From 1a506214e5779e068c1d2b7b34dbf3d1c2e8c637 Mon Sep 17 00:00:00 2001 From: Oleg Mitsura Date: Tue, 27 Jul 2021 16:24:23 -0400 Subject: SO-3720 BuildingBlockRollback lookup table Issue-ID: SO-3720 BuildingBlockRollback lookup table will indicate the rollback BB to take; this is the first part for simplifying WorkflowActionBBTasks logic: instead of doing string matching, we just do a lookup of a block to call to perform the rollback operation. In some cases, the Action is set as well - this would be needed for certain BBs, in that case, there is a corresponding rollbackAction as well. Change-Id: I072a2ada894cf4672f5a1cdce762605757cb1d14 Signed-off-by: Oleg Mitsura --- .../so/adapters/catalogdb/JerseyConfiguration.java | 2 + .../rest/BuildingBlockRollbackRestImpl.java | 67 +++++++++++ .../migration/V8.9.1__AddBuildingBlockRollback.sql | 10 ++ .../so/db/catalog/beans/BuildingBlockRollback.java | 134 +++++++++++++++++++++ .../onap/so/db/catalog/client/CatalogDbClient.java | 24 +++- .../BuildingBlockRollbackRepository.java | 34 ++++++ mso-catalog-db/src/test/resources/schema.sql | 9 ++ 7 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/BuildingBlockRollbackRestImpl.java create mode 100644 adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V8.9.1__AddBuildingBlockRollback.sql create mode 100644 mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/BuildingBlockRollback.java create mode 100644 mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/BuildingBlockRollbackRepository.java diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/JerseyConfiguration.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/JerseyConfiguration.java index 359c8cd46e..e276faf5d0 100644 --- a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/JerseyConfiguration.java +++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/JerseyConfiguration.java @@ -27,6 +27,7 @@ import javax.ws.rs.ApplicationPath; import org.glassfish.jersey.server.ResourceConfig; import org.onap.logging.filter.base.Constants; import org.onap.logging.filter.base.ONAPComponents; +import org.onap.so.adapters.catalogdb.rest.BuildingBlockRollbackRestImpl; import org.onap.so.adapters.catalogdb.rest.CatalogDbAdapterRest; import org.onap.so.adapters.catalogdb.rest.ServiceRestImpl; import org.onap.so.adapters.catalogdb.rest.VnfRestImpl; @@ -53,6 +54,7 @@ public class JerseyConfiguration extends ResourceConfig { register(AcceptHeaderOpenApiResource.class); register(ServiceRestImpl.class); register(VnfRestImpl.class); + register(BuildingBlockRollbackRestImpl.class); OpenAPI oas = new OpenAPI(); Info info = new Info(); diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/BuildingBlockRollbackRestImpl.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/BuildingBlockRollbackRestImpl.java new file mode 100644 index 0000000000..bd247e1a4f --- /dev/null +++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/BuildingBlockRollbackRestImpl.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Bell Canada + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.so.adapters.catalogdb.rest; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import java.util.List; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.onap.so.db.catalog.beans.BuildingBlockRollback; +import org.onap.so.db.catalog.data.repository.BuildingBlockRollbackRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + + +@OpenAPIDefinition(info = @Info(title = "/v1", description = "model")) +@Path("/v1/buildingBlockRollback") +@Component +public class BuildingBlockRollbackRestImpl { + + @Autowired + private BuildingBlockRollbackRepository bbRollbackRepo; + + @GET + @Path("/{id}") + @Produces({MediaType.APPLICATION_JSON}) + @Transactional(readOnly = true) + public BuildingBlockRollback findService(@PathParam("id") Integer id) { + return bbRollbackRepo.findOneById(id); + } + + @GET + @Operation(description = "Look up BuildingBlock Rollback List", responses = @ApiResponse( + content = @Content(array = @ArraySchema(schema = @Schema(implementation = BuildingBlockRollback.class))))) + @Produces({MediaType.APPLICATION_JSON}) + @Transactional(readOnly = true) + public List getBBRollbackList() { + return bbRollbackRepo.findAll(); + } +} diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V8.9.1__AddBuildingBlockRollback.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V8.9.1__AddBuildingBlockRollback.sql new file mode 100644 index 0000000000..11dd1ecfb3 --- /dev/null +++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V8.9.1__AddBuildingBlockRollback.sql @@ -0,0 +1,10 @@ +use catalogdb; + +CREATE TABLE IF NOT EXISTS `building_block_rollback` ( + `ID` INT NOT NULL AUTO_INCREMENT, + `BUILDING_BLOCK_NAME` varchar(200) NOT NULL, + `ACTION` varchar(200) null, + `ROLLBACK_BUILDING_BLOCK_NAME` varchar(200) NOT NULL, + `ROLLBACK_ACTION` varchar(200) NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/BuildingBlockRollback.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/BuildingBlockRollback.java new file mode 100644 index 0000000000..798604e4fb --- /dev/null +++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/BuildingBlockRollback.java @@ -0,0 +1,134 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2021 Bell Canada. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.so.db.catalog.beans; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.openpojo.business.annotation.BusinessKey; +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import uk.co.blackpepper.bowman.annotation.RemoteResource; + +@Entity +@RemoteResource("/buildingBlockRollback") +@Table(name = "building_block_rollback") +public class BuildingBlockRollback implements Serializable { + + private static final long serialVersionUID = 1; + + @Id + @BusinessKey + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID", nullable = false, updatable = false) + private Integer id; + + @BusinessKey + @JsonProperty("building_block_name") + @Column(name = "BUILDING_BLOCK_NAME", nullable = false, length = 200) + private String buildingBlockName; + + @BusinessKey + @JsonProperty("action") + @Column(name = "ACTION", length = 200) + private String action; + + @BusinessKey + @JsonProperty("rollback_building_block_name") + @Column(name = "ROLLBACK_BUILDING_BLOCK_NAME", nullable = false, length = 200) + private String rollbackBuildingBlockName; + + @BusinessKey + @JsonProperty("rollback_action") + @Column(name = "ROLLBACK_ACTION", length = 200) + private String rollbackAction; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBuildingBlockName() { + return buildingBlockName; + } + + public void setBuildingBlockName(String buildingBlockName) { + this.buildingBlockName = buildingBlockName; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getRollbackBuildingBlockName() { + return rollbackBuildingBlockName; + } + + public void setRollbackBuildingBlockName(String rollbackBuildingBlockName) { + this.rollbackBuildingBlockName = rollbackBuildingBlockName; + } + + public String getRollbackAction() { + return rollbackAction; + } + + public void setRollbackAction(String rollbackAction) { + this.rollbackAction = rollbackAction; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BuildingBlockRollback that = (BuildingBlockRollback) o; + return id.equals(that.id) && buildingBlockName.equals(that.buildingBlockName) + && Objects.equals(action, that.action) + && rollbackBuildingBlockName.equals(that.rollbackBuildingBlockName) + && Objects.equals(rollbackAction, that.rollbackAction); + } + + @Override + public int hashCode() { + return Objects.hash(id, buildingBlockName, action, rollbackBuildingBlockName, rollbackAction); + } + + @Override + public String toString() { + return "BuildingBlockRollback{" + "id='" + id + '\'' + ", buildingBlockName='" + buildingBlockName + '\'' + + ", action='" + action + '\'' + ", rollbackBuildingBlockName='" + rollbackBuildingBlockName + '\'' + + ", rollbackAction='" + rollbackAction + '\'' + '}'; + } +} diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java index ae6d51c6a2..45d6a878ed 100644 --- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java +++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java @@ -25,6 +25,7 @@ import java.net.URI; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.persistence.EntityNotFoundException; @@ -35,6 +36,7 @@ import org.onap.logging.filter.base.Constants; import org.onap.logging.filter.spring.SpringClientPayloadFilter; import org.onap.so.db.catalog.beans.BBNameSelectionReference; import org.onap.so.db.catalog.beans.BuildingBlockDetail; +import org.onap.so.db.catalog.beans.BuildingBlockRollback; import org.onap.so.db.catalog.beans.CloudSite; import org.onap.so.db.catalog.beans.CloudifyManager; import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization; @@ -126,6 +128,7 @@ public class CatalogDbClient { private static final String WORKFLOW = "/workflow"; private static final String BB_NAME_SELECTION_REFERENCE = "/bbNameSelectionReference"; private static final String PROCESSING_FLAGS = "/processingFlags"; + private static final String BB_ROLLBACK = "/buildingBlockRollback"; private static final String SEARCH = "/search"; @@ -236,6 +239,7 @@ public class CatalogDbClient { private String pnfResourceURI; private String pnfResourceCustomizationURI; private String workflowURI; + private String buildingBlockRollbacksURI; private final Client serviceClient; @@ -299,6 +303,8 @@ public class CatalogDbClient { private final Client processingFlagsClient; + private final Client buildingBlockRollbackClient; + @Value("${mso.catalog.db.spring.endpoint:#{null}}") private String endpoint; @@ -391,7 +397,7 @@ public class CatalogDbClient { pnfResourceURI = endpoint + PNF_RESOURCE + URI_SEPARATOR; pnfResourceCustomizationURI = endpoint + PNF_RESOURCE_CUSTOMIZATION + URI_SEPARATOR; workflowURI = endpoint + WORKFLOW + URI_SEPARATOR; - + buildingBlockRollbacksURI = endpoint + BB_ROLLBACK + URI_SEPARATOR; } public CatalogDbClient() { @@ -445,6 +451,7 @@ public class CatalogDbClient { bbNameSelectionReferenceClient = clientFactory.create(BBNameSelectionReference.class); processingFlagsClient = clientFactory.create(ProcessingFlags.class); networkResourceClient = clientFactory.create(NetworkResource.class); + buildingBlockRollbackClient = clientFactory.create(BuildingBlockRollback.class); } public CatalogDbClient(String baseUri, String auth) { @@ -498,6 +505,7 @@ public class CatalogDbClient { bbNameSelectionReferenceClient = clientFactory.create(BBNameSelectionReference.class); processingFlagsClient = clientFactory.create(ProcessingFlags.class); networkResourceClient = clientFactory.create(NetworkResource.class); + buildingBlockRollbackClient = clientFactory.create(BuildingBlockRollback.class); } public NetworkCollectionResourceCustomization getNetworkCollectionResourceCustomizationByID( @@ -1224,6 +1232,20 @@ public class CatalogDbClient { getUri(UriBuilder.fromUri(findProcessingFlagsByFlag).queryParam(FLAG, flag).build().toString())); } + // TODO: redo using buildingBlockRollbackClient + public List getBuildingBlockRollbackEntries() { + try { + HttpEntity entity = getHttpEntity(); + return restTemplate.exchange( + UriComponentsBuilder.fromUriString(endpoint + "/ecomp/mso/catalog/v1/buildingBlockRollback").build() + .encode().toString(), + HttpMethod.GET, entity, new ParameterizedTypeReference>() {}).getBody(); + } catch (HttpClientErrorException e) { + logger.error("Error Calling catalog database", e); + throw e; + } + } + public String getEndpoint() { return endpoint; } diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/BuildingBlockRollbackRepository.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/BuildingBlockRollbackRepository.java new file mode 100644 index 0000000000..24dd713197 --- /dev/null +++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/BuildingBlockRollbackRepository.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Bell Canada + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.so.db.catalog.data.repository; + +import java.util.List; +import org.onap.so.db.catalog.beans.BuildingBlockRollback; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.rest.core.annotation.RepositoryRestResource; + +@RepositoryRestResource(collectionResourceRel = "buildingBlockRollback", path = "buildingBlockRollback") +public interface BuildingBlockRollbackRepository extends JpaRepository { + + List findAll(); + + BuildingBlockRollback findOneById(Integer ID); +} diff --git a/mso-catalog-db/src/test/resources/schema.sql b/mso-catalog-db/src/test/resources/schema.sql index 86f56ca3a5..db800b2b49 100644 --- a/mso-catalog-db/src/test/resources/schema.sql +++ b/mso-catalog-db/src/test/resources/schema.sql @@ -1415,3 +1415,12 @@ CREATE TABLE IF NOT EXISTS `processing_flags` ( PRIMARY KEY (`ID`), UNIQUE KEY `UK_processing_flags` (`FLAG`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE IF NOT EXISTS `building_block_rollback` ( + `ID` INT NOT NULL AUTO_INCREMENT, + `BUILDING_BLOCK_NAME` varchar(200) NOT NULL, + `ACTION` varchar(200) null, + `ROLLBACK_BUILDING_BLOCK_NAME` varchar(200) NOT NULL, + `ROLLBACK_ACTION` varchar(200) NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- cgit 1.2.3-korg