Merge "Enhanced List Level flow with backward support"
authorSeshu Kumar M <seshu.kumar.m@huawei.com>
Tue, 23 Jul 2019 05:30:31 +0000 (05:30 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 23 Jul 2019 05:30:31 +0000 (05:30 +0000)
166 files changed:
adapters/mso-adapter-utils/src/main/java/org/onap/so/audit/beans/AuditInventory.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatEnvironmentEntry.java
adapters/mso-adapter-utils/src/main/resources/application-local.yaml [deleted file]
adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryGroups.java
adapters/mso-catalog-db-adapter/src/main/resources/application-local.yaml [deleted file]
adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__WorkflowDesignerData.sql
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AbstractAuditService.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditCreateStackService.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDataService.java [new file with mode: 0644]
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDeleteStackService.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditQueryStackService.java [new file with mode: 0644]
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditStackService.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditVServer.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/HeatStackAudit.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/inventory/create/CreateInventoryTask.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfAdapterImpl.java
adapters/mso-openstack-adapters/src/main/resources/application-local.yaml [deleted file]
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditDataServiceTest.java [new file with mode: 0644]
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditStackServiceDataTest.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditVServerTest.java
adapters/mso-openstack-adapters/src/test/resources/vfModule.json [new file with mode: 0644]
adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/RequestDbRepositoryConfiguration.java [new file with mode: 0644]
adapters/mso-requests-db-adapter/src/main/resources/application-local.yaml [deleted file]
adapters/mso-requests-db-adapter/src/main/resources/db/migration/V6.2__Expand_Column_Size_Infra_Active_Requests_Request_Status.sql [new file with mode: 0644]
adapters/mso-requests-db-adapter/src/main/resources/db/migration/V6.3__Expand_Column_Size_Archived_Infra_Active_Requests_Request_Status.sql [new file with mode: 0644]
adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/SDNCAdapterApplication.java
adapters/mso-sdnc-adapter/src/main/resources/application-local.yaml [deleted file]
adapters/mso-vfc-adapter/src/main/resources/application-local.yaml [deleted file]
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/pom.xml
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/SdcPackageProvider.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/AaiServiceProviderImpl.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderImpl.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/lifecycle/LifecycleManager.java
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/application.yaml
adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/org.onap.so.trust.jks [new file with mode: 0644]
asdc-controller/src/main/java/org/onap/so/asdc/ASDCControllerSingleton.java
asdc-controller/src/main/java/org/onap/so/asdc/Application.java
asdc-controller/src/main/java/org/onap/so/asdc/JerseyConfiguration.java
asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java
asdc-controller/src/main/java/org/onap/so/asdc/client/test/rest/ASDCRestInterface.java
asdc-controller/src/main/resources/application-local.yaml [deleted file]
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ExceptionUtil.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VnfAdapterRestV1.groovy
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExtractPojosForBB.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/ExceptionBuilder.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDayUnitTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildlingBlockRainyDayTest.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/exception/ExceptionBuilderTest.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/exception/ExceptionBuilderUnitTest.java [new file with mode: 0644]
bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/WorkflowException.java
bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/RollbackData.java
bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/xml/XmlToolTest.java
bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowProcessor.java
bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/infrastructure/CXFConfiguration.java
bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/common/BPMNUtil.java
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/HomingBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/WorkflowActionBB.bpmn
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/process/WorkflowActionBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeleteVfModuleBBTest.java
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/vfcmodel/NsParameters.java
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactory.java
bpmn/so-bpmn-infrastructure-common/src/main/resources/application.properties [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactoryTest.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIFlagTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/audit/AuditTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCQueryTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCUnassignTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVfModuleResources.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/common/data/TestDataSetup.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1Test.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/audit/AuditTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCQueryTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCUnassignTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/SDNCVfModuleResourcesTest.java
cloudify-client/src/main/java/org/onap/so/cloudify/base/client/CloudifyClient.java
common/src/main/java/org/onap/so/constants/OrchestrationRequestFormat.java [moved from mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/Status.java with 81% similarity]
common/src/main/java/org/onap/so/constants/Status.java [new file with mode: 0644]
common/src/main/java/org/onap/so/serviceinstancebeans/RequestStatus.java
common/src/main/java/org/onap/so/utils/TargetEntities.java [new file with mode: 0644]
common/src/main/java/org/onap/so/utils/TargetEntity.java
mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/filters/ResponseUpdateFilter.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/E2EServiceInstances.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManualTasks.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ResumeOrchestrationRequest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandler.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/BpmnRequestBuilder.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandler.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/NetworkRestHandler.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/ServiceInstanceRestHandler.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/VFModuleRestHandler.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/VnfRestHandler.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/VolumeRestHandler.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/CloudOrchestration.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/CloudResourcesOrchestration.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/ModelDistributionRequest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/TenantIsolationRequest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/process/CreateVnfOperationalEnvironment.java
mso-api-handlers/mso-api-handler-infra/src/main/resources/application-local.yaml [deleted file]
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsUnitTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/RequestHandlerUtilsUnitTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ResumeOrchestrationRequestTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/NetworkRestHandlerTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/ServiceInstanceRestHandlerTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/VfModuleRestHandlerTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/VnfRestHandlerTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/VolumeRestHandlerTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/CloudOrchestrationTest.java
mso-api-handlers/mso-requests-db-repositories/pom.xml
mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/configuration/ExposeEntityIdResourceConfiguration.java [new file with mode: 0644]
mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/RequestProcessingDataRepository.java
mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/client/RequestsDbClient.java
mso-api-handlers/mso-requests-db/src/test/java/org/onap/so/db/request/client/RequestDbClientTest.java [new file with mode: 0644]
mso-catalog-db/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
pom.xml
so-monitoring/readme.md [new file with mode: 0644]
so-monitoring/so-monitoring-service/pom.xml
so-monitoring/so-monitoring-service/src/main/java/org/onap/so/monitoring/rest/api/UserController.java [new file with mode: 0644]
so-monitoring/so-monitoring-service/src/main/java/org/onap/so/monitoring/rest/api/WebApplicationConfig.java
so-monitoring/so-monitoring-service/src/main/java/org/onap/so/monitoring/rest/api/WebSecurityConfigImpl.java [new file with mode: 0644]
so-monitoring/so-monitoring-service/src/main/resources/application.yaml
so-monitoring/so-monitoring-ui/src/main/frontend/README.md
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/app-routing.module.ts
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/app.module.ts
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/auth.guard.ts [new file with mode: 0644]
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/authentication.service.ts [new file with mode: 0644]
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/basic-auth.interceptor.ts [new file with mode: 0644]
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/data.service.ts
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/error.interceptor.ts [new file with mode: 0644]
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.html [new file with mode: 0644]
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.spec.ts [new file with mode: 0644]
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.ts [new file with mode: 0644]
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/sidebar/sidebar.component.html
so-monitoring/so-monitoring-ui/src/main/frontend/src/environments/environment.ts
vnfm-simulator/vnfm-service/pom.xml
vnfm-simulator/vnfm-service/src/main/java/org/onap/svnfm/simulator/config/ApplicationConfig.java
vnfm-simulator/vnfm-service/src/main/java/org/onap/svnfm/simulator/controller/SvnfmController.java
vnfm-simulator/vnfm-service/src/main/java/org/onap/svnfm/simulator/services/VnfmHelper.java
vnfm-simulator/vnfm-service/src/main/resources/application.yaml
vnfm-simulator/vnfm-service/src/main/resources/so-vnfm-simulator.p12 [new file with mode: 0644]
vnfm-simulator/vnfm-service/src/test/java/org/onap/svnfm/simulator/services/VnfmHelperTest.java [new file with mode: 0644]

index 7e612b3..eff32cf 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -25,18 +25,24 @@ import java.io.Serializable;
 public class AuditInventory implements Serializable {
 
     /**
-     * 
+     *
      */
     private static final long serialVersionUID = 4937350343452380760L;
 
+    private String msoRequestId;
+
     private String cloudRegion;
 
     private String cloudOwner;
 
     private String tenantId;
 
+    private String vfModuleId;
+
     private String heatStackName;
 
+    private String genericVnfId;
+
     public String getCloudRegion() {
         return cloudRegion;
     }
@@ -69,6 +75,30 @@ public class AuditInventory implements Serializable {
         this.heatStackName = heatStackName;
     }
 
+    public String getGenericVnfId() {
+        return genericVnfId;
+    }
+
+    public void setGenericVnfId(String genericVnfId) {
+        this.genericVnfId = genericVnfId;
+    }
+
+    public String getVfModuleId() {
+        return vfModuleId;
+    }
+
+    public void setVfModuleId(String vfModuleId) {
+        this.vfModuleId = vfModuleId;
+    }
+
+    public String getMsoRequestId() {
+        return msoRequestId;
+    }
+
+    public void setMsoRequestId(String msoRequestId) {
+        this.msoRequestId = msoRequestId;
+    }
+
 
 
 }
index 723bed1..8cacf85 100644 (file)
@@ -58,9 +58,12 @@ public class MsoHeatEnvironmentEntry {
                 return;
             byte[] b = this.rawEntry.toString().getBytes();
             MsoYamlEditorWithEnvt yaml = new MsoYamlEditorWithEnvt(b);
-            this.parameters = yaml.getParameterListFromEnvt();
-            // this.resources = yaml.getResourceListFromEnvt();
-            StringBuilder sb = this.getResourceRegistryRawEntry();
+            StringBuilder sb = null;
+            if (yaml != null) {
+                this.parameters = yaml.getParameterListFromEnvt();
+                // this.resources = yaml.getResourceListFromEnvt();
+                sb = this.getResourceRegistryRawEntry();
+            }
             if (sb == null) {
                 this.resourceRegistryEntryRaw = new StringBuilder("");
             } else {
diff --git a/adapters/mso-adapter-utils/src/main/resources/application-local.yaml b/adapters/mso-adapter-utils/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index 5fc2144..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-# will be used as entry in DB to say SITE OFF/ON for healthcheck
-# MSO Properties go here
-mso:
-  catalog:
-    db:
-      spring:
-        endpoint: "http://localhost:8080"
-  db:
-    auth: Basic YnBlbDptc28tZGItMTUwNyE=
-cloud_config:
-  identity_services:
-    MT_KEYSTONE:
-      identity_url: "http://localhost:5000/v2.0"
-      mso_id: "john"
-      mso_pass: "313DECE408AF7759D442D7B06DD9A6AA"
-      admin_tenant: "admin"
-      member_role: "_member_"
-      tenant_metadata: false
-      identity_server_type: "KEYSTONE"
-      identity_authentication_type: "USERNAME_PASSWORD"
-    DAN_KEYSTONE:
-      identity_url: "http://192.168.170.21:5000/v2.0"
-      mso_id: "jc1348"
-      mso_pass: "313DECE408AF7759D442D7B06DD9A6AA"
-      admin_tenant: "service"
-      member_role: "_member_"
-      tenant_metadata: false
-      identity_server_type: "KEYSTONE"
-      identity_authentication_type: "USERNAME_PASSWORD"
-  cloud_sites:
-    regionOne:
-      region_id: "regionOne"
-      clli: "MT2"
-      aic_version: "2.5"
-      identity_service_id: "MT_KEYSTONE"
-    DAN:
-      region_id: "RegionOne"
-      clli: "MT"
-      aic_version: "2.5"
-      identity_service_id: "DAN_KEYSTONE"
-    DEFAULT:
-      region_id: ""
-      clli: "MTN6"
-      aic_version: "3.0"
-      identity_service_id: "ORDM3"
-adapters:
-  po:
-    retryCodes: "504"
-    retryDelay: "5"
-    retryCount: "3"
-  tenant:
-    tenant_description: "ECOMP Tenant"
-    region_type: "single"
-    user_role: "admin"
-    success_status_string: "Success"
-    no_regions_status_string: "no regions"
-    orm_request_path: "/v1/orm/customers/"
-    x_aic_orm_client_string: "ECOMP-MSO"
-    keystone_url_version: "/v2.0"
-    keystone_reg_ex: "/[vV][0-9]"
-    orm_url_replace_this: "8080"
-    orm_url_replace_with_this: "7080"
-    quota_value: "10"
-    set_default_quota: "false"
index facdd2f..ed2526f 100644 (file)
@@ -3,6 +3,8 @@
  * ONAP - SO
  * ================================================================================
  * Copyright (C) 2019 Huawei Intellectual Property. All rights reserved.
+ *
+ * Copyright (C) 2019 IBM.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +23,6 @@
 package org.onap.so.adapters.catalogdb.catalogrest;
 
 import org.onap.so.db.catalog.beans.InstanceGroup;
-import org.onap.so.db.catalog.beans.VFCInstanceGroup;
 import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
 import javax.xml.bind.annotation.XmlRootElement;
 import java.util.ArrayList;
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/application-local.yaml b/adapters/mso-catalog-db-adapter/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index d7c13ea..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-
-catalog:
-  db:
-    endpoint: http://localhost:8090
-
-ssl-enable: false 
-mso:
-  site-name: localDevEnv
-  logPath: logs
-  catalog:
-    db:
-      spring:
-        endpoint: http://localhost:8090
-  db:
-    auth: Basic YnBlbDptc28tZGItMTUwNyE=
-spring:
-  security:
-    usercredentials:
-    -  
-      username: test
-      password: '$2a$12$Zi3AuYcZoZO/gBQyUtST2.F5N6HqcTtaNci2Et.ufsQhski56srIu'
-      role: BPEL-Client
-    -
-      username: bpel
-      password: '$2a$12$1xyutEZNfjGewIZRfKaE8eZE99f5sYFUmmM80BobI65KNjmcK0JuO'
-      role: BPEL-Client
-    -  
-      username: mso_admin
-      password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'
-      role: ACTUATOR  
-  
-server:
-    port: 8090
-
-
index 3f76334..137f73c 100644 (file)
@@ -201,5 +201,5 @@ VALUES
 INSERT INTO `workflow` (`ARTIFACT_UUID`,`ARTIFACT_NAME`,`NAME`,`OPERATION_NAME`,`VERSION`,`DESCRIPTION`,`RESOURCE_TARGET`,`SOURCE`)
 VALUES
 ('9d45cd30-1a89-4993-87c1-6dd09c1696cf','VFModule-ScaleOut','VNF Scale Out','ScaleOut',1.0,'native static workflow to support ScaleOut','vfModule','native'),
-('da6478e4-ea33-3346-ac12-ab121284a333','VnfInPlaceUpdate.bpmn','VNF In Place Software Update','inPlaceSoftwareUpdate',1.0,'native static workflow to support inPlaceSoftwareUpdate','vnf','native'),
-('fdb3ac48-70f9-4584-bd92-253bdbdec1e1','VnfConfigUpdate.bpmn','VNF Config Update','applyConfigModify',1.0,'native static workflow to support applyConfigModify','vnf','native');
\ No newline at end of file
+('da6478e4-ea33-3346-ac12-ab121284a333','VnfInPlaceUpdate.bpmn','VnfInPlaceUpdate','inPlaceSoftwareUpdate',1.0,'native static workflow to support inPlaceSoftwareUpdate','vnf','native'),
+('fdb3ac48-70f9-4584-bd92-253bdbdec1e1','VnfConfigUpdate.bpmn','VnfConfigUpdate','applyConfigModify',1.0,'native static workflow to support applyConfigModify','vnf','native');
index 5060e55..8edce12 100644 (file)
@@ -43,6 +43,8 @@ public abstract class AbstractAuditService {
     protected static final String UNABLE_TO_FIND_ALL_V_SERVERS_AND_L_INTERACES_IN_A_AI =
             "Unable to find all VServers and L-Interaces in A&AI";
 
+    protected static final String UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK = "Unable to find VServers in Openstack";
+
     @Autowired
     public Environment env;
 
@@ -68,12 +70,12 @@ public abstract class AbstractAuditService {
      * @param auditList
      * @return
      */
-    protected boolean didDeleteAuditFail(Optional<AAIObjectAuditList> auditList) {
-        if (auditList.get().getAuditList() != null && !auditList.get().getAuditList().isEmpty()) {
+    protected boolean didDeleteAuditFail(AAIObjectAuditList auditList) {
+        if (auditList.getAuditList() != null && !auditList.getAuditList().isEmpty()) {
             if (logger.isInfoEnabled()) {
-                logger.info("Audit Results: {}", auditList.get().toString());
+                logger.info("Audit Results: {}", auditList.toString());
             }
-            return auditList.get().getAuditList().stream().filter(AAIObjectAudit::isDoesObjectExist).findFirst()
+            return auditList.getAuditList().stream().filter(AAIObjectAudit::isDoesObjectExist).findFirst()
                     .map(v -> true).orElse(false);
         } else {
             return false;
@@ -85,9 +87,12 @@ public abstract class AbstractAuditService {
     }
 
     protected void setupMDC(ExternalTask externalTask) {
+        logger.info(ONAPLogConstants.Markers.ENTRY, "Entering");
         String msoRequestId = externalTask.getVariable("mso-request-id");
-        if (msoRequestId != null && !msoRequestId.isEmpty())
+        if (msoRequestId != null && !msoRequestId.isEmpty()) {
             MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, msoRequestId);
+        }
+        MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, externalTask.getTopicName());
     }
 
     protected long calculateRetryDelay(int currentRetries) {
index 7722991..1e5b6de 100644 (file)
@@ -27,6 +27,7 @@ import java.util.Map;
 import java.util.Optional;
 import org.camunda.bpm.client.task.ExternalTask;
 import org.camunda.bpm.client.task.ExternalTaskService;
+import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
 import org.onap.so.objects.audit.AAIObjectAuditList;
@@ -48,9 +49,9 @@ public class AuditCreateStackService extends AbstractAuditService {
     public Environment environment;
 
     protected void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
+        setupMDC(externalTask);
         AuditInventory auditInventory = externalTask.getVariable("auditInventory");
         Map<String, Object> variables = new HashMap<>();
-        setupMDC(externalTask);
         boolean success = false;
         try {
             logger.info("Executing External Task Audit Inventory, Retry Number: {} \n {}", auditInventory,
@@ -71,6 +72,7 @@ public class AuditCreateStackService extends AbstractAuditService {
         if (success) {
             externalTaskService.complete(externalTask, variables);
             logger.debug("The External Task Id: {}  Successful", externalTask.getId());
+            logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
         } else {
             if (externalTask.getRetries() == null) {
                 logger.debug("The External Task Id: {}  Failed, Setting Retries to Default Start Value: {}",
@@ -80,6 +82,7 @@ public class AuditCreateStackService extends AbstractAuditService {
             } else if (externalTask.getRetries() != null && externalTask.getRetries() - 1 == 0) {
                 logger.debug("The External Task Id: {}  Failed, All Retries Exhausted", externalTask.getId());
                 externalTaskService.complete(externalTask, variables);
+                logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
             } else {
                 logger.debug("The External Task Id: {}  Failed, Decrementing Retries: {} , Retry Delay: ",
                         externalTask.getId(), externalTask.getRetries() - 1,
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDataService.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDataService.java
new file mode 100644 (file)
index 0000000..1c707fe
--- /dev/null
@@ -0,0 +1,77 @@
+package org.onap.so.adapters.audit;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import org.onap.so.audit.beans.AuditInventory;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+
+@Component
+public class AuditDataService {
+
+    @Autowired
+    private RequestsDbClient requestsDbClient;
+
+    /**
+     * Checks to see if an entry already exist for the given heat stack and writes audit stack data to the request
+     * database if it doesn't.
+     *
+     * @throws JsonProcessingException
+     */
+    public void writeStackDataToRequestDb(AuditInventory auditInventory, AAIObjectAuditList auditList)
+            throws JsonProcessingException {
+        List<RequestProcessingData> requestProcessingDataList =
+                requestsDbClient.getRequestProcessingDataByGroupingIdAndNameAndTag(auditInventory.getVfModuleId(),
+                        auditInventory.getHeatStackName(), "AuditStackData");
+        if (requestProcessingDataList.isEmpty()) {
+            GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+            String auditListString = objectMapper.getMapper().writeValueAsString(auditList);;
+
+            RequestProcessingData requestProcessingData = new RequestProcessingData();
+            requestProcessingData.setSoRequestId(auditInventory.getMsoRequestId());
+            requestProcessingData.setGroupingId(auditInventory.getVfModuleId());
+            requestProcessingData.setName(auditInventory.getHeatStackName());
+            requestProcessingData.setTag("AuditStackData");
+            requestProcessingData.setValue(auditListString);
+
+            requestsDbClient.saveRequestProcessingData(requestProcessingData);
+        }
+    }
+
+    /**
+     * Retrieves audit stack data from the request database.
+     *
+     * @throws IOException
+     * @throws JsonMappingException
+     * @throws JsonParseException
+     */
+    public Optional<AAIObjectAuditList> getStackDataFromRequestDb(AuditInventory auditInventory)
+            throws JsonParseException, JsonMappingException, IOException {
+
+        List<RequestProcessingData> requestProcessingDataList =
+                requestsDbClient.getRequestProcessingDataByGroupingIdAndNameAndTag(auditInventory.getVfModuleId(),
+                        auditInventory.getHeatStackName(), "AuditStackData");
+        if (!requestProcessingDataList.isEmpty()) {
+            RequestProcessingData requestProcessingData = requestProcessingDataList.get(0);
+            String auditListString = requestProcessingData.getValue();
+
+            GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+            AAIObjectAuditList auditList =
+                    objectMapper.getMapper().readValue(auditListString, AAIObjectAuditList.class);
+
+            return Optional.of(auditList);
+        } else {
+            return Optional.empty();
+        }
+    }
+
+
+}
index 9b245ba..0aa4f9b 100644 (file)
@@ -25,6 +25,7 @@ import java.util.Map;
 import java.util.Optional;
 import org.camunda.bpm.client.task.ExternalTask;
 import org.camunda.bpm.client.task.ExternalTaskService;
+import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
 import org.onap.so.objects.audit.AAIObjectAuditList;
@@ -40,28 +41,38 @@ public class AuditDeleteStackService extends AbstractAuditService {
     private static final Logger logger = LoggerFactory.getLogger(AuditDeleteStackService.class);
 
     @Autowired
-    public HeatStackAudit heatStackAudit;
+    protected HeatStackAudit heatStackAudit;
 
     @Autowired
-    public Environment environment;
+    protected AuditVServer auditVservers;
+
+    @Autowired
+    protected AuditDataService auditDataService;
+
+    @Autowired
+    protected Environment env;
 
     protected void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
+        setupMDC(externalTask);
         AuditInventory auditInventory = externalTask.getVariable("auditInventory");
         Map<String, Object> variables = new HashMap<>();
-        setupMDC(externalTask);
         boolean success = false;
         try {
-            logger.info("Executing External Task Audit Inventory, Retry Number: {} \n {}", auditInventory,
-                    externalTask.getRetries());
-            Optional<AAIObjectAuditList> auditListOpt = heatStackAudit.auditHeatStack(auditInventory.getCloudRegion(),
-                    auditInventory.getCloudOwner(), auditInventory.getTenantId(), auditInventory.getHeatStackName());
+            logger.info("Executing External Task Delete Audit Inventory. Retry Number: {}", externalTask.getRetries());
+            Optional<AAIObjectAuditList> auditListOpt = auditDataService.getStackDataFromRequestDb(auditInventory);
             if (auditListOpt.isPresent()) {
-                auditListOpt.get().setAuditType("delete");
-                auditListOpt.get().setHeatStackName(auditInventory.getHeatStackName());
-                GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
-                variables.put("auditInventoryResult", objectMapper.getMapper().writeValueAsString(auditListOpt.get()));
-                success = !didDeleteAuditFail(auditListOpt);
+                auditVservers.auditVservers(auditListOpt.get());
+            } else {
+                logger.debug("Auditing Vservers based on vf module relationships");
+                auditListOpt = auditVservers.auditVserversThroughRelationships(auditInventory.getGenericVnfId(),
+                        auditInventory.getHeatStackName());
             }
+            auditListOpt.get().setHeatStackName(auditInventory.getHeatStackName());
+            auditListOpt.get().setAuditType("delete");
+            GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+            variables.put("auditInventoryResult", objectMapper.getMapper().writeValueAsString(auditListOpt.get()));
+            success = !didDeleteAuditFail(auditListOpt.get());
+
         } catch (Exception e) {
             logger.error("Error during audit of stack", e);
         }
@@ -69,6 +80,7 @@ public class AuditDeleteStackService extends AbstractAuditService {
         if (success) {
             externalTaskService.complete(externalTask, variables);
             logger.debug("The External Task Id: {}  Successful", externalTask.getId());
+            logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
         } else {
             if (externalTask.getRetries() == null) {
                 logger.debug("The External Task Id: {}  Failed, Setting Retries to Default Start Value: {}",
@@ -78,6 +90,7 @@ public class AuditDeleteStackService extends AbstractAuditService {
             } else if (externalTask.getRetries() != null && externalTask.getRetries() - 1 == 0) {
                 logger.debug("The External Task Id: {}  Failed, All Retries Exhausted", externalTask.getId());
                 externalTaskService.complete(externalTask, variables);
+                logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
             } else {
                 logger.debug("The External Task Id: {}  Failed, Decrementing Retries: {} , Retry Delay: ",
                         externalTask.getId(), externalTask.getRetries() - 1,
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditQueryStackService.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditQueryStackService.java
new file mode 100644 (file)
index 0000000..2ef7d5b
--- /dev/null
@@ -0,0 +1,71 @@
+package org.onap.so.adapters.audit;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.camunda.bpm.client.task.ExternalTask;
+import org.camunda.bpm.client.task.ExternalTaskService;
+import org.onap.logging.ref.slf4j.ONAPLogConstants;
+import org.onap.so.audit.beans.AuditInventory;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AuditQueryStackService extends AbstractAuditService {
+
+    private static final Logger logger = LoggerFactory.getLogger(AuditQueryStackService.class);
+
+    @Autowired
+    protected HeatStackAudit heatStackAudit;
+
+    @Autowired
+    protected AuditDataService auditDataService;
+
+    protected void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
+        setupMDC(externalTask);
+        AuditInventory auditInventory = externalTask.getVariable("auditInventory");
+        boolean success = false;
+        Map<String, Object> variables = new HashMap<>();
+        try {
+            logger.info("Executing External Task Query Audit Inventory. Audit Inventory: {} \n Retry Number: {}",
+                    auditInventory.toString(), externalTask.getRetries());
+
+            Optional<AAIObjectAuditList> auditList = heatStackAudit.queryHeatStack(auditInventory.getCloudOwner(),
+                    auditInventory.getCloudRegion(), auditInventory.getTenantId(), auditInventory.getHeatStackName());
+
+            if (auditList.isPresent()) {
+                success = true;
+                auditDataService.writeStackDataToRequestDb(auditInventory, auditList.get());
+            }
+            if (success) {
+                externalTaskService.complete(externalTask, variables);
+                logger.debug("The External Task {}  was Successful", externalTask.getId());
+                logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
+            } else {
+                if (externalTask.getRetries() == null) {
+                    logger.debug("The External Task {} Failed. Setting Retries to Default Start Value: {}",
+                            externalTask.getId(), getRetrySequence().length);
+                    externalTaskService.handleFailure(externalTask, UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK,
+                            UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK, getRetrySequence().length, 10000);
+                } else if (externalTask.getRetries() != null && externalTask.getRetries() - 1 == 0) {
+                    logger.debug("The External Task {} Failed. All Retries Exhausted", externalTask.getId());
+                    externalTaskService.complete(externalTask, variables);
+                    logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
+                } else {
+                    logger.debug("The External Task {} Failed. Decrementing Retries to {} , Retry Delay: ",
+                            externalTask.getId(), externalTask.getRetries() - 1,
+                            calculateRetryDelay(externalTask.getRetries()));
+                    externalTaskService.handleFailure(externalTask, UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK,
+                            UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK, externalTask.getRetries() - 1,
+                            calculateRetryDelay(externalTask.getRetries()));
+                }
+                logger.debug("The External Task {} Failed", externalTask.getId());
+            }
+        } catch (Exception e) {
+            logger.error("Error during audit query of stack", e);
+        }
+    }
+}
index 576acb1..999d273 100644 (file)
@@ -49,6 +49,9 @@ public class AuditStackService {
     @Autowired
     private AuditDeleteStackService auditDeleteStack;
 
+    @Autowired
+    private AuditQueryStackService auditQueryStack;
+
     @PostConstruct
     public void auditAddAAIInventory() throws Exception {
         for (int i = 0; i < getMaxClients(); i++) {
@@ -69,6 +72,16 @@ public class AuditStackService {
         }
     }
 
+    @PostConstruct
+    public void auditQueryInventory() throws Exception {
+        for (int i = 0; i < getMaxClients(); i++) {
+            ExternalTaskClient client = createExternalTaskClient();
+            client.subscribe("InventoryQueryAudit")
+                    .lockDuration(Long.parseLong(env.getProperty("mso.audit.lock-time", "60000")))
+                    .handler(auditQueryStack::executeExternalTask).open();
+        }
+    }
+
     protected ExternalTaskClient createExternalTaskClient() throws Exception {
         ClientRequestInterceptor interceptor = createClientRequestInterceptor();
         ExternalTaskClient client = ExternalTaskClient.create()
index e009c0e..89e0320 100644 (file)
 
 package org.onap.so.adapters.audit;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import org.onap.aai.domain.yang.LInterface;
 import org.onap.aai.domain.yang.Vserver;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
@@ -40,6 +42,38 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 public class AuditVServer extends AbstractAudit {
     private static final Logger logger = LoggerFactory.getLogger(AuditVServer.class);
 
+    public void auditVservers(AAIObjectAuditList aaiObjectAuditList) {
+
+        aaiObjectAuditList.getAuditList().forEach(aaiObjectAudit -> {
+            boolean vserverExist = getAaiClient().exists(AAIUriFactory
+                    .createResourceFromExistingURI(AAIObjectType.VSERVER, aaiObjectAudit.getResourceURI()));
+            aaiObjectAudit.setDoesObjectExist(vserverExist);
+        });
+    }
+
+    public Optional<AAIObjectAuditList> auditVserversThroughRelationships(String genericVnfId, String vfModuleName) {
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, genericVnfId)
+                .queryParam("vf-module-name", vfModuleName);
+        if (getAaiClient().get(uri).getRelationships().isPresent()) {
+            List<AAIResourceUri> relatedVservers =
+                    getAaiClient().get(uri).getRelationships().get().getRelatedUris(AAIObjectType.VSERVER);
+            if (!relatedVservers.isEmpty()) {
+                relatedVservers.forEach(vserverUri -> {
+                    Optional<Vserver> vserver = getAaiClient().get(vserverUri).asBean(Vserver.class);
+                    Vserver vServerShallow = new Vserver();
+                    BeanUtils.copyProperties(vserver, vServerShallow);
+                    AAIObjectAudit vServerAudit = new AAIObjectAudit();
+                    vServerAudit.setAaiObject(vServerShallow);
+                    vServerAudit.setAaiObjectType(AAIObjectType.VSERVER.typeName());
+                    vServerAudit.setDoesObjectExist(true);
+                    auditList.getAuditList().add(vServerAudit);
+                });
+            }
+        }
+        return Optional.of(auditList);
+    }
+
     public Optional<AAIObjectAuditList> auditVservers(Set<Vserver> vServersToAudit, String tenantId, String cloudOwner,
             String cloudRegion) {
         if (vServersToAudit == null || vServersToAudit.isEmpty()) {
index 2be87ff..06fff19 100644 (file)
@@ -35,11 +35,16 @@ import org.onap.aai.domain.yang.LInterfaces;
 import org.onap.aai.domain.yang.Vlan;
 import org.onap.aai.domain.yang.Vlans;
 import org.onap.aai.domain.yang.Vserver;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.objects.audit.AAIObjectAudit;
 import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.onap.so.openstack.utils.MsoHeatUtils;
 import org.onap.so.openstack.utils.MsoNeutronUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.woorea.openstack.heat.model.Link;
@@ -66,6 +71,28 @@ public class HeatStackAudit {
     @Autowired
     protected AuditVServer auditVservers;
 
+    public Optional<AAIObjectAuditList> queryHeatStack(String cloudOwner, String cloudRegion, String tenantId,
+            String heatStackName) {
+        try {
+            logger.debug("Fetching Top Level Stack Information");
+            Resources resources = heat.queryStackResources(cloudRegion, tenantId, heatStackName, 3);
+            List<Resource> novaResources = resources.getList().stream()
+                    .filter(p -> "OS::Nova::Server".equals(p.getType())).collect(Collectors.toList());
+            if (novaResources.isEmpty())
+                return Optional.of(new AAIObjectAuditList());
+            else {
+                Set<Vserver> vserversToAudit = createVserverSet(novaResources);
+                AAIObjectAuditList aaiObjectAuditList = new AAIObjectAuditList();
+                vserversToAudit.stream().forEach(vServer -> aaiObjectAuditList.getAuditList()
+                        .add(createAAIObjectAudit(cloudOwner, cloudRegion, tenantId, vServer)));
+                return Optional.of(aaiObjectAuditList);
+            }
+        } catch (Exception e) {
+            logger.error("Error during query stack resources", e);
+            return Optional.of(new AAIObjectAuditList());
+        }
+    }
+
     public Optional<AAIObjectAuditList> auditHeatStack(String cloudRegion, String cloudOwner, String tenantId,
             String heatStackName) {
         try {
@@ -215,6 +242,31 @@ public class HeatStackAudit {
         return vserversToAudit;
     }
 
+    protected Set<Vserver> createVserverSet(List<Resource> novaResources) {
+        Set<Vserver> vserversToAudit = new HashSet<>();
+        for (Resource novaResource : novaResources) {
+            Vserver auditVserver = new Vserver();
+            auditVserver.setLInterfaces(new LInterfaces());
+            auditVserver.setVserverId(novaResource.getPhysicalResourceId());
+            vserversToAudit.add(auditVserver);
+        }
+        return vserversToAudit;
+    }
+
+    protected AAIObjectAudit createAAIObjectAudit(String cloudOwner, String cloudRegion, String tenantId,
+            Vserver vServer) {
+        AAIObjectAudit aaiObjectAudit = new AAIObjectAudit();
+        Vserver vServerShallow = new Vserver();
+        BeanUtils.copyProperties(vServer, vServerShallow);
+        aaiObjectAudit.setAaiObject(vServerShallow);
+        aaiObjectAudit.setAaiObjectType(AAIObjectType.VSERVER.typeName());
+        aaiObjectAudit.setResourceURI(AAIUriFactory
+                .createResourceUri(AAIObjectType.VSERVER, cloudOwner, cloudRegion, tenantId, vServer.getVserverId())
+                .build());
+
+        return aaiObjectAudit;
+    }
+
     /**
      * @param novaResource Single openstack resource that is of type Nova
      * @param neutronPorts List of Neutron ports created within the stack
index 74cf7c3..a6c6170 100644 (file)
@@ -3,6 +3,8 @@
  * ONAP - SO
  * ================================================================================
  * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ *
+ * Copyright (C) 2019 IBM
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -39,6 +41,8 @@ public class CreateInventoryTask {
 
     private static final Logger logger = LoggerFactory.getLogger(CreateInventoryTask.class);
 
+    private static final String AAI_INVENTORY_FAILURE = "AAIInventoryFailure";
+
     @Autowired
     CreateAAIInventory createInventory;
 
@@ -73,9 +77,10 @@ public class CreateInventoryTask {
             if (success) {
                 externalTaskService.complete(externalTask);
                 logger.debug("The External Task Id: {}  Successful", externalTask.getId());
+                logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
             } else if (inventoryException) {
                 logger.debug("The External Task Id: {}  Failed, Retry not needed", externalTask.getId());
-                externalTaskService.handleBpmnError(externalTask, "AAIInventoryFailure");
+                externalTaskService.handleBpmnError(externalTask, AAI_INVENTORY_FAILURE);
             } else {
                 if (externalTask.getRetries() == null) {
                     logger.debug("The External Task Id: {}  Failed, Setting Retries to Default Start Value: {}",
@@ -84,7 +89,8 @@ public class CreateInventoryTask {
                             UNABLE_TO_WRITE_ALL_INVENTORY_TO_A_AI, getRetrySequence().length, 10000);
                 } else if (externalTask.getRetries() != null && externalTask.getRetries() - 1 == 0) {
                     logger.debug("The External Task Id: {}  Failed, All Retries Exhausted", externalTask.getId());
-                    externalTaskService.handleBpmnError(externalTask, "AAIInventoryFailure");
+                    externalTaskService.handleBpmnError(externalTask, AAI_INVENTORY_FAILURE);
+                    logger.info(ONAPLogConstants.Markers.EXIT, "Exiting");
                 } else {
                     logger.debug("The External Task Id: {}  Failed, Decrementing Retries: {} , Retry Delay: ",
                             externalTask.getId(), externalTask.getRetries() - 1,
@@ -97,13 +103,15 @@ public class CreateInventoryTask {
             }
         } else {
             logger.debug("The External Task Id: {}  Failed, No Audit Results Written", externalTask.getId());
-            externalTaskService.handleBpmnError(externalTask, "AAIInventoryFailure");
+            externalTaskService.handleBpmnError(externalTask, AAI_INVENTORY_FAILURE);
         }
     }
 
     private void setupMDC(ExternalTask externalTask) {
         try {
-            String msoRequestId = (String) externalTask.getVariable("mso-request-id");
+            logger.info(ONAPLogConstants.Markers.ENTRY, "Entering");
+            MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, externalTask.getTopicName());
+            String msoRequestId = externalTask.getVariable("mso-request-id");
             if (msoRequestId != null && !msoRequestId.isEmpty())
                 MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, msoRequestId);
         } catch (Exception e) {
index d2c0d9c..d9f47f5 100644 (file)
@@ -962,7 +962,7 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
             if (netInfo != null) {
                 // Found. Populate the output elements
                 networkExists.value = Boolean.TRUE;
-                if ("HEAT".equals(mode)) {
+                if ("HEAT".equals(mode) && heatStack != null) {
                     networkId.value = heatStack.getCanonicalName();
                 } else {
                     networkId.value = netInfo.getId();
@@ -1294,15 +1294,23 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
         // Resource Property
         List<ContrailPolicyRef> prlist = new ArrayList<>();
         int index = 1;
-        for (String pf : pFqdns) {
-            if (!commonUtils.isNullOrEmpty(pf)) {
-                ContrailPolicyRef pr = new ContrailPolicyRef();
-                ContrailPolicyRefSeq refSeq = new ContrailPolicyRefSeq(String.valueOf(index), "0");
-                pr.setSeq(refSeq);
-                index++;
-                logger.debug("Contrail PolicyRefs Data:{}", pr);
-                prlist.add(pr);
+
+        if (pFqdns != null) {
+            for (String pf : pFqdns) {
+                if (!commonUtils.isNullOrEmpty(pf)) {
+                    ContrailPolicyRef pr = new ContrailPolicyRef();
+                    ContrailPolicyRefSeq refSeq = new ContrailPolicyRefSeq(String.valueOf(index), "0");
+                    pr.setSeq(refSeq);
+                    index++;
+                    logger.debug("Contrail PolicyRefs Data:{}", pr);
+                    prlist.add(pr);
+                }
             }
+        } else {
+            String error = "Null pFqdns at start of mergePolicyRefs";
+            logger.error(LoggingAnchor.THREE, MessageEnum.RA_MARSHING_ERROR, ErrorCode.BusinessProcesssError.getValue(),
+                    error);
+            throw new MsoAdapterException(error);
         }
 
         JsonNode node = null;
index a141f59..1d73bf2 100644 (file)
@@ -843,8 +843,10 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             // Add version check
             // First - see if it's in the VnfResource record
             // if we have a vf Module - then we have to query to get the VnfResource record.
-            if (!oldWay && vf.getVnfResources() != null) {
-                vnfResource = vf.getVnfResources();
+            if (!oldWay) {
+                if (vf != null) {
+                    vnfResource = vf.getVnfResources();
+                }
                 if (vnfResource == null) {
                     logger.debug("Unable to find vnfResource will not error for now...");
                 }
diff --git a/adapters/mso-openstack-adapters/src/main/resources/application-local.yaml b/adapters/mso-openstack-adapters/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index 66d63d4..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-# will be used as entry in DB to say SITE OFF/ON for healthcheck
-# MSO Properties go here
-org:
-  onap:
-    so:
-      adapters:
-        default_keystone_url_version: /v2.0
-        default_keystone_reg_ex: "/[vV][0-9]"
-        vnf:
-          bpelauth: 1DDAD7A55A230BB446AA2125053EFB46455F43E48B60155E1C53236E175DFC722A6BE120F6DB390C60034C7564AEB653EA
-          checkRequiredParameters: true
-          addGetFilesOnVolumeReq: false
-          sockettimeout: 30
-          connecttimeout: 30
-          retrycount: 5
-          retryinterval: -15
-          retrylist: 408,429,500,502,503,504,900
-        network:
-          bpelauth: 1DDAD7A55A230BB446AA2125053EFB46455F43E48B60155E1C53236E175DFC722A6BE120F6DB390C60034C7564AEB653EA
-          sockettimeout: 5
-          connecttimeout: 5
-          retrycount: 5
-          retryinterval: -15
-          retrylist: 408,429,500,502,503,504,900
-          encryptionKey: aa3871669d893c7fb8abbcda31b88b4f
-        tenant: 
-          default_x_aic_orm_client_string: ECOMP-MSO
-          default_keystone_url_version: /v2.0
-          default_keystone_reg_ex: "/[vV][0-9]"
-          default_tenant_description: ECOMP Tenant
-          default_region_type: single
-          default_user_role: admin
-          default_success_status_string: Success
-          default_no_regions_status_string: no regions
-          default_orm_request_path: /v1/orm/customers/
-          default_orm_url_replace_this: 8080
-          default_orm_url_replace_with_this: 7080
-          default_quota_value: 10
-          set_default_quota: false
-        po:
-          retryCodes: 504
-          retryDelay: 5
-          retryCount: 3
-          pollTimeout: 7500
-          pollInterval: 15
-      
-server-port: 8080
-ssl-enable: false
-tomcat:
-  max-threads: 50
-mso:
-  msoKey: 07a7159d3bf51a0e53be7a8f89699be7
-  auth: 6B466C603A260F3655DBF91E53CE54667041C01406D10E8CAF9CC24D8FA5388D06F90BFE4C852052B436
-  audit:
-    lock-time: 240000
-  logPath: logs
-  msb-ip: localhost
-  msb-port: ${wiremock.server.port}
-  workflow:
-    endpoint: http://bpmn-infra:8081/sobpmnengine
-    topics:
-      retryMultiplier: 1000
-  config:
-    cadi:
-      aafId: test
-  catalog:
-    db:
-      spring:
-        endpoint: "http://localhost:8080"
-  db:
-    auth: Basic YnBlbDptc28tZGItMTUwNyE=
-  site-name: localDevEnv
-  async:
-    core-pool-size: 50
-    max-pool-size: 50
-    queue-capacity: 500
-
-spring:
-  security:
-    usercredentials:
-    -  
-      username: sdnc
-      password: '$2a$12$mukkC6IvLikKGBdwqGnev.H0ccvV6K13TFeLvyNhJoCuNkRjWhqi6'
-      role: SDNC-Client
-    -  
-      username: sitecontrol
-      password: '$2a$12$VBUF.qBmeK1FNyO2MqTpD.P2M1tvlesZlhCkAjjHvF9hmYNVdMDmu'
-      role: SiteControl-Client 
-    -  
-      username: bpel
-      password: '$2a$12$/GW0/AVAUooTag.7GDc9a.jW7XH3nq/.QsJJJFZJ0N24iXB2W9ksO'
-      role: BPEL-Client        
-    -  
-      username: sniro
-      password: '$2a$12$lbOQWS1iDmdQPxW2Mb6OiuTzGaPUrkrvoKVn2zwpFWb6n5Y86Lf1y'
-      role: SNIRO-Client  
-    -  
-      username: apih
-      password: '$2a$12$e1BGJ7qknMN/b7bqsQvU2OT9iGunt9IlfQclKlCs6n240oHBfcO5y'
-      role: MSO-Client
-    -  
-      username: mso_admin
-      password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'
-      role: ACTUATOR
-
diff --git a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditDataServiceTest.java b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditDataServiceTest.java
new file mode 100644 (file)
index 0000000..d3380a6
--- /dev/null
@@ -0,0 +1,101 @@
+package org.onap.so.adapters.audit;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.aai.domain.yang.Vserver;
+import org.onap.so.audit.beans.AuditInventory;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.objects.audit.AAIObjectAudit;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class AuditDataServiceTest {
+
+    @InjectMocks
+    AuditDataService auditDataService = new AuditDataService();
+
+    @Mock
+    protected RequestsDbClient requestsDbClient;
+
+    AuditInventory auditInventory = new AuditInventory();
+
+    @Before
+    public void before() throws JsonProcessingException {
+        auditInventory.setCloudOwner("testCloudOwner");
+        auditInventory.setCloudRegion("testLcpCloudRegionId");
+        auditInventory.setHeatStackName("testVfModuleName1");
+        auditInventory.setVfModuleId("testVnfModuleId");
+        auditInventory.setTenantId("testTenantId");
+        auditInventory.setGenericVnfId("testVnfId1");
+    }
+
+    @Test
+    public void testWriteStackDataToRequestDb() throws Exception {
+        Mockito.doReturn(new ArrayList<RequestProcessingData>()).when(requestsDbClient)
+                .getRequestProcessingDataByGroupingIdAndNameAndTag(Mockito.any(), Mockito.any(), Mockito.any());
+        Mockito.doNothing().when(requestsDbClient).saveRequestProcessingData(Mockito.any());
+
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        auditList.setHeatStackName("testHeatStackName");
+        AAIObjectAudit audit = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        audit.setAaiObject(vserver);
+        auditList.getAuditList().add(audit);
+
+        GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+        String auditListString = objectMapper.getMapper().writeValueAsString(auditList);;
+
+        RequestProcessingData requestProcessingData = new RequestProcessingData();
+        requestProcessingData.setSoRequestId(auditInventory.getMsoRequestId());
+        requestProcessingData.setGroupingId(auditInventory.getVfModuleId());
+        requestProcessingData.setName(auditInventory.getHeatStackName());
+        requestProcessingData.setTag("AuditStackData");
+        requestProcessingData.setValue(auditListString);
+
+        auditDataService.writeStackDataToRequestDb(auditInventory, auditList);
+        Mockito.verify(requestsDbClient, Mockito.times(1)).saveRequestProcessingData(requestProcessingData);
+    }
+
+    @Test
+    public void testGetStackDataToRequestDb() throws Exception {
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        auditList.setHeatStackName("testHeatStackName");
+        AAIObjectAudit audit = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        audit.setAaiObject(vserver);
+        auditList.getAuditList().add(audit);
+        GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+        String auditListString = objectMapper.getMapper().writeValueAsString(audit);
+
+        List<RequestProcessingData> list = new ArrayList();
+        RequestProcessingData requestProcessingData = new RequestProcessingData();
+        requestProcessingData.setId(234321432);
+        requestProcessingData.setGroupingId("testVfModuleId");
+        requestProcessingData.setName("heatStackName");
+        requestProcessingData.setTag("AuditStackData");
+        requestProcessingData.setValue(auditListString);
+        list.add(requestProcessingData);
+
+        Mockito.doReturn(list).when(requestsDbClient).getRequestProcessingDataByGroupingIdAndNameAndTag(Mockito.any(),
+                Mockito.any(), Mockito.any());
+        auditDataService.getStackDataFromRequestDb(auditInventory);
+        Mockito.verify(requestsDbClient, Mockito.times(1)).getRequestProcessingDataByGroupingIdAndNameAndTag(
+                "testVnfModuleId", "testVfModuleName1", "AuditStackData");
+    }
+
+}
index f23486c..3432e4a 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -40,6 +40,7 @@ import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.springframework.core.env.Environment;
 import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
@@ -48,6 +49,9 @@ public class AuditStackServiceDataTest extends AuditCreateStackService {
     @InjectMocks
     private AuditCreateStackService auditStackService = new AuditCreateStackService();
 
+    @InjectMocks
+    private AuditQueryStackService auditQueryStackService = new AuditQueryStackService();
+
     @Mock
     private HeatStackAudit heatStackAuditMock;
 
@@ -60,6 +64,9 @@ public class AuditStackServiceDataTest extends AuditCreateStackService {
     @Mock
     private ExternalTaskService mockExternalTaskService;
 
+    @Mock
+    private AuditDataService auditDataService;
+
     private ObjectMapper objectMapper = new ObjectMapper();
 
     private AuditInventory auditInventory = new AuditInventory();
@@ -111,6 +118,20 @@ public class AuditStackServiceDataTest extends AuditCreateStackService {
         assertNotNull(actualMap.get("auditInventoryResult"));
     }
 
+    @Test
+    public void executeExternalTaskQueryAuditTest() throws JsonProcessingException {
+        doReturn(auditListOptSuccess).when(heatStackAuditMock).queryHeatStack("cloudOwner", "cloudRegion", "tenantId",
+                "stackName");
+        Mockito.doNothing().when(auditDataService).writeStackDataToRequestDb(Mockito.any(AuditInventory.class),
+                Mockito.any(AAIObjectAuditList.class));
+        auditQueryStackService.executeExternalTask(mockExternalTask, mockExternalTaskService);
+        ArgumentCaptor<Map> captor = ArgumentCaptor.forClass(Map.class);
+        ArgumentCaptor<ExternalTask> taskCaptor = ArgumentCaptor.forClass(ExternalTask.class);
+        Mockito.verify(mockExternalTaskService).complete(taskCaptor.capture(), captor.capture());
+        Mockito.verify(auditDataService).writeStackDataToRequestDb(Mockito.any(AuditInventory.class),
+                Mockito.any(AAIObjectAuditList.class));
+    }
+
     @Test
     public void execute_external_task_audit_first_failure_Test() {
         doReturn(auditListOptFailure).when(heatStackAuditMock).auditHeatStack("cloudRegion", "cloudOwner", "tenantId",
index 2075557..3d9a128 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -33,14 +33,19 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.LInterface;
 import org.onap.aai.domain.yang.LInterfaces;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipList;
+import org.onap.aai.domain.yang.VfModule;
 import org.onap.aai.domain.yang.Vserver;
 import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
@@ -48,6 +53,7 @@ import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.objects.audit.AAIObjectAudit;
 import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.skyscreamer.jsonassert.JSONAssert;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -362,6 +368,69 @@ public class AuditVServerTest extends AuditVServer {
         JSONAssert.assertEquals(expected, actualString, false);
     }
 
+    @Test
+    public void testAuditVserversWithList() {
+
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        AAIObjectAudit obj1 = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        obj1.setAaiObject(vserver);
+        obj1.setResourceURI(AAIUriFactory
+                .createResourceUri(AAIObjectType.VSERVER, cloudOwner, cloudRegion, tenantId, "testVserverId").build());
+        auditList.getAuditList().add(obj1);
+
+        doReturn(false).when(aaiResourcesMock).exists(AAIUriFactory.createResourceUri(AAIObjectType.VSERVER, cloudOwner,
+                cloudRegion, tenantId, "testVserverId"));
+
+        auditNova.auditVservers(auditList);
+
+        Mockito.verify(aaiResourcesMock).exists(AAIUriFactory.createResourceUri(AAIObjectType.VSERVER, cloudOwner,
+                cloudRegion, tenantId, "testVserverId"));
+
+        Assert.assertEquals(false, auditList.getAuditList().get(0).isDoesObjectExist());
+    }
+
+    @Test
+    public void testAuditVserversThroughRelationships() {
+
+        VfModule vfModule = new VfModule();
+        vfModule.setVfModuleId("id");
+
+        AAIResultWrapper wrapper = new AAIResultWrapper(vfModule);
+
+        doReturn(wrapper).when(aaiResourcesMock)
+                .get(AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, "genericVnfId")
+                        .queryParam("vf-module-name", "vfModuleName"));
+
+        Optional<AAIObjectAuditList> auditList =
+                auditNova.auditVserversThroughRelationships("genericVnfId", "vfModuleName");
+
+        Assert.assertTrue(auditList.get().getAuditList().isEmpty());
+    }
+
+    @Test
+    public void testAuditVserversThroughRelationships_exists() throws IOException {
+
+        String vfModule = getJson("vfModule.json");
+
+        AAIResultWrapper wrapper = new AAIResultWrapper(vfModule);
+        AAIResultWrapper vserverWrapper = new AAIResultWrapper(new Vserver());
+
+        doReturn(wrapper).when(aaiResourcesMock)
+                .get(AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, "genericVnfId")
+                        .queryParam("vf-module-name", "vfModuleName"));
+
+        doReturn(vserverWrapper).when(aaiResourcesMock).get(AAIUriFactory.createResourceUri(AAIObjectType.VSERVER,
+                "cloud-owner", "cloud-region-id", "tenant-id", "VUSCHGA1"));
+
+        Optional<AAIObjectAuditList> auditList =
+                auditNova.auditVserversThroughRelationships("genericVnfId", "vfModuleName");
+
+        Assert.assertFalse(auditList.get().getAuditList().isEmpty());
+    }
+
+
     private String getJson(String filename) throws IOException {
         return new String(Files.readAllBytes(Paths.get("src/test/resources/" + filename)));
     }
diff --git a/adapters/mso-openstack-adapters/src/test/resources/vfModule.json b/adapters/mso-openstack-adapters/src/test/resources/vfModule.json
new file mode 100644 (file)
index 0000000..bfdca2c
--- /dev/null
@@ -0,0 +1,38 @@
+{
+                "vf-module-id": "a62d14f0-421e-4e64-980a-a368722819db",
+                "vf-module-name": "vig30001vm001vig001_migrated.base.module-0",
+                "is-base-vf-module": false,
+                "resource-version": "1494001780539",
+                "relationship-list": {
+                    "relationship": [
+                        {
+                            "related-to": "vserver",
+                            "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant-id/vservers/vserver/VUSCHGA1",
+                            "relationship-data": [
+                                {
+                                    "relationship-key": "cloud-region.cloud-owner",
+                                    "relationship-value": "cloud-owner"
+                                },
+                                {
+                                    "relationship-key": "cloud-region.cloud-region-id",
+                                    "relationship-value": "cloud-region-id"
+                                },
+                                {
+                                    "relationship-key": "tenant.tenant-id",
+                                    "relationship-value": "tenant-id"
+                                },
+                                {
+                                    "relationship-key": "vserver.vserver-id",
+                                    "relationship-value": "VUSCHGA1"
+                                }
+                            ],
+                            "related-to-property": [
+                                {
+                                    "property-key": "vserver.vserver-name",
+                                    "property-value": "VUSCHGA1"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
diff --git a/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/RequestDbRepositoryConfiguration.java b/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/RequestDbRepositoryConfiguration.java
new file mode 100644 (file)
index 0000000..c32525a
--- /dev/null
@@ -0,0 +1,23 @@
+package org.onap.so.adapters.requestsdb;
+
+import java.util.stream.Collectors;
+import javax.persistence.EntityManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
+
+@Configuration
+public class RequestDbRepositoryConfiguration extends RepositoryRestConfigurerAdapter {
+
+    @Autowired
+    private EntityManager entityManager;
+
+    @Override
+    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
+        config.exposeIdsFor(entityManager.getMetamodel().getEntities().stream().map(e -> e.getJavaType())
+                .collect(Collectors.toList()).toArray(new Class[0]));
+    }
+
+
+}
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/application-local.yaml b/adapters/mso-requests-db-adapter/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index 5d3a837..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-# will be used as entry in DB to say SITE OFF/ON for healthcheck\r
-\r
-server:\r
-    port: 8090\r
-    tomcat:\r
-        max-threads: 50\r
-ssl-enable: false\r
-mso:\r
-  adapters:\r
-    requestDb:\r
-      auth: Basic YnBlbDptc28tZGItMTUwNyE=\r
-      endpoint: http://localhost:8081\r
-  logPath: logs\r
-  site-name: localSite\r
-  infra-requests:\r
-    archived:\r
-      period: 180\r
-spring:\r
-  datasource:\r
-    url: jdbc:mariadb://localhost:3306/requestdb\r
-    username: catalog\r
-    password: catalog123\r
-    driver-class-name: org.mariadb.jdbc.Driver\r
-    initialize: true\r
-    initialization-mode: never\r
-  jpa:\r
-    generate-ddl: false\r
-    show-sql: false\r
-    hibernate:\r
-      ddl-auto: validate\r
-      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy\r
-      enable-lazy-load-no-trans: true\r
-    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect\r
-  security:\r
-    usercredentials:\r
-    -\r
-      username: bpel\r
-      password: '$2a$12$1xyutEZNfjGewIZRfKaE8eZE99f5sYFUmmM80BobI65KNjmcK0JuO'\r
-      role: BPEL-Client\r
-    -  \r
-      username: mso_admin\r
-      password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'\r
-      role: ACTUATOR\r
-\r
-\r
-flyway:\r
-  baseline-on-migrate: false\r
-  url: jdbc:mariadb://localhost:3306/requestdb\r
-  user: catalog\r
-  password: catalog123\r
-      
\ No newline at end of file
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V6.2__Expand_Column_Size_Infra_Active_Requests_Request_Status.sql b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V6.2__Expand_Column_Size_Infra_Active_Requests_Request_Status.sql
new file mode 100644 (file)
index 0000000..427eb0b
--- /dev/null
@@ -0,0 +1,3 @@
+use requestdb;
+
+ALTER TABLE infra_active_requests MODIFY COLUMN REQUEST_STATUS varchar(25) NULL;
\ No newline at end of file
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V6.3__Expand_Column_Size_Archived_Infra_Active_Requests_Request_Status.sql b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V6.3__Expand_Column_Size_Archived_Infra_Active_Requests_Request_Status.sql
new file mode 100644 (file)
index 0000000..0780a61
--- /dev/null
@@ -0,0 +1,3 @@
+use requestdb;
+
+ALTER TABLE archived_infra_requests MODIFY COLUMN REQUEST_STATUS varchar(25) NULL;
\ No newline at end of file
index a38d057..5502308 100644 (file)
@@ -3,6 +3,8 @@
  * ONAP - SO
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ *
+ * Copyright (C) 2019 IBM
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,11 +24,9 @@ package org.onap.so.adapters.sdnc;
 
 import java.util.concurrent.Executor;
 import org.onap.so.logging.jaxrs.filter.MDCTaskDecorator;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
diff --git a/adapters/mso-sdnc-adapter/src/main/resources/application-local.yaml b/adapters/mso-sdnc-adapter/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index 4141548..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-management:
-    context-path: /manage
-mso:
-    async:
-        core-pool-size: 50
-        max-pool-size: 50
-        queue-capacity: 500
-    logPath: /app/logs/sdnc
-    catalog:
-      db:
-        spring:
-          endpoint: "http://localhost:8080"
-    db:
-      auth: Basic YnBlbDptc28tZGItMTUwNyE=
-    site-name: local
-org:
-    onap:
-        so:
-            adapters:
-                sdnc:
-                    '.':
-                        put: PUT|60000|sdncurl5|
-                        query: GET|60000|sdncurl2|
-                        restdelete: DELETE|60000|sdncurl5|
-                    '':
-                        contrail-route-topology-operation:
-                            activate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            assign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            create: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            deactivate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            delete: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            unassign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource                      
-                        network-topology-operation:
-                            activate: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            assign: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            changeassign: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            changedelete: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            delete: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            reserve: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            rollback: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                        security-zone-topology-operation:
-                            activate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            assign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            create: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            deactivate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            delete: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            unassign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource                      
-                        service-topology-operation:
-                            assign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            deactivate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            delete: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            rollback: POST|270000|sdncur10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource                       
-                        vnf-topology-operation:
-                            activate: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            assign: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            changeassign: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            changedelete: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            delete: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                            rollback: POST|270000|sdncurl6|sdnc-request-header|org:onap:sdnctl:vnf
-                    bpelauth: BBD450258299BD2FEF7E3EBA3CD2B58AD417355332319856D761654AA876830A9839820D33DE8426A81E5D48649A4BE6FE7021F5
-                    bpelurl: http://localhost:8080/mso/SDNCAdapterCallbackService                    
-                    generic-resource:
-                        network-topology-operation:
-                            activate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            assign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            deactivate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            unassign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                        vf-module-topology-operation:
-                            activate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            assign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            changeassign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            changedelete: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            deactivate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            delete: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            rollback: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            unassign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                        vnf-topology-operation:
-                            activate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            assign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            changeassign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            changedelete: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            deactivate: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            delete: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            rollback: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                            unassign: POST|270000|sdncurl10|sdnc-request-header|org:onap:sdnc:northbound:generic-resource
-                    infra:
-                        '':
-                            query: GET|60000|sdncurl5|
-                    mobility:
-                        '':
-                            query: GET|60000|sdncurl5|
-                    myurl: http://localhost:8080/adapters/rest/SDNCNotify
-                    rest:
-                        bpelurl: http://localhost:8080/mso/WorkflowMessage
-                    sdncauth: 1C2DC9B30545C5F673B3C33904608E942476F0C969B3CF7A2509459AB83C9062EFAAE89E91D6DB
-                    sdncconnecttime: 5000                
-                    sdncurl10: 'https://localhost:8443/restconf/operations/GENERIC-RESOURCE-API:'                   
-                    sdncurl12: https://localhost:8443/                 
-                    sdncurl5: https://localhost:8443/restconf/config
-                    sdncurl6: 'https://localhost:8443/restconf/operations/VNF-API:'  
-                    vfmodule:
-                        '':
-                            query: GET|60000|sdncurl12|
-                network:
-                  encryptionKey: aa3871669d893c7fb8abbcda31b88b4f
-spring:  
-  security:
-    usercredentials:
-    -  
-      username: sdnc
-      password: '$2a$12$mukkC6IvLikKGBdwqGnev.H0ccvV6K13TFeLvyNhJoCuNkRjWhqi6'
-      role: SDNC-Client
-    -  
-      username: sitecontrol
-      password: '$2a$12$VBUF.qBmeK1FNyO2MqTpD.P2M1tvlesZlhCkAjjHvF9hmYNVdMDmu'
-      role: SiteControl-Client
-    -  
-      username: bpel
-      password: '$2a$12$/GW0/AVAUooTag.7GDc9a.jW7XH3nq/.QsJJJFZJ0N24iXB2W9ksO'
-      role: BPEL-Client
-    -  
-      username: sniro
-      password: '$2a$12$lbOQWS1iDmdQPxW2Mb6OiuTzGaPUrkrvoKVn2zwpFWb6n5Y86Lf1y'
-      role: SNIRO-Client
-    -  
-      username: apih
-      password: '$2a$12$e1BGJ7qknMN/b7bqsQvU2OT9iGunt9IlfQclKlCs6n240oHBfcO5y'
-      role: MSO-Client
-    -  
-      username: mso_admin
-      password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'
-      role: ACTUATOR
-ssl-enable: false
diff --git a/adapters/mso-vfc-adapter/src/main/resources/application-local.yaml b/adapters/mso-vfc-adapter/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index 414dabb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-server:
-    port: 8091
-    tomcat:
-        max-threads: 50
-ssl-enable: false
-mso:
-  logPath: logs
-  site-name: localSite
-spring:
-  datasource:
-    jdbc-url: jdbc:mariadb://localhost:3306/requestdb
-    username: mso
-    password: mso123
-    driver-class-name: org.mariadb.jdbc.Driver
-    initialize: true
-    initialization-mode: never
-  jpa:
-    generate-ddl: false
-    show-sql: false
-    hibernate:
-      ddl-auto: validate
-      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
-      enable-lazy-load-no-trans: true
-    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
-  security:
-    usercredentials:
-    -
-      username: bpel
-      password: '$2a$12$1xyutEZNfjGewIZRfKaE8eZE99f5sYFUmmM80BobI65KNjmcK0JuO'
-      role: BPEL-Client
-    -
-      username: mso_admin
-      password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'
-      role: ACTUATOR
index 09c28f9..e2dd64d 100644 (file)
         </configuration>
       </plugin>
     </plugins>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+        <excludes>
+          <exclude>**/*.p12</exclude>
+          <exclude>**/*.jks</exclude>
+        </excludes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <includes>
+          <include>**/*.p12</include>
+          <include>**/*.jks</include>
+        </includes>
+      </resource>
+    </resources>
   </build>
   <dependencies>
     <dependency>
index 57d6615..735e1f9 100644 (file)
@@ -49,6 +49,7 @@ import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
+import javax.net.ssl.SSLContext;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -133,7 +134,7 @@ public class SdcPackageProvider {
 
     private byte[] getPackage(final String csarId) {
         final String SERVICE_NAME = "vnfm-adapter";
-        try (CloseableHttpClient client = HttpClients.createDefault()) {
+        try (CloseableHttpClient client = HttpClients.custom().setSSLContext(SSLContext.getDefault()).build()) {
             final HttpGet httpget = new HttpGet(format(GET_PACKAGE_URL, baseUrl, csarId));
             httpget.setHeader(ACCEPT, APPLICATION_OCTET_STREAM_VALUE);
             httpget.setHeader("X-ECOMP-InstanceID", SERVICE_NAME);
index 1fa62ef..019a08a 100644 (file)
@@ -28,6 +28,7 @@ import org.onap.aai.domain.yang.GenericVnfs;
 import org.onap.aai.domain.yang.Vserver;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.entities.uri.Depth;
 import org.onap.vnfmadapter.v1.model.Tenant;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,8 +59,8 @@ public class AaiServiceProviderImpl implements AaiServiceProvider {
     @Override
     public GenericVnfs invokeQueryGenericVnf(final String selfLink) {
         return aaiClientProvider.getAaiClient()
-                .get(GenericVnfs.class, AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNFS)
-                        .queryParam("selflink", selfLink.replaceAll("https", "http")))
+                .get(GenericVnfs.class,
+                        AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNFS).queryParam("selflink", selfLink))
                 .orElseGet(() -> {
                     logger.debug("No vnf found in AAI with selflink: {}", selfLink);
                     return null;
@@ -78,7 +79,8 @@ public class AaiServiceProviderImpl implements AaiServiceProvider {
     @Override
     public EsrVnfm invokeGetVnfm(final String vnfmId) {
         return aaiClientProvider.getAaiClient()
-                .get(EsrVnfm.class, AAIUriFactory.createResourceUri(AAIObjectType.VNFM, vnfmId)).orElseGet(() -> {
+                .get(EsrVnfm.class, AAIUriFactory.createResourceUri(AAIObjectType.VNFM, vnfmId).depth(Depth.ONE))
+                .orElseGet(() -> {
                     logger.debug("VNFM not found in AAI");
                     return null;
                 });
index 2aee1c0..3342e0d 100644 (file)
@@ -22,16 +22,34 @@ package org.onap.so.adapters.vnfmadapter.extclients.vnfm;
 
 import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
 import com.google.gson.Gson;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
 import java.util.Iterator;
+import java.util.ListIterator;
+import javax.net.ssl.SSLContext;
+import org.apache.http.client.HttpClient;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContextBuilder;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.JSON;
 import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
 import org.onap.so.configuration.rest.HttpHeadersProvider;
+import org.onap.so.logging.jaxrs.filter.SpringClientFilter;
 import org.onap.so.rest.service.HttpRestServiceProvider;
 import org.onap.so.rest.service.HttpRestServiceProviderImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.Resource;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.json.GsonHttpMessageConverter;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@@ -43,6 +61,13 @@ import org.springframework.web.client.RestTemplate;
 @Configuration
 public class VnfmServiceProviderConfiguration {
 
+    private static final Logger logger = LoggerFactory.getLogger(VnfmServiceProviderConfiguration.class);
+
+    @Value("${http.client.ssl.trust-store}")
+    private Resource keyStore;
+    @Value("${http.client.ssl.trust-store-password}")
+    private String keyStorePassword;
+
     @Bean(name = "vnfmServiceProvider")
     public HttpRestServiceProvider httpRestServiceProvider(
             @Qualifier(CONFIGURABLE_REST_TEMPLATE) @Autowired final RestTemplate restTemplate) {
@@ -52,6 +77,8 @@ public class VnfmServiceProviderConfiguration {
     private HttpRestServiceProvider getHttpRestServiceProvider(final RestTemplate restTemplate,
             final HttpHeadersProvider httpHeadersProvider) {
         setGsonMessageConverter(restTemplate);
+        setTrustStore(restTemplate);
+        removeSpringClientFilter(restTemplate);
         return new HttpRestServiceProviderImpl(restTemplate, httpHeadersProvider);
     }
 
@@ -66,4 +93,30 @@ public class VnfmServiceProviderConfiguration {
         restTemplate.getMessageConverters().add(new GsonHttpMessageConverter(gson));
     }
 
+    private void setTrustStore(final RestTemplate restTemplate) {
+        SSLContext sslContext;
+        try {
+            sslContext = new SSLContextBuilder().loadTrustMaterial(keyStore.getURL(), keyStorePassword.toCharArray())
+                    .build();
+            logger.info("Setting truststore: {}", keyStore.getURL());
+            final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
+            final HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
+            final HttpComponentsClientHttpRequestFactory factory =
+                    new HttpComponentsClientHttpRequestFactory(httpClient);
+            restTemplate.setRequestFactory(factory);
+        } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException | CertificateException
+                | IOException exception) {
+            logger.error("Error reading truststore, TLS connection to VNFM will fail.", exception);
+        }
+    }
+
+    private void removeSpringClientFilter(final RestTemplate restTemplate) {
+        ListIterator<ClientHttpRequestInterceptor> interceptorIterator = restTemplate.getInterceptors().listIterator();
+        while (interceptorIterator.hasNext()) {
+            if (interceptorIterator.next() instanceof SpringClientFilter) {
+                interceptorIterator.remove();
+            }
+        }
+    }
+
 }
index 0b5b09a..c470008 100644 (file)
@@ -54,7 +54,7 @@ public class VnfmServiceProviderImpl implements VnfmServiceProvider {
 
     @Override
     public Optional<InlineResponse201> getVnf(final String vnfSelfLink) {
-        return httpServiceProvider.get(vnfSelfLink.replaceAll("https", "http"), InlineResponse201.class);
+        return httpServiceProvider.get(vnfSelfLink, InlineResponse201.class);
     }
 
     @Override
index a4f7d32..fa2fa30 100644 (file)
@@ -114,7 +114,7 @@ public class LifecycleManager {
     private String getSelfLink(final InlineResponse201 vnfmResponse, final EsrVnfm vnfm) {
         if (vnfmResponse.getLinks() != null && vnfmResponse.getLinks().getSelf() != null
                 && vnfmResponse.getLinks().getSelf().getHref() != null) {
-            return vnfmResponse.getLinks().getSelf().getHref().replaceAll("https", "http");
+            return vnfmResponse.getLinks().getSelf().getHref();
         }
         return vnfm.getEsrSystemInfoList().getEsrSystemInfo().iterator().next().getServiceUrl() + "/vnf_instances/"
                 + vnfmResponse.getId();
index 951d4a3..0bd63df 100644 (file)
@@ -23,6 +23,12 @@ spring:
   http:
     converters:
     preferred-json-mapper: gson
+    
+http:
+  client:
+    ssl:
+      trust-store: classpath:org.onap.so.trust.jks
+      trust-store-password: ',sx#.C*W)]wVgJC6ccFHI#:H'
         
 server:
   port: 9092
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/org.onap.so.trust.jks b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/org.onap.so.trust.jks
new file mode 100644 (file)
index 0000000..1f0d8a5
Binary files /dev/null and b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/org.onap.so.trust.jks differ
index a5e3340..e00bb1e 100644 (file)
@@ -38,21 +38,26 @@ import java.security.SecureRandom;
 @Profile("!test")
 public class ASDCControllerSingleton {
 
+    private static final Logger logger = LoggerFactory.getLogger(ASDCControllerSingleton.class);
+    private final ASDCController asdcController;
 
     @Autowired
-    private ASDCController asdcController;
-    private static Logger logger = LoggerFactory.getLogger(ASDCControllerSingleton.class);
-
-
+    public ASDCControllerSingleton(final ASDCController asdcController) {
+        this.asdcController = asdcController;
+    }
 
     @Scheduled(fixedRate = 50000)
     public void periodicControllerTask() {
         try {
-            int randomNumber = new SecureRandom().nextInt(Integer.MAX_VALUE);
+            final int randomNumber = new SecureRandom().nextInt(Integer.MAX_VALUE);
             asdcController.setControllerName("mso-controller" + randomNumber);
-            asdcController.initASDC();
-        } catch (ASDCControllerException e) {
-            logger.error("Exception occurred", e);
+            if (asdcController.isStopped()) {
+                logger.info("{} not running will try to initialize it, currrent status: {}",
+                        asdcController.getClass().getName(), asdcController.getControllerStatus());
+                asdcController.initASDC();
+            }
+        } catch (final ASDCControllerException controllerException) {
+            logger.error("Exception occurred", controllerException);
         }
     }
 
@@ -60,8 +65,8 @@ public class ASDCControllerSingleton {
     private void terminate() {
         try {
             asdcController.closeASDC();
-        } catch (ASDCControllerException e) {
-            logger.error("Exception occurred", e);
+        } catch (final ASDCControllerException controllerException) {
+            logger.error("Exception occurred", controllerException);
         }
     }
 
index eb2957c..2c83472 100644 (file)
@@ -35,7 +35,6 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableJpaRepositories("org.onap.so.db.catalog.data.repository")
 public class Application {
     private static final Logger logger = LoggerFactory.getLogger(Application.class);
-    private static final String MSO_CONFIG_PATH = "mso.config.path";
     private static final String LOGS_DIR = "logs_dir";
 
     @Autowired
@@ -47,11 +46,6 @@ public class Application {
         }
     }
 
-    private static void setConfigPath() {
-        if (System.getProperty(MSO_CONFIG_PATH) == null)
-            System.getProperties().setProperty(MSO_CONFIG_PATH, ".");
-    }
-
     @PostConstruct
     private void deployActivities() {
         try {
index 9025069..22265a0 100644 (file)
@@ -24,7 +24,9 @@ import javax.annotation.PostConstruct;
 import javax.ws.rs.ApplicationPath;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.onap.so.asdc.client.test.rest.ASDCRestInterface;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
 import io.swagger.jaxrs.config.BeanConfig;
 import io.swagger.jaxrs.listing.ApiListingResource;
 import io.swagger.jaxrs.listing.SwaggerSerializers;
@@ -33,6 +35,12 @@ import io.swagger.jaxrs.listing.SwaggerSerializers;
 @ApplicationPath("/test")
 public class JerseyConfiguration extends ResourceConfig {
 
+    private Environment environment;
+
+    @Autowired
+    public JerseyConfiguration(final Environment environment) {
+        this.environment = environment;
+    }
 
     @PostConstruct
     public void setUp() {
@@ -40,10 +48,10 @@ public class JerseyConfiguration extends ResourceConfig {
         register(ApiListingResource.class);
         register(SwaggerSerializers.class);
 
-        BeanConfig beanConfig = new BeanConfig();
+        final BeanConfig beanConfig = new BeanConfig();
         beanConfig.setVersion("1.0.2");
         beanConfig.setSchemes(new String[] {"http"});
-        beanConfig.setHost("localhost:8080");
+        beanConfig.setHost("localhost:" + environment.getProperty("server.port"));
         beanConfig.setBasePath("/mso");
         beanConfig.setResourcePackage("org.onap.so.apihandlerinfra");
         beanConfig.setPrettyPrint(true);
index 563291c..3b9406a 100644 (file)
@@ -196,11 +196,9 @@ public class ASDCController {
      * @throws IOException In case of issues when trying to load the key file
      */
     public void initASDC() throws ASDCControllerException {
-        String event = "Initialize the ASDC Controller";
-        logger.debug(event);
-        if (this.getControllerStatus() != ASDCControllerStatus.STOPPED) {
-            String endEvent = "The controller is already initialized, call the closeASDC method first";
-            throw new ASDCControllerException(endEvent);
+        logger.debug("Initialize the ASDC Controller");
+        if (!isStopped()) {
+            throw new ASDCControllerException("The controller is already initialized, call the closeASDC method first");
         }
 
         if (asdcConfig != null) {
@@ -237,6 +235,13 @@ public class ASDCController {
                 "changeControllerStatus");
     }
 
+    /**
+     * @return true if controller is stopped
+     */
+    public boolean isStopped() {
+        return this.getControllerStatus() == ASDCControllerStatus.STOPPED;
+    }
+
     /**
      * This method closes the ASDC Controller and the ASDC Client.
      *
@@ -245,7 +250,7 @@ public class ASDCController {
      */
     public void closeASDC() throws ASDCControllerException {
 
-        if (this.getControllerStatus() == ASDCControllerStatus.BUSY) {
+        if (isBusy()) {
             throw new ASDCControllerException("Cannot close the ASDC controller as it's currently in BUSY state");
         }
         if (this.distributionClient != null) {
@@ -261,6 +266,13 @@ public class ASDCController {
         this.changeControllerStatus(ASDCControllerStatus.STOPPED);
     }
 
+    /**
+     * @return true if controller is currently processing notification
+     */
+    public boolean isBusy() {
+        return this.getControllerStatus() == ASDCControllerStatus.BUSY;
+    }
+
     protected boolean checkResourceAlreadyDeployed(ResourceStructure resource, boolean serviceDeployed)
             throws ArtifactInstallerException {
 
@@ -713,12 +725,6 @@ public class ASDCController {
 
         try {
             this.processCsarServiceArtifacts(iNotif, toscaResourceStructure);
-            IArtifactInfo iArtifact = toscaResourceStructure.getToscaArtifact();
-            String filePath =
-                    msoConfigPath + "/ASDC/" + iArtifact.getArtifactVersion() + "/" + iArtifact.getArtifactName();
-            File csarFile = new File(filePath);
-
-
             if (isCsarAlreadyDeployed(iNotif, toscaResourceStructure)) {
                 return;
             }
index f4cfb13..93e4aee 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
  * 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
@@ -59,7 +61,7 @@ public class ArtifactInfoImpl implements IArtifactInfo {
     }
 
     public static List<ArtifactInfoImpl> convertToArtifactInfoImpl(List<IArtifactInfo> list) {
-        List<ArtifactInfoImpl> ret = new ArrayList<ArtifactInfoImpl>();
+        List<ArtifactInfoImpl> ret = new ArrayList<>();
         if (list != null) {
             for (IArtifactInfo artifactInfo : list) {
                 ret.add(new ArtifactInfoImpl(artifactInfo));
@@ -159,7 +161,7 @@ public class ArtifactInfoImpl implements IArtifactInfo {
 
     @Override
     public List<IArtifactInfo> getRelatedArtifacts() {
-        List<IArtifactInfo> temp = new ArrayList<IArtifactInfo>();
+        List<IArtifactInfo> temp = new ArrayList<>();
         if (relatedArtifactsInfo != null) {
             temp.addAll(relatedArtifactsImpl);
         }
index 56690a8..24e1887 100644 (file)
@@ -23,7 +23,6 @@
 package org.onap.so.asdc.client.test.rest;
 
 
-import java.io.IOException;
 import javax.transaction.Transactional;
 import javax.ws.rs.HeaderParam;
 import javax.ws.rs.POST;
@@ -31,15 +30,14 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import org.onap.so.logger.LoggingAnchor;
+import javax.ws.rs.core.Response.Status;
 import org.onap.so.asdc.client.ASDCController;
-import org.onap.so.asdc.client.exceptions.ASDCControllerException;
-import org.onap.so.asdc.client.exceptions.ASDCParametersException;
 import org.onap.so.asdc.client.test.emulators.DistributionClientEmulator;
-import org.onap.so.asdc.client.test.emulators.NotificationDataImpl;
 import org.onap.so.asdc.client.test.emulators.JsonStatusData;
+import org.onap.so.asdc.client.test.emulators.NotificationDataImpl;
 import org.onap.so.asdc.installer.heat.ToscaResourceInstaller;
 import org.onap.so.logger.ErrorCode;
+import org.onap.so.logger.LoggingAnchor;
 import org.onap.so.logger.MessageEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,13 +46,15 @@ import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 
 /**
- * This is a TEST only rest interface. It is not used in production, it is used to aid in testing the ASDC service on
- * jboss without the need to be connected to the ASDC service broker. It starts the test at the treatNotification step
- * and simulates both the notification step as well as the artifact download step.
+ * This is a TEST only rest interface. It is not used in production, it is used to aid in testing the ASDC service
+ * without the need to be connected to the ASDC service broker. It starts the test at the treatNotification step and
+ * simulates both the notification step as well as the artifact download step.
  * <p>
- * i.e. http://localhost:8080/asdc/treatNotification/v1
+ * i.e. http://localhost:8085/test/treatNotification/v1
  * <p>
- * i.e. http://localhost:8080/asdc/statusData/v1
+ * i.e. http://localhost:8085/test/statusData/v1
+ * 
+ * This interface is also used in CSIT to simulate a distribution of a service, without using SDC
  *
  * @author jm5423
  */
@@ -66,48 +66,75 @@ public class ASDCRestInterface {
 
     private static final Logger logger = LoggerFactory.getLogger(ASDCRestInterface.class);
 
-    @Autowired
-    private ASDCController asdcController;
+    private final ASDCController asdcController;
+
+    private final ToscaResourceInstaller toscaInstaller;
 
     @Autowired
-    private ToscaResourceInstaller toscaInstaller;
+    public ASDCRestInterface(final ASDCController asdcController, final ToscaResourceInstaller toscaInstaller) {
+        this.asdcController = asdcController;
+        this.toscaInstaller = toscaInstaller;
+    }
 
     @POST
     @Path("/treatNotification/v1")
     @Produces(MediaType.APPLICATION_JSON)
     @Transactional
-    public Response invokeASDCService(NotificationDataImpl request,
-            @HeaderParam("resource-location") String resourceLocation)
-            throws ASDCControllerException, ASDCParametersException, IOException {
-        DistributionClientEmulator distributionClientEmulator = new DistributionClientEmulator(resourceLocation);
-
-        asdcController.setControllerName("asdc-controller1");
-        asdcController.setDistributionClient(distributionClientEmulator);
-        asdcController.initASDC();
-        asdcController.treatNotification(request);
-        asdcController.closeASDC();
-        return Response.status(200).build();
+    public Response invokeASDCService(final NotificationDataImpl request,
+            @HeaderParam("resource-location") final String resourceLocation) {
+
+        try {
+            logger.info("Received message : {}", request);
+            logger.info("resource-location : {}", resourceLocation);
+            final DistributionClientEmulator distributionClientEmulator =
+                    getDistributionClientEmulator(resourceLocation);
+
+            asdcController.setControllerName("asdc-controller1");
+            asdcController.setDistributionClient(distributionClientEmulator);
+
+            if (asdcController.isStopped()) {
+                logger.info("{} not running will try to initialize it, currrent status: {}",
+                        asdcController.getClass().getName(), asdcController.getControllerStatus());
+                asdcController.initASDC();
+            }
+
+            asdcController.treatNotification(request);
+
+            if (!asdcController.isBusy()) {
+                asdcController.closeASDC();
+            }
+
+            return Response.status(Status.OK).build();
+        } catch (final Exception exception) {
+            logger.error("Unable to process notification request", exception);
+            return Response.status(Status.INTERNAL_SERVER_ERROR).build();
+        }
+
+    }
+
+    private DistributionClientEmulator getDistributionClientEmulator(final String resourceLocation) {
+        return new DistributionClientEmulator(resourceLocation);
     }
 
     @POST
     @Path("/statusData/v1")
     @Produces(MediaType.APPLICATION_JSON)
     @Transactional
-    public Response invokeASDCStatusData(String request) {
+    public Response invokeASDCStatusData(final String request) {
 
         try {
-            DistributionClientEmulator distributionClientEmulator =
-                    new DistributionClientEmulator("resource-examples/");
-            JsonStatusData statusData = JsonStatusData.instantiateNotifFromJsonFile("resource-examples/");
+            final DistributionClientEmulator distributionClientEmulator =
+                    getDistributionClientEmulator("resource-examples/");
+            final JsonStatusData statusData = JsonStatusData.instantiateNotifFromJsonFile("resource-examples/");
 
-            ASDCController controller = new ASDCController("asdc-controller1", distributionClientEmulator);
-            controller.initASDC();
+            asdcController.setDistributionClient(distributionClientEmulator);
+            asdcController.initASDC();
             toscaInstaller.installTheComponentStatus(statusData);
-            controller.closeASDC();
+            asdcController.closeASDC();
 
             logger.info(LoggingAnchor.FOUR, MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC.toString(),
                     statusData.getDistributionID(), "ASDC", "ASDC Updates Are Complete");
-        } catch (Exception e) {
+        } catch (final Exception e) {
             logger.info("Error caught " + e.getMessage());
             logger.error(LoggingAnchor.SIX, MessageEnum.ASDC_GENERAL_EXCEPTION.toString(),
                     "Exception caught during ASDCRestInterface", "ASDC", "invokeASDCService",
diff --git a/asdc-controller/src/main/resources/application-local.yaml b/asdc-controller/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index 1b21d8b..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-# will be used as entry in DB to say SITE OFF/ON for healthcheck
-
-server-port: 8080
-ssl-enable: false
-
-
-
-# H2
-spring:
-  datasource:
-    jdbc-url: jdbc:mariadb://localhost:3306/catalogdb
-    username: root
-    password: password
-    driver-class-name: org.mariadb.jdbc.Driver
-    initialize: true
-
-  jpa:
-      show-sql: true
-      hibernate:
-        ddl-auto: validate
-        naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
-        enable-lazy-load-no-trans: true
-      database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
-  security:
-    usercredentials:
-    -  
-      username: asdc
-      password: '$2a$12$4R2QhxH7elzoZYoC.HJKTOHYDoaC9LbJD44Q9/tm4t/UzPF9Cgifi'
-      role: Asdc-Client 
-    -  
-      username: mso_admin
-      password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'
-      role: ACTUATOR        
-request:
-  datasource:
-    jdbc-url: jdbc:mariadb://localhost:3306/requestdb
-    username: root
-    password: password
-    driver-class-name: org.mariadb.jdbc.Driver
-    initialize: true
-    initialization-mode: never
-
-#Actuator
-management:
-  endpoints:
-    web:
-      base-path: /manage
-  server:
-    servlet:
-      context-path: /manage
-  metrics:
-    se-global-registry: false
-    export:
-      prometheus:
-        enabled: true # Whether exporting of metrics to Prometheus is enabled.
-        step: 1m # Step size (i.e. reporting frequency) to use.  
-
-
-mso:
-  logPath: logs
-  catalog:
-    db:
-      spring:
-        endpoint: "http://localhost:8090"
-  db:
-    auth: Basic YnBlbDptc28tZGItMTUwNyE=
-  site-name: siteName
-  aai:  
-    endpoint: https://localhost:8443
-  asdc-connections:
-    asdc-controller1:
-      user: msopreist
-      consumerGroup: msoasdc-id-local
-      consumerId: msoasdc-id-local
-      environmentName: Pre-IST
-      asdcAddress: localhost:8443
-      password: CB655C3C236F1F0370A347E3A0E0E133BE10ADCF4D16377E7378D3FE46A4BF60C27DF1FFB4
-      pollingInterval: 30
-      pollingTimeout: 30
-      relevantArtifactTypes: HEAT,HEAT_ENV,HEAT_VOL
-      useHttpsWithDmaap: true
-      activateServerTLSAuth: false
-      keyStorePassword:  
-      keyStorePath:
-      watchDogTimeout: 1
-      isFitlerInEmptyResources: true
-      messageBusAddress: localhost,localhost,localhost
-  asdc:
-    config:
-      key: 566B754875657232314F5548556D3665
-      components:
-        count: 3,
-        componentNames: SO,AAI,SDNC
-  scheduling:
-    enabled: false
index d95dbe2..c231503 100644 (file)
@@ -34,6 +34,7 @@ import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.logger.MessageEnum
+import org.onap.so.utils.TargetEntities
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -283,6 +284,16 @@ class ExceptionUtil extends AbstractServiceTaskProcessor {
                execution.setVariable("WorkflowException", exception);
                logger.debug("Outgoing WorkflowException is " + exception)
        }
+       
+       public void buildWorkflowException(DelegateExecution execution, int errorCode, String errorMessage, TargetEntities extSystemErrorSource) {
+               MsoUtils utils = new MsoUtils()
+               String processKey = getProcessKey(execution);
+               logger.debug("Building a WorkflowException for " + processKey)
+
+               WorkflowException exception = new WorkflowException(processKey, errorCode, errorMessage, extSystemErrorSource);
+               execution.setVariable("WorkflowException", exception);
+               logger.debug("Outgoing WorkflowException is " + exception)
+       }
 
        /**
         * This error handling method builds a WorkflowException Object and throws a
index a769eca..866229f 100644 (file)
@@ -40,7 +40,6 @@ import java.util.UUID
 
 
 
-
 class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
     private static final Logger logger = LoggerFactory.getLogger( VnfAdapterRestV1.class);
 
@@ -81,7 +80,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                String msg = getProcessKey(execution) + ': no messageId in ' + requestType
                                logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                ErrorCode.UnknownError.getValue());
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                        }
 
                        execution.setVariable('VNFAResponse_CORRELATOR', messageId)
@@ -95,7 +94,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                String msg = getProcessKey(execution) + ': no notificationUrl in ' + requestType
                                logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                ErrorCode.UnknownError.getValue());
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                        }
 
                        execution.setVariable(prefix + 'notificationUrl', notificationUrl)
@@ -109,7 +108,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                String msg = getProcessKey(execution) + ': mso:adapters:vnf:rest:endpoint URN mapping is not defined'
                                logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                ErrorCode.UnknownError.getValue());
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                        }
 
                        while (vnfAdapterEndpoint.endsWith('/')) {
@@ -127,7 +126,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vnfId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                vnfAdapterMethod = 'POST'
@@ -140,7 +139,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vnfId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                String vfModuleId = getChildText(root, 'vfModuleId')
@@ -149,7 +148,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vfModuleId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                vnfAdapterMethod = 'PUT'
@@ -163,7 +162,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vnfId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                String vfModuleId = getChildText(root, 'vfModuleId')
@@ -172,7 +171,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vfModuleId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                vnfAdapterMethod = 'DELETE'
@@ -186,7 +185,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vfModuleRollback in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                String vnfId = getChildText(vfModuleRollbackNode, 'vnfId')
@@ -195,7 +194,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vnfId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                String vfModuleId = getChildText(vfModuleRollbackNode, 'vfModuleId')
@@ -204,7 +203,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no vfModuleId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                vnfAdapterMethod = 'DELETE'
@@ -225,7 +224,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no volumeGroupId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                vnfAdapterMethod = 'PUT'
@@ -241,7 +240,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no volumeGroupId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                vnfAdapterMethod = 'DELETE'
@@ -257,7 +256,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                        String msg = getProcessKey(execution) + ': no volumeGroupId in ' + requestType
                                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                        ErrorCode.UnknownError.getValue());
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                                }
 
                                vnfAdapterMethod = 'DELETE'
@@ -270,7 +269,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                String msg = getProcessKey(execution) + ': Unsupported request type: ' + requestType
                                logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                ErrorCode.UnknownError.getValue());
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                        }
 
                        execution.setVariable(prefix + 'vnfAdapterMethod', vnfAdapterMethod)
@@ -307,7 +306,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                        ErrorCode.UnknownError.getValue());
                        logger.debug(msg)
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                }
        }
 
@@ -358,7 +357,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                                String msg = 'Unsupported HTTP method "' + vnfAdapterMethod + '" in ' + method + ": " + e
                                logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                                ErrorCode.UnknownError.getValue());
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                        }
 
                        execution.setVariable(prefix + "vnfAdapterStatusCode", response.getStatus())
@@ -371,7 +370,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                        String msg = 'Caught exception in ' + method + ": " + e
                        logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
                                        ErrorCode.UnknownError.getValue());
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg, TargetEntity.SO)
                }
        }
 
@@ -400,7 +399,7 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                        }
                } catch (Exception e) {
                        logger.debug("Error encountered within VnfAdapterRest ProcessCallback method: {}", e.getMessage(), e)
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7020, "Error encountered within VnfAdapterRest ProcessCallback method")
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7020, "Error encountered within VnfAdapterRest ProcessCallback method", TargetEntity.SO)
                }
        }
 
@@ -419,10 +418,10 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                        String rolledBack = getChildText(root, "rolledBack")
                        rolledBack = rolledBack == null || rolledBack.isEmpty() ? "" : " rolledBack='" + rolledBack + "'"
                        exceptionUtil.buildWorkflowException(execution, 7020, "Received " + root.name() +
-                               " from VnfAdapter:" + category + message + rolledBack);
+                               " from VnfAdapter:" + category + message + rolledBack, TargetEntity.OPENSTACK);
                } catch (Exception e) {
                        response = response == null || String.valueOf(response).isEmpty() ? "NONE" : response
-                       exceptionUtil.buildWorkflowException(execution, 7020, "Received error from VnfAdapter: " + response)
+                       exceptionUtil.buildWorkflowException(execution, 7020, "Received error from VnfAdapter: " + response, TargetEntity.OPENSTACK)
                }
        }
 
index 8ac5f6e..f8d5402 100644 (file)
@@ -23,6 +23,9 @@
 package org.onap.so.bpmn.servicedecomposition.tasks;
 
 import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -42,6 +45,7 @@ import org.onap.aai.domain.yang.VolumeGroups;
 import org.onap.aai.domain.yang.VpnBinding;
 import org.onap.so.bpmn.common.InjectionHelper;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.MultipleObjectsFoundException;
 import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.NoServiceInstanceFoundException;
 import org.onap.so.client.aai.AAIObjectPlurals;
@@ -59,6 +63,7 @@ import org.onap.so.db.catalog.beans.VfModuleCustomization;
 import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
+import org.onap.so.db.request.beans.RequestProcessingData;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 import org.onap.so.serviceinstancebeans.ModelType;
@@ -69,7 +74,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
@@ -79,6 +87,9 @@ public class BBInputSetupUtils {
     private static final Logger logger = LoggerFactory.getLogger(BBInputSetupUtils.class);
     private ObjectMapper objectMapper = new ObjectMapper();
     private static final String REQUEST_ERROR = "Could not find request.";
+    private static final String DATA_LOAD_ERROR = "Could not process loading data from database";
+    private static final String DATA_PARSE_ERROR = "Could not parse data";
+    private static final String PROCESSING_DATA_NAME_EXECUTION_FLOWS = "flowExecutionPath";
 
     @Autowired
     protected CatalogDbClient catalogDbClient;
@@ -139,6 +150,66 @@ public class BBInputSetupUtils {
         }
     }
 
+    public void persistFlowExecutionPath(String requestId, List<ExecuteBuildingBlock> flowsToExecute) {
+
+        if (requestId != null) {
+            List<String> flows = new ArrayList<>();
+            ObjectMapper om = new ObjectMapper();
+            try {
+                for (ExecuteBuildingBlock ebb : flowsToExecute) {
+                    flows.add(om.writeValueAsString(ebb));
+                }
+            } catch (JsonProcessingException e) {
+                logger.error(DATA_PARSE_ERROR, e);
+            }
+
+            this.requestsDbClient.persistProcessingData(flows.toString(), requestId);
+        } else {
+            logger.debug(REQUEST_ERROR);
+        }
+    }
+
+    public InfraActiveRequests loadInfraActiveRequestById(String requestId) {
+
+        return this.requestsDbClient.getInfraActiveRequestbyRequestId(requestId);
+    }
+
+    public InfraActiveRequests loadOriginalInfraActiveRequestById(String requestId) {
+
+        return this.requestsDbClient.getInfraActiveRequestbyRequestId(
+                this.requestsDbClient.getInfraActiveRequestbyRequestId(requestId).getOriginalRequestId());
+    }
+
+    public List<ExecuteBuildingBlock> loadOriginalFlowExecutionPath(String requestId) {
+
+        List<ExecuteBuildingBlock> asList = null;
+        if (requestId != null) {
+
+            InfraActiveRequests request = loadInfraActiveRequestById(requestId);
+
+            if (request.getOriginalRequestId() != null) {
+
+                RequestProcessingData requestProcessingData =
+                        this.requestsDbClient.getRequestProcessingDataBySoRequestIdAndName(
+                                request.getOriginalRequestId(), PROCESSING_DATA_NAME_EXECUTION_FLOWS);
+
+                ObjectMapper om = new ObjectMapper();
+                try {
+                    ExecuteBuildingBlock[] asArray =
+                            om.readValue(requestProcessingData.getValue(), ExecuteBuildingBlock[].class);
+                    asList = Arrays.asList(asArray);
+                } catch (Exception e) {
+                    logger.error(DATA_LOAD_ERROR, e);
+                }
+            }
+
+        } else {
+            logger.debug(REQUEST_ERROR);
+        }
+
+        return asList;
+    }
+
     public Service getCatalogServiceByModelUUID(String modelUUID) {
         return catalogDbClient.getServiceByID(modelUUID);
     }
index 122e718..fd2054c 100644 (file)
@@ -30,10 +30,13 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.macro.RainyDayHandlerStatus;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.utils.TargetEntities;
+import org.onap.so.utils.TargetEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +48,7 @@ public class ExecuteBuildingBlockRainyDay {
 
     private static final Logger logger = LoggerFactory.getLogger(ExecuteBuildingBlockRainyDay.class);
     public static final String HANDLING_CODE = "handlingCode";
+    public static final String ROLLBACK_TARGET_STATE = "rollbackTargetState";
 
     @Autowired
     private CatalogDbClient catalogDbClient;
@@ -165,6 +169,18 @@ public class ExecuteBuildingBlockRainyDay {
                 if (handlingCode.equals("RollbackToAssigned") && !aLaCarte) {
                     handlingCode = "Rollback";
                 }
+                if (handlingCode.startsWith("Rollback")) {
+                    String targetState = "";
+                    if (handlingCode.equalsIgnoreCase("RollbackToAssigned")) {
+                        targetState = Status.ROLLED_BACK_TO_ASSIGNED.toString();
+                    } else if (handlingCode.equalsIgnoreCase("RollbackToCreated")) {
+                        targetState = Status.ROLLED_BACK_TO_CREATED.toString();
+                    } else {
+                        targetState = Status.ROLLED_BACK.toString();
+                    }
+                    execution.setVariable(ROLLBACK_TARGET_STATE, targetState);
+                    logger.debug("Rollback target state is: {}", targetState);
+                }
             }
             logger.debug("RainyDayHandler Status Code is: {}", handlingCode);
             execution.setVariable(HANDLING_CODE, handlingCode);
@@ -185,4 +201,44 @@ public class ExecuteBuildingBlockRainyDay {
     public void setHandlingStatusSuccess(DelegateExecution execution) {
         execution.setVariable(HANDLING_CODE, "Success");
     }
+
+    public void updateExtSystemErrorSource(DelegateExecution execution) {
+        try {
+            String requestId = (String) execution.getVariable("mso-request-id");
+            WorkflowException exception = (WorkflowException) execution.getVariable("WorkflowException");
+            TargetEntities extSystemErrorSource = exception.getExtSystemErrorSource();
+            InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
+            Boolean isRollbackFailure = (Boolean) execution.getVariable("isRollback");
+            if (isRollbackFailure == null) {
+                isRollbackFailure = false;
+            }
+
+            if (extSystemErrorSource != null) {
+                String extSystemErrorSourceString = extSystemErrorSource.toString();
+                if (isRollbackFailure) {
+                    logger.debug("Updating extSystemErrorSource for isRollbackFailure to {} for request: {}",
+                            extSystemErrorSourceString, requestId);
+                    request.setRollbackExtSystemErrorSource(extSystemErrorSourceString);
+                } else {
+                    logger.debug("Updating extSystemErrorSource to {} for request: {}", extSystemErrorSourceString,
+                            requestId);
+                    request.setExtSystemErrorSource(extSystemErrorSourceString);
+                }
+            } else if (isRollbackFailure) {
+                logger.debug(
+                        "rollbackExtSystemErrorSource is null for isRollbackFailure. Setting rollbackExtSystemErrorSource to UNKNOWN");
+                request.setRollbackExtSystemErrorSource(TargetEntity.UNKNOWN.toString());
+            } else {
+                logger.debug("extSystemErrorSource is null. Setting extSystemErrorSource to UNKNOWN");
+                request.setExtSystemErrorSource(TargetEntity.UNKNOWN.toString());
+            }
+
+            request.setLastModifiedBy("CamundaBPMN");
+            requestDbclient.updateInfraActiveRequests(request);
+        } catch (Exception e) {
+            logger.error("Failed to update Request db with extSystemErrorSource or rollbackExtSystemErrorSource: "
+                    + e.getMessage());
+        }
+    }
+
 }
index b76316b..b2dbd97 100644 (file)
@@ -60,7 +60,7 @@ public class ExtractPojosForBB {
                     if (gBBInput.getCustomer().getServiceSubscription() == null
                             && gBBInput.getServiceInstance() != null) {
                         result = Optional.of((T) gBBInput.getServiceInstance());
-                    } else {
+                    } else if (gBBInput.getCustomer().getServiceSubscription() != null) {
                         result = lookupObjectInList(
                                 gBBInput.getCustomer().getServiceSubscription().getServiceInstances(), value);
                     }
index d656314..100887d 100644 (file)
@@ -43,6 +43,8 @@ import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvide
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.objects.audit.AAIObjectAudit;
 import org.onap.so.objects.audit.AAIObjectAuditList;
+import org.onap.so.utils.TargetEntities;
+import org.onap.so.utils.TargetEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -89,6 +91,39 @@ public class ExceptionBuilder {
         buildAndThrowWorkflowException(execution, errorCode, msg);
     }
 
+    public void buildAndThrowWorkflowException(BuildingBlockExecution execution, int errorCode, Exception exception,
+            TargetEntities extSystemErrorSource) {
+        String msg = "Exception in %s.%s ";
+        try {
+            logger.error("Exception occurred", exception);
+
+            String errorVariable = "Error%s%s";
+
+            StackTraceElement[] trace = Thread.currentThread().getStackTrace();
+            for (StackTraceElement traceElement : trace) {
+                if (!traceElement.getClassName().equals(this.getClass().getName())
+                        && !traceElement.getClassName().equals(Thread.class.getName())) {
+                    msg = String.format(msg, traceElement.getClassName(), traceElement.getMethodName());
+                    String shortClassName =
+                            traceElement.getClassName().substring(traceElement.getClassName().lastIndexOf(".") + 1);
+                    errorVariable = String.format(errorVariable, shortClassName, traceElement.getMethodName());
+                    break;
+                }
+            }
+
+            logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
+                    ErrorCode.UnknownError.getValue(), msg.toString());
+            execution.setVariable(errorVariable, exception.getMessage());
+        } catch (Exception ex) {
+            // log trace, allow process to complete gracefully
+            logger.error("Exception occurred", ex);
+        }
+
+        if (exception.getMessage() != null)
+            msg = msg.concat(exception.getMessage());
+        buildAndThrowWorkflowException(execution, errorCode, msg, extSystemErrorSource);
+    }
+
     public void buildAndThrowWorkflowException(DelegateExecution execution, int errorCode, Exception exception) {
         String msg = "Exception in %s.%s ";
         try {
@@ -120,6 +155,38 @@ public class ExceptionBuilder {
         buildAndThrowWorkflowException(execution, errorCode, msg);
     }
 
+    public void buildAndThrowWorkflowException(DelegateExecution execution, int errorCode, Exception exception,
+            TargetEntities extSystemErrorSource) {
+        String msg = "Exception in %s.%s ";
+        try {
+            logger.error("Exception occurred", exception);
+
+            String errorVariable = "Error%s%s";
+
+            StackTraceElement[] trace = Thread.currentThread().getStackTrace();
+            for (StackTraceElement traceElement : trace) {
+                if (!traceElement.getClassName().equals(this.getClass().getName())
+                        && !traceElement.getClassName().equals(Thread.class.getName())) {
+                    msg = String.format(msg, traceElement.getClassName(), traceElement.getMethodName());
+                    String shortClassName =
+                            traceElement.getClassName().substring(traceElement.getClassName().lastIndexOf(".") + 1);
+                    errorVariable = String.format(errorVariable, shortClassName, traceElement.getMethodName());
+                    break;
+                }
+            }
+            logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
+                    ErrorCode.UnknownError.getValue(), msg.toString());
+            execution.setVariable(errorVariable, exception.getMessage());
+        } catch (Exception ex) {
+            // log trace, allow process to complete gracefully
+            logger.error("Exception occurred", ex);
+        }
+
+        if (exception.getMessage() != null)
+            msg = msg.concat(exception.getMessage());
+        buildAndThrowWorkflowException(execution, errorCode, msg, extSystemErrorSource);
+    }
+
     public void buildAndThrowWorkflowException(BuildingBlockExecution execution, int errorCode, String errorMessage) {
         if (execution instanceof DelegateExecutionImpl) {
             buildAndThrowWorkflowException(((DelegateExecutionImpl) execution).getDelegateExecution(), errorCode,
@@ -127,6 +194,14 @@ public class ExceptionBuilder {
         }
     }
 
+    public void buildAndThrowWorkflowException(BuildingBlockExecution execution, int errorCode, String errorMessage,
+            TargetEntities extSystemErrorSource) {
+        if (execution instanceof DelegateExecutionImpl) {
+            buildAndThrowWorkflowException(((DelegateExecutionImpl) execution).getDelegateExecution(), errorCode,
+                    errorMessage, extSystemErrorSource);
+        }
+    }
+
     public void buildAndThrowWorkflowException(DelegateExecution execution, int errorCode, String errorMessage) {
         String processKey = getProcessKey(execution);
         logger.info("Building a WorkflowException for Subflow");
@@ -139,6 +214,19 @@ public class ExceptionBuilder {
         throw new BpmnError("MSOWorkflowException");
     }
 
+    public void buildAndThrowWorkflowException(DelegateExecution execution, int errorCode, String errorMessage,
+            TargetEntities extSystemErrorSource) {
+        String processKey = getProcessKey(execution);
+        logger.info("Building a WorkflowException for Subflow");
+
+        WorkflowException exception = new WorkflowException(processKey, errorCode, errorMessage, extSystemErrorSource);
+        execution.setVariable("WorkflowException", exception);
+        execution.setVariable("WorkflowExceptionErrorMessage", errorMessage);
+        logger.info("Outgoing WorkflowException is {}", exception);
+        logger.info("Throwing MSOWorkflowException");
+        throw new BpmnError("MSOWorkflowException");
+    }
+
     public void buildAndThrowWorkflowException(DelegateExecution execution, String errorCode, String errorMessage) {
         execution.setVariable("WorkflowExceptionErrorMessage", errorMessage);
         throw new BpmnError(errorCode, errorMessage);
@@ -204,7 +292,8 @@ public class ExceptionBuilder {
             if (flowShouldContinue) {
                 execution.setVariable("StatusMessage", errorMessage.toString());
             } else {
-                WorkflowException exception = new WorkflowException(processKey, 400, errorMessage.toString());
+                WorkflowException exception =
+                        new WorkflowException(processKey, 400, errorMessage.toString(), TargetEntity.SO);
                 execution.setVariable("WorkflowException", exception);
                 execution.setVariable("WorkflowExceptionErrorMessage", errorMessage.toString());
                 logger.info("Outgoing WorkflowException is {}", exception);
index 25135a0..1899475 100644 (file)
@@ -25,6 +25,7 @@ import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
@@ -57,6 +58,7 @@ import org.onap.aai.domain.yang.VolumeGroups;
 import org.onap.so.bpmn.common.InjectionHelper;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceSubscription;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.MultipleObjectsFoundException;
 import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.NoServiceInstanceFoundException;
 import org.onap.so.client.aai.AAIObjectPlurals;
@@ -70,6 +72,7 @@ import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
+import org.onap.so.db.request.beans.RequestProcessingData;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 import org.onap.so.serviceinstancebeans.ModelInfo;
@@ -832,4 +835,34 @@ public class BBInputSetupUtilsTest {
 
         assertEquals(actualVolumeGroup, Optional.empty());
     }
+
+    @Test
+    public void loadOriginalFlowExecutionPathTest() throws Exception {
+
+        String requestId = "123";
+        String flowsToExecuteString =
+                "[{\"buildingBlock\":{\"mso-id\":\"2f9ddc4b-4dcf-4129-a35f-be1625ae0176\",\"bpmn-flow-name\":\"DeactivateFabricConfigurationBB\",\"key\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"is-virtual-link\":false,\"virtual-link-key\":null},\"requestId\":\"9c944122-d161-4280-8594-48c06a9d96d5\",\"apiVersion\":\"7\",\"resourceId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"requestAction\":\"deleteInstance\",\"vnfType\":\"\",\"aLaCarte\":true,\"homing\":false,\"workflowResourceIds\":{\"serviceInstanceId\":\"ff9dae72-05bb-4277-ad2b-1b082467c138\",\"vnfId\":\"84a29830-e533-4f20-a838-910c740bf24c\",\"networkId\":\"\",\"volumeGroupId\":\"\",\"vfModuleId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"networkCollectionId\":null,\"configurationId\":\"10f8a3a3-91bf-4821-9515-c01b2864dff0\",\"instanceGroupId\":\"\"},\"requestDetails\":{\"modelInfo\":{\"modelCustomizationName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelInvariantId\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelType\":\"vfModule\",\"modelId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelVersion\":\"1\",\"modelCustomizationUuid\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelVersionId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelCustomizationId\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelUuid\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelInvariantUuid\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelInstanceName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\"},\"requestInfo\":{\"source\":\"VID\",\"suppressRollback\":false,\"requestorId\":\"pj8646\"},\"cloudConfiguration\":{\"tenantId\":\"e2a6af59d1cb43b2874e943bbbf8470a\",\"cloudOwner\":\"att-nc\",\"lcpCloudRegionId\":\"auk51b\"},\"requestParameters\":{\"testApi\":\"GR_API\"}},\"configurationResourceKeys\":{\"vfModuleCustomizationUUID\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"vnfResourceCustomizationUUID\":\"a80f05b8-d651-44af-b999-8ed78fb4582f\",\"cvnfcCustomizationUUID\":\"69cce457-9ffd-4359-962b-0596a1e83ad1\",\"vnfcName\":\"zauk51bmcmr01mcm001\"}},{\"buildingBlock\":{\"mso-id\":\"1ca5584e-38a9-4c3f-a4b4-99b0d42089ba\",\"bpmn-flow-name\":\"UnassignFabricConfigurationBB\",\"key\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"is-virtual-link\":false,\"virtual-link-key\":null},\"requestId\":\"9c944122-d161-4280-8594-48c06a9d96d5\",\"apiVersion\":\"7\",\"resourceId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"requestAction\":\"deleteInstance\",\"vnfType\":\"\",\"aLaCarte\":true,\"homing\":false,\"workflowResourceIds\":{\"serviceInstanceId\":\"ff9dae72-05bb-4277-ad2b-1b082467c138\",\"vnfId\":\"84a29830-e533-4f20-a838-910c740bf24c\",\"networkId\":\"\",\"volumeGroupId\":\"\",\"vfModuleId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"networkCollectionId\":null,\"configurationId\":\"10f8a3a3-91bf-4821-9515-c01b2864dff0\",\"instanceGroupId\":\"\"},\"requestDetails\":{\"modelInfo\":{\"modelCustomizationName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelInvariantId\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelType\":\"vfModule\",\"modelId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelVersion\":\"1\",\"modelCustomizationUuid\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelVersionId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelCustomizationId\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelUuid\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelInvariantUuid\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelInstanceName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\"},\"requestInfo\":{\"source\":\"VID\",\"suppressRollback\":false,\"requestorId\":\"pj8646\"},\"cloudConfiguration\":{\"tenantId\":\"e2a6af59d1cb43b2874e943bbbf8470a\",\"cloudOwner\":\"att-nc\",\"lcpCloudRegionId\":\"auk51b\"},\"requestParameters\":{\"testApi\":\"GR_API\"}},\"configurationResourceKeys\":{\"vfModuleCustomizationUUID\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"vnfResourceCustomizationUUID\":\"a80f05b8-d651-44af-b999-8ed78fb4582f\",\"cvnfcCustomizationUUID\":\"69cce457-9ffd-4359-962b-0596a1e83ad1\",\"vnfcName\":\"zauk51bmcmr01mcm001\"}},{\"buildingBlock\":{\"mso-id\":\"68d16097-4810-477d-803b-8322106106ef\",\"bpmn-flow-name\":\"DeactivateVfModuleBB\",\"key\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"is-virtual-link\":false,\"virtual-link-key\":null},\"requestId\":\"9c944122-d161-4280-8594-48c06a9d96d5\",\"apiVersion\":\"7\",\"resourceId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"requestAction\":\"deleteInstance\",\"vnfType\":\"\",\"aLaCarte\":true,\"homing\":false,\"workflowResourceIds\":{\"serviceInstanceId\":\"ff9dae72-05bb-4277-ad2b-1b082467c138\",\"vnfId\":\"84a29830-e533-4f20-a838-910c740bf24c\",\"networkId\":\"\",\"volumeGroupId\":\"\",\"vfModuleId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"networkCollectionId\":null,\"configurationId\":\"10f8a3a3-91bf-4821-9515-c01b2864dff0\",\"instanceGroupId\":\"\"},\"requestDetails\":{\"modelInfo\":{\"modelCustomizationName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelInvariantId\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelType\":\"vfModule\",\"modelId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelVersion\":\"1\",\"modelCustomizationUuid\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelVersionId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelCustomizationId\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelUuid\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelInvariantUuid\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelInstanceName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\"},\"requestInfo\":{\"source\":\"VID\",\"suppressRollback\":false,\"requestorId\":\"pj8646\"},\"cloudConfiguration\":{\"tenantId\":\"e2a6af59d1cb43b2874e943bbbf8470a\",\"cloudOwner\":\"att-nc\",\"lcpCloudRegionId\":\"auk51b\"},\"requestParameters\":{\"testApi\":\"GR_API\"}},\"configurationResourceKeys\":null},{\"buildingBlock\":{\"mso-id\":\"0b02eb09-bc23-4329-b19e-716dcca4e4a6\",\"bpmn-flow-name\":\"DeleteVfModuleBB\",\"key\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"is-virtual-link\":false,\"virtual-link-key\":null},\"requestId\":\"9c944122-d161-4280-8594-48c06a9d96d5\",\"apiVersion\":\"7\",\"resourceId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"requestAction\":\"deleteInstance\",\"vnfType\":\"\",\"aLaCarte\":true,\"homing\":false,\"workflowResourceIds\":{\"serviceInstanceId\":\"ff9dae72-05bb-4277-ad2b-1b082467c138\",\"vnfId\":\"84a29830-e533-4f20-a838-910c740bf24c\",\"networkId\":\"\",\"volumeGroupId\":\"\",\"vfModuleId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"networkCollectionId\":null,\"configurationId\":\"10f8a3a3-91bf-4821-9515-c01b2864dff0\",\"instanceGroupId\":\"\"},\"requestDetails\":{\"modelInfo\":{\"modelCustomizationName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelInvariantId\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelType\":\"vfModule\",\"modelId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelVersion\":\"1\",\"modelCustomizationUuid\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelVersionId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelCustomizationId\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelUuid\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelInvariantUuid\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelInstanceName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\"},\"requestInfo\":{\"source\":\"VID\",\"suppressRollback\":false,\"requestorId\":\"pj8646\"},\"cloudConfiguration\":{\"tenantId\":\"e2a6af59d1cb43b2874e943bbbf8470a\",\"cloudOwner\":\"att-nc\",\"lcpCloudRegionId\":\"auk51b\"},\"requestParameters\":{\"testApi\":\"GR_API\"}},\"configurationResourceKeys\":null},{\"buildingBlock\":{\"mso-id\":\"bcf95d05-0782-44ff-920d-d5100525c275\",\"bpmn-flow-name\":\"UnassignVfModuleBB\",\"key\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"is-virtual-link\":false,\"virtual-link-key\":null},\"requestId\":\"9c944122-d161-4280-8594-48c06a9d96d5\",\"apiVersion\":\"7\",\"resourceId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"requestAction\":\"deleteInstance\",\"vnfType\":\"\",\"aLaCarte\":true,\"homing\":false,\"workflowResourceIds\":{\"serviceInstanceId\":\"ff9dae72-05bb-4277-ad2b-1b082467c138\",\"vnfId\":\"84a29830-e533-4f20-a838-910c740bf24c\",\"networkId\":\"\",\"volumeGroupId\":\"\",\"vfModuleId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"networkCollectionId\":null,\"configurationId\":\"10f8a3a3-91bf-4821-9515-c01b2864dff0\",\"instanceGroupId\":\"\"},\"requestDetails\":{\"modelInfo\":{\"modelCustomizationName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelInvariantId\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelType\":\"vfModule\",\"modelId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelVersion\":\"1\",\"modelCustomizationUuid\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelVersionId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelCustomizationId\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelUuid\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelInvariantUuid\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelInstanceName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\"},\"requestInfo\":{\"source\":\"VID\",\"suppressRollback\":false,\"requestorId\":\"pj8646\"},\"cloudConfiguration\":{\"tenantId\":\"e2a6af59d1cb43b2874e943bbbf8470a\",\"cloudOwner\":\"att-nc\",\"lcpCloudRegionId\":\"auk51b\"},\"requestParameters\":{\"testApi\":\"GR_API\"}},\"configurationResourceKeys\":null}]";
+        ObjectMapper om = new ObjectMapper();
+        List<ExecuteBuildingBlock> expectedFlowsToExecute = null;
+        try {
+            ExecuteBuildingBlock[] asArray = om.readValue(flowsToExecuteString, ExecuteBuildingBlock[].class);
+            expectedFlowsToExecute = Arrays.asList(asArray);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        InfraActiveRequests request = new InfraActiveRequests();
+        request.setRequestId("requestId");
+        request.setOriginalRequestId("originalRequestId");
+        doReturn(request).when(MOCK_requestsDbClient).getInfraActiveRequestbyRequestId(anyString());
+        RequestProcessingData rpd = new RequestProcessingData();
+        rpd.setValue(flowsToExecuteString);
+        doReturn(rpd).when(MOCK_requestsDbClient).getRequestProcessingDataBySoRequestIdAndName(anyString(),
+                anyString());
+
+        List<ExecuteBuildingBlock> flowsToExecute = bbInputSetupUtils.loadOriginalFlowExecutionPath(requestId);
+        assertEquals(expectedFlowsToExecute.size(), flowsToExecute.size());
+    }
+
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDayUnitTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDayUnitTest.java
new file mode 100644 (file)
index 0000000..6a48558
--- /dev/null
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.bpmn.servicedecomposition.tasks;
+
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.core.WorkflowException;
+import org.onap.so.db.request.beans.InfraActiveRequests;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.utils.TargetEntity;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ExecuteBuildingBlockRainyDayUnitTest {
+
+    @Mock
+    private RequestsDbClient requestsDbClient;
+
+    @InjectMocks
+    @Spy
+    private ExecuteBuildingBlockRainyDay executeBuildingBlockRainyDay;
+
+    private DelegateExecution execution;
+    private DelegateExecution executionNullisRollback;
+    private String msoRequestId = "ef7c004b-829f-4773-a7d8-4de29feef5b1";
+    private InfraActiveRequests request = new InfraActiveRequests();
+    private WorkflowException exception;
+    private WorkflowException noExtSystemErrorSourceException;
+
+    @Before
+    public void setup() {
+        exception = new WorkflowException("Test exception", 7000, "", "", TargetEntity.SDNC);
+        noExtSystemErrorSourceException =
+                new WorkflowException("Test exception without extsystemErrorSource", 7000, "", "");
+
+        execution = new DelegateExecutionFake();
+        execution.setVariable("mso-request-id", "ef7c004b-829f-4773-a7d8-4de29feef5b1");
+
+        executionNullisRollback = new DelegateExecutionFake();
+        executionNullisRollback.setVariable("mso-request-id", "ef7c004b-829f-4773-a7d8-4de29feef5b1");
+    }
+
+    @Test
+    public void updateExtSystemErrorSourceTest() {
+        doReturn(request).when(requestsDbClient).getInfraActiveRequestbyRequestId(msoRequestId);
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(request);
+        execution.setVariable("isRollback", false);
+        execution.setVariable("WorkflowException", exception);
+        executeBuildingBlockRainyDay.updateExtSystemErrorSource(execution);
+        request.setExtSystemErrorSource(TargetEntity.SDNC.toString());
+
+        verify(requestsDbClient, Mockito.times(1)).updateInfraActiveRequests(request);
+    }
+
+    @Test
+    public void updateExtSystemErrorSourceisRollbackTest() {
+        doReturn(request).when(requestsDbClient).getInfraActiveRequestbyRequestId(msoRequestId);
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(request);
+        execution.setVariable("isRollback", true);
+        execution.setVariable("WorkflowException", exception);
+        executeBuildingBlockRainyDay.updateExtSystemErrorSource(execution);
+        request.setExtSystemErrorSource(TargetEntity.SDNC.toString());
+
+        verify(requestsDbClient, Mockito.times(1)).updateInfraActiveRequests(request);
+    }
+
+    @Test
+    public void updateExtSystemErrorSourceisRollbackTargetEntityNullTest() {
+        doReturn(request).when(requestsDbClient).getInfraActiveRequestbyRequestId(msoRequestId);
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(request);
+        execution.setVariable("isRollback", true);
+        execution.setVariable("WorkflowException", noExtSystemErrorSourceException);
+        executeBuildingBlockRainyDay.updateExtSystemErrorSource(execution);
+        request.setExtSystemErrorSource(TargetEntity.UNKNOWN.toString());
+
+        verify(requestsDbClient, Mockito.times(1)).updateInfraActiveRequests(request);
+    }
+
+    @Test
+    public void updateExtSystemErrorSourceTargetEntityNullTest() {
+        doReturn(request).when(requestsDbClient).getInfraActiveRequestbyRequestId(msoRequestId);
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(request);
+        execution.setVariable("isRollback", false);
+        execution.setVariable("WorkflowException", noExtSystemErrorSourceException);
+        executeBuildingBlockRainyDay.updateExtSystemErrorSource(execution);
+        request.setExtSystemErrorSource(TargetEntity.UNKNOWN.toString());
+
+        verify(requestsDbClient, Mockito.times(1)).updateInfraActiveRequests(request);
+    }
+
+    @Test
+    public void updateExtSystemErrorSourceTargetEntityisRollbackNullTest() {
+        doReturn(request).when(requestsDbClient).getInfraActiveRequestbyRequestId(msoRequestId);
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(request);
+        executionNullisRollback.setVariable("WorkflowException", exception);
+        executeBuildingBlockRainyDay.updateExtSystemErrorSource(executionNullisRollback);
+        request.setExtSystemErrorSource(TargetEntity.SDNC.toString());
+
+        verify(requestsDbClient, Mockito.times(1)).updateInfraActiveRequests(request);
+    }
+}
index c5da3cb..80373eb 100644 (file)
@@ -38,6 +38,7 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.macro.RainyDayHandlerStatus;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -207,6 +208,7 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
         executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution, true);
 
         assertEquals("Rollback", delegateExecution.getVariable("handlingCode"));
+        assertEquals(Status.ROLLED_BACK.toString(), delegateExecution.getVariable("rollbackTargetState"));
     }
 
     @Test
@@ -232,8 +234,36 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
         executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution, true);
 
         assertEquals("RollbackToAssigned", delegateExecution.getVariable("handlingCode"));
+        assertEquals(Status.ROLLED_BACK_TO_ASSIGNED.toString(), delegateExecution.getVariable("rollbackTargetState"));
     }
 
+    @Test
+    public void queryRainyDayTableRollbackToCreated() throws Exception {
+        customer.getServiceSubscription().getServiceInstances().add(serviceInstance);
+        serviceInstance.getModelInfoServiceInstance().setServiceType("st1");
+        vnf.setVnfType("vnft1");
+        delegateExecution.setVariable("aLaCarte", true);
+        delegateExecution.setVariable("suppressRollback", false);
+        delegateExecution.setVariable("WorkflowExceptionCode", "7000");
+        RainyDayHandlerStatus rainyDayHandlerStatus = new RainyDayHandlerStatus();
+        rainyDayHandlerStatus.setErrorCode("7000");
+        rainyDayHandlerStatus.setFlowName("AssignServiceInstanceBB");
+        rainyDayHandlerStatus.setServiceType("st1");
+        rainyDayHandlerStatus.setVnfType("vnft1");
+        rainyDayHandlerStatus.setPolicy("RollbackToCreated");
+        rainyDayHandlerStatus.setWorkStep(ASTERISK);
+        rainyDayHandlerStatus.setSecondaryPolicy("Abort");
+
+        doReturn(rainyDayHandlerStatus).when(MOCK_catalogDbClient).getRainyDayHandlerStatus("AssignServiceInstanceBB",
+                "st1", "vnft1", "7000", "*", "errorMessage");
+
+        executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution, true);
+
+        assertEquals("RollbackToCreated", delegateExecution.getVariable("handlingCode"));
+        assertEquals(Status.ROLLED_BACK_TO_CREATED.toString(), delegateExecution.getVariable("rollbackTargetState"));
+    }
+
+
     @Test
     public void suppressRollbackTest() throws Exception {
         delegateExecution.setVariable("suppressRollback", true);
index 5f9aef6..aae6244 100644 (file)
@@ -55,6 +55,7 @@ public class ExceptionBuilderTest extends BaseTest {
     @Mock
     protected ExtractPojosForBB extractPojosForBB;
 
+
     @Spy
     @InjectMocks
     private ExceptionBuilder exceptionBuilder = new ExceptionBuilder();
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/exception/ExceptionBuilderUnitTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/exception/ExceptionBuilderUnitTest.java
new file mode 100644 (file)
index 0000000..b109ae2
--- /dev/null
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
+ * 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.client.exception;
+
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import org.camunda.bpm.engine.delegate.BpmnError;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.utils.TargetEntity;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ExceptionBuilderUnitTest {
+    @Mock
+    private BuildingBlockExecution buildingBlockExecution;
+
+    @InjectMocks
+    @Spy
+    private ExceptionBuilder exceptionBuilder;
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
+    private Exception e = new Exception("failure message");
+    private DelegateExecution execution;
+
+    @Before
+    public void setup() {
+        execution = new DelegateExecutionFake();
+    }
+
+
+    @Test
+    public void buildAndThrowWorkflowExceptionTest() {
+        String expectedErrorMessage =
+                "Exception in org.onap.so.client.exception.ExceptionBuilder.buildAndThrowWorkflowException failure message";
+        doNothing().when(exceptionBuilder).buildAndThrowWorkflowException(execution, 7000, expectedErrorMessage,
+                TargetEntity.SDNC);
+
+        exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e, TargetEntity.SDNC);
+
+        verify(exceptionBuilder, times(1)).buildAndThrowWorkflowException(execution, 7000, expectedErrorMessage,
+                TargetEntity.SDNC);
+    }
+
+    @Test
+    public void buildAndThrowWorkflowExceptionBuildingBlockExecutionTest() {
+        String expectedErrorMessage =
+                "Exception in org.onap.so.client.exception.ExceptionBuilder.buildAndThrowWorkflowException failure message";
+        doNothing().when(exceptionBuilder).buildAndThrowWorkflowException(buildingBlockExecution, 7000,
+                expectedErrorMessage, TargetEntity.SDNC);
+
+        exceptionBuilder.buildAndThrowWorkflowException(buildingBlockExecution, 7000, e, TargetEntity.SDNC);
+
+        verify(exceptionBuilder, times(1)).buildAndThrowWorkflowException(buildingBlockExecution, 7000,
+                expectedErrorMessage, TargetEntity.SDNC);
+    }
+
+    @Test
+    public void buildAndThrowWorkflowExceptionWithErrorMessageTest() {
+        doReturn("Process key").when(exceptionBuilder).getProcessKey(execution);
+
+        thrown.expect(BpmnError.class);
+        exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getMessage(), TargetEntity.SDNC);
+    }
+}
index 1692045..7d5bb0d 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.bpmn.core;
 
 import java.io.Serializable;
+import org.onap.so.utils.TargetEntities;
 
 /**
  * An object that represents a workflow exception.
@@ -32,6 +33,7 @@ public class WorkflowException implements Serializable {
     private final int errorCode;
     private final String errorMessage;
     private final String workStep;
+    private TargetEntities extSystemErrorSource;
 
     /**
      * Constructor
@@ -47,6 +49,15 @@ public class WorkflowException implements Serializable {
         workStep = "*";
     }
 
+    public WorkflowException(String processKey, int errorCode, String errorMessage,
+            TargetEntities extSystemErrorSource) {
+        this.processKey = processKey;
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        workStep = "*";
+        this.extSystemErrorSource = extSystemErrorSource;
+    }
+
     public WorkflowException(String processKey, int errorCode, String errorMessage, String workStep) {
         this.processKey = processKey;
         this.errorCode = errorCode;
@@ -54,6 +65,15 @@ public class WorkflowException implements Serializable {
         this.workStep = workStep;
     }
 
+    public WorkflowException(String processKey, int errorCode, String errorMessage, String workStep,
+            TargetEntities extSystemErrorSource) {
+        this.processKey = processKey;
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        this.workStep = workStep;
+        this.extSystemErrorSource = extSystemErrorSource;
+    }
+
     /**
      * Returns the process key.
      */
@@ -82,12 +102,17 @@ public class WorkflowException implements Serializable {
         return workStep;
     }
 
+    public TargetEntities getExtSystemErrorSource() {
+        return extSystemErrorSource;
+    }
+
     /**
      * Returns a string representation of this object.
      */
     @Override
     public String toString() {
         return getClass().getSimpleName() + "[processKey=" + getProcessKey() + ",errorCode=" + getErrorCode()
-                + ",errorMessage=" + getErrorMessage() + ",workStep=" + getWorkStep() + "]";
+                + ",errorMessage=" + getErrorMessage() + ",workStep=" + getWorkStep() + ",extSystemErrorSource="
+                + extSystemErrorSource + "]";
     }
 }
index 633736a..11b717c 100644 (file)
@@ -29,7 +29,7 @@ public class RollbackData implements Serializable {
     private static final long serialVersionUID = -4811571658272937718L;
 
     private String requestId;
-    private Map<String, String> additionalData = new HashMap<String, String>();
+    private Map<String, String> additionalData = new HashMap<>();
 
 
     public String getRequestId() {
index d099cbe..b6bccdb 100644 (file)
@@ -28,7 +28,7 @@ public class XmlToolTest {
     private String encodeResponseNamespace =
             "<Response xmlns:ns2=\"http://ecomp.att.com/mso/request/types/v1\">good</Response>";
     private String attribute = "<Response>good&\"bad\"</Response>";
-    private String updatedAttribute = "&lt;Response&gt;good&amp;&quot;bad&quot;&lt;/Response&gt;";
+    // private String updatedAttribute = "&lt;Response&gt;good&amp;&quot;bad&quot;&lt;/Response&gt;";
 
     private String content = "<dummy><configuration-event>" + "<event-type>test</event-type>"
             + "<event-correlator-type>test</event-correlator-type>" + "<event-correlator>123</event-correlator>"
index 4e9e9fd..d33e7ae 100644 (file)
@@ -45,8 +45,7 @@ public class WorkflowProcessor extends ProcessEngineAwareService {
     @Async
     public void startProcess(String processKey, VariableMapImpl variableMap) {
 
-        long startTime = System.currentTimeMillis();
-        Map<String, Object> inputVariables = null;
+        Map<String, Object> inputVariables;
         String processInstanceId = null;
         try {
             inputVariables = getInputVariables(variableMap);
index 6572bea..a049f81 100644 (file)
@@ -52,8 +52,6 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
 @Configuration
 public class CXFConfiguration {
 
-    private static final Logger logger = LoggerFactory.getLogger(CXFConfiguration.class);
-
     @Autowired
     private Bus bus;
 
index f417a55..a94713e 100644 (file)
@@ -317,7 +317,8 @@ public class BPMNUtil {
      */
     static class ProcessThread extends Thread {
 
-        public WorkflowResponse workflowResponse = null;
+        public WorkflowResponse workflowResponse;
+        // public WorkflowResponse workflowResponse = null;
         public String processKey;
         public boolean started;
         public ProcessEngineServices processEngineServices;
index 33335ab..ca0f845 100644 (file)
@@ -2,13 +2,12 @@
 <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0">
   <bpmn:process id="DeleteVfModuleBB" name="DeleteVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="DeleteVfModuleBB_Start">
-      <bpmn:outgoing>SequenceFlow_1537yw5</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1oeootm</bpmn:outgoing>
     </bpmn:startEvent>
-    <bpmn:serviceTask id="DeleteVfModuleVnfAdapter" name="Delete Vf Module VnfAdapter" camunda:expression="${VnfAdapterDeleteTasks.deleteVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_1n8gab5</bpmn:incoming>
+    <bpmn:serviceTask id="DeleteVfModuleVnfAdapter" name="Prepare Request" camunda:expression="${VnfAdapterDeleteTasks.deleteVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_028rmiu</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_08tvhtf</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1537yw5" sourceRef="DeleteVfModuleBB_Start" targetRef="ExclusiveGateway_0xrgzm7" />
     <bpmn:serviceTask id="UpdateVfModuleDeleteStatus" name="&#10;AAI &#10;Update&#10;(vf module)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusDeleteVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_01vfwtp</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_09l7pcg</bpmn:outgoing>
       <bpmn:incoming>SequenceFlow_0khqfnc</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0yuz21z</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1n8gab5" sourceRef="ExclusiveGateway_0xrgzm7" targetRef="DeleteVfModuleVnfAdapter" />
-    <bpmn:parallelGateway id="ExclusiveGateway_0xrgzm7">
-      <bpmn:incoming>SequenceFlow_1537yw5</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1n8gab5</bpmn:outgoing>
-      <bpmn:outgoing>SequenceFlow_1v3jgqe</bpmn:outgoing>
-    </bpmn:parallelGateway>
-    <bpmn:sequenceFlow id="SequenceFlow_032jv5j" name="Yes&#10;" sourceRef="ExclusiveGateway_1h2ystu" targetRef="Setup_Audit_Variable">
+    <bpmn:sequenceFlow id="SequenceFlow_032jv5j" name="Yes&#10;" sourceRef="auditEnabledCheck" targetRef="Setup_Audit_Variable">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditInventoryNeeded") == true}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:sequenceFlow id="SequenceFlow_0qfmmgt" sourceRef="Audit_Inventory" targetRef="auditSuccessfulCheck" />
     <bpmn:sequenceFlow id="SequenceFlow_14bu4ys" sourceRef="ExclusiveGateway_1yvh16a" targetRef="aaiThrow" />
-    <bpmn:sequenceFlow id="SequenceFlow_1mgunf3" name="No" sourceRef="ExclusiveGateway_1h2ystu" targetRef="ExclusiveGateway_1pydilb" />
     <bpmn:serviceTask id="Check_Audit" name="Check Audit Variable" camunda:expression="${AuditTasks.isDeleteAuditNeeded(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_1v3jgqe</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1odt2wt</bpmn:outgoing>
+      <bpmn:incoming>SequenceFlow_1oeootm</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_10af0fk</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1v3jgqe" sourceRef="ExclusiveGateway_0xrgzm7" targetRef="Check_Audit" />
-    <bpmn:sequenceFlow id="SequenceFlow_1odt2wt" sourceRef="Check_Audit" targetRef="ExclusiveGateway_1h2ystu" />
-    <bpmn:sequenceFlow id="SequenceFlow_1swistn" sourceRef="Setup_Audit_Variable" targetRef="Audit_Inventory" />
-    <bpmn:serviceTask id="Audit_Inventory" name="Audit Inventory For Delete in AAI" camunda:type="external" camunda:topic="InventoryDeleteAudit">
-      <bpmn:incoming>SequenceFlow_1swistn</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_0qfmmgt</bpmn:outgoing>
+    <bpmn:serviceTask id="Audit_Inventory" name="&#10;AAI&#10;Audit&#10;(vservers)&#10;" camunda:type="external" camunda:topic="InventoryDeleteAudit">
+      <bpmn:incoming>SequenceFlow_0f5ljoh</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0hpj2mm</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="Setup_Audit_Variable" name="Setup Audit Variable" camunda:expression="${AuditTasks.setupAuditVariable(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_032jv5j</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1swistn</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1iulltd</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1ut7n32" sourceRef="ExclusiveGateway_1pydilb" targetRef="ExclusiveGateway_1yvh16a" />
-    <bpmn:exclusiveGateway id="ExclusiveGateway_1h2ystu" name="Audit&#10; Enabled?" default="SequenceFlow_1mgunf3">
-      <bpmn:incoming>SequenceFlow_1odt2wt</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_032jv5j</bpmn:outgoing>
-      <bpmn:outgoing>SequenceFlow_1mgunf3</bpmn:outgoing>
-    </bpmn:exclusiveGateway>
-    <bpmn:exclusiveGateway id="ExclusiveGateway_1pydilb">
-      <bpmn:incoming>SequenceFlow_1mgunf3</bpmn:incoming>
-      <bpmn:incoming>SequenceFlow_17cd9e2</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1ut7n32</bpmn:outgoing>
-    </bpmn:exclusiveGateway>
     <bpmn:subProcess id="SubProcess_0grvkj2" name="Audit Exception Sub Process" triggeredByEvent="true">
       <bpmn:endEvent id="EndEvent_1gzq57j">
         <bpmn:incoming>SequenceFlow_1fhst92</bpmn:incoming>
       <bpmn:sequenceFlow id="SequenceFlow_1fhst92" sourceRef="ServiceTask_1isbxvo" targetRef="EndEvent_1gzq57j" />
       <bpmn:startEvent id="StartEvent_1euiddy" isInterrupting="false">
         <bpmn:outgoing>SequenceFlow_0xuodpy</bpmn:outgoing>
-        <bpmn:escalationEventDefinition escalationRef="Escalation_130je8j" camunda:escalationCodeVariable="test" />
+        <bpmn:escalationEventDefinition escalationRef="Escalation_130je8j" camunda:escalationCodeVariable="auditCode" />
       </bpmn:startEvent>
     </bpmn:subProcess>
     <bpmn:sequenceFlow id="SequenceFlow_179btn2" sourceRef="aaiCatch" targetRef="DeleteNetworkPolicies" />
       <bpmn:outgoing>SequenceFlow_179btn2</bpmn:outgoing>
       <bpmn:linkEventDefinition name="AAI" />
     </bpmn:intermediateCatchEvent>
-    <bpmn:sequenceFlow id="SequenceFlow_17cd9e2" name="Yes/No" sourceRef="auditSuccessfulCheck" targetRef="ExclusiveGateway_1pydilb">
+    <bpmn:sequenceFlow id="SequenceFlow_17cd9e2" name="Yes/No" sourceRef="auditSuccessfulCheck" targetRef="ExclusiveGateway_01wvywu">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditIsSuccessful") == false || execution.getVariable("auditIsSuccessful") == true}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:sequenceFlow id="SequenceFlow_1gdyk9j" name="No" sourceRef="auditSuccessfulCheck" targetRef="EndEvent_0b0ocu0">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditIsSuccessful") == false}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:inclusiveGateway id="ExclusiveGateway_1yvh16a">
-      <bpmn:incoming>SequenceFlow_02lpx87</bpmn:incoming>
-      <bpmn:incoming>SequenceFlow_1ut7n32</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_14bu4ys</bpmn:outgoing>
-    </bpmn:inclusiveGateway>
     <bpmn:inclusiveGateway id="auditSuccessfulCheck" name="Audit&#10; Successful?">
-      <bpmn:incoming>SequenceFlow_0qfmmgt</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0hpj2mm</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_17cd9e2</bpmn:outgoing>
       <bpmn:outgoing>SequenceFlow_1gdyk9j</bpmn:outgoing>
     </bpmn:inclusiveGateway>
       <bpmn:incoming>SequenceFlow_1gdyk9j</bpmn:incoming>
       <bpmn:escalationEventDefinition escalationRef="Escalation_130je8j" />
     </bpmn:endEvent>
+    <bpmn:exclusiveGateway id="auditEnabledCheck" name="Audit&#10; Enabled?" default="SequenceFlow_1bt1p2u">
+      <bpmn:incoming>SequenceFlow_10af0fk</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_032jv5j</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1bt1p2u</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_1t9q2jl">
+      <bpmn:incoming>SequenceFlow_1bt1p2u</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0dzf7hz</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1bq9g02</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_1bt1p2u" name="No" sourceRef="auditEnabledCheck" targetRef="ExclusiveGateway_1t9q2jl" />
+    <bpmn:sequenceFlow id="SequenceFlow_1oeootm" sourceRef="DeleteVfModuleBB_Start" targetRef="Check_Audit" />
+    <bpmn:sequenceFlow id="SequenceFlow_10af0fk" sourceRef="Check_Audit" targetRef="auditEnabledCheck" />
+    <bpmn:serviceTask id="aicQueryStack" name="&#10;AIC&#10;Query&#10;(stack)&#10;" camunda:type="external" camunda:topic="InventoryQueryAudit">
+      <bpmn:incoming>SequenceFlow_1iulltd</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0dzf7hz</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_1iulltd" sourceRef="Setup_Audit_Variable" targetRef="aicQueryStack" />
+    <bpmn:sequenceFlow id="SequenceFlow_0dzf7hz" sourceRef="aicQueryStack" targetRef="ExclusiveGateway_1t9q2jl" />
+    <bpmn:sequenceFlow id="SequenceFlow_1bq9g02" sourceRef="ExclusiveGateway_1t9q2jl" targetRef="ExclusiveGateway_1naduhl" />
+    <bpmn:sequenceFlow id="SequenceFlow_0mtzl4z" sourceRef="ExclusiveGateway_1naduhl" targetRef="ExclusiveGateway_13fhmpf" />
+    <bpmn:sequenceFlow id="SequenceFlow_028rmiu" sourceRef="ExclusiveGateway_1naduhl" targetRef="DeleteVfModuleVnfAdapter" />
+    <bpmn:parallelGateway id="ExclusiveGateway_1naduhl">
+      <bpmn:incoming>SequenceFlow_1bq9g02</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0mtzl4z</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_028rmiu</bpmn:outgoing>
+    </bpmn:parallelGateway>
+    <bpmn:inclusiveGateway id="ExclusiveGateway_1yvh16a">
+      <bpmn:incoming>SequenceFlow_02lpx87</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_13mlz57</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_14bu4ys</bpmn:outgoing>
+    </bpmn:inclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_0hpj2mm" sourceRef="Audit_Inventory" targetRef="auditSuccessfulCheck" />
+    <bpmn:exclusiveGateway id="ExclusiveGateway_13fhmpf" name="Audit&#10; Enabled?" default="SequenceFlow_1gjwivp">
+      <bpmn:incoming>SequenceFlow_0mtzl4z</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0f5ljoh</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1gjwivp</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_0f5ljoh" name="Yes" sourceRef="ExclusiveGateway_13fhmpf" targetRef="Audit_Inventory">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditInventoryNeeded") == true}]]></bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_01wvywu">
+      <bpmn:incoming>SequenceFlow_17cd9e2</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1gjwivp</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_13mlz57</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_1gjwivp" name="No" sourceRef="ExclusiveGateway_13fhmpf" targetRef="ExclusiveGateway_01wvywu" />
+    <bpmn:sequenceFlow id="SequenceFlow_13mlz57" sourceRef="ExclusiveGateway_01wvywu" targetRef="ExclusiveGateway_1yvh16a" />
   </bpmn:process>
   <bpmn:error id="Error_0jjnve8" name="Error_3k24na6" errorCode="AAIInventoryFailure" />
   <bpmn:escalation id="Escalation_130je8j" name="audit" escalationCode="audit1" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_16798zf_di" bpmnElement="DeleteVfModuleVnfAdapter">
-        <dc:Bounds x="382" y="303" width="100" height="80" />
+        <dc:Bounds x="888" y="312" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1537yw5_di" bpmnElement="SequenceFlow_1537yw5">
-        <di:waypoint xsi:type="dc:Point" x="195" y="284" />
-        <di:waypoint xsi:type="dc:Point" x="282" y="284" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="194" y="263" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0pbhsub_di" bpmnElement="UpdateVfModuleDeleteStatus">
         <dc:Bounds x="907" y="468" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_08tvhtf_di" bpmnElement="SequenceFlow_08tvhtf">
-        <di:waypoint xsi:type="dc:Point" x="482" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="511" y="343" />
+        <di:waypoint xsi:type="dc:Point" x="988" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="1020" y="352" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="452" y="322" width="90" height="12" />
+          <dc:Bounds x="959" y="331" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1rn6yvh_di" bpmnElement="DeleteVfModuleBB_End">
-        <dc:Bounds x="1136" y="490" width="36" height="36" />
+        <dc:Bounds x="1268" y="490" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1109" y="530" width="90" height="0" />
+          <dc:Bounds x="1241" y="530" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="CallActivity_0whogn3_di" bpmnElement="VnfAdapter">
-        <dc:Bounds x="511" y="303" width="100" height="80" />
+        <dc:Bounds x="1020" y="312" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_02lpx87_di" bpmnElement="SequenceFlow_02lpx87">
-        <di:waypoint xsi:type="dc:Point" x="611" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="309" />
+        <di:waypoint xsi:type="dc:Point" x="1120" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="309" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="723" y="328" width="90" height="0" />
+          <dc:Bounds x="1116.5" y="337" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_11p7mrh_di" bpmnElement="SubProcess_11p7mrh" isExpanded="true">
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_09l7pcg_di" bpmnElement="SequenceFlow_09l7pcg">
         <di:waypoint xsi:type="dc:Point" x="1007" y="508" />
-        <di:waypoint xsi:type="dc:Point" x="1136" y="508" />
+        <di:waypoint xsi:type="dc:Point" x="1268" y="508" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1027" y="493" width="90" height="0" />
+          <dc:Bounds x="1092.5" y="493" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0xyu3pk_di" bpmnElement="SequenceFlow_0xyu3pk">
       <bpmndi:BPMNShape id="ServiceTask_0v8naz9_di" bpmnElement="UpdateVfModuleContrailServiceInstanceFqdn">
         <dc:Bounds x="654" y="468" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1n8gab5_di" bpmnElement="SequenceFlow_1n8gab5">
-        <di:waypoint xsi:type="dc:Point" x="307" y="309" />
-        <di:waypoint xsi:type="dc:Point" x="307" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="382" y="343" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="277" y="320" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ParallelGateway_18x6mx2_di" bpmnElement="ExclusiveGateway_0xrgzm7">
-        <dc:Bounds x="282" y="259" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="262" y="312" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_032jv5j_di" bpmnElement="SequenceFlow_032jv5j">
-        <di:waypoint xsi:type="dc:Point" x="492" y="174" />
-        <di:waypoint xsi:type="dc:Point" x="492" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="531" y="133" />
+        <di:waypoint xsi:type="dc:Point" x="397" y="259" />
+        <di:waypoint xsi:type="dc:Point" x="397" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="444" y="214" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="499" y="139" width="19" height="24" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0qfmmgt_di" bpmnElement="SequenceFlow_0qfmmgt">
-        <di:waypoint xsi:type="dc:Point" x="754" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="780" y="133" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="722" y="111.5" width="90" height="13" />
+          <dc:Bounds x="405.5348837209302" y="217.95121951219514" width="19" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_14bu4ys_di" bpmnElement="SequenceFlow_14bu4ys">
-        <di:waypoint xsi:type="dc:Point" x="950" y="284" />
-        <di:waypoint xsi:type="dc:Point" x="1100" y="283" />
+        <di:waypoint xsi:type="dc:Point" x="1228" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="1323" y="284" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="980" y="262" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1mgunf3_di" bpmnElement="SequenceFlow_1mgunf3">
-        <di:waypoint xsi:type="dc:Point" x="492" y="224" />
-        <di:waypoint xsi:type="dc:Point" x="492" y="257" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="257" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="224" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="503.9261744966443" y="237" width="14" height="12" />
+          <dc:Bounds x="1230.5" y="262.5" width="90" height="13" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1vmz3zo_di" bpmnElement="Check_Audit">
-        <dc:Bounds x="339" y="159" width="100" height="80" />
+        <dc:Bounds x="244" y="244" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1v3jgqe_di" bpmnElement="SequenceFlow_1v3jgqe">
-        <di:waypoint xsi:type="dc:Point" x="307" y="259" />
-        <di:waypoint xsi:type="dc:Point" x="307" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="339" y="199" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="277" y="223" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1odt2wt_di" bpmnElement="SequenceFlow_1odt2wt">
-        <di:waypoint xsi:type="dc:Point" x="439" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="467" y="199" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="408" y="178" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1swistn_di" bpmnElement="SequenceFlow_1swistn">
-        <di:waypoint xsi:type="dc:Point" x="631" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="654" y="133" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="598" y="112" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1l8r2a6_di" bpmnElement="Audit_Inventory">
-        <dc:Bounds x="654" y="93" width="100" height="80" />
+        <dc:Bounds x="930" y="117" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1gttdjr_di" bpmnElement="Setup_Audit_Variable">
-        <dc:Bounds x="531" y="93" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1ut7n32_di" bpmnElement="SequenceFlow_1ut7n32">
-        <di:waypoint xsi:type="dc:Point" x="893" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="259" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="864" y="177.5" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ExclusiveGateway_1olwkdn_di" bpmnElement="ExclusiveGateway_1h2ystu" isMarkerVisible="true">
-        <dc:Bounds x="467" y="174" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="519" y="187" width="45" height="24" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ExclusiveGateway_1d1pmqz_di" bpmnElement="ExclusiveGateway_1pydilb" isMarkerVisible="true">
-        <dc:Bounds x="843" y="174" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="733" y="227" width="90" height="13" />
-        </bpmndi:BPMNLabel>
+        <dc:Bounds x="444" y="174" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="SubProcess_0grvkj2_di" bpmnElement="SubProcess_0grvkj2" isExpanded="true">
         <dc:Bounds x="231" y="642" width="350" height="200" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="IntermediateThrowEvent_1sftyjz_di" bpmnElement="aaiThrow">
-        <dc:Bounds x="1100" y="266" width="36" height="36" />
+        <dc:Bounds x="1323" y="266" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1092" y="305" width="55" height="12" />
+          <dc:Bounds x="1315" y="305" width="55" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="IntermediateCatchEvent_13y483m_di" bpmnElement="aaiCatch">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_17cd9e2_di" bpmnElement="SequenceFlow_17cd9e2">
-        <di:waypoint xsi:type="dc:Point" x="830" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="174" />
+        <di:waypoint xsi:type="dc:Point" x="1108" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="189" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="830" y="114" width="36" height="12" />
+          <dc:Bounds x="1111.0434782608695" y="137" width="36" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1gdyk9j_di" bpmnElement="SequenceFlow_1gdyk9j">
-        <di:waypoint xsi:type="dc:Point" x="805" y="108" />
-        <di:waypoint xsi:type="dc:Point" x="805" y="56" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="132" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="109" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="109" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="84" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="812" y="77" width="14" height="12" />
+          <dc:Bounds x="1083" y="110.74468085106383" width="14" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="InclusiveGateway_0cjvlht_di" bpmnElement="ExclusiveGateway_1yvh16a">
-        <dc:Bounds x="900" y="259" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="879" y="312" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="InclusiveGateway_0i6rdd1_di" bpmnElement="auditSuccessfulCheck">
-        <dc:Bounds x="780" y="108" width="50" height="50" />
+        <dc:Bounds x="1058" y="132" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="775" y="162" width="60" height="24" />
+          <dc:Bounds x="1053" y="186" width="60" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="StartEvent_04qhoba_di" bpmnElement="StartEvent_1euiddy">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1onxfk1_di" bpmnElement="EndEvent_0b0ocu0">
-        <dc:Bounds x="787" y="20" width="36" height="36" />
+        <dc:Bounds x="1065" y="48" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1024" y="87" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_05scr6c_di" bpmnElement="auditEnabledCheck" isMarkerVisible="true">
+        <dc:Bounds x="371.6051332675222" y="259" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="421" y="272" width="45" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_1t9q2jl_di" bpmnElement="ExclusiveGateway_1t9q2jl" isMarkerVisible="true">
+        <dc:Bounds x="697" y="259" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="677" y="313" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1bt1p2u_di" bpmnElement="SequenceFlow_1bt1p2u">
+        <di:waypoint xsi:type="dc:Point" x="397" y="309" />
+        <di:waypoint xsi:type="dc:Point" x="397" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="309" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="407" y="326" width="14" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1oeootm_di" bpmnElement="SequenceFlow_1oeootm">
+        <di:waypoint xsi:type="dc:Point" x="195" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="244" y="284" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="219.5" y="263" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_10af0fk_di" bpmnElement="SequenceFlow_10af0fk">
+        <di:waypoint xsi:type="dc:Point" x="344" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="372" y="284" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="358" y="263" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_1l7z1c0_di" bpmnElement="aicQueryStack">
+        <dc:Bounds x="571" y="174" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1iulltd_di" bpmnElement="SequenceFlow_1iulltd">
+        <di:waypoint xsi:type="dc:Point" x="544" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="571" y="214" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="557.5" y="193" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0dzf7hz_di" bpmnElement="SequenceFlow_0dzf7hz">
+        <di:waypoint xsi:type="dc:Point" x="671" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="259" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="651.5" y="193" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1bq9g02_di" bpmnElement="SequenceFlow_1bq9g02">
+        <di:waypoint xsi:type="dc:Point" x="747" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="796" y="284" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="726.5" y="263" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0mtzl4z_di" bpmnElement="SequenceFlow_0mtzl4z">
+        <di:waypoint xsi:type="dc:Point" x="821" y="259" />
+        <di:waypoint xsi:type="dc:Point" x="821" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="846" y="214" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="791" y="231" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_028rmiu_di" bpmnElement="SequenceFlow_028rmiu">
+        <di:waypoint xsi:type="dc:Point" x="821" y="309" />
+        <di:waypoint xsi:type="dc:Point" x="821" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="888" y="352" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="791" y="324.5" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ParallelGateway_1we1ooj_di" bpmnElement="ExclusiveGateway_1naduhl">
+        <dc:Bounds x="796" y="259" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="760" y="59" width="0" height="12" />
+          <dc:Bounds x="775" y="313" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="InclusiveGateway_07wvmp4_di" bpmnElement="ExclusiveGateway_1yvh16a">
+        <dc:Bounds x="1178" y="259" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1067" y="312" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0hpj2mm_di" bpmnElement="SequenceFlow_0hpj2mm">
+        <di:waypoint xsi:type="dc:Point" x="1030" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="1058" y="157" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="999" y="136" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ExclusiveGateway_13fhmpf_di" bpmnElement="ExclusiveGateway_13fhmpf" isMarkerVisible="true">
+        <dc:Bounds x="846" y="189" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="898" y="202" width="45" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0f5ljoh_di" bpmnElement="SequenceFlow_0f5ljoh">
+        <di:waypoint xsi:type="dc:Point" x="871" y="189" />
+        <di:waypoint xsi:type="dc:Point" x="871" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="930" y="157" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="877.601615925754" y="162.89580806038546" width="19" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ExclusiveGateway_01wvywu_di" bpmnElement="ExclusiveGateway_01wvywu" isMarkerVisible="true">
+        <dc:Bounds x="1131" y="189" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1111" y="243" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1gjwivp_di" bpmnElement="SequenceFlow_1gjwivp">
+        <di:waypoint xsi:type="dc:Point" x="871" y="239" />
+        <di:waypoint xsi:type="dc:Point" x="871" y="266" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="266" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="239" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="879" y="244" width="14" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_13mlz57_di" bpmnElement="SequenceFlow_13mlz57">
+        <di:waypoint xsi:type="dc:Point" x="1181" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="259" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1147" y="193" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index 0a6a773..e64c44e 100644 (file)
@@ -11,6 +11,7 @@
         <camunda:in source="mso-request-id" target="mso-request-id" />
         <camunda:out source="WorkflowExceptionErrorMessage" target="WorkflowExceptionErrorMessage" />
         <camunda:out source="StatusMessage" target="StatusMessage" />
+        <camunda:in source="isRollback" target="isRollback" />
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_19wuics</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_01h9qmz</bpmn:outgoing>
     </bpmn:exclusiveGateway>
     <bpmn:sequenceFlow id="SequenceFlow_0je0y25" sourceRef="StatusPolicy" targetRef="CheckOrchestrationStatusValidationResults" />
     <bpmn:subProcess id="SubProcess_0tv8zda" name="Error Handling&#10;&#10;" triggeredByEvent="true">
-      <bpmn:startEvent id="StartEvent_0tmcs9g">
-        <bpmn:outgoing>SequenceFlow_09synl9</bpmn:outgoing>
-        <bpmn:errorEventDefinition camunda:errorCodeVariable="WorkflowExceptionCode" camunda:errorMessageVariable="WorkflowExceptionMessage" />
-      </bpmn:startEvent>
-      <bpmn:sequenceFlow id="SequenceFlow_09synl9" sourceRef="StartEvent_0tmcs9g" targetRef="Task_QueryRainyDayTable" />
       <bpmn:serviceTask id="Task_QueryRainyDayTable" name="QueryRainyDayTable" camunda:expression="${ExecuteBuildingBlockRainyDay.queryRainyDayTable(execution,true)}">
-        <bpmn:incoming>SequenceFlow_09synl9</bpmn:incoming>
+        <bpmn:incoming>SequenceFlow_0vdeqxv</bpmn:incoming>
         <bpmn:outgoing>SequenceFlow_0a62t4c</bpmn:outgoing>
       </bpmn:serviceTask>
       <bpmn:exclusiveGateway id="ExclusiveGateway_1aonzik" name="Check HandlingCode" default="SequenceFlow_0h8v45y">
         <bpmn:incoming>SequenceFlow_0541bid</bpmn:incoming>
         <bpmn:outgoing>SequenceFlow_12ps9at</bpmn:outgoing>
       </bpmn:serviceTask>
+      <bpmn:sequenceFlow id="SequenceFlow_0vdeqxv" sourceRef="Task_UpdateExtErrorSource" targetRef="Task_QueryRainyDayTable" />
+      <bpmn:sequenceFlow id="SequenceFlow_09synl9" sourceRef="StartEvent_0tmcs9g" targetRef="Task_UpdateExtErrorSource" />
+      <bpmn:startEvent id="StartEvent_0tmcs9g">
+        <bpmn:outgoing>SequenceFlow_09synl9</bpmn:outgoing>
+        <bpmn:errorEventDefinition camunda:errorCodeVariable="WorkflowExceptionCode" camunda:errorMessageVariable="WorkflowExceptionMessage" />
+      </bpmn:startEvent>
+      <bpmn:serviceTask id="Task_UpdateExtErrorSource" name="Update ExtErrorSource" camunda:expression="${ExecuteBuildingBlockRainyDay.updateExtSystemErrorSource(execution)}">
+        <bpmn:incoming>SequenceFlow_09synl9</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_0vdeqxv</bpmn:outgoing>
+      </bpmn:serviceTask>
     </bpmn:subProcess>
     <bpmn:sequenceFlow id="SequenceFlow_16lmcxp" sourceRef="Task_setHandlingCodeSuccess" targetRef="End_ExecuteBuildingBlock" />
     <bpmn:sequenceFlow id="SequenceFlow_1j0vskt" name="Silent Success" sourceRef="CheckOrchestrationStatusValidationResults" targetRef="Task_setHandlingCodeSuccess">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ExclusiveGateway_0ey4zpt_di" bpmnElement="ExclusiveGateway_0ey4zpt" isMarkerVisible="true">
-        <dc:Bounds x="721" y="385" width="50" height="50" />
+        <dc:Bounds x="692" y="389" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="716" y="360" width="63" height="13" />
+          <dc:Bounds x="686" y="364" width="65" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="IntermediateCatchEvent_0qjyidb_di" bpmnElement="IntermediateCatchEvent_RetryTimer">
-        <dc:Bounds x="965" y="392" width="36" height="36" />
+        <dc:Bounds x="936" y="396" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="956" y="367" width="55" height="13" />
+          <dc:Bounds x="927" y="371" width="56" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ExclusiveGateway_1aonzik_di" bpmnElement="ExclusiveGateway_1aonzik" isMarkerVisible="true">
-        <dc:Bounds x="568" y="385" width="50" height="50" />
+        <dc:Bounds x="539" y="389" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="558" y="347" width="70" height="25" />
+          <dc:Bounds x="528" y="351" width="72" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1wbevp0_di" bpmnElement="SequenceFlow_1wbevp0">
-        <di:waypoint xsi:type="dc:Point" x="771" y="410" />
-        <di:waypoint xsi:type="dc:Point" x="836" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="742" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="807" y="414" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="788" y="385" width="18" height="13" />
+          <dc:Bounds x="759" y="389" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0fwsjva_di" bpmnElement="SequenceFlow_0fwsjva">
-        <di:waypoint xsi:type="dc:Point" x="618" y="410" />
-        <di:waypoint xsi:type="dc:Point" x="721" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="589" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="692" y="414" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="656" y="418" width="27" height="13" />
+          <dc:Bounds x="627" y="422" width="28" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0h8v45y_di" bpmnElement="SequenceFlow_0h8v45y">
-        <di:waypoint xsi:type="dc:Point" x="593" y="435" />
-        <di:waypoint xsi:type="dc:Point" x="593" y="491" />
+        <di:waypoint xsi:type="dc:Point" x="564" y="439" />
+        <di:waypoint xsi:type="dc:Point" x="564" y="495" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="600" y="456" width="85" height="13" />
+          <dc:Bounds x="570" y="460" width="88" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1tifgqh_di" bpmnElement="Task_QueryRainyDayTable">
-        <dc:Bounds x="425" y="370" width="100" height="80" />
+        <dc:Bounds x="396" y="374" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ndt8ft_di" bpmnElement="SequenceFlow_0ndt8ft">
-        <di:waypoint xsi:type="dc:Point" x="936" y="410" />
-        <di:waypoint xsi:type="dc:Point" x="965" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="907" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="936" y="414" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="906" y="389" width="90" height="12" />
+          <dc:Bounds x="877" y="393" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_07a1ytc_di" bpmnElement="SequenceFlow_07a1ytc">
-        <di:waypoint xsi:type="dc:Point" x="1001" y="410" />
-        <di:waypoint xsi:type="dc:Point" x="1039" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="972" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="1010" y="414" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="975" y="389" width="90" height="12" />
+          <dc:Bounds x="946" y="393" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1obvxht_di" bpmnElement="Task_SetRetryTimer">
-        <dc:Bounds x="836" y="370" width="100" height="80" />
+        <dc:Bounds x="807" y="374" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0kdjsnx_di" bpmnElement="Continue">
         <di:waypoint xsi:type="dc:Point" x="508" y="180" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0a62t4c_di" bpmnElement="SequenceFlow_0a62t4c">
-        <di:waypoint xsi:type="dc:Point" x="525" y="410" />
-        <di:waypoint xsi:type="dc:Point" x="568" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="496" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="539" y="414" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="502" y="389" width="90" height="13" />
+          <dc:Bounds x="473" y="393" width="90" height="13" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_0tv8zda_di" bpmnElement="SubProcess_0tv8zda" isExpanded="true">
-        <dc:Bounds x="320" y="294" width="802" height="290" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="StartEvent_0tmcs9g_di" bpmnElement="StartEvent_0tmcs9g">
-        <dc:Bounds x="340" y="392" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="223" y="428" width="90" height="12" />
-        </bpmndi:BPMNLabel>
+        <dc:Bounds x="171" y="298" width="922" height="295" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_09synl9_di" bpmnElement="SequenceFlow_09synl9">
-        <di:waypoint xsi:type="dc:Point" x="376" y="410" />
-        <di:waypoint xsi:type="dc:Point" x="425" y="410" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="356" y="389" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_0mvmk3i_di" bpmnElement="EndEvent_0mvmk3i">
-        <dc:Bounds x="575" y="491" width="36" height="36" />
+        <dc:Bounds x="546" y="495" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="548" y="531" width="90" height="12" />
+          <dc:Bounds x="519" y="535" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1aww7yx_di" bpmnElement="EndEvent_1sez2lh">
-        <dc:Bounds x="1039" y="392" width="36" height="36" />
+        <dc:Bounds x="1010" y="396" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1049" y="432" width="19" height="13" />
+          <dc:Bounds x="1020" y="436" width="20" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_16lmcxp_di" bpmnElement="SequenceFlow_16lmcxp">
         <dc:Bounds x="906" y="140" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0541bid_di" bpmnElement="SequenceFlow_0541bid">
-        <di:waypoint xsi:type="dc:Point" x="746" y="435" />
-        <di:waypoint xsi:type="dc:Point" x="746" y="459" />
+        <di:waypoint xsi:type="dc:Point" x="717" y="439" />
+        <di:waypoint xsi:type="dc:Point" x="717" y="463" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="757" y="436" width="13" height="13" />
+          <dc:Bounds x="728" y="440" width="13" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_12ps9at_di" bpmnElement="SequenceFlow_12ps9at">
-        <di:waypoint xsi:type="dc:Point" x="796" y="499" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="499" />
+        <di:waypoint xsi:type="dc:Point" x="767" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="839" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="787" y="478" width="90" height="12" />
+          <dc:Bounds x="758" y="482" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_05vw85n_di" bpmnElement="EndEvent_0ex9298">
-        <dc:Bounds x="868" y="481" width="36" height="36" />
+        <dc:Bounds x="839" y="485" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="877" y="521" width="19" height="13" />
+          <dc:Bounds x="848" y="525" width="20" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_11f2c91_di" bpmnElement="Task_QuerySecondaryPolicy">
-        <dc:Bounds x="696" y="459" width="100" height="80" />
+        <dc:Bounds x="667" y="463" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0vdeqxv_di" bpmnElement="SequenceFlow_0vdeqxv">
+        <di:waypoint xsi:type="dc:Point" x="361" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="396" y="414" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="378.5" y="393" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="StartEvent_0tmcs9g_di" bpmnElement="StartEvent_0tmcs9g">
+        <dc:Bounds x="196" y="396" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="79" y="432" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_09synl9_di" bpmnElement="SequenceFlow_09synl9">
+        <di:waypoint xsi:type="dc:Point" x="232" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="261" y="414" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="201.5" y="393" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_10v49qn_di" bpmnElement="Task_UpdateExtErrorSource">
+        <dc:Bounds x="261" y="374" width="100" height="80" />
       </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
index b66ecfa..11227ed 100644 (file)
@@ -50,6 +50,7 @@ ex.processJavaException(execution)]]></bpmn2:script>
         <camunda:in source="asyncCorrelator" target="RCVWFMSG_correlator" />
         <camunda:in source="asyncTimeout" target="RCVWFMSG_timeout" />
         <camunda:out source="WorkflowResponse" target="asyncResponse" />
+        <camunda:in source="mso-request-id" target="mso-request-id" />
       </bpmn2:extensionElements>
       <bpmn2:incoming>SequenceFlow_0qrwjzu</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_03cy5y5</bpmn2:outgoing>
index 35b77d9..efdee86 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.7.2">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.0.3">
   <bpmn:process id="WorkflowActionBB" name="WorkflowActionBB" isExecutable="true">
     <bpmn:startEvent id="Start_WorkflowActionBB" name="start">
       <bpmn:outgoing>SequenceFlow_15s0okp</bpmn:outgoing>
@@ -23,6 +23,9 @@
         <camunda:out source="RetryDuration" target="RetryDuration" />
         <camunda:in source="suppressRollback" target="suppressRollback" />
         <camunda:out source="StatusMessage" target="StatusMessage" />
+        <camunda:in source="isRollback" target="isRollback" />
+        <camunda:in source="rollbackTargetState" target="rollbackTargetState" />
+        <camunda:out source="rollbackTargetState" target="rollbackTargetState" />
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_0mew9im</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1hsqed1</bpmn:outgoing>
@@ -43,7 +46,7 @@
       <bpmn:outgoing>SequenceFlow_0l7kaba</bpmn:outgoing>
     </bpmn:exclusiveGateway>
     <bpmn:sequenceFlow id="SequenceFlow_1m2eezj" name="Completed = true" sourceRef="ExclusiveGateway_Finished" targetRef="ExclusiveGateway_isTopLevelFlowC">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("completed")==true&&execution.getVariable("isRollback")==false&&execution.getVariable("handlingCode")=="Success"}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("completed")==true&amp;&amp;execution.getVariable("isRollback")==false&amp;&amp;execution.getVariable("handlingCode")=="Success"}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:serviceTask id="Task_RetrieveBBExectuionList" name="Retrieve BB Execution List" camunda:expression="${WorkflowAction.selectExecutionList(execution)}">
       <bpmn:incoming>SequenceFlow_15s0okp</bpmn:incoming>
@@ -80,7 +83,7 @@
       </bpmn:exclusiveGateway>
       <bpmn:sequenceFlow id="SequenceFlow_024g0d1" name="no" sourceRef="ExclusiveGateway_10q79b6" targetRef="Task_UpdateDb" />
       <bpmn:sequenceFlow id="SequenceFlow_0vi883o" name="yes" sourceRef="ExclusiveGateway_10q79b6" targetRef="Task_SendSyncAckError">
-        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("isTopLevelFlow")==true&&execution.getVariable("sentSyncResponse")==false}]]></bpmn:conditionExpression>
+        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("isTopLevelFlow")==true&amp;&amp;execution.getVariable("sentSyncResponse")==false}</bpmn:conditionExpression>
       </bpmn:sequenceFlow>
       <bpmn:sequenceFlow id="SequenceFlow_0eana0l" sourceRef="Task_SendSyncAckError" targetRef="Task_UpdateDb" />
       <bpmn:serviceTask id="Task_SendSyncAckError" name="Send Sync Ack API Handler" camunda:asyncAfter="true" camunda:expression="${WorkflowActionBBTasks.sendSyncAck(execution)}">
       </bpmn:serviceTask>
     </bpmn:subProcess>
     <bpmn:sequenceFlow id="SequenceFlow_0v588sm" name="Rollback = true" sourceRef="ExclusiveGateway_Finished" targetRef="Task_RollbackExecutionPath">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("handlingCode")=="Rollback"||execution.getVariable("handlingCode")=="RollbackToAssigned"||execution.getVariable("handlingCode")=="RollbackToCreated"}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("handlingCode")=="Rollback"||execution.getVariable("handlingCode")=="RollbackToAssigned"||execution.getVariable("handlingCode")=="RollbackToCreated"}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:sequenceFlow id="SequenceFlow_1atzsgn" sourceRef="Task_RollbackExecutionPath" targetRef="Task_SelectBB">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("isRollbackNeeded")==true}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("isRollbackNeeded")==true}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:serviceTask id="Task_RollbackExecutionPath" name="Rollback Execution Path" camunda:expression="${WorkflowActionBBTasks.rollbackExecutionPath(execution)}">
       <bpmn:incoming>SequenceFlow_0v588sm</bpmn:incoming>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0vc9go9" sourceRef="Task_RetrieveBBExectuionList" targetRef="ExclusiveGateway_isTopLevelFlow" />
     <bpmn:sequenceFlow id="SequenceFlow_11530ei" name="Abort = true" sourceRef="ExclusiveGateway_Finished" targetRef="ExclusiveGateway_isTopLevelFlowAbort">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("handlingCode")=="Abort"}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("handlingCode")=="Abort"}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:serviceTask id="Task_AbortAndCallErrorHandling" name="Update Request To Failed" camunda:expression="${WorkflowActionBBFailure.updateRequestStatusToFailed(execution)}">
       <bpmn:incoming>SequenceFlow_02ksbt0</bpmn:incoming>
     </bpmn:exclusiveGateway>
     <bpmn:sequenceFlow id="SequenceFlow_0sckerv" name="yes" sourceRef="ExclusiveGateway_isTopLevelFlow" targetRef="Task_SendSync" />
     <bpmn:sequenceFlow id="SequenceFlow_0unbew4" name="no" sourceRef="ExclusiveGateway_isTopLevelFlow" targetRef="Task_PreValidateWorkflow">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("isTopLevelFlow")==false}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("isTopLevelFlow")==false}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:exclusiveGateway id="ExclusiveGateway_isTopLevelFlowAbort" name="Is Top-Level Flow?" default="SequenceFlow_02ksbt0">
       <bpmn:incoming>SequenceFlow_11530ei</bpmn:incoming>
     </bpmn:exclusiveGateway>
     <bpmn:sequenceFlow id="SequenceFlow_02ksbt0" name="yes" sourceRef="ExclusiveGateway_isTopLevelFlowAbort" targetRef="Task_AbortAndCallErrorHandling" />
     <bpmn:sequenceFlow id="SequenceFlow_1r570x3" name="no" sourceRef="ExclusiveGateway_isTopLevelFlowAbort" targetRef="EndEvent_0lzz1ya">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("isTopLevelFlow")==false}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("isTopLevelFlow")==false}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:exclusiveGateway id="ExclusiveGateway_isTopLevelFlowC" name="Is Top-Level Flow?" default="SequenceFlow_0kf5sen">
       <bpmn:incoming>SequenceFlow_1m2eezj</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0kf5sen</bpmn:outgoing>
     </bpmn:exclusiveGateway>
     <bpmn:sequenceFlow id="SequenceFlow_0x4urgp" name="no" sourceRef="ExclusiveGateway_isTopLevelFlowC" targetRef="End_WorkflowActionBB">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("isTopLevelFlow")==false}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("isTopLevelFlow")==false}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:endEvent id="End_RollbackFailed" name="end">
       <bpmn:incoming>SequenceFlow_1ui67mc</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_11dlyzt" name="Rollback Not Needed" sourceRef="Task_RollbackExecutionPath" targetRef="Task_UpdateRequestToFailed">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("isRollbackNeeded")==false}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("isRollbackNeeded")==false}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:serviceTask id="Task_UpdateRequestToFailed" name="Update Request To Failed" camunda:expression="${WorkflowActionBBFailure.updateRequestStatusToFailedWithRollback(execution)}">
       <bpmn:incoming>SequenceFlow_11dlyzt</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1ui67mc</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0l7kaba" name="Rollback Completed" sourceRef="ExclusiveGateway_Finished" targetRef="Task_UpdateRequestToFailed">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("completed")==true&&execution.getVariable("isRollback")==true&&execution.getVariable("handlingCode")=="Success"}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("completed")==true&amp;&amp;execution.getVariable("isRollback")==true&amp;&amp;execution.getVariable("handlingCode")=="Success"}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:sequenceFlow id="SequenceFlow_1ui67mc" sourceRef="Task_UpdateRequestToFailed" targetRef="End_RollbackFailed" />
     <bpmn:subProcess id="SubProcess_0fuugr9" name="Java Exception Handling Sub Process" triggeredByEvent="true">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_15s0okp_di" bpmnElement="SequenceFlow_15s0okp">
-        <di:waypoint xsi:type="dc:Point" x="-398" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="-365" y="120" />
+        <di:waypoint x="-398" y="120" />
+        <di:waypoint x="-365" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="-381" y="99" width="0" height="0" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="560" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0mqrkxv_di" bpmnElement="SequenceFlow_0mqrkxv">
-        <di:waypoint xsi:type="dc:Point" x="339" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="400" y="120" />
+        <di:waypoint x="339" y="120" />
+        <di:waypoint x="400" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="324.5" y="105" width="90" height="0" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1m2eezj_di" bpmnElement="SequenceFlow_1m2eezj">
-        <di:waypoint xsi:type="dc:Point" x="949" y="132" />
-        <di:waypoint xsi:type="dc:Point" x="980" y="165" />
-        <di:waypoint xsi:type="dc:Point" x="1060" y="165" />
+        <di:waypoint x="949" y="132" />
+        <di:waypoint x="980" y="165" />
+        <di:waypoint x="1060" y="165" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="968" y="168" width="83" height="12" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="1161" y="206" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1pz6edz_di" bpmnElement="SequenceFlow_1pz6edz">
-        <di:waypoint xsi:type="dc:Point" x="1261" y="246" />
-        <di:waypoint xsi:type="dc:Point" x="1322" y="246" />
-        <di:waypoint xsi:type="dc:Point" x="1322" y="183" />
+        <di:waypoint x="1261" y="246" />
+        <di:waypoint x="1322" y="246" />
+        <di:waypoint x="1322" y="183" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1247" y="231" width="90" height="0" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0v588sm_di" bpmnElement="SequenceFlow_0v588sm">
-        <di:waypoint xsi:type="dc:Point" x="936" y="145" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="262" />
-        <di:waypoint xsi:type="dc:Point" x="339" y="262" />
+        <di:waypoint x="936" y="145" />
+        <di:waypoint x="936" y="262" />
+        <di:waypoint x="339" y="262" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="769.202380952381" y="272" width="73" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1atzsgn_di" bpmnElement="SequenceFlow_1atzsgn">
-        <di:waypoint xsi:type="dc:Point" x="289" y="222" />
-        <di:waypoint xsi:type="dc:Point" x="289" y="160" />
+        <di:waypoint x="289" y="222" />
+        <di:waypoint x="289" y="160" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="259" y="191" width="90" height="0" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="239" y="222" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0vc9go9_di" bpmnElement="SequenceFlow_0vc9go9">
-        <di:waypoint xsi:type="dc:Point" x="-265" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="-228" y="120" />
+        <di:waypoint x="-265" y="120" />
+        <di:waypoint x="-228" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="-246" y="105" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_11530ei_di" bpmnElement="SequenceFlow_11530ei">
-        <di:waypoint xsi:type="dc:Point" x="946" y="105" />
-        <di:waypoint xsi:type="dc:Point" x="983" y="44" />
-        <di:waypoint xsi:type="dc:Point" x="1060" y="45" />
+        <di:waypoint x="946" y="105" />
+        <di:waypoint x="983" y="44" />
+        <di:waypoint x="1060" y="45" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="975" y="17" width="58" height="12" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1p8yxu6_di" bpmnElement="SequenceFlow_1p8yxu6">
-        <di:waypoint xsi:type="dc:Point" x="1276" y="-36" />
-        <di:waypoint xsi:type="dc:Point" x="1359" y="-36" />
-        <di:waypoint xsi:type="dc:Point" x="1359" y="45" />
-        <di:waypoint xsi:type="dc:Point" x="1386" y="45" />
+        <di:waypoint x="1276" y="-36" />
+        <di:waypoint x="1359" y="-36" />
+        <di:waypoint x="1359" y="45" />
+        <di:waypoint x="1386" y="45" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1329" y="5" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1wb59ic_di" bpmnElement="SequenceFlow_1wb59ic">
-        <di:waypoint xsi:type="dc:Point" x="-32" y="34" />
-        <di:waypoint xsi:type="dc:Point" x="32" y="34" />
-        <di:waypoint xsi:type="dc:Point" x="32" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="80" y="120" />
+        <di:waypoint x="-32" y="34" />
+        <di:waypoint x="32" y="34" />
+        <di:waypoint x="32" y="120" />
+        <di:waypoint x="80" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="47" y="77" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_01j184u_di" bpmnElement="SequenceFlow_01j184u">
-        <di:waypoint xsi:type="dc:Point" x="936" y="95" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="55" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="55" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="4" />
+        <di:waypoint x="936" y="95" />
+        <di:waypoint x="936" y="55" />
+        <di:waypoint x="936" y="55" />
+        <di:waypoint x="936" y="4" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="906" y="49" width="90" height="0" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0sckerv_di" bpmnElement="SequenceFlow_0sckerv">
-        <di:waypoint xsi:type="dc:Point" x="-202" y="96" />
-        <di:waypoint xsi:type="dc:Point" x="-202" y="34" />
-        <di:waypoint xsi:type="dc:Point" x="-132" y="34" />
+        <di:waypoint x="-202" y="96" />
+        <di:waypoint x="-202" y="34" />
+        <di:waypoint x="-132" y="34" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="-195" y="55.55555555555556" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0unbew4_di" bpmnElement="SequenceFlow_0unbew4">
-        <di:waypoint xsi:type="dc:Point" x="-178" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="80" y="120" />
+        <di:waypoint x="-178" y="120" />
+        <di:waypoint x="80" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="-87" y="99.95468180757382" width="12" height="12" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_02ksbt0_di" bpmnElement="SequenceFlow_02ksbt0">
-        <di:waypoint xsi:type="dc:Point" x="1085" y="20" />
-        <di:waypoint xsi:type="dc:Point" x="1085" y="-37" />
-        <di:waypoint xsi:type="dc:Point" x="1176" y="-37" />
+        <di:waypoint x="1085" y="20" />
+        <di:waypoint x="1085" y="-37" />
+        <di:waypoint x="1176" y="-37" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1091" y="-8" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1r570x3_di" bpmnElement="SequenceFlow_1r570x3">
-        <di:waypoint xsi:type="dc:Point" x="1110" y="45" />
-        <di:waypoint xsi:type="dc:Point" x="1386" y="45" />
+        <di:waypoint x="1110" y="45" />
+        <di:waypoint x="1386" y="45" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1242" y="20" width="12" height="12" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0x4urgp_di" bpmnElement="SequenceFlow_0x4urgp">
-        <di:waypoint xsi:type="dc:Point" x="1110" y="165" />
-        <di:waypoint xsi:type="dc:Point" x="1220" y="165" />
-        <di:waypoint xsi:type="dc:Point" x="1220" y="165" />
-        <di:waypoint xsi:type="dc:Point" x="1304" y="165" />
+        <di:waypoint x="1110" y="165" />
+        <di:waypoint x="1220" y="165" />
+        <di:waypoint x="1220" y="165" />
+        <di:waypoint x="1304" y="165" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1256" y="140" width="12" height="12" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_11dlyzt_di" bpmnElement="SequenceFlow_11dlyzt">
-        <di:waypoint xsi:type="dc:Point" x="289" y="302" />
-        <di:waypoint xsi:type="dc:Point" x="289" y="368" />
-        <di:waypoint xsi:type="dc:Point" x="960" y="368" />
+        <di:waypoint x="289" y="302" />
+        <di:waypoint x="289" y="368" />
+        <di:waypoint x="960" y="368" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="381.45685840707966" y="325" width="63" height="24" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="960" y="325" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0l7kaba_di" bpmnElement="SequenceFlow_0l7kaba">
-        <di:waypoint xsi:type="dc:Point" x="942" y="139" />
-        <di:waypoint xsi:type="dc:Point" x="976" y="252" />
-        <di:waypoint xsi:type="dc:Point" x="1016" y="252" />
-        <di:waypoint xsi:type="dc:Point" x="1016" y="325" />
+        <di:waypoint x="942" y="139" />
+        <di:waypoint x="976" y="252" />
+        <di:waypoint x="1016" y="252" />
+        <di:waypoint x="1016" y="325" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="959" y="255" width="52" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1edjl5x_di" bpmnElement="SequenceFlow_1edjl5x">
-        <di:waypoint xsi:type="dc:Point" x="556" y="657" />
-        <di:waypoint xsi:type="dc:Point" x="602" y="657" />
+        <di:waypoint x="556" y="657" />
+        <di:waypoint x="602" y="657" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="534" y="636" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0wvzfgf_di" bpmnElement="SequenceFlow_0wvzfgf">
-        <di:waypoint xsi:type="dc:Point" x="813" y="657" />
-        <di:waypoint xsi:type="dc:Point" x="880" y="657" />
+        <di:waypoint x="813" y="657" />
+        <di:waypoint x="880" y="657" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="801.5" y="636" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1ui67mc_di" bpmnElement="SequenceFlow_1ui67mc">
-        <di:waypoint xsi:type="dc:Point" x="1060" y="365" />
-        <di:waypoint xsi:type="dc:Point" x="1134" y="365" />
-        <di:waypoint xsi:type="dc:Point" x="1134" y="365" />
-        <di:waypoint xsi:type="dc:Point" x="1159" y="365" />
+        <di:waypoint x="1060" y="365" />
+        <di:waypoint x="1134" y="365" />
+        <di:waypoint x="1134" y="365" />
+        <di:waypoint x="1159" y="365" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1104" y="359" width="90" height="13" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_024g0d1_di" bpmnElement="SequenceFlow_024g0d1">
-        <di:waypoint xsi:type="dc:Point" x="652" y="657" />
-        <di:waypoint xsi:type="dc:Point" x="683" y="657" />
-        <di:waypoint xsi:type="dc:Point" x="683" y="657" />
-        <di:waypoint xsi:type="dc:Point" x="713" y="657" />
+        <di:waypoint x="652" y="657" />
+        <di:waypoint x="683" y="657" />
+        <di:waypoint x="683" y="657" />
+        <di:waypoint x="713" y="657" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="677" y="634" width="12" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0vi883o_di" bpmnElement="SequenceFlow_0vi883o">
-        <di:waypoint xsi:type="dc:Point" x="627" y="632" />
-        <di:waypoint xsi:type="dc:Point" x="627" y="548" />
-        <di:waypoint xsi:type="dc:Point" x="713" y="548" />
+        <di:waypoint x="627" y="632" />
+        <di:waypoint x="627" y="548" />
+        <di:waypoint x="713" y="548" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="633" y="584" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0eana0l_di" bpmnElement="SequenceFlow_0eana0l">
-        <di:waypoint xsi:type="dc:Point" x="763" y="588" />
-        <di:waypoint xsi:type="dc:Point" x="763" y="617" />
+        <di:waypoint x="763" y="588" />
+        <di:waypoint x="763" y="617" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="778" y="596.5" width="0" height="12" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_11d126w_di" bpmnElement="SequenceFlow_11d126w">
-        <di:waypoint xsi:type="dc:Point" x="606" y="875" />
-        <di:waypoint xsi:type="dc:Point" x="690" y="875" />
+        <di:waypoint x="606" y="875" />
+        <di:waypoint x="690" y="875" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="603" y="854" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0w4sx88_di" bpmnElement="SequenceFlow_0w4sx88">
-        <di:waypoint xsi:type="dc:Point" x="790" y="875" />
-        <di:waypoint xsi:type="dc:Point" x="856" y="875" />
+        <di:waypoint x="790" y="875" />
+        <di:waypoint x="856" y="875" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="778" y="854" width="0" height="12" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="400" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0mew9im_di" bpmnElement="SequenceFlow_0mew9im">
-        <di:waypoint xsi:type="dc:Point" x="500" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="560" y="120" />
+        <di:waypoint x="500" y="120" />
+        <di:waypoint x="560" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="530" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0kf5sen_di" bpmnElement="SequenceFlow_0kf5sen">
-        <di:waypoint xsi:type="dc:Point" x="1085" y="190" />
-        <di:waypoint xsi:type="dc:Point" x="1085" y="246" />
-        <di:waypoint xsi:type="dc:Point" x="1161" y="246" />
+        <di:waypoint x="1085" y="190" />
+        <di:waypoint x="1085" y="246" />
+        <di:waypoint x="1161" y="246" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1091" y="218" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1tfizxf_di" bpmnElement="SequenceFlow_1tfizxf">
-        <di:waypoint xsi:type="dc:Point" x="180" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="211" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="211" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="239" y="120" />
+        <di:waypoint x="180" y="120" />
+        <di:waypoint x="211" y="120" />
+        <di:waypoint x="211" y="120" />
+        <di:waypoint x="239" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="226" y="120" width="0" height="0" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="735" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1hsqed1_di" bpmnElement="SequenceFlow_1hsqed1">
-        <di:waypoint xsi:type="dc:Point" x="660" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="735" y="120" />
+        <di:waypoint x="660" y="120" />
+        <di:waypoint x="735" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="697.5" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1fftixk_di" bpmnElement="SequenceFlow_1fftixk">
-        <di:waypoint xsi:type="dc:Point" x="835" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="911" y="120" />
+        <di:waypoint x="835" y="120" />
+        <di:waypoint x="911" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="873" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1pnkpim_di" bpmnElement="SequenceFlow_1pnkpim">
-        <di:waypoint xsi:type="dc:Point" x="886" y="-36" />
-        <di:waypoint xsi:type="dc:Point" x="289" y="-36" />
-        <di:waypoint xsi:type="dc:Point" x="289" y="80" />
+        <di:waypoint x="886" y="-36" />
+        <di:waypoint x="289" y="-36" />
+        <di:waypoint x="289" y="80" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="587.5" y="-57" width="0" height="12" />
         </bpmndi:BPMNLabel>
index 051f373..bd29e55 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
  * 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
@@ -93,8 +95,7 @@ public class WorkflowActionBBTest extends BaseBPMNTest {
         Map<String, String> map = new HashMap<>();
         map.put("handlingCode", "Abort");
 
-        doThrow(new BpmnError("7000", "TESTING ERRORS")).when(workflowActionBBFailure)
-                .abortCallErrorHandling(any(DelegateExecution.class));
+        doThrow(new BpmnError("7000", "TESTING ERRORS")).when(workflowActionBBFailure).abortCallErrorHandling();
         mockSubprocess("ExecuteBuildingBlock", "Mocked ExecuteBuildingBlock", "GenericStub", map);
 
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("WorkflowActionBB", variables);
index d9166c9..47d0ad9 100644 (file)
@@ -46,18 +46,20 @@ public class DeleteVfModuleBBTest extends BaseBPMNTest {
         mockSubprocess("VnfAdapter", "Mocked VnfAdapter", "GenericStub");
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeleteVfModuleBB", variables);
         List<LockedExternalTask> tasks = externalTaskService.fetchAndLock(100, "externalWorkerId")
-                .topic("InventoryDeleteAudit", 60L * 1000L).execute();
+                .topic("InventoryDeleteAudit", 60L * 1000L).topic("InventoryQueryAudit", 60L * 1000L).execute();
         while (!tasks.isEmpty()) {
             for (LockedExternalTask task : tasks) {
                 externalTaskService.complete(task.getId(), "externalWorkerId");
             }
             tasks = externalTaskService.fetchAndLock(100, "externalWorkerId").topic("InventoryDeleteAudit", 60L * 1000L)
-                    .execute();
+                    .topic("InventoryQueryAudit", 60L * 1000L).execute();
         }
         assertThat(pi).isNotNull();
-        assertThat(pi).isStarted().hasPassed("DeleteVfModuleBB_Start", "ExclusiveGateway_0xrgzm7",
-                "ExclusiveGateway_1yvh16a", "Check_Audit", "Setup_Audit_Variable", "Audit_Inventory",
-                "DeleteVfModuleVnfAdapter", "VnfAdapter", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress",
+        assertThat(pi).isStarted().hasPassed("DeleteVfModuleBB_Start", "Check_Audit", "auditEnabledCheck",
+                "Setup_Audit_Variable", "Setup_Audit_Variable", "aicQueryStack", "ExclusiveGateway_1t9q2jl",
+                "ExclusiveGateway_1naduhl", "ExclusiveGateway_13fhmpf", "DeleteVfModuleVnfAdapter", "VnfAdapter",
+                "Audit_Inventory", "ExclusiveGateway_1yvh16a", "auditSuccessfulCheck", "ExclusiveGateway_01wvywu",
+                "ExclusiveGateway_1yvh16a", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress",
                 "UpdateVnfManagementV6Address", "UpdateVfModuleContrailServiceInstanceFqdn",
                 "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
         assertThat(pi).isEnded();
@@ -68,19 +70,22 @@ public class DeleteVfModuleBBTest extends BaseBPMNTest {
         doThrow(BpmnError.class).when(vnfAdapterDeleteTasks).deleteVfModule(any(BuildingBlockExecution.class));
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeleteVfModuleBB", variables);
         List<LockedExternalTask> tasks = externalTaskService.fetchAndLock(100, "externalWorkerId")
-                .topic("InventoryDeleteAudit", 60L * 1000L).execute();
+                .topic("InventoryDeleteAudit", 60L * 1000L).topic("InventoryQueryAudit", 60L * 1000L).execute();
         while (!tasks.isEmpty()) {
             for (LockedExternalTask task : tasks) {
                 externalTaskService.complete(task.getId(), "externalWorkerId");
             }
             tasks = externalTaskService.fetchAndLock(100, "externalWorkerId").topic("InventoryDeleteAudit", 60L * 1000L)
-                    .execute();
+                    .topic("InventoryQueryAudit", 60L * 1000L).execute();
         }
         assertThat(pi).isNotNull();
-        assertThat(pi).isStarted().hasPassed("DeleteVfModuleBB_Start", "DeleteVfModuleVnfAdapter").hasNotPassed(
-                "VnfAdapter", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress", "UpdateVnfManagementV6Address",
-                "UpdateVfModuleContrailServiceInstanceFqdn", "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus",
-                "DeleteVfModuleBB_End");
+        assertThat(pi).isStarted()
+                .hasPassed("DeleteVfModuleBB_Start", "Check_Audit", "auditEnabledCheck", "Setup_Audit_Variable",
+                        "Setup_Audit_Variable", "aicQueryStack", "ExclusiveGateway_1t9q2jl", "ExclusiveGateway_1naduhl",
+                        "ExclusiveGateway_13fhmpf")
+                .hasNotPassed("VnfAdapter", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress",
+                        "UpdateVnfManagementV6Address", "UpdateVfModuleContrailServiceInstanceFqdn",
+                        "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
         assertThat(pi).isEnded();
     }
 }
index ad388fe..c7c12bf 100644 (file)
@@ -37,7 +37,7 @@ public class NsParameters {
 
     private List<LocationConstraint> locationConstraints;
 
-    private Map<String, Object> additionalParamForNs = new HashMap<String, Object>();
+    private Map<String, Object> additionalParamForNs = new HashMap<>();
 
     /**
      * @return Returns the locationConstraints.
index 22c4f95..9319353 100644 (file)
@@ -26,6 +26,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -34,6 +35,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
+import java.util.Properties;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpResponse;
 import org.apache.http.ParseException;
@@ -73,13 +75,9 @@ import org.springframework.web.util.UriUtils;
 
 public class ServicePluginFactory {
 
-    // SOTN calculate route
-    public static final String OOF_DEFAULT_ENDPOINT = "http://192.168.1.223:8443/oof/sotncalc";
-
-    public static final String THIRD_SP_DEFAULT_ENDPOINT = "http://192.168.1.223:8443/sp/resourcemgr/querytps";
-
-    public static final String INVENTORY_OSS_DEFAULT_ENDPOINT = "http://192.168.1.199:8443/oss/inventory";
-
+    private static String OOF_DEFAULT_ENDPOINT;
+    private static String THIRD_SP_DEFAULT_ENDPOINT;
+    private static String INVENTORY_OSS_DEFAULT_ENDPOINT;
     private static final int DEFAULT_TIME_OUT = 60000;
 
     static JsonUtils jsonUtil = new JsonUtils();
@@ -88,6 +86,17 @@ public class ServicePluginFactory {
 
     private static ServicePluginFactory instance;
 
+    static {
+        try (InputStream is = ClassLoader.class.getResourceAsStream("/application.properties")) {
+            Properties prop = new Properties();
+            prop.load(is);
+            OOF_DEFAULT_ENDPOINT = prop.getProperty("oof.default.endpoint");
+            THIRD_SP_DEFAULT_ENDPOINT = prop.getProperty("third.sp.default.endpoint");
+            INVENTORY_OSS_DEFAULT_ENDPOINT = prop.getProperty("inventory.oss.default.endpoint");
+        } catch (IOException e) {
+            logger.error("Failed to load property file!");
+        }
+    }
 
     public static synchronized ServicePluginFactory getInstance() {
         if (null == instance) {
@@ -802,4 +811,5 @@ public class ServicePluginFactory {
             }
         }
     }
+
 }
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/resources/application.properties b/bpmn/so-bpmn-infrastructure-common/src/main/resources/application.properties
new file mode 100644 (file)
index 0000000..87af451
--- /dev/null
@@ -0,0 +1,3 @@
+oof.default.endpoint=http://192.168.1.223:8443/oof/sotncalc
+third.sp.default.endpoint=http://192.168.1.223:8443/sp/resourcemgr/querytps
+inventory.oss.default.endpoint=http://192.168.1.199:8443/oss/inventory
index 0b4050b..1a75f12 100644 (file)
@@ -20,6 +20,7 @@
 package org.onap.so.bpmn.infrastructure.workflow.service;
 
 import static org.mockito.Mockito.doReturn;
+import org.apache.commons.lang.reflect.FieldUtils;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -154,4 +155,21 @@ public class ServicePluginFactoryTest {
         String result = servicePluginFactory.doServiceHoming(null, invalidJsonWithOnlyNeededValues);
         Assert.assertEquals(result, invalidJsonWithOnlyNeededValues);
     }
+
+    @Test
+    public void verifyExternalConfigurationLoading() throws IllegalAccessException {
+
+        ServicePluginFactory servicePluginFactory = ServicePluginFactory.getInstance();
+
+        String oofDefaultEndpoint = (String) FieldUtils.readField(servicePluginFactory, "OOF_DEFAULT_ENDPOINT", true);
+        Assert.assertNotNull(oofDefaultEndpoint);
+
+        String thirdSpDefaultEndpoint =
+                (String) FieldUtils.readField(servicePluginFactory, "THIRD_SP_DEFAULT_ENDPOINT", true);
+        Assert.assertNotNull(thirdSpDefaultEndpoint);
+
+        String inventoryOssDefaultEndpoint =
+                (String) FieldUtils.readField(servicePluginFactory, "INVENTORY_OSS_DEFAULT_ENDPOINT", true);
+        Assert.assertNotNull(inventoryOssDefaultEndpoint);
+    }
 }
index e5df3d3..f1fd23f 100644 (file)
@@ -65,6 +65,7 @@ import org.onap.so.client.sniro.beans.ServiceInfo;
 import org.onap.so.client.sniro.beans.SniroManagerRequest;
 import org.onap.so.client.sniro.beans.SubscriberInfo;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
+import org.onap.so.utils.TargetEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -160,14 +161,15 @@ public class SniroHomingV2 {
             logger.trace("Completed Sniro Homing Call Sniro");
         } catch (BpmnError e) {
             logger.error(EXCEPTION_OCCURRED, e);
-            exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(e.getErrorCode()), e.getMessage());
+            exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(e.getErrorCode()), e.getMessage(),
+                    TargetEntity.SNIRO);
         } catch (BadResponseException e) {
             logger.error(EXCEPTION_OCCURRED, e);
-            exceptionUtil.buildAndThrowWorkflowException(execution, 400, e.getMessage());
+            exceptionUtil.buildAndThrowWorkflowException(execution, 400, e.getMessage(), TargetEntity.SNIRO);
         } catch (Exception e) {
             logger.error(EXCEPTION_OCCURRED, e);
             exceptionUtil.buildAndThrowWorkflowException(execution, INTERNAL,
-                    "Internal Error - occurred while preparing sniro request: " + e.getMessage());
+                    "Internal Error - occurred while preparing sniro request: " + e.getMessage(), TargetEntity.SO);
         }
     }
 
@@ -211,14 +213,16 @@ public class SniroHomingV2 {
             logger.trace("Completed Sniro Homing Process Solution");
         } catch (BpmnError e) {
             logger.error(EXCEPTION_OCCURRED, e);
-            exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(e.getErrorCode()), e.getMessage());
+            exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(e.getErrorCode()), e.getMessage(),
+                    TargetEntity.SNIRO);
         } catch (BadResponseException e) {
             logger.error(EXCEPTION_OCCURRED, e);
-            exceptionUtil.buildAndThrowWorkflowException(execution, 400, e.getMessage());
+            exceptionUtil.buildAndThrowWorkflowException(execution, 400, e.getMessage(), TargetEntity.SNIRO);
         } catch (Exception e) {
             logger.error(EXCEPTION_OCCURRED, e);
             exceptionUtil.buildAndThrowWorkflowException(execution, INTERNAL,
-                    "Internal Error - occurred while processing sniro asynchronous response: " + e.getMessage());
+                    "Internal Error - occurred while processing sniro asynchronous response: " + e.getMessage(),
+                    TargetEntity.SO);
         }
     }
 
index e3540ec..583e3e1 100644 (file)
@@ -77,7 +77,6 @@ public class AAICreateTasks {
 
     private static final Logger logger = LoggerFactory.getLogger(AAICreateTasks.class);
     private static final String networkTypeProvider = "PROVIDER";
-    private static final String A_LA_CARTE = "aLaCarte";
     private static String NETWORK_COLLECTION_NAME = "networkCollectionName";
     private static String CONTRAIL_NETWORK_POLICY_FQDN_LIST = "contrailNetworkPolicyFqdnList";
     private static String HEAT_STACK_ID = "heatStackId";
@@ -107,12 +106,8 @@ public class AAICreateTasks {
 
     public void createServiceInstance(BuildingBlockExecution execution) {
         try {
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
-            if (Boolean.TRUE.equals(alaCarte) && aaiSIResources.checkInstanceServiceNameInUse(serviceInstance)) {
-                throw new DuplicateNameException("service-instance", serviceInstance.getServiceInstanceName());
-            }
             Customer customer = execution.getGeneralBuildingBlock().getCustomer();
             aaiSIResources.createServiceInstance(serviceInstance, customer);
         } catch (Exception ex) {
@@ -199,11 +194,7 @@ public class AAICreateTasks {
 
     public void createVnf(BuildingBlockExecution execution) {
         try {
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
-            if (Boolean.TRUE.equals(alaCarte) && aaiVnfResources.checkNameInUse(vnf.getVnfName())) {
-                throw new DuplicateNameException("generic-vnf", vnf.getVnfName());
-            }
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
             execution.setVariable("homing", Boolean.TRUE.equals(vnf.isCallHoming()));
@@ -262,10 +253,6 @@ public class AAICreateTasks {
             GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
             VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID);
             CloudRegion cloudRegion = gBBInput.getCloudRegion();
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
-            if (Boolean.TRUE.equals(alaCarte) && aaiVolumeGroupResources.checkNameInUse(volumeGroup)) {
-                throw new DuplicateNameException("volume-group", volumeGroup.getVolumeGroupName());
-            }
             aaiVolumeGroupResources.createVolumeGroup(volumeGroup, cloudRegion);
             aaiVolumeGroupResources.connectVolumeGroupToVnf(genericVnf, volumeGroup, cloudRegion);
             aaiVolumeGroupResources.connectVolumeGroupToTenant(volumeGroup, cloudRegion);
@@ -278,10 +265,6 @@ public class AAICreateTasks {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
-            if (Boolean.TRUE.equals(alaCarte) && aaiVfModuleResources.checkNameInUse(vfModule)) {
-                throw new DuplicateNameException("vf-module", vfModule.getVfModuleName());
-            }
             int moduleIndex = 0;
             if (vfModule.getModelInfoVfModule() != null
                     && !Boolean.TRUE.equals(vfModule.getModelInfoVfModule().getIsBaseBoolean())) {
@@ -327,14 +310,9 @@ public class AAICreateTasks {
      */
     public void createNetwork(BuildingBlockExecution execution) {
         try {
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
             L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID);
-            if (Boolean.TRUE.equals(alaCarte)
-                    && aaiNetworkResources.checkNetworkNameInUse(l3network.getNetworkName())) {
-                throw new DuplicateNameException("l3Network", l3network.getNetworkName());
-            }
             // set default to false. ToBe updated by SDNC
             l3network.setIsBoundToVpn(false);
             // define is bound to vpn flag as true if NEUTRON_NETWORK_TYPE is PROVIDER
@@ -385,16 +363,11 @@ public class AAICreateTasks {
      */
     public void createNetworkCollectionInstanceGroup(BuildingBlockExecution execution) {
         try {
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
             InstanceGroup instanceGroup = serviceInstance.getCollection().getInstanceGroup();
             // set name generated for NetworkCollection/NetworkCollectionInstanceGroup in previous step of the BB flow
             instanceGroup.setInstanceGroupName(execution.getVariable(NETWORK_COLLECTION_NAME));
-            if (Boolean.TRUE.equals(alaCarte)
-                    && aaiInstanceGroupResources.checkInstanceGroupNameInUse(instanceGroup.getInstanceGroupName())) {
-                throw new DuplicateNameException("instance-group", instanceGroup.getInstanceGroupName());
-            }
             // put shell in AAI
             aaiNetworkResources.createNetworkInstanceGroup(instanceGroup);
         } catch (Exception ex) {
@@ -511,12 +484,7 @@ public class AAICreateTasks {
 
     public void createConfiguration(BuildingBlockExecution execution) {
         try {
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
             Configuration configuration = extractPojosForBB.extractByKey(execution, ResourceKey.CONFIGURATION_ID);
-            if (Boolean.TRUE.equals(alaCarte)
-                    && aaiConfigurationResources.checkConfigurationNameInUse(configuration.getConfigurationName())) {
-                throw new DuplicateNameException("configuration", configuration.getConfigurationName());
-            }
             aaiConfigurationResources.createConfiguration(configuration);
         } catch (Exception ex) {
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
@@ -525,14 +493,9 @@ public class AAICreateTasks {
 
     public void createInstanceGroupVnf(BuildingBlockExecution execution) {
         try {
-            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
             InstanceGroup instanceGroup = extractPojosForBB.extractByKey(execution, ResourceKey.INSTANCE_GROUP_ID);
-            if (Boolean.TRUE.equals(alaCarte)
-                    && aaiInstanceGroupResources.checkInstanceGroupNameInUse(instanceGroup.getInstanceGroupName())) {
-                throw new DuplicateNameException("instance-group", instanceGroup.getInstanceGroupName());
-            }
             aaiInstanceGroupResources.createInstanceGroupandConnectServiceInstance(instanceGroup, serviceInstance);
         } catch (Exception ex) {
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
index 12aade7..1add5e6 100644 (file)
@@ -35,7 +35,6 @@ import org.springframework.stereotype.Component;
 
 @Component
 public class AAIFlagTasks {
-    private static final Logger logger = LoggerFactory.getLogger(AAIFlagTasks.class);
 
     @Autowired
     private AAIVnfResources aaiVnfResources;
index 859db11..e9d33f4 100644 (file)
@@ -38,6 +38,7 @@ import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
 import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.orchestration.NetworkAdapterResources;
+import org.onap.so.utils.TargetEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -93,7 +94,7 @@ public class NetworkAdapterRestV1 {
                 throw new Exception("No Network Request was created. networkAdapterRequest was null.");
             }
         } catch (Exception ex) {
-            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, ex);
+            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SO);
         }
     }
 
@@ -138,7 +139,7 @@ public class NetworkAdapterRestV1 {
             }
         } catch (Exception e) {
             logger.error("Error in Openstack Adapter callback", e);
-            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getMessage());
+            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getMessage(), TargetEntity.OPENSTACK);
         }
     }
 
@@ -151,7 +152,7 @@ public class NetworkAdapterRestV1 {
 
     public void handleTimeOutException(DelegateExecution execution) {
         exceptionBuilder.buildAndThrowWorkflowException(execution, 7000,
-                "Error timed out waiting on Openstack Async-Response");
+                "Error timed out waiting on Openstack Async-Response", TargetEntity.SO);
     }
 
     public void handleSyncError(DelegateExecution execution) {
@@ -159,6 +160,6 @@ public class NetworkAdapterRestV1 {
         String responseString = (String) execution.getVariable(NETWORK_SYNC_RESPONSE);
         String errorMessage = "Error with Openstack Adapter Sync Request: StatusCode = " + statusCode + " Response = "
                 + responseString;
-        exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, errorMessage);
+        exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, errorMessage, TargetEntity.OPENSTACK);
     }
 }
index 62878fd..922b721 100644 (file)
 package org.onap.so.bpmn.infrastructure.audit;
 
 
+import java.util.List;
 import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.exception.BBObjectNotFoundException;
 import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -83,12 +89,17 @@ public class AuditTasks {
 
         GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
         VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
+        GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
         CloudRegion cloudRegion = gBBInput.getCloudRegion();
 
+        auditInventory.setMsoRequestId(gBBInput.getRequestContext().getMsoRequestId());
         auditInventory.setCloudOwner(cloudRegion.getCloudOwner());
         auditInventory.setCloudRegion(cloudRegion.getLcpCloudRegionId());
         auditInventory.setTenantId(cloudRegion.getTenantId());
+        auditInventory.setVfModuleId(vfModule.getVfModuleId());
         auditInventory.setHeatStackName(vfModule.getVfModuleName());
+        auditInventory.setGenericVnfId(genericVnf.getVnfId());
         return auditInventory;
     }
+
 }
index 155455e..ea0b408 100644 (file)
@@ -108,7 +108,7 @@ public class NamingServiceCreateTasks {
         namingRequestObject.setNamingTypeValue(NamingServiceConstants.NAMING_TYPE_SERVICE);
         namingRequestObject.setServiceModelNameValue(serviceInstance.getModelInfoServiceInstance().getModelName());
         namingRequestObject.setModelVersionValue(serviceInstance.getModelInfoServiceInstance().getModelVersion());
-        namingRequestObject.setNetworkNameValue(execution.getVariable(network.getNetworkName()));
+        namingRequestObject.setNetworkNameValue(network.getNetworkName());
         namingRequestObject.setVpnNameValue(vpnBinding.getVpnName());
         namingRequestObject.setResourceNameValue(NamingServiceConstants.RESOURCE_NAME_SERVICE_INSTANCE_NAME);
 
index fcc67d0..9bbe94a 100644 (file)
@@ -29,8 +29,10 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.exception.BBObjectNotFoundException;
+import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.orchestration.SDNCVnfResources;
+import org.onap.so.utils.TargetEntity;
 import org.onap.so.client.orchestration.SDNCVfModuleResources;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,7 +41,8 @@ import org.springframework.stereotype.Component;
 
 @Component
 public class SDNCQueryTasks {
-
+    private static final Logger logger = LoggerFactory.getLogger(SDNCQueryTasks.class);
+    private static final String NO_RESPONSE_FROM_SDNC = "Error did not receive a response from SDNC.";
     public static final String SDNCQUERY_RESPONSE = "SDNCQueryResponse_";
     @Autowired
     private SDNCVnfResources sdncVnfResources;
@@ -63,8 +66,14 @@ public class SDNCQueryTasks {
             }
             String response = sdncVnfResources.queryVnf(genericVnf);
             execution.setVariable(SDNCQUERY_RESPONSE + genericVnf.getVnfId(), response);
+        } catch (BadResponseException ex) {
+            if (!ex.getMessage().equals(NO_RESPONSE_FROM_SDNC)) {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SDNC);
+            } else {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SO);
+            }
         } catch (Exception ex) {
-            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SO);
         }
     }
 
@@ -88,6 +97,12 @@ public class SDNCQueryTasks {
                 throw new Exception("Vf Module " + vfModule.getVfModuleId()
                         + " exists in gBuildingBlock but does not have a selflink value");
             }
+        } catch (BadResponseException ex) {
+            if (!ex.getMessage().equals(NO_RESPONSE_FROM_SDNC)) {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SDNC);
+            } else {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SO);
+            }
         } catch (Exception ex) {
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
         }
@@ -109,10 +124,16 @@ public class SDNCQueryTasks {
             // If we see a bb object not found exception for something that is not a vf module id, then we should throw
             // the error as normal
             if (!ResourceKey.VF_MODULE_ID.equals(bbException.getResourceKey())) {
-                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, bbException);
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, bbException, TargetEntity.SO);
+            }
+        } catch (BadResponseException ex) {
+            if (!ex.getMessage().equals(NO_RESPONSE_FROM_SDNC)) {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SDNC);
+            } else {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SO);
             }
         } catch (Exception ex) {
-            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex, TargetEntity.SO);
         }
     }
 }
index cb761f4..03714db 100644 (file)
@@ -37,6 +37,7 @@ import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.exception.MapperException;
 import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.utils.TargetEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -79,17 +80,19 @@ public class SDNCRequestTasks {
         } catch (PathNotFoundException e) {
             logger.error("Error Parsing SDNC Response. Could not find read final ack indicator from JSON.", e);
             exceptionBuilder.buildAndThrowWorkflowException(execution, 7000,
-                    "Recieved invalid response from SDNC, unable to read message content.");
+                    "Recieved invalid response from SDNC, unable to read message content.", TargetEntity.SO);
         } catch (MapperException e) {
             logger.error("Failed to map SDNC object to JSON prior to POST.", e);
             exceptionBuilder.buildAndThrowWorkflowException(execution, 7000,
-                    "Failed to map SDNC object to JSON prior to POST.");
+                    "Failed to map SDNC object to JSON prior to POST.", TargetEntity.SO);
         } catch (BadResponseException e) {
             logger.error("Did not receive a successful response from SDNC.", e);
-            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getLocalizedMessage());
+            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getLocalizedMessage(),
+                    TargetEntity.SDNC);
         } catch (HttpClientErrorException e) {
             logger.error("HttpClientErrorException: 404 Not Found, Failed to contact SDNC", e);
-            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, "SDNC cannot be contacted.");
+            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, "SDNC cannot be contacted.",
+                    TargetEntity.SO);
         }
     }
 
@@ -120,16 +123,17 @@ public class SDNCRequestTasks {
             }
         } catch (SDNCErrorResponseException e) {
             logger.error("SDNC error response - " + e.getMessage());
-            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getMessage());
+            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getMessage(), TargetEntity.SDNC);
         } catch (Exception e) {
-            logger.error("Error procesing SDNC callback", e);
-            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, "Error procesing SDNC callback");
+            logger.error("Error processing SDNC callback", e);
+            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, "Error processing SDNC callback",
+                    TargetEntity.SO);
         }
     }
 
     public void handleTimeOutException(DelegateExecution execution) {
         exceptionBuilder.buildAndThrowWorkflowException(execution, 7000,
-                "Error timed out waiting on SDNC Async-Response");
+                "Error timed out waiting on SDNC Async-Response", TargetEntity.SO);
     }
 
     protected boolean convertIndicatorToBoolean(String finalMessageIndicator) {
@@ -149,5 +153,4 @@ public class SDNCRequestTasks {
         }
         return result;
     }
-
 }
index 7d5591a..4721bf5 100644 (file)
@@ -91,16 +91,18 @@ public class SDNCUnassignTasks {
 
     public void unassignVfModule(BuildingBlockExecution execution) {
         try {
+            GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
+            RequestContext requestContext = gBBInput.getRequestContext();
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
             SDNCRequest sdncRequest = new SDNCRequest();
             UriBuilder builder = UriBuilder.fromPath(env.getRequiredProperty("mso.workflow.message.endpoint"))
                     .path(sdncRequest.getCorrelationName()).path(sdncRequest.getCorrelationValue());
             URI uri = builder.build();
             GenericResourceApiVfModuleOperationInformation req =
-                    sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance, uri);
+                    sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance, requestContext, uri);
             sdncRequest.setSDNCPayload(req);
             sdncRequest.setTopology(SDNCTopology.VFMODULE);
             execution.setVariable(SDNC_REQUEST, sdncRequest);
index 0553afb..89030d5 100644 (file)
@@ -62,10 +62,8 @@ import org.onap.so.client.orchestration.AAIConfigurationResources;
 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization;
-import org.onap.so.db.catalog.beans.ConfigurationResourceCustomization;
 import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
 import org.onap.so.db.catalog.beans.CvnfcCustomization;
-import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization;
 import org.onap.so.db.catalog.beans.VfModuleCustomization;
 import org.onap.so.db.catalog.beans.macro.NorthBoundRequest;
 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
@@ -74,7 +72,6 @@ import org.onap.so.serviceinstancebeans.ModelInfo;
 import org.onap.so.serviceinstancebeans.ModelType;
 import org.onap.so.serviceinstancebeans.Networks;
 import org.onap.so.serviceinstancebeans.RelatedInstance;
-import org.onap.so.serviceinstancebeans.RelatedInstanceList;
 import org.onap.so.serviceinstancebeans.RequestDetails;
 import org.onap.so.serviceinstancebeans.Service;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
@@ -149,7 +146,7 @@ public class WorkflowAction {
         final String bpmnRequest = (String) execution.getVariable(BBConstants.G_BPMN_REQUEST);
         final boolean aLaCarte = (boolean) execution.getVariable(BBConstants.G_ALACARTE);
         final String apiVersion = (String) execution.getVariable(BBConstants.G_APIVERSION);
-        final String uri = (String) execution.getVariable(BBConstants.G_URI);
+        String uri = (String) execution.getVariable(BBConstants.G_URI);
         final String vnfType = (String) execution.getVariable(VNF_TYPE);
         String serviceInstanceId = (String) execution.getVariable("serviceInstanceId");
         final String serviceType =
@@ -183,6 +180,11 @@ public class WorkflowAction {
                 suppressRollback = false;
             }
             execution.setVariable("suppressRollback", suppressRollback);
+            if (isUriResume(uri)) {
+                logger.debug("replacing URI {}", uri);
+                uri = bbInputSetupUtils.loadOriginalInfraActiveRequestById(requestId).getRequestUrl();
+                logger.debug("for RESUME with original value {}", uri);
+            }
             Resource resource = extractResourceIdAndTypeFromUri(uri);
             WorkflowType resourceType = resource.getResourceType();
             execution.setVariable("resourceName", resourceType.toString());
@@ -200,140 +202,147 @@ public class WorkflowAction {
             execution.setVariable("resourceId", resourceId);
             execution.setVariable("resourceType", resourceType);
 
-            if (aLaCarte) {
-                if (orchFlows == null || orchFlows.isEmpty()) {
-                    orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte,
-                            cloudOwner, serviceType);
-                }
-                String key = "";
-                ModelInfo modelInfo = sIRequest.getRequestDetails().getModelInfo();
-                if (modelInfo != null) {
-                    if (modelInfo.getModelType().equals(ModelType.service)) {
-                        key = modelInfo.getModelVersionId();
-                    } else {
-                        key = modelInfo.getModelCustomizationId();
-                    }
-                }
-                boolean isConfiguration = isConfiguration(orchFlows);
-                Resource resourceKey = new Resource(resourceType, key, aLaCarte);
-                if (isConfiguration && !requestAction.equalsIgnoreCase(CREATEINSTANCE)) {
-                    List<ExecuteBuildingBlock> configBuildingBlocks = getConfigBuildingBlocks(
-                            new ConfigBuildingBlocksDataObject().setsIRequest(sIRequest).setOrchFlows(orchFlows)
-                                    .setRequestId(requestId).setResourceKey(resourceKey).setApiVersion(apiVersion)
-                                    .setResourceId(resourceId).setRequestAction(requestAction).setaLaCarte(aLaCarte)
-                                    .setVnfType(vnfType).setWorkflowResourceIds(workflowResourceIds)
-                                    .setRequestDetails(requestDetails).setExecution(execution));
-
-                    flowsToExecute.addAll(configBuildingBlocks);
-                }
-                orchFlows = orchFlows.stream().filter(item -> !item.getFlowName().contains(FABRIC_CONFIGURATION))
-                        .collect(Collectors.toList());
-                for (OrchestrationFlow orchFlow : orchFlows) {
-                    ExecuteBuildingBlock ebb = buildExecuteBuildingBlock(orchFlow, requestId, resourceKey, apiVersion,
-                            resourceId, requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false,
-                            null, false);
-                    flowsToExecute.add(ebb);
+            if (isRequestMacroServiceResume(aLaCarte, resourceType, requestAction, serviceInstanceId)) {
+                flowsToExecute = bbInputSetupUtils.loadOriginalFlowExecutionPath(requestId);
+                if (flowsToExecute == null) {
+                    buildAndThrowException(execution, "Could not resume Macro flow. Error loading execution path.");
                 }
             } else {
-                boolean foundRelated = false;
-                boolean containsService = false;
-                if (resourceType == WorkflowType.SERVICE && requestAction.equalsIgnoreCase(ASSIGNINSTANCE)) {
-                    // SERVICE-MACRO-ASSIGN will always get user params with a
-                    // service.
-                    if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) {
-                        List<Map<String, Object>> userParams =
-                                sIRequest.getRequestDetails().getRequestParameters().getUserParams();
-                        for (Map<String, Object> params : userParams) {
-                            if (params.containsKey(USERPARAMSERVICE)) {
-                                containsService = true;
+                if (aLaCarte) {
+                    if (orchFlows == null || orchFlows.isEmpty()) {
+                        orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte,
+                                cloudOwner, serviceType);
+                    }
+                    String key = "";
+                    ModelInfo modelInfo = sIRequest.getRequestDetails().getModelInfo();
+                    if (modelInfo != null) {
+                        if (modelInfo.getModelType().equals(ModelType.service)) {
+                            key = modelInfo.getModelVersionId();
+                        } else {
+                            key = modelInfo.getModelCustomizationId();
+                        }
+                    }
+                    boolean isConfiguration = isConfiguration(orchFlows);
+                    Resource resourceKey = new Resource(resourceType, key, aLaCarte);
+                    if (isConfiguration && !requestAction.equalsIgnoreCase(CREATEINSTANCE)) {
+                        List<ExecuteBuildingBlock> configBuildingBlocks = getConfigBuildingBlocks(
+                                new ConfigBuildingBlocksDataObject().setsIRequest(sIRequest).setOrchFlows(orchFlows)
+                                        .setRequestId(requestId).setResourceKey(resourceKey).setApiVersion(apiVersion)
+                                        .setResourceId(resourceId).setRequestAction(requestAction).setaLaCarte(aLaCarte)
+                                        .setVnfType(vnfType).setWorkflowResourceIds(workflowResourceIds)
+                                        .setRequestDetails(requestDetails).setExecution(execution));
+
+                        flowsToExecute.addAll(configBuildingBlocks);
+                    }
+                    orchFlows = orchFlows.stream().filter(item -> !item.getFlowName().contains(FABRIC_CONFIGURATION))
+                            .collect(Collectors.toList());
+                    for (OrchestrationFlow orchFlow : orchFlows) {
+                        ExecuteBuildingBlock ebb = buildExecuteBuildingBlock(orchFlow, requestId, resourceKey,
+                                apiVersion, resourceId, requestAction, aLaCarte, vnfType, workflowResourceIds,
+                                requestDetails, false, null, false);
+                        flowsToExecute.add(ebb);
+                    }
+                } else {
+                    boolean foundRelated = false;
+                    boolean containsService = false;
+                    if (resourceType == WorkflowType.SERVICE && requestAction.equalsIgnoreCase(ASSIGNINSTANCE)) {
+                        // SERVICE-MACRO-ASSIGN will always get user params with a
+                        // service.
+                        if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) {
+                            List<Map<String, Object>> userParams =
+                                    sIRequest.getRequestDetails().getRequestParameters().getUserParams();
+                            for (Map<String, Object> params : userParams) {
+                                if (params.containsKey(USERPARAMSERVICE)) {
+                                    containsService = true;
+                                }
+                            }
+                            if (containsService) {
+                                traverseUserParamsService(execution, resourceCounter, sIRequest, requestAction);
+                            }
+                        } else {
+                            buildAndThrowException(execution,
+                                    "Service-Macro-Assign request details must contain user params with a service");
+                        }
+                    } else if (resourceType == WorkflowType.SERVICE && requestAction.equalsIgnoreCase(CREATEINSTANCE)) {
+                        // SERVICE-MACRO-CREATE will get user params with a service,
+                        // a service with a network, a service with a
+                        // networkcollection, OR an empty service.
+                        // If user params is just a service or null and macro
+                        // queries the SI and finds a VNF, macro fails.
+
+                        if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) {
+                            List<Map<String, Object>> userParams =
+                                    sIRequest.getRequestDetails().getRequestParameters().getUserParams();
+                            for (Map<String, Object> params : userParams) {
+                                if (params.containsKey(USERPARAMSERVICE)) {
+                                    containsService = true;
+                                }
                             }
                         }
                         if (containsService) {
-                            traverseUserParamsService(execution, resourceCounter, sIRequest, requestAction);
+                            foundRelated =
+                                    traverseUserParamsService(execution, resourceCounter, sIRequest, requestAction);
+                        }
+                        if (!foundRelated) {
+                            traverseCatalogDbService(execution, sIRequest, resourceCounter, aaiResourceIds);
                         }
+                    } else if (resourceType == WorkflowType.SERVICE
+                            && (requestAction.equalsIgnoreCase("activateInstance")
+                                    || requestAction.equalsIgnoreCase("unassignInstance")
+                                    || requestAction.equalsIgnoreCase("deleteInstance")
+                                    || requestAction.equalsIgnoreCase("activate" + FABRIC_CONFIGURATION))) {
+                        // SERVICE-MACRO-ACTIVATE, SERVICE-MACRO-UNASSIGN, and
+                        // SERVICE-MACRO-DELETE
+                        // Will never get user params with service, macro will have
+                        // to query the SI in AAI to find related instances.
+                        traverseAAIService(execution, resourceCounter, resourceId, aaiResourceIds);
+                    } else if (resourceType == WorkflowType.SERVICE
+                            && requestAction.equalsIgnoreCase("deactivateInstance")) {
+                        resourceCounter.add(new Resource(WorkflowType.SERVICE, "", false));
+                    } else if (resourceType == WorkflowType.VNF && (requestAction.equalsIgnoreCase("replaceInstance")
+                            || (requestAction.equalsIgnoreCase("recreateInstance")))) {
+                        traverseAAIVnf(execution, resourceCounter, workflowResourceIds.getServiceInstanceId(),
+                                workflowResourceIds.getVnfId(), aaiResourceIds);
                     } else {
-                        buildAndThrowException(execution,
-                                "Service-Macro-Assign request details must contain user params with a service");
+                        buildAndThrowException(execution, "Current Macro Request is not supported");
                     }
-                } else if (resourceType == WorkflowType.SERVICE && requestAction.equalsIgnoreCase(CREATEINSTANCE)) {
-                    // SERVICE-MACRO-CREATE will get user params with a service,
-                    // a service with a network, a service with a
-                    // networkcollection, OR an empty service.
-                    // If user params is just a service or null and macro
-                    // queries the SI and finds a VNF, macro fails.
-
-                    if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) {
-                        List<Map<String, Object>> userParams =
-                                sIRequest.getRequestDetails().getRequestParameters().getUserParams();
-                        for (Map<String, Object> params : userParams) {
-                            if (params.containsKey(USERPARAMSERVICE)) {
-                                containsService = true;
-                            }
-                        }
+                    String foundObjects = "";
+                    for (WorkflowType type : WorkflowType.values()) {
+                        foundObjects = foundObjects + type + " - " + resourceCounter.stream()
+                                .filter(x -> type.equals(x.getResourceType())).collect(Collectors.toList()).size()
+                                + "    ";
                     }
-                    if (containsService) {
-                        foundRelated = traverseUserParamsService(execution, resourceCounter, sIRequest, requestAction);
+                    logger.info("Found {}", foundObjects);
+
+                    if (orchFlows == null || orchFlows.isEmpty()) {
+                        orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte,
+                                cloudOwner, serviceType);
                     }
-                    if (!foundRelated) {
-                        traverseCatalogDbService(execution, sIRequest, resourceCounter, aaiResourceIds);
+                    flowsToExecute = buildExecuteBuildingBlockList(orchFlows, resourceCounter, requestId, apiVersion,
+                            resourceId, requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails);
+                    if (!resourceCounter.stream().filter(x -> WorkflowType.NETWORKCOLLECTION == x.getResourceType())
+                            .collect(Collectors.toList()).isEmpty()) {
+                        logger.info("Sorting for Vlan Tagging");
+                        flowsToExecute = sortExecutionPathByObjectForVlanTagging(flowsToExecute, requestAction);
+                    }
+                    // By default, enable homing at VNF level for CREATEINSTANCE and ASSIGNINSTANCE
+                    if (resourceType == WorkflowType.SERVICE
+                            && (requestAction.equals(CREATEINSTANCE) || requestAction.equals(ASSIGNINSTANCE))
+                            && !resourceCounter.stream().filter(x -> WorkflowType.VNF.equals(x.getResourceType()))
+                                    .collect(Collectors.toList()).isEmpty()) {
+                        execution.setVariable("homing", true);
+                        execution.setVariable("calledHoming", false);
+                    }
+                    if (resourceType == WorkflowType.SERVICE && (requestAction.equalsIgnoreCase(ASSIGNINSTANCE)
+                            || requestAction.equalsIgnoreCase(CREATEINSTANCE))) {
+                        generateResourceIds(flowsToExecute, resourceCounter, serviceInstanceId);
+                    } else {
+                        updateResourceIdsFromAAITraversal(flowsToExecute, resourceCounter, aaiResourceIds,
+                                serviceInstanceId);
                     }
-                } else if (resourceType == WorkflowType.SERVICE && (requestAction.equalsIgnoreCase("activateInstance")
-                        || requestAction.equalsIgnoreCase("unassignInstance")
-                        || requestAction.equalsIgnoreCase("deleteInstance")
-                        || requestAction.equalsIgnoreCase("activate" + FABRIC_CONFIGURATION))) {
-                    // SERVICE-MACRO-ACTIVATE, SERVICE-MACRO-UNASSIGN, and
-                    // SERVICE-MACRO-DELETE
-                    // Will never get user params with service, macro will have
-                    // to query the SI in AAI to find related instances.
-                    traverseAAIService(execution, resourceCounter, resourceId, aaiResourceIds);
-                } else if (resourceType == WorkflowType.SERVICE
-                        && requestAction.equalsIgnoreCase("deactivateInstance")) {
-                    resourceCounter.add(new Resource(WorkflowType.SERVICE, "", false));
-                } else if (resourceType == WorkflowType.VNF && (requestAction.equalsIgnoreCase("replaceInstance")
-                        || (requestAction.equalsIgnoreCase("recreateInstance")))) {
-                    traverseAAIVnf(execution, resourceCounter, workflowResourceIds.getServiceInstanceId(),
-                            workflowResourceIds.getVnfId(), aaiResourceIds);
-                } else {
-                    buildAndThrowException(execution, "Current Macro Request is not supported");
-                }
-                String foundObjects = "";
-                for (WorkflowType type : WorkflowType.values()) {
-                    foundObjects = foundObjects + type + " - " + resourceCounter.stream()
-                            .filter(x -> type.equals(x.getResourceType())).collect(Collectors.toList()).size() + "    ";
-                }
-                logger.info("Found {}", foundObjects);
-
-                if (orchFlows == null || orchFlows.isEmpty()) {
-                    orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte,
-                            cloudOwner, serviceType);
-                }
-                flowsToExecute =
-                        buildExecuteBuildingBlockList(orchFlows, resourceCounter, requestId, apiVersion, resourceId,
-                                resourceType, requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails);
-                if (!resourceCounter.stream().filter(x -> WorkflowType.NETWORKCOLLECTION == x.getResourceType())
-                        .collect(Collectors.toList()).isEmpty()) {
-                    logger.info("Sorting for Vlan Tagging");
-                    flowsToExecute = sortExecutionPathByObjectForVlanTagging(flowsToExecute, requestAction);
-                }
-                // By default, enable homing at VNF level for CREATEINSTANCE and ASSIGNINSTANCE
-                if (resourceType == WorkflowType.SERVICE
-                        && (requestAction.equals(CREATEINSTANCE) || requestAction.equals(ASSIGNINSTANCE))
-                        && !resourceCounter.stream().filter(x -> WorkflowType.VNF.equals(x.getResourceType()))
-                                .collect(Collectors.toList()).isEmpty()) {
-                    execution.setVariable("homing", true);
-                    execution.setVariable("calledHoming", false);
-                }
-                if (resourceType == WorkflowType.SERVICE && (requestAction.equalsIgnoreCase(ASSIGNINSTANCE)
-                        || requestAction.equalsIgnoreCase(CREATEINSTANCE))) {
-                    generateResourceIds(flowsToExecute, resourceCounter, serviceInstanceId);
-                } else {
-                    updateResourceIdsFromAAITraversal(flowsToExecute, resourceCounter, aaiResourceIds,
-                            serviceInstanceId);
                 }
             }
-
-            // If the user set "Homing_Solution" to "none", disable homing, else if "Homing_Solution" is
-            // specified,
+            // If the user set "Homing_Solution" to "none", disable homing, else if "Homing_Solution" is specified,
             // enable it.
             if (sIRequest.getRequestDetails().getRequestParameters() != null
                     && sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) {
@@ -359,6 +368,10 @@ public class WorkflowAction {
                 logger.info(ebb.getBuildingBlock().getBpmnFlowName());
                 flowNames.add(ebb.getBuildingBlock().getBpmnFlowName());
             }
+
+            if (!aLaCarte) {
+                bbInputSetupUtils.persistFlowExecutionPath(requestId, flowsToExecute);
+            }
             execution.setVariable("flowNames", flowNames);
             execution.setVariable(BBConstants.G_CURRENT_SEQUENCE, 0);
             execution.setVariable("retryCount", 0);
@@ -431,9 +444,8 @@ public class WorkflowAction {
     protected List<ExecuteBuildingBlock> getConfigBuildingBlocks(ConfigBuildingBlocksDataObject dataObj) {
 
         List<ExecuteBuildingBlock> flowsToExecuteConfigs = new ArrayList<>();
-        List<OrchestrationFlow> result = new ArrayList<>(dataObj.getOrchFlows());
-        result = dataObj.getOrchFlows().stream().filter(item -> item.getFlowName().contains(FABRIC_CONFIGURATION))
-                .collect(Collectors.toList());
+        List<OrchestrationFlow> result = dataObj.getOrchFlows().stream()
+                .filter(item -> item.getFlowName().contains(FABRIC_CONFIGURATION)).collect(Collectors.toList());
         String vnfId = dataObj.getWorkflowResourceIds().getVnfId();
         String vfModuleId = dataObj.getWorkflowResourceIds().getVfModuleId();
 
@@ -633,7 +645,7 @@ public class WorkflowAction {
             RelatedInstance relatedLocalNetwork =
                     bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.network);
             if (relatedVpnBinding != null && relatedLocalNetwork != null) {
-                traverseVrfConfiguration(execution, aaiResourceIds, resourceCounter, service, relatedVpnBinding,
+                traverseVrfConfiguration(aaiResourceIds, resourceCounter, service, relatedVpnBinding,
                         relatedLocalNetwork);
             } else {
                 traverseNetworkCollection(execution, resourceCounter, service);
@@ -641,10 +653,10 @@ public class WorkflowAction {
         }
     }
 
-    protected void traverseVrfConfiguration(DelegateExecution execution,
-            List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceCounter,
-            org.onap.so.db.catalog.beans.Service service, RelatedInstance relatedVpnBinding,
-            RelatedInstance relatedLocalNetwork) throws VrfBondingServiceException, JsonProcessingException {
+    protected void traverseVrfConfiguration(List<Pair<WorkflowType, String>> aaiResourceIds,
+            List<Resource> resourceCounter, org.onap.so.db.catalog.beans.Service service,
+            RelatedInstance relatedVpnBinding, RelatedInstance relatedLocalNetwork)
+            throws VrfBondingServiceException, JsonProcessingException {
         org.onap.aai.domain.yang.L3Network aaiLocalNetwork =
                 bbInputSetupUtils.getAAIL3Network(relatedLocalNetwork.getInstanceId());
         vrfValidation.vrfServiceValidation(service);
@@ -1263,8 +1275,8 @@ public class WorkflowAction {
 
     protected List<ExecuteBuildingBlock> buildExecuteBuildingBlockList(List<OrchestrationFlow> orchFlows,
             List<Resource> resourceCounter, String requestId, String apiVersion, String resourceId,
-            WorkflowType resourceType, String requestAction, boolean aLaCarte, String vnfType,
-            WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails) {
+            String requestAction, boolean aLaCarte, String vnfType, WorkflowResourceIds workflowResourceIds,
+            RequestDetails requestDetails) {
         List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>();
         for (OrchestrationFlow orchFlow : orchFlows) {
             if (orchFlow.getFlowName().contains(SERVICE)) {
@@ -1477,4 +1489,17 @@ public class WorkflowAction {
         }
         exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, runtimeErrorMessage);
     }
+
+    protected boolean isUriResume(String uri) {
+        return uri.endsWith("/resume");
+    }
+
+    protected boolean isRequestMacroServiceResume(boolean aLaCarte, WorkflowType resourceType, String requestAction,
+            String serviceInstanceId) {
+        return (!aLaCarte && resourceType == WorkflowType.SERVICE
+                && (requestAction.equalsIgnoreCase(ASSIGNINSTANCE) || requestAction.equalsIgnoreCase(CREATEINSTANCE))
+                && (serviceInstanceId != null && serviceInstanceId.trim().length() > 1)
+                && (bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId) != null));
+    }
 }
+
index 4d2f9fd..be3e06c 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
  * 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
@@ -26,6 +28,7 @@ import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.onap.so.bpmn.core.WorkflowException;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.slf4j.Logger;
@@ -37,6 +40,7 @@ import org.springframework.stereotype.Component;
 public class WorkflowActionBBFailure {
 
     private static final Logger logger = LoggerFactory.getLogger(WorkflowActionBBFailure.class);
+    public static final String ROLLBACK_TARGET_STATE = "rollbackTargetState";
     @Autowired
     private RequestsDbClient requestDbclient;
     @Autowired
@@ -53,7 +57,12 @@ public class WorkflowActionBBFailure {
             } else {
                 errorMsg = "Failed to determine error message";
             }
-            request.setStatusMessage(errorMsg);
+            Boolean isRollback = (Boolean) execution.getVariable("isRollback");
+            if (!Boolean.TRUE.equals(isRollback)) {
+                request.setStatusMessage(errorMsg);
+            } else {
+                request.setRollbackStatusMessage(errorMsg);
+            }
             request.setProgress(Long.valueOf(100));
             request.setLastModifiedBy("CamundaBPMN");
             request.setEndTime(new Timestamp(System.currentTimeMillis()));
@@ -84,6 +93,8 @@ public class WorkflowActionBBFailure {
                 rollbackErrorMsg = "Rollback has been completed successfully.";
                 request.setRollbackStatusMessage(rollbackErrorMsg);
                 execution.setVariable("RollbackErrorMessage", rollbackErrorMsg);
+                String rollbackTargetState = (String) execution.getVariable(ROLLBACK_TARGET_STATE);
+                request.setRequestStatus(rollbackTargetState);
             } else if (isRollbackFailure) {
                 Optional<String> rollbackErrorMsgOp = retrieveErrorMessage(execution);
                 if (rollbackErrorMsgOp.isPresent()) {
@@ -93,6 +104,7 @@ public class WorkflowActionBBFailure {
                 }
                 request.setRollbackStatusMessage(rollbackErrorMsg);
                 execution.setVariable("RollbackErrorMessage", rollbackErrorMsg);
+                request.setRequestStatus(Status.FAILED.toString());
             } else {
                 Optional<String> errorMsgOp = retrieveErrorMessage(execution);
                 if (errorMsgOp.isPresent()) {
@@ -102,6 +114,12 @@ public class WorkflowActionBBFailure {
                 }
                 request.setStatusMessage(errorMsg);
                 execution.setVariable("ErrorMessage", errorMsg);
+                String handlingCode = (String) execution.getVariable("handlingCode");
+                if ("Abort".equalsIgnoreCase(handlingCode)) {
+                    request.setRequestStatus(Status.ABORTED.toString());
+                } else {
+                    request.setRequestStatus(Status.FAILED.toString());
+                }
             }
             if (ebb != null && ebb.getBuildingBlock() != null) {
                 String flowStatus = "";
@@ -115,7 +133,6 @@ public class WorkflowActionBBFailure {
             }
 
             request.setProgress(Long.valueOf(100));
-            request.setRequestStatus("FAILED");
             request.setLastModifiedBy("CamundaBPMN");
             request.setEndTime(new Timestamp(System.currentTimeMillis()));
             requestDbclient.updateInfraActiveRequests(request);
@@ -128,10 +145,10 @@ public class WorkflowActionBBFailure {
         String errorMsg = null;
         try {
             WorkflowException exception = (WorkflowException) execution.getVariable("WorkflowException");
-            if (exception != null && (exception.getErrorMessage() != null || !exception.getErrorMessage().equals(""))) {
+            if (exception != null && (exception.getErrorMessage() != null || !"".equals(exception.getErrorMessage()))) {
                 errorMsg = exception.getErrorMessage();
             }
-            if (errorMsg == null || errorMsg.equals("")) {
+            if (errorMsg == null || "".equals(errorMsg)) {
                 errorMsg = (String) execution.getVariable("WorkflowExceptionErrorMessage");
             }
             if (errorMsg == null) {
@@ -150,7 +167,7 @@ public class WorkflowActionBBFailure {
         updateRequestStatusToFailed(execution);
     }
 
-    public void abortCallErrorHandling(DelegateExecution execution) {
+    public void abortCallErrorHandling() {
         String msg = "Flow has failed. Rainy day handler has decided to abort the process.";
         logger.error(msg);
         throw new BpmnError(msg);
index 44152fc..a17556f 100644 (file)
@@ -312,7 +312,6 @@ public class WorkflowActionBBTasks {
             }
 
             workflowActionBBFailure.updateRequestErrorStatusMessage(execution);
-
             if (rollbackFlows.isEmpty())
                 execution.setVariable("isRollbackNeeded", false);
             else
index b83a4d5..b3ea18d 100644 (file)
@@ -60,9 +60,9 @@ public class SDNCVfModuleResources {
     }
 
     public GenericResourceApiVfModuleOperationInformation unassignVfModule(VfModule vfModule, GenericVnf vnf,
-            ServiceInstance serviceInstance, URI callbackURI) throws MapperException {
+            ServiceInstance serviceInstance, RequestContext requestContext, URI callbackURI) throws MapperException {
         return sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN, vfModule, null,
-                vnf, serviceInstance, null, null, null, null, callbackURI);
+                vnf, serviceInstance, null, null, requestContext, null, callbackURI);
     }
 
     public GenericResourceApiVfModuleOperationInformation deactivateVfModule(VfModule vfModule, GenericVnf vnf,
index 825c703..4f1ad99 100644 (file)
@@ -159,7 +159,7 @@ public class TestDataSetup {
 
     public RequestContext buildRequestContext() {
         RequestContext requestContext = new RequestContext();
-        requestContext.setMsoRequestId(UUID.randomUUID().toString());
+        requestContext.setMsoRequestId("fb06f44c-c797-4f38-9b17-b4b975344600");
         requestContext.setProductFamilyId("testProductFamilyId");
         requestContext.setRequestorId("testRequestorId");
 
index b889493..ed3ec75 100644 (file)
@@ -60,7 +60,6 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoGenericVnf;
 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoVfModule;
-import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.DuplicateNameException;
 import org.onap.so.client.exception.BBObjectNotFoundException;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
@@ -129,14 +128,6 @@ public class AAICreateTasksTest extends BaseTaskTest {
         verify(aaiServiceInstanceResources, times(1)).createServiceInstance(serviceInstance, customer);
     }
 
-    @Test
-    public void createServiceInstanceNameInUseExceptionTest() throws Exception {
-        expectedException.expect(BpmnError.class);
-        doReturn(true).when(aaiServiceInstanceResources).checkInstanceServiceNameInUse(serviceInstance);
-        execution.setVariable("aLaCarte", Boolean.TRUE);
-        aaiCreateTasks.createServiceInstance(execution);
-    }
-
     @Test
     public void createServiceInstanceExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
@@ -161,14 +152,6 @@ public class AAICreateTasksTest extends BaseTaskTest {
         verify(aaiVolumeGroupResources, times(1)).connectVolumeGroupToTenant(volumeGroup, cloudRegion);
     }
 
-    @Test
-    public void createVolumeGroupDuplicateNameTest() throws Exception {
-        expectedException.expect(BpmnError.class);
-        execution.setVariable("aLaCarte", Boolean.TRUE);
-        doReturn(true).when(aaiVolumeGroupResources).checkNameInUse(volumeGroup);
-        aaiCreateTasks.createVolumeGroup(execution);
-    }
-
     @Test
     public void createVolumeGroupExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
@@ -348,14 +331,6 @@ public class AAICreateTasksTest extends BaseTaskTest {
         verify(aaiVnfResources, times(1)).createVnfandConnectServiceInstance(genericVnf, serviceInstance);
     }
 
-    @Test
-    public void createVnfDuplicateNameTest() throws Exception {
-        expectedException.expect(BpmnError.class);
-        doReturn(true).when(aaiVnfResources).checkNameInUse(genericVnf.getVnfName());
-        execution.setVariable("aLaCarte", Boolean.TRUE);
-        aaiCreateTasks.createVnf(execution);
-    }
-
     @Test
     public void createVnfExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
@@ -385,14 +360,6 @@ public class AAICreateTasksTest extends BaseTaskTest {
         verify(aaiVfModuleResources, times(1)).createVfModule(newVfModule, genericVnf);
     }
 
-    @Test
-    public void createVfModuleDuplicateNameTest() throws Exception {
-        expectedException.expect(BpmnError.class);
-        execution.setVariable("aLaCarte", Boolean.TRUE);
-        doReturn(true).when(aaiVfModuleResources).checkNameInUse(vfModule);
-        aaiCreateTasks.createVfModule(execution);
-    }
-
     @Test
     public void createServiceSubscriptionTest() {
         doNothing().when(aaiServiceInstanceResources).createServiceSubscription(customer);
@@ -440,14 +407,6 @@ public class AAICreateTasksTest extends BaseTaskTest {
         verify(aaiNetworkResources, times(1)).createNetworkConnectToServiceInstance(network, serviceInstance);
     }
 
-    @Test
-    public void createNetworkNameInUseExceptionTest() throws Exception {
-        expectedException.expect(BpmnError.class);
-        execution.setVariable("aLaCarte", Boolean.TRUE);
-        doReturn(true).when(aaiNetworkResources).checkNetworkNameInUse(network.getNetworkName());
-        aaiCreateTasks.createNetwork(execution);
-    }
-
     @Test
     public void createNetworkExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
@@ -559,15 +518,6 @@ public class AAICreateTasksTest extends BaseTaskTest {
         verify(aaiConfigurationResources, times(1)).createConfiguration(configuration);
     }
 
-    @Test
-    public void createConfigurationNameInUseExceptionTest() throws Exception {
-        expectedException.expect(BpmnError.class);
-        doReturn(true).when(aaiConfigurationResources)
-                .checkConfigurationNameInUse(configuration.getConfigurationName());
-        execution.setVariable("aLaCarte", Boolean.TRUE);
-        aaiCreateTasks.createConfiguration(execution);
-    }
-
     @Test
     public void connectVnfToCloudRegionTest() throws Exception {
         gBBInput = execution.getGeneralBuildingBlock();
@@ -608,15 +558,6 @@ public class AAICreateTasksTest extends BaseTaskTest {
                 serviceInstance);
     }
 
-    @Test
-    public void createInstanceGroupVnfNameInUseExceptionTest() throws Exception {
-        expectedException.expect(BpmnError.class);
-        doReturn(true).when(aaiInstanceGroupResources)
-                .checkInstanceGroupNameInUse(instanceGroup.getInstanceGroupName());
-        execution.setVariable("aLaCarte", Boolean.TRUE);
-        aaiCreateTasks.createInstanceGroupVnf(execution);
-    }
-
     @Test
     public void createInstanceGroupVnfExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
index d0cee42..8aea2d2 100644 (file)
@@ -39,12 +39,14 @@ import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.exception.MapperException;
+import org.onap.so.utils.TargetEntity;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -110,8 +112,9 @@ public class NetworkAdapterRestV1Test extends BaseTaskTest {
         delegateExecution.setVariable("networkAdapterRequest", updateNetworkRequest);
         delegateExecution.setVariable("NetworkAResponse_MESSAGE", updateNetworkResponse.toXmlString());
 
-        doThrow(new BpmnError("MSOWorkflowException")).when(exceptionBuilder)
-                .buildAndThrowWorkflowException(any(DelegateExecution.class), anyInt(), any(String.class));
+        doThrow(new BpmnError("MSOWorkflowException")).when(exceptionBuilder).buildAndThrowWorkflowException(
+                any(DelegateExecution.class), anyInt(), any(String.class), any(TargetEntity.class));
+
         try {
             networkAdapterRestV1Tasks.processCallback(delegateExecution);
         } catch (BpmnError be) {
@@ -119,6 +122,6 @@ public class NetworkAdapterRestV1Test extends BaseTaskTest {
         }
         assertNull(delegateExecution.getVariable("updateNetworkResponse"));
         verify(exceptionBuilder, times(1)).buildAndThrowWorkflowException(any(DelegateExecution.class), eq(7000),
-                eq("test error message"));
+                eq("test error message"), eq(TargetEntity.OPENSTACK));
     }
 }
index 3bf2429..cee06ca 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -21,14 +21,20 @@ package org.onap.so.bpmn.infrastructure.audit;
 
 import static com.shazam.shazamcrest.MatcherAssert.assertThat;
 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
+import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
+import org.mockito.Mockito;
+import org.onap.aai.domain.yang.Vserver;
 import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
@@ -36,6 +42,11 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.client.exception.BBObjectNotFoundException;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.objects.audit.AAIObjectAudit;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import com.fasterxml.jackson.core.JsonProcessingException;
 
 public class AuditTasksTest extends BaseTaskTest {
 
@@ -50,16 +61,29 @@ public class AuditTasksTest extends BaseTaskTest {
     public final ExpectedException exception = ExpectedException.none();
 
     @Before
-    public void before() throws BBObjectNotFoundException {
+    public void before() throws BBObjectNotFoundException, JsonProcessingException {
         serviceInstance = setServiceInstance();
         genericVnf = setGenericVnf();
         vfModule = setVfModule();
+        buildRequestContext();
         setCloudRegion();
+        setRequestContext();
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.GENERIC_VNF_ID)))
                 .thenReturn(genericVnf);
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.VF_MODULE_ID))).thenReturn(vfModule);
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.SERVICE_INSTANCE_ID)))
                 .thenReturn(serviceInstance);
+        execution.setVariable("auditQuerySuccess", true);
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        auditList.setHeatStackName("testHeatStackName");
+        AAIObjectAudit audit = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        audit.setAaiObject(vserver);
+        auditList.getAuditList().add(audit);
+        GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+        String auditListString = objectMapper.getMapper().writeValueAsString(audit);
+        execution.setVariable("auditList", auditListString);
     }
 
     @Test
@@ -68,8 +92,12 @@ public class AuditTasksTest extends BaseTaskTest {
         expectedAuditInventory.setCloudOwner("testCloudOwner");
         expectedAuditInventory.setCloudRegion("testLcpCloudRegionId");
         expectedAuditInventory.setHeatStackName("testVfModuleName1");
+        expectedAuditInventory.setVfModuleId("testVfModuleId1");
         expectedAuditInventory.setTenantId("testTenantId");
+        expectedAuditInventory.setGenericVnfId("testVnfId1");
+        expectedAuditInventory.setMsoRequestId("fb06f44c-c797-4f38-9b17-b4b975344600");
         auditTasks.setupAuditVariable(execution);
         assertThat((AuditInventory) execution.getVariable("auditInventory"), sameBeanAs(expectedAuditInventory));
     }
+
 }
index 44e5e0e..609d2da 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.bpmn.infrastructure.namingservice.tasks;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
@@ -31,6 +32,7 @@ import static org.mockito.Mockito.when;
 import java.util.Optional;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
@@ -47,6 +49,8 @@ import org.onap.so.client.aai.AAICommonObjectMapperProvider;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.Relationships;
 import org.onap.so.client.exception.BBObjectNotFoundException;
+import org.onap.so.client.namingservice.NamingRequestObject;
+import org.onap.so.client.namingservice.NamingServiceConstants;
 
 public class NamingServiceCreateTasksTest extends BaseTaskTest {
     @InjectMocks
@@ -106,9 +110,17 @@ public class NamingServiceCreateTasksTest extends BaseTaskTest {
         String generatedName = "generatedWanTransportServiceName";
         doReturn(generatedName).when(namingServiceResources).generateServiceInstanceName(any());
         NamingServiceCreateTasks spy = Mockito.spy(namingServiceCreateTasks);
+        ArgumentCaptor<NamingRequestObject> captor = ArgumentCaptor.forClass(NamingRequestObject.class);
 
         spy.createWanTransportServiceName(execution);
-        verify(namingServiceResources, times(1)).generateServiceInstanceName(any());
+        verify(namingServiceResources, times(1)).generateServiceInstanceName(captor.capture());
+        assertTrue(captor.getAllValues().get(0).getExternalKeyValue().startsWith("testServiceInstanceId"));
+        assertEquals(captor.getAllValues().get(0).getNamingTypeValue(), NamingServiceConstants.NAMING_TYPE_SERVICE);
+        assertEquals(captor.getAllValues().get(0).getResourceNameValue(),
+                NamingServiceConstants.RESOURCE_NAME_SERVICE_INSTANCE_NAME);
+        assertEquals(captor.getAllValues().get(0).getPolicyInstanceNameValue(), null);
+        assertTrue(captor.getAllValues().get(0).getServiceModelNameValue().startsWith("testModelName"));
+        assertTrue(captor.getAllValues().get(0).getModelVersionValue().startsWith("testModelVersion"));
         assertEquals(generatedName, serviceInstance.getServiceInstanceName());
     }
 
@@ -118,10 +130,20 @@ public class NamingServiceCreateTasksTest extends BaseTaskTest {
                 .thenReturn(buildL3Network());
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.VPN_ID)))
                 .thenReturn(buildVpnBinding());
+        ArgumentCaptor<NamingRequestObject> captor = ArgumentCaptor.forClass(NamingRequestObject.class);
         String generatedName = "generatedWanTransportServiceName";
         doReturn(generatedName).when(namingServiceResources).generateServiceInstanceName(any());
         namingServiceCreateTasks.createVpnBondingServiceName(execution);
-        verify(namingServiceResources, times(1)).generateServiceInstanceName(any());
+        verify(namingServiceResources, times(1)).generateServiceInstanceName(captor.capture());
+        assertTrue(captor.getAllValues().get(0).getExternalKeyValue().startsWith("testServiceInstanceId"));
+        assertEquals(captor.getAllValues().get(0).getPolicyInstanceNameValue(), null);
+        assertEquals(captor.getAllValues().get(0).getNamingTypeValue(), NamingServiceConstants.NAMING_TYPE_SERVICE);
+        assertTrue(captor.getAllValues().get(0).getServiceModelNameValue().startsWith("testModelName"));
+        assertTrue(captor.getAllValues().get(0).getModelVersionValue().startsWith("testModelVersion"));
+        assertTrue(captor.getAllValues().get(0).getNetworkNameValue().startsWith("testNetworkName"));
+        assertTrue(captor.getAllValues().get(0).getVpnNameValue().startsWith("testVpnName"));
+        assertEquals(captor.getAllValues().get(0).getResourceNameValue(),
+                NamingServiceConstants.RESOURCE_NAME_SERVICE_INSTANCE_NAME);
         assertEquals(generatedName, serviceInstance.getServiceInstanceName());
     }
 }
index 3ea8474..0ba9237 100644 (file)
@@ -43,6 +43,9 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.client.exception.BBObjectNotFoundException;
+import org.onap.so.client.exception.BadResponseException;
+import org.onap.so.utils.TargetEntities;
+import org.onap.so.utils.TargetEntity;
 
 public class SDNCQueryTasksTest extends BaseTaskTest {
     @InjectMocks
@@ -61,8 +64,8 @@ public class SDNCQueryTasksTest extends BaseTaskTest {
         genericVnf = setGenericVnf();
         vfModule = setVfModule();
 
-        doThrow(new BpmnError("BPMN Error")).when(exceptionUtil)
-                .buildAndThrowWorkflowException(any(BuildingBlockExecution.class), eq(7000), any(Exception.class));
+        doThrow(new BpmnError("BPMN Error")).when(exceptionUtil).buildAndThrowWorkflowException(
+                any(BuildingBlockExecution.class), eq(7000), any(Exception.class), any(TargetEntities.class));
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.SERVICE_INSTANCE_ID)))
                 .thenReturn(serviceInstance);
 
@@ -87,6 +90,28 @@ public class SDNCQueryTasksTest extends BaseTaskTest {
         verify(sdncVfModuleResources, times(1)).queryVfModule(vfModule);
     }
 
+    @Test
+    public void queryVfModuleBadResponseExceptionTest() throws Exception {
+        BadResponseException exception = new BadResponseException("Error received from SDNC");
+        doThrow(exception).when(sdncVfModuleResources).queryVfModule(vfModule);
+
+        expectedException.expect(BpmnError.class);
+        sdncQueryTasks.queryVfModule(execution);
+
+        verify(exceptionUtil, times(1)).buildAndThrowWorkflowException(execution, 700, exception, TargetEntity.SDNC);
+    }
+
+    @Test
+    public void queryVfModuleResponseExceptionNoResponseTest() throws Exception {
+        BadResponseException exception = new BadResponseException("Error did not receive a response from SDNC.");
+        doThrow(exception).when(sdncVfModuleResources).queryVfModule(vfModule);
+
+        expectedException.expect(BpmnError.class);
+        sdncQueryTasks.queryVfModule(execution);
+
+        verify(exceptionUtil, times(1)).buildAndThrowWorkflowException(execution, 700, exception, TargetEntity.SO);
+    }
+
     @Test
     public void queryVnfTest() throws Exception {
         String sdncQueryResponse = "response";
@@ -100,6 +125,28 @@ public class SDNCQueryTasksTest extends BaseTaskTest {
         verify(sdncVnfResources, times(1)).queryVnf(genericVnf);
     }
 
+    @Test
+    public void queryVnfBadResponseExceptionTest() throws Exception {
+        BadResponseException exception = new BadResponseException("Error received from SDNC");
+        doThrow(exception).when(sdncVnfResources).queryVnf(genericVnf);
+
+        expectedException.expect(BpmnError.class);
+        sdncQueryTasks.queryVnf(execution);
+
+        verify(exceptionUtil, times(1)).buildAndThrowWorkflowException(execution, 700, exception, TargetEntity.SDNC);
+    }
+
+    @Test
+    public void queryVnfBadResponseExceptionNoResponseTest() throws Exception {
+        BadResponseException exception = new BadResponseException("Error did not receive a response from SDNC.");
+        doThrow(exception).when(sdncVnfResources).queryVnf(genericVnf);
+
+        expectedException.expect(BpmnError.class);
+        sdncQueryTasks.queryVnf(execution);
+
+        verify(exceptionUtil, times(1)).buildAndThrowWorkflowException(execution, 700, exception, TargetEntity.SO);
+    }
+
     @Test
     public void queryVfModuleForVolumeGroupTest() throws Exception {
         String sdncQueryResponse = "response";
@@ -114,6 +161,28 @@ public class SDNCQueryTasksTest extends BaseTaskTest {
         verify(sdncVfModuleResources, times(1)).queryVfModule(vfModule);
     }
 
+    @Test
+    public void queryVfModuleForVolumeGroupBadResponseExceptionTest() throws Exception {
+        BadResponseException exception = new BadResponseException("Error received from SDNC");
+        doThrow(exception).when(sdncVfModuleResources).queryVfModule(vfModule);
+
+        expectedException.expect(BpmnError.class);
+        sdncQueryTasks.queryVfModuleForVolumeGroup(execution);
+
+        verify(exceptionUtil, times(1)).buildAndThrowWorkflowException(execution, 700, exception, TargetEntity.SDNC);
+    }
+
+    @Test
+    public void queryVfModuleForVolumeGroupBadResponseExceptionNoResponseTest() throws Exception {
+        BadResponseException exception = new BadResponseException("Error did not receive a response from SDNC.");
+        doThrow(exception).when(sdncVfModuleResources).queryVfModule(vfModule);
+
+        expectedException.expect(BpmnError.class);
+        sdncQueryTasks.queryVfModuleForVolumeGroup(execution);
+
+        verify(exceptionUtil, times(1)).buildAndThrowWorkflowException(execution, 700, exception, TargetEntity.SO);
+    }
+
     @Test
     public void queryVfModuleForVolumeGroupNoSelfLinkExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
index 6a94b35..0fc33fe 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import java.io.IOException;
@@ -48,6 +49,7 @@ import org.onap.so.client.exception.MapperException;
 import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCRequest;
 import org.onap.so.client.sdnc.endpoint.SDNCTopology;
+import org.onap.so.utils.TargetEntity;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 import com.fasterxml.jackson.core.JsonParseException;
@@ -66,7 +68,6 @@ public class SDNCRequestTasksTest extends SDNCRequestTasks {
     @Mock
     SDNCClient sdncClient;
 
-
     @Spy
     private ExceptionBuilder exceptionBuilder;
 
index 10c034d..b29d15c 100644 (file)
@@ -106,11 +106,11 @@ public class SDNCUnassignTasksTest extends BaseTaskTest {
 
     @Test
     public void unassignVfModuleTest() throws Exception {
-        doReturn(new GenericResourceApiVfModuleOperationInformation()).when(sdncVfModuleResources)
-                .unassignVfModule(eq(vfModule), eq(genericVnf), eq(serviceInstance), any(URI.class));
+        doReturn(new GenericResourceApiVfModuleOperationInformation()).when(sdncVfModuleResources).unassignVfModule(
+                eq(vfModule), eq(genericVnf), eq(serviceInstance), eq(requestContext), any(URI.class));
         sdncUnassignTasks.unassignVfModule(execution);
         verify(sdncVfModuleResources, times(1)).unassignVfModule(eq(vfModule), eq(genericVnf), eq(serviceInstance),
-                any(URI.class));
+                eq(requestContext), any(URI.class));
         SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
         assertEquals(SDNCTopology.VFMODULE, sdncRequest.getTopology());
     }
@@ -119,7 +119,7 @@ public class SDNCUnassignTasksTest extends BaseTaskTest {
     public void unassignVfModuleExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
         doThrow(RuntimeException.class).when(sdncVfModuleResources).unassignVfModule(eq(vfModule), eq(genericVnf),
-                eq(serviceInstance), any(URI.class));
+                eq(serviceInstance), eq(requestContext), any(URI.class));
         sdncUnassignTasks.unassignVfModule(execution);
     }
 
index c683303..2d48d02 100644 (file)
@@ -41,6 +41,7 @@ import org.mockito.Spy;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.core.WorkflowException;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 
 public class WorkflowActionBBFailureTest extends BaseTaskTest {
@@ -102,6 +103,24 @@ public class WorkflowActionBBFailureTest extends BaseTaskTest {
         workflowActionBBFailure.updateRequestStatusToFailed(execution);
         String errorMsg = (String) execution.getVariable("ErrorMessage");
         assertEquals("error in test case", errorMsg);
+        assertEquals(Status.FAILED.toString(), req.getRequestStatus());
+    }
+
+    @Test
+    public void updateRequestStatusToAborted() {
+        execution.setVariable("mso-request-id", "123");
+        execution.setVariable("isRollbackComplete", false);
+        execution.setVariable("isRollback", false);
+        execution.setVariable("handlingCode", "Abort");
+        InfraActiveRequests req = new InfraActiveRequests();
+        WorkflowException wfe = new WorkflowException("processKey123", 1, "error in test case");
+        execution.setVariable("WorkflowException", wfe);
+        doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId("123");
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class));
+        workflowActionBBFailure.updateRequestStatusToFailed(execution);
+        String errorMsg = (String) execution.getVariable("ErrorMessage");
+        assertEquals("error in test case", errorMsg);
+        assertEquals(Status.ABORTED.toString(), req.getRequestStatus());
     }
 
     @Test
@@ -117,19 +136,52 @@ public class WorkflowActionBBFailureTest extends BaseTaskTest {
         workflowActionBBFailure.updateRequestStatusToFailed(execution);
         String errorMsg = (String) execution.getVariable("RollbackErrorMessage");
         assertEquals("error in rollback", errorMsg);
+        assertEquals(Status.FAILED.toString(), req.getRequestStatus());
+    }
+
+    @Test
+    public void updateRequestStatusToRolledback() {
+        execution.setVariable("mso-request-id", "123");
+        execution.setVariable("isRollbackComplete", true);
+        execution.setVariable("isRollback", true);
+        execution.setVariable("rollbackTargetState", "ROLLED_BACK");
+        InfraActiveRequests req = new InfraActiveRequests();
+        doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId("123");
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class));
+        workflowActionBBFailure.updateRequestStatusToFailed(execution);
+        String errorMsg = (String) execution.getVariable("RollbackErrorMessage");
+        assertEquals("Rollback has been completed successfully.", errorMsg);
+        assertEquals(Status.ROLLED_BACK.toString(), req.getRequestStatus());
     }
 
     @Test
-    public void updateRequestStatusToFailedRollbackCompleted() {
+    public void updateRequestStatusToRolledbackToAssigned() {
         execution.setVariable("mso-request-id", "123");
         execution.setVariable("isRollbackComplete", true);
         execution.setVariable("isRollback", true);
+        execution.setVariable("rollbackTargetState", "ROLLED_BACK_TO_ASSIGNED");
         InfraActiveRequests req = new InfraActiveRequests();
         doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId("123");
         doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class));
         workflowActionBBFailure.updateRequestStatusToFailed(execution);
         String errorMsg = (String) execution.getVariable("RollbackErrorMessage");
         assertEquals("Rollback has been completed successfully.", errorMsg);
+        assertEquals(Status.ROLLED_BACK_TO_ASSIGNED.toString(), req.getRequestStatus());
+    }
+
+    @Test
+    public void updateRequestStatusToRolledbackToCreated() {
+        execution.setVariable("mso-request-id", "123");
+        execution.setVariable("isRollbackComplete", true);
+        execution.setVariable("isRollback", true);
+        execution.setVariable("rollbackTargetState", "ROLLED_BACK_TO_CREATED");
+        InfraActiveRequests req = new InfraActiveRequests();
+        doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId("123");
+        doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class));
+        workflowActionBBFailure.updateRequestStatusToFailed(execution);
+        String errorMsg = (String) execution.getVariable("RollbackErrorMessage");
+        assertEquals("Rollback has been completed successfully.", errorMsg);
+        assertEquals(Status.ROLLED_BACK_TO_CREATED.toString(), req.getRequestStatus());
     }
 
     @Test
@@ -160,4 +212,38 @@ public class WorkflowActionBBFailureTest extends BaseTaskTest {
         Mockito.verify(reqMock, Mockito.times(1)).setLastModifiedBy("CamundaBPMN");
         Mockito.verify(reqMock, Mockito.times(1)).setEndTime(any(Timestamp.class));
     }
+
+    @Test
+    public void updateRequestRollbackErrorStatusMessageTest() {
+        String reqId = "reqId123";
+        execution.setVariable("mso-request-id", reqId);
+        WorkflowException we = new WorkflowException("WorkflowAction", 1231, "Error Case");
+        execution.setVariable("WorkflowException", we);
+        execution.setVariable("isRollback", true);
+
+        doReturn(reqMock).when(requestsDbClient).getInfraActiveRequestbyRequestId(reqId);
+        workflowActionBBFailure.updateRequestErrorStatusMessage(execution);
+        Mockito.verify(reqMock, Mockito.times(0)).setStatusMessage("Error Case");
+        Mockito.verify(reqMock, Mockito.times(1)).setRollbackStatusMessage("Error Case");
+        Mockito.verify(reqMock, Mockito.times(1)).setProgress(Long.valueOf(100));
+        Mockito.verify(reqMock, Mockito.times(1)).setLastModifiedBy("CamundaBPMN");
+        Mockito.verify(reqMock, Mockito.times(1)).setEndTime(any(Timestamp.class));
+    }
+
+    @Test
+    public void updateRequestNotRollbackErrorStatusMessageTest() {
+        String reqId = "reqId123";
+        execution.setVariable("mso-request-id", reqId);
+        WorkflowException we = new WorkflowException("WorkflowAction", 1231, "Error Case");
+        execution.setVariable("WorkflowException", we);
+        execution.setVariable("isRollback", false);
+
+        doReturn(reqMock).when(requestsDbClient).getInfraActiveRequestbyRequestId(reqId);
+        workflowActionBBFailure.updateRequestErrorStatusMessage(execution);
+        Mockito.verify(reqMock, Mockito.times(1)).setStatusMessage("Error Case");
+        Mockito.verify(reqMock, Mockito.times(0)).setRollbackStatusMessage("Error Case");
+        Mockito.verify(reqMock, Mockito.times(1)).setProgress(Long.valueOf(100));
+        Mockito.verify(reqMock, Mockito.times(1)).setLastModifiedBy("CamundaBPMN");
+        Mockito.verify(reqMock, Mockito.times(1)).setEndTime(any(Timestamp.class));
+    }
 }
index 176a09a..918a474 100644 (file)
@@ -26,6 +26,7 @@ import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
@@ -96,6 +97,8 @@ import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.VfModuleCustomization;
 import org.onap.so.db.catalog.beans.macro.NorthBoundRequest;
 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
+import org.onap.so.db.request.beans.InfraActiveRequests;
+import org.onap.so.db.request.beans.RequestProcessingData;
 import org.onap.so.serviceinstancebeans.RequestDetails;
 import org.onap.so.serviceinstancebeans.RequestParameters;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
@@ -1194,6 +1197,49 @@ public class WorkflowActionTest extends BaseTaskTest {
         assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeleteVfModuleBB", "UnassignVfModuleBB");
     }
 
+    @Test
+    public void selectExecutionListMacroResumeTest() throws Exception {
+        String gAction = "createInstance";
+        String resource = "Service";
+        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+        execution.setVariable("requestAction", gAction);
+        String bpmnRequest =
+                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
+        execution.setVariable("bpmnRequest", bpmnRequest);
+        execution.setVariable("aLaCarte", false);
+        execution.setVariable("apiVersion", "7");
+        execution.setVariable("requestUri", "v6/serviceInstances/123");
+
+        NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+        List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB");
+        northBoundRequest.setOrchestrationFlowList(orchFlows);
+
+        Service service = new Service();
+        service.setModelUUID("3c40d244-808e-42ca-b09a-256d83d19d0a");
+
+        ServiceInstance si = new ServiceInstance();
+
+        when(bbSetupUtils.getAAIServiceInstanceById("123")).thenReturn(si);
+        when(catalogDbClient.getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a")).thenReturn(service);
+
+        String flowsToExecuteString =
+                "[{\"buildingBlock\":{\"mso-id\":\"2f9ddc4b-4dcf-4129-a35f-be1625ae0176\",\"bpmn-flow-name\":\"AssignServiceInstanceBB\",\"key\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"is-virtual-link\":false,\"virtual-link-key\":null},\"requestId\":\"9c944122-d161-4280-8594-48c06a9d96d5\",\"apiVersion\":\"7\",\"resourceId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"requestAction\":\"deleteInstance\",\"vnfType\":\"\",\"aLaCarte\":true,\"homing\":false,\"workflowResourceIds\":{\"serviceInstanceId\":\"ff9dae72-05bb-4277-ad2b-1b082467c138\",\"vnfId\":\"84a29830-e533-4f20-a838-910c740bf24c\",\"networkId\":\"\",\"volumeGroupId\":\"\",\"vfModuleId\":\"d1d35800-783d-42d3-82f6-d654c5054a6e\",\"networkCollectionId\":null,\"configurationId\":\"10f8a3a3-91bf-4821-9515-c01b2864dff0\",\"instanceGroupId\":\"\"},\"requestDetails\":{\"modelInfo\":{\"modelCustomizationName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelInvariantId\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelType\":\"vfModule\",\"modelId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\",\"modelVersion\":\"1\",\"modelCustomizationUuid\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelVersionId\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelCustomizationId\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"modelUuid\":\"00d15ebb-c80e-43c1-80f0-90c40dde70b0\",\"modelInvariantUuid\":\"8028fcc0-96dc-427d-a4de-4536245943da\",\"modelInstanceName\":\"McmrNcUpVnf20191..cr_mccm_fc_base..module-0\"},\"requestInfo\":{\"source\":\"VID\",\"suppressRollback\":false,\"requestorId\":\"pj8646\"},\"cloudConfiguration\":{\"tenantId\":\"e2a6af59d1cb43b2874e943bbbf8470a\",\"cloudOwner\":\"att-nc\",\"lcpCloudRegionId\":\"auk51b\"},\"requestParameters\":{\"testApi\":\"GR_API\"}},\"configurationResourceKeys\":{\"vfModuleCustomizationUUID\":\"7adc7c29-21a3-40a2-b8b6-5d4ad08b68e9\",\"vnfResourceCustomizationUUID\":\"a80f05b8-d651-44af-b999-8ed78fb4582f\",\"cvnfcCustomizationUUID\":\"69cce457-9ffd-4359-962b-0596a1e83ad1\",\"vnfcName\":\"zauk51bmcmr01mcm001\"}}]";
+        ObjectMapper om = new ObjectMapper();
+        List<ExecuteBuildingBlock> flowsToExecute = null;
+        try {
+            ExecuteBuildingBlock[] asArray = om.readValue(flowsToExecuteString, ExecuteBuildingBlock[].class);
+            flowsToExecute = Arrays.asList(asArray);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        when(bbSetupUtils.loadOriginalFlowExecutionPath(anyString())).thenReturn(flowsToExecute);
+
+        workflowAction.selectExecutionList(execution);
+        List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+        assertEqualsBulkFlowName(ebbs, "AssignServiceInstanceBB");
+    }
+
     @Test
     public void getRelatedResourcesInVfModuleTest() throws Exception {
         org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
@@ -1423,6 +1469,21 @@ public class WorkflowActionTest extends BaseTaskTest {
         workflowAction.extractResourceIdAndTypeFromUri("something that doesn't match anything");
     }
 
+    @Test
+    public void isUriResumeTest() {
+        assertTrue(workflowAction.isUriResume(
+                "http://localhost:9100/onap/so/infra/orchestrationRequests/v7/requests/2f8ab587-ef6a-4456-b7b2-d73f9363dabd/resume"));
+        assertFalse(workflowAction.isUriResume("/v6/serviceInstances/123/vnfs/1234/vfmodules/5678/replace"));
+    }
+
+    @Test
+    public void isRequestMacroServiceResumeTest() {
+        ServiceInstance si = new ServiceInstance();
+        when(bbSetupUtils.getAAIServiceInstanceById(anyString())).thenReturn(si);
+        assertFalse(workflowAction.isRequestMacroServiceResume(false, WorkflowType.SERVICE, "createInstance", ""));
+        assertTrue(workflowAction.isRequestMacroServiceResume(false, WorkflowType.SERVICE, "createInstance", "123"));
+    }
+
     @Test
     public void populateResourceIdsFromApiHandlerTest() {
         execution.setVariable("serviceInstanceId", "123");
index 57d6496..14e9932 100644 (file)
@@ -98,10 +98,12 @@ public class SDNCVfModuleResourcesTest extends TestDataSetup {
     @Test
     public void unassignVfModuleTest() throws MapperException {
         doReturn(sdncReq).when(vfModuleTopologyMapper).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION,
-                SDNCSvcAction.UNASSIGN, vfModule, null, vnf, serviceInstance, null, null, null, null, testURI);
-        sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance, testURI);
+                SDNCSvcAction.UNASSIGN, vfModule, null, vnf, serviceInstance, null, null, requestContext, null,
+                testURI);
+        sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance, requestContext, testURI);
         verify(vfModuleTopologyMapper, times(1)).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION,
-                SDNCSvcAction.UNASSIGN, vfModule, null, vnf, serviceInstance, null, null, null, null, testURI);
+                SDNCSvcAction.UNASSIGN, vfModule, null, vnf, serviceInstance, null, null, requestContext, null,
+                testURI);
     }
 
     @Test
index 1893590..3bd646f 100644 (file)
@@ -95,6 +95,11 @@ public class CloudifyClient {
      */
     public <T> T execute(CloudifyRequest<T> request) {
         CloudifyResponse response = request(request);
+
+        if (null == response) {
+            return null;
+        }
+
         return (request.returnType() != null && request.returnType() != Void.class)
                 ? response.getEntity(request.returnType())
                 : null;
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.apihandlerinfra;
+package org.onap.so.constants;
 
-
-/*
- * Enum for Status values returned by API Handler to Tail-F
- */
-public enum Status {
-    PENDING, IN_PROGRESS, COMPLETE, COMPLETED, FAILED, TIMEOUT, UNLOCKED, PENDING_MANUAL_TASK
+public enum OrchestrationRequestFormat {
+    DETAIL, STATUSDETAIL
 }
diff --git a/common/src/main/java/org/onap/so/constants/Status.java b/common/src/main/java/org/onap/so/constants/Status.java
new file mode 100644 (file)
index 0000000..b460418
--- /dev/null
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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.constants;
+
+
+/*
+ * Enum for Status values returned by API Handler to Tail-F
+ */
+public enum Status {
+    PENDING,
+    IN_PROGRESS,
+    COMPLETE,
+    COMPLETED,
+    FAILED,
+    TIMEOUT,
+    UNLOCKED,
+    PENDING_MANUAL_TASK,
+    ABORTED,
+    ROLLED_BACK,
+    ROLLED_BACK_TO_ASSIGNED,
+    ROLLED_BACK_TO_CREATED
+}
index e236003..3ada984 100644 (file)
@@ -40,6 +40,36 @@ public class RequestStatus {
     protected String extSystemErrorSource;
     @JsonProperty("rollbackExtSystemErrorSource")
     protected String rollbackExtSystemErrorSource;
+    @JsonProperty("flowStatus")
+    protected String flowStatus;
+    @JsonProperty("retryStatusMessage")
+    protected String retryStatusMessage;
+    @JsonProperty("rollbackStatusMessage")
+    protected String rollbackStatusMessage;
+
+    public String getFlowStatus() {
+        return flowStatus;
+    }
+
+    public void setFlowStatus(String flowStatus) {
+        this.flowStatus = flowStatus;
+    }
+
+    public String getRetryStatusMessage() {
+        return retryStatusMessage;
+    }
+
+    public void setRetryStatusMessage(String retryStatusMessage) {
+        this.retryStatusMessage = retryStatusMessage;
+    }
+
+    public String getRollbackStatusMessage() {
+        return rollbackStatusMessage;
+    }
+
+    public void setRollbackStatusMessage(String rollbackStatusMessage) {
+        this.rollbackStatusMessage = rollbackStatusMessage;
+    }
 
     public String getExtSystemErrorSource() {
         return extSystemErrorSource;
@@ -94,6 +124,8 @@ public class RequestStatus {
         return new ToStringBuilder(this).append("requestState", requestState).append("statusMessage", statusMessage)
                 .append("percentProgress", percentProgress).append("timestamp", timeStamp)
                 .append("extSystemErrorSource", extSystemErrorSource)
-                .append("rollbackExtSystemErrorSource", rollbackExtSystemErrorSource).toString();
+                .append("rollbackExtSystemErrorSource", rollbackExtSystemErrorSource).append("flowStatus", flowStatus)
+                .append("retryStatusMessage", retryStatusMessage).append("rollbackStatusMessage", rollbackStatusMessage)
+                .toString();
     }
 }
diff --git a/common/src/main/java/org/onap/so/utils/TargetEntities.java b/common/src/main/java/org/onap/so/utils/TargetEntities.java
new file mode 100644 (file)
index 0000000..94385ec
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.utils;
+
+public interface TargetEntities {
+
+}
index 0f1fe51..3a3ec91 100644 (file)
@@ -22,7 +22,7 @@ package org.onap.so.utils;
 
 import java.util.EnumSet;
 
-public enum TargetEntity {
+public enum TargetEntity implements TargetEntities {
     OPENSTACK_ADAPTER,
     BPMN,
     GRM,
@@ -37,7 +37,11 @@ public enum TargetEntity {
     SDC,
     EXTERNAL,
     MULTICLOUD,
-    OOF;
+    OOF,
+    SDNC,
+    SO,
+    UNKNOWN,
+    OPENSTACK;
 
     private static final String PREFIX = "SO";
 
index eb52625..119a0a5 100644 (file)
@@ -31,7 +31,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.Provider;
 import javax.ws.rs.ext.Providers;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
-import org.onap.so.apihandlerinfra.Status;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.serviceinstancebeans.RequestError;
index 49aef84..af76417 100644 (file)
@@ -56,6 +56,7 @@ import org.onap.so.apihandlerinfra.e2eserviceinstancebeans.GetE2EServiceInstance
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.ServiceRecipe;
 import org.onap.so.db.catalog.client.CatalogDbClient;
@@ -139,7 +140,7 @@ public class E2EServiceInstances {
 
         instanceIdMap.put("serviceId", serviceId);
 
-        return updateE2EserviceInstances(request, Action.updateInstance, instanceIdMap, version);
+        return updateE2EserviceInstances(request, Action.updateInstance, version);
     }
 
     /**
@@ -187,7 +188,7 @@ public class E2EServiceInstances {
 
         logger.debug("------------------scale begin------------------");
         instanceIdMap.put("serviceId", serviceId);
-        return scaleE2EserviceInstances(request, Action.scaleInstance, instanceIdMap, version);
+        return scaleE2EserviceInstances(request, Action.scaleInstance, version);
     }
 
     /**
@@ -250,8 +251,6 @@ public class E2EServiceInstances {
         RequestClient requestClient;
         HttpResponse response;
 
-        long subStartTime = System.currentTimeMillis();
-
         try {
             requestClient = requestClientFactory.getRequestClient(workflowUrl);
 
@@ -290,8 +289,7 @@ public class E2EServiceInstances {
         ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
         int bpelStatus = respHandler.getStatus();
 
-        return beplStatusUpdate(requestId, startTime, requestClient, respHandler, bpelStatus, action, instanceIdMap,
-                version);
+        return beplStatusUpdate(requestClient, respHandler, bpelStatus, version);
     }
 
     private Response getE2EServiceInstance(String serviceId, String operationId, String version) {
@@ -300,8 +298,6 @@ public class E2EServiceInstances {
 
         String apiVersion = version.substring(1);
 
-        long startTime = System.currentTimeMillis();
-
         OperationStatus operationStatus;
 
         try {
@@ -391,7 +387,6 @@ public class E2EServiceInstances {
         RequestClient requestClient;
         HttpResponse response;
 
-        long subStartTime = System.currentTimeMillis();
         try {
             requestClient = requestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI());
 
@@ -435,12 +430,10 @@ public class E2EServiceInstances {
         ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
         int bpelStatus = respHandler.getStatus();
 
-        return beplStatusUpdate(requestId, startTime, requestClient, respHandler, bpelStatus, action, instanceIdMap,
-                version);
+        return beplStatusUpdate(requestClient, respHandler, bpelStatus, version);
     }
 
-    private Response updateE2EserviceInstances(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
-            String version) throws ApiException {
+    private Response updateE2EserviceInstances(String requestJSON, Action action, String version) throws ApiException {
 
         String requestId = UUID.randomUUID().toString();
         long startTime = System.currentTimeMillis();
@@ -512,7 +505,6 @@ public class E2EServiceInstances {
         RequestClient requestClient;
         HttpResponse response;
 
-        long subStartTime = System.currentTimeMillis();
         String sirRequestJson = convertToString(sir);
 
         try {
@@ -553,8 +545,7 @@ public class E2EServiceInstances {
         ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
         int bpelStatus = respHandler.getStatus();
 
-        return beplStatusUpdate(serviceId, startTime, requestClient, respHandler, bpelStatus, action, instanceIdMap,
-                version);
+        return beplStatusUpdate(requestClient, respHandler, bpelStatus, version);
     }
 
     private Response processE2EserviceInstances(String requestJSON, Action action,
@@ -628,7 +619,6 @@ public class E2EServiceInstances {
         RequestClient requestClient;
         HttpResponse response;
 
-        long subStartTime = System.currentTimeMillis();
         String sirRequestJson = convertToString(sir);
 
         try {
@@ -667,12 +657,10 @@ public class E2EServiceInstances {
         ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
         int bpelStatus = respHandler.getStatus();
 
-        return beplStatusUpdate(requestId, startTime, requestClient, respHandler, bpelStatus, action, instanceIdMap,
-                version);
+        return beplStatusUpdate(requestClient, respHandler, bpelStatus, version);
     }
 
-    private Response scaleE2EserviceInstances(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
-            String version) throws ApiException {
+    private Response scaleE2EserviceInstances(String requestJSON, Action action, String version) throws ApiException {
 
         String requestId = UUID.randomUUID().toString();
         long startTime = System.currentTimeMillis();
@@ -727,7 +715,6 @@ public class E2EServiceInstances {
         RequestClient requestClient;
         HttpResponse response;
 
-        long subStartTime = System.currentTimeMillis();
         try {
             requestClient = requestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI());
 
@@ -771,12 +758,10 @@ public class E2EServiceInstances {
         ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
         int bpelStatus = respHandler.getStatus();
 
-        return beplStatusUpdate(requestId, startTime, requestClient, respHandler, bpelStatus, action, instanceIdMap,
-                version);
+        return beplStatusUpdate(requestClient, respHandler, bpelStatus, version);
     }
 
-    private Response beplStatusUpdate(String serviceId, long startTime, RequestClient requestClient,
-            ResponseHandler respHandler, int bpelStatus, Action action, HashMap<String, String> instanceIdMap,
+    private Response beplStatusUpdate(RequestClient requestClient, ResponseHandler respHandler, int bpelStatus,
             String version) {
 
         String apiVersion = version.substring(1);
@@ -875,7 +860,6 @@ public class E2EServiceInstances {
 
         ServiceInstancesRequest sir = new ServiceInstancesRequest();
 
-        String returnString = null;
         RequestDetails requestDetails = new RequestDetails();
         ModelInfo modelInfo = new ModelInfo();
 
index c582e42..d8a7cb3 100644 (file)
@@ -33,6 +33,7 @@ import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Workflow;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
index 47f978a..b9b7fcc 100644 (file)
@@ -50,7 +50,6 @@ import org.onap.so.apihandlerinfra.tasksbeans.TaskRequestReference;
 import org.onap.so.apihandlerinfra.tasksbeans.TasksRequest;
 import org.onap.so.apihandlerinfra.tasksbeans.Value;
 import org.onap.so.apihandlerinfra.tasksbeans.Variables;
-import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.exceptions.ValidationException;
 import org.onap.so.logger.ErrorCode;
 import org.onap.so.logger.MessageEnum;
@@ -93,7 +92,6 @@ public class ManualTasks {
 
         String requestId = requestContext.getProperty("requestId").toString();
         logger.info(LoggingAnchor.TWO, MessageEnum.APIH_GENERATED_REQUEST_ID.toString(), requestId);
-        long startTime = System.currentTimeMillis();
         logger.debug("requestId is: {}", requestId);
         TasksRequest taskRequest = null;
         String apiVersion = version.substring(1);
@@ -140,9 +138,6 @@ public class ManualTasks {
             throw validateException;
 
         }
-        // Create Request Record
-        InfraActiveRequests currentActiveReq =
-                msoRequest.createRequestObject(taskRequest, Action.completeTask, requestId, Status.PENDING, request);
 
         // Transform the request to Camunda-style Complete request
         Variables variablesForComplete = new Variables();
@@ -156,7 +151,7 @@ public class ManualTasks {
         variablesForComplete.setResponseValue(responseValue);
         variablesForComplete.setRequestorId(requestorIdValue);
 
-        String camundaJsonReq = null;
+        String camundaJsonReq;
         try {
             ObjectMapper mapper = new ObjectMapper();
             mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
@@ -175,9 +170,8 @@ public class ManualTasks {
             throw validateException;
         }
 
-        RequestClient requestClient = null;
-        HttpResponse response = null;
-        long subStartTime = System.currentTimeMillis();
+        RequestClient requestClient;
+        HttpResponse response;
         String requestUrl = taskUri + "/" + taskId + "/complete";
         try {
             requestClient = reqClientFactory.getRequestClient(requestUrl);
index cbfe927..4bcc0d4 100644 (file)
@@ -63,6 +63,7 @@ import org.onap.so.apihandlerinfra.validation.ValidationRule;
 import org.onap.so.apihandlerinfra.vnfbeans.RequestStatusType;
 import org.onap.so.apihandlerinfra.vnfbeans.VnfInputs;
 import org.onap.so.apihandlerinfra.vnfbeans.VnfRequest;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.exceptions.ValidationException;
index b63e391..9e92c29 100644 (file)
@@ -48,6 +48,8 @@ import org.onap.so.apihandler.common.ResponseBuilder;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.constants.OrchestrationRequestFormat;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.beans.RequestProcessingData;
 import org.onap.so.db.request.client.RequestsDbClient;
@@ -72,6 +74,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+
 @Path("onap/so/infra/orchestrationRequests")
 @Api(value = "onap/so/infra/orchestrationRequests", description = "API Requests for Orchestration requests")
 @Component
@@ -95,7 +98,7 @@ public class OrchestrationRequests {
     @Transactional
     public Response getOrchestrationRequest(@PathParam("requestId") String requestId,
             @PathParam("version") String version, @QueryParam("includeCloudRequest") boolean includeCloudRequest,
-            @QueryParam("extSystemErrorSource") boolean extSystemErrorSource) throws ApiException {
+            @QueryParam(value = "format") String format) throws ApiException {
 
         String apiVersion = version.substring(1);
         GetOrchestrationResponse orchestrationResponse = new GetOrchestrationResponse();
@@ -142,7 +145,7 @@ public class OrchestrationRequests {
             throw validateException;
         }
 
-        Request request = mapInfraActiveRequestToRequest(infraActiveRequest, includeCloudRequest, extSystemErrorSource);
+        Request request = mapInfraActiveRequestToRequest(infraActiveRequest, includeCloudRequest, format);
 
         if (!requestProcessingData.isEmpty()) {
             request.setRequestProcessingData(mapRequestProcessingData(requestProcessingData));
@@ -159,16 +162,14 @@ public class OrchestrationRequests {
     @Produces(MediaType.APPLICATION_JSON)
     @Transactional
     public Response getOrchestrationRequest(@Context UriInfo ui, @PathParam("version") String version,
-            @QueryParam("includeCloudRequest") boolean includeCloudRequest,
-            @QueryParam("extSystemErrorSource") boolean extSystemErrorSource) throws ApiException {
-
-        long startTime = System.currentTimeMillis();
+            @QueryParam("includeCloudRequest") boolean includeCloudRequest, @QueryParam(value = "format") String format)
+            throws ApiException {
 
         MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
 
-        List<InfraActiveRequests> activeRequests = null;
+        List<InfraActiveRequests> activeRequests;
 
-        GetOrchestrationListResponse orchestrationList = null;
+        GetOrchestrationListResponse orchestrationList;
         Map<String, List<String>> orchestrationMap;
         String apiVersion = version.substring(1);
 
@@ -197,7 +198,7 @@ public class OrchestrationRequests {
             List<RequestProcessingData> requestProcessingData =
                     requestsDbClient.getRequestProcessingDataBySoRequestId(infraActive.getRequestId());
             RequestList requestList = new RequestList();
-            Request request = mapInfraActiveRequestToRequest(infraActive, includeCloudRequest, extSystemErrorSource);
+            Request request = mapInfraActiveRequestToRequest(infraActive, includeCloudRequest, format);
 
             if (!requestProcessingData.isEmpty()) {
                 request.setRequestProcessingData(mapRequestProcessingData(requestProcessingData));
@@ -219,12 +220,10 @@ public class OrchestrationRequests {
     public Response unlockOrchestrationRequest(String requestJSON, @PathParam("requestId") String requestId,
             @PathParam("version") String version) throws ApiException {
 
-        long startTime = System.currentTimeMillis();
         logger.debug("requestId is: {}", requestId);
-        ServiceInstancesRequest sir = null;
+        ServiceInstancesRequest sir;
 
-        InfraActiveRequests infraActiveRequest = null;
-        Request request = null;
+        InfraActiveRequests infraActiveRequest;
 
         try {
             ObjectMapper mapper = new ObjectMapper();
@@ -269,9 +268,10 @@ public class OrchestrationRequests {
 
         } else {
             String status = infraActiveRequest.getRequestStatus();
-            if (status.equalsIgnoreCase("IN_PROGRESS") || status.equalsIgnoreCase("PENDING")
-                    || status.equalsIgnoreCase("PENDING_MANUAL_TASK")) {
-                infraActiveRequest.setRequestStatus("UNLOCKED");
+            if (Status.IN_PROGRESS.toString().equalsIgnoreCase(status)
+                    || Status.PENDING.toString().equalsIgnoreCase(status)
+                    || Status.PENDING_MANUAL_TASK.toString().equalsIgnoreCase(status)) {
+                infraActiveRequest.setRequestStatus(Status.UNLOCKED.toString());
                 infraActiveRequest.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
                 infraActiveRequest.setRequestId(requestId);
                 requestsDbClient.save(infraActiveRequest);
@@ -294,7 +294,7 @@ public class OrchestrationRequests {
     }
 
     protected Request mapInfraActiveRequestToRequest(InfraActiveRequests iar, boolean includeCloudRequest,
-            boolean extSystemErrorSource) throws ApiException {
+            String format) throws ApiException {
         String requestBody = iar.getRequestBody();
         Request request = new Request();
 
@@ -303,9 +303,6 @@ public class OrchestrationRequests {
         request.setRequestId(iar.getRequestId());
         request.setRequestScope(iar.getRequestScope());
         request.setRequestType(iar.getRequestAction());
-        String rollbackStatusMessage = iar.getRollbackStatusMessage();
-        String flowStatusMessage = iar.getFlowStatus();
-        String retryStatusMessage = iar.getRetryStatusMessage();
 
         String originalRequestId = iar.getOriginalRequestId();
         if (originalRequestId != null) {
@@ -376,43 +373,15 @@ public class OrchestrationRequests {
             String endTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(iar.getEndTime()) + " GMT";
             request.setFinishTime(endTimeStamp);
         }
-        String statusMessages = null;
+
         RequestStatus status = new RequestStatus();
-        if (iar.getStatusMessage() != null) {
-            statusMessages = "STATUS: " + iar.getStatusMessage();
-        }
-        if (flowStatusMessage != null) {
-            if (statusMessages != null) {
-                statusMessages = statusMessages + " " + "FLOW STATUS: " + flowStatusMessage;
-            } else {
-                statusMessages = "FLOW STATUS: " + flowStatusMessage;
-            }
-        }
-        if (retryStatusMessage != null) {
-            if (statusMessages != null) {
-                statusMessages = statusMessages + " " + "RETRY STATUS: " + retryStatusMessage;
-            } else {
-                statusMessages = "RETRY STATUS: " + retryStatusMessage;
-            }
-        }
-        if (rollbackStatusMessage != null) {
-            if (statusMessages != null) {
-                statusMessages = statusMessages + " " + "ROLLBACK STATUS: " + rollbackStatusMessage;
-            } else {
-                statusMessages = "ROLLBACK STATUS: " + rollbackStatusMessage;
-            }
-        }
-        if (statusMessages != null) {
-            status.setStatusMessage(statusMessages);
-        }
+
         if (iar.getModifyTime() != null) {
             String timeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(iar.getModifyTime()) + " GMT";
             status.setTimeStamp(timeStamp);
         }
 
-        if (iar.getRequestStatus() != null) {
-            status.setRequestState(iar.getRequestStatus());
-        }
+        status.setRequestState(mapRequestStatusToRequest(iar, format));
 
         if (iar.getProgress() != null) {
             status.setPercentProgress(iar.getProgress().intValue());
@@ -430,17 +399,80 @@ public class OrchestrationRequests {
             });
         }
 
-        mapExtSystemErrorSourceToRequest(iar, status, extSystemErrorSource);
+        mapRequestStatusAndExtSysErrSrcToRequest(iar, status, format);
 
         request.setRequestStatus(status);
         return request;
     }
 
-    protected void mapExtSystemErrorSourceToRequest(InfraActiveRequests iar, RequestStatus status,
-            boolean extSystemErrorSource) {
-        if (extSystemErrorSource) {
+    protected String mapRequestStatusToRequest(InfraActiveRequests iar, String format) {
+        if (iar.getRequestStatus() != null) {
+            if (!StringUtils.isBlank(format) && OrchestrationRequestFormat.DETAIL.toString().equalsIgnoreCase(format)) {
+                return iar.getRequestStatus();
+            } else {
+                if (Status.ABORTED.toString().equalsIgnoreCase(iar.getRequestStatus())
+                        || Status.ROLLED_BACK.toString().equalsIgnoreCase(iar.getRequestStatus())
+                        || Status.ROLLED_BACK_TO_ASSIGNED.toString().equalsIgnoreCase(iar.getRequestStatus())
+                        || Status.ROLLED_BACK_TO_CREATED.toString().equalsIgnoreCase(iar.getRequestStatus())) {
+                    return Status.FAILED.toString();
+                } else {
+                    return iar.getRequestStatus();
+                }
+            }
+        }
+        return null;
+    }
+
+    protected void mapRequestStatusAndExtSysErrSrcToRequest(InfraActiveRequests iar, RequestStatus status,
+            String format) {
+        String rollbackStatusMessage = iar.getRollbackStatusMessage();
+        String flowStatusMessage = iar.getFlowStatus();
+        String retryStatusMessage = iar.getRetryStatusMessage();
+
+        String statusMessages = null;
+        if (iar.getStatusMessage() != null) {
+            statusMessages = "STATUS: " + iar.getStatusMessage();
+        }
+
+        if (OrchestrationRequestFormat.STATUSDETAIL.toString().equalsIgnoreCase(format)) {
+            if (flowStatusMessage != null) {
+                status.setFlowStatus(flowStatusMessage);
+            }
+            if (retryStatusMessage != null) {
+                status.setRetryStatusMessage(retryStatusMessage);
+            }
+            if (rollbackStatusMessage != null) {
+                status.setRollbackStatusMessage(rollbackStatusMessage);
+            }
             status.setExtSystemErrorSource(iar.getExtSystemErrorSource());
             status.setRollbackExtSystemErrorSource(iar.getRollbackExtSystemErrorSource());
+        } else {
+
+            if (flowStatusMessage != null) {
+                if (statusMessages != null) {
+                    statusMessages = statusMessages + " " + "FLOW STATUS: " + flowStatusMessage;
+                } else {
+                    statusMessages = "FLOW STATUS: " + flowStatusMessage;
+                }
+            }
+            if (retryStatusMessage != null) {
+                if (statusMessages != null) {
+                    statusMessages = statusMessages + " " + "RETRY STATUS: " + retryStatusMessage;
+                } else {
+                    statusMessages = "RETRY STATUS: " + retryStatusMessage;
+                }
+            }
+            if (rollbackStatusMessage != null) {
+                if (statusMessages != null) {
+                    statusMessages = statusMessages + " " + "ROLLBACK STATUS: " + rollbackStatusMessage;
+                } else {
+                    statusMessages = "ROLLBACK STATUS: " + rollbackStatusMessage;
+                }
+            }
+        }
+
+        if (statusMessages != null) {
+            status.setStatusMessage(statusMessages);
         }
     }
 
index 86e2f5c..c3f3234 100644 (file)
@@ -62,6 +62,7 @@ import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
 import org.onap.so.apihandlerinfra.infra.rest.handler.AbstractRestHandler;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.VfModule;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
index d82fd38..ed300d9 100644 (file)
@@ -40,6 +40,7 @@ import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.logger.ErrorCode;
index b290a79..5b827d9 100644 (file)
@@ -52,6 +52,7 @@ import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.infra.rest.handler.AbstractRestHandler;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.NetworkResource;
 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.Recipe;
index bba8064..b57bb5d 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
  * 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
@@ -91,13 +93,13 @@ public class WorkflowSpecificationsHandler {
         List<Workflow> workflows = catalogDbClient.findWorkflowByModelUUID(vnfModelVersionId);
 
         List<Workflow> nativeWorkflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
-        if (nativeWorkflows != null && nativeWorkflows.size() != 0) {
+        if (nativeWorkflows != null && !nativeWorkflows.isEmpty()) {
             workflows.addAll(nativeWorkflows);
         }
 
         WorkflowSpecifications workflowSpecifications = mapWorkflowsToWorkflowSpecifications(workflows);
 
-        String jsonResponse = null;
+        String jsonResponse;
         try {
             ObjectMapper mapper = new ObjectMapper();
             jsonResponse = mapper.writeValueAsString(workflowSpecifications);
@@ -116,11 +118,11 @@ public class WorkflowSpecificationsHandler {
     }
 
     protected WorkflowSpecifications mapWorkflowsToWorkflowSpecifications(List<Workflow> workflows) {
-        if (workflows == null || workflows.size() == 0) {
+        if (workflows == null || workflows.isEmpty()) {
             return null;
         }
         WorkflowSpecifications workflowSpecifications = new WorkflowSpecifications();
-        List<WorkflowSpecificationList> workflowSpecificationList = new ArrayList<WorkflowSpecificationList>();
+        List<WorkflowSpecificationList> workflowSpecificationList = new ArrayList<>();
 
         for (Workflow workflow : workflows) {
             WorkflowSpecificationList workflowSpecificationListItem = new WorkflowSpecificationList();
@@ -153,10 +155,10 @@ public class WorkflowSpecificationsHandler {
 
     private List<ActivitySequence> buildActivitySequence(Workflow workflow) {
         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
-        if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.size() == 0) {
+        if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
             return null;
         }
-        List<ActivitySequence> activitySequences = new ArrayList<ActivitySequence>();
+        List<ActivitySequence> activitySequences = new ArrayList<>();
         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
             if (workflowActivitySpecSequence != null) {
                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
@@ -174,17 +176,17 @@ public class WorkflowSpecificationsHandler {
 
     private List<WorkflowInputParameter> buildWorkflowInputParameters(Workflow workflow) {
         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
-        if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.size() == 0) {
-            return new ArrayList<WorkflowInputParameter>();
+        if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
+            return new ArrayList<>();
         }
-        Map<String, WorkflowInputParameter> workflowInputParameterMap = new HashMap<String, WorkflowInputParameter>();
+        Map<String, WorkflowInputParameter> workflowInputParameterMap = new HashMap<>();
         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
             if (workflowActivitySpecSequence != null) {
                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
                 if (activitySpec != null) {
                     List<ActivitySpecUserParameters> activitySpecUserParameters =
                             activitySpec.getActivitySpecUserParameters();
-                    if (activitySpecUserParameters != null && activitySpecUserParameters.size() != 0) {
+                    if (activitySpecUserParameters != null && !activitySpecUserParameters.isEmpty()) {
                         for (ActivitySpecUserParameters activitySpecUserParameter : activitySpecUserParameters) {
                             UserParameters userParameter = activitySpecUserParameter.getUserParameters();
                             if (userParameter != null) {
@@ -199,7 +201,7 @@ public class WorkflowSpecificationsHandler {
         }
 
         if (workflowInputParameterMap.size() == 0) {
-            return new ArrayList<WorkflowInputParameter>();
+            return new ArrayList<>();
         }
         List<WorkflowInputParameter> workflowInputParameterList =
                 workflowInputParameterMap.values().stream().collect(Collectors.toList());
@@ -220,7 +222,7 @@ public class WorkflowSpecificationsHandler {
     private List<Validation> buildValidationList(UserParameters userParameter) {
         List<Validation> validationList = null;
         if (userParameter.getMaxLength() != null || userParameter.getAllowableChars() != null) {
-            validationList = new ArrayList<Validation>();
+            validationList = new ArrayList<>();
             Validation validation = new Validation();
             if (userParameter.getMaxLength() != null) {
                 validation.setMaxLength(userParameter.getMaxLength().toString());
index 5b51d85..bb5b4ed 100644 (file)
@@ -30,7 +30,6 @@ import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.VfModule;
 import org.onap.aai.domain.yang.VolumeGroup;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.AAIEntityNotFound;
 import org.onap.so.apihandlerinfra.infra.rest.exception.CloudConfigurationNotFoundException;
 import org.onap.so.client.aai.AAIObjectType;
@@ -38,6 +37,7 @@ import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
index 227506c..b5b548a 100644 (file)
@@ -35,13 +35,13 @@ import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Actions;
 import org.onap.so.apihandlerinfra.Constants;
 import org.onap.so.apihandlerinfra.MsoRequest;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.infra.rest.exception.RequestConflictedException;
 import org.onap.so.apihandlerinfra.infra.rest.exception.WorkflowEngineConnectionException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
index ebb5d7e..7b095fc 100644 (file)
@@ -25,9 +25,9 @@ import java.util.HashMap;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
 import org.onap.so.apihandlerinfra.infra.rest.exception.RequestConflictedException;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.NetworkRecipe;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.request.beans.InfraActiveRequests;
index 7d3091e..afadf36 100644 (file)
@@ -26,9 +26,9 @@ import java.util.HashMap;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
 import org.onap.so.apihandlerinfra.infra.rest.exception.RequestConflictedException;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.catalog.beans.ServiceRecipe;
 import org.onap.so.db.request.beans.InfraActiveRequests;
index efd8b12..0762803 100644 (file)
@@ -26,8 +26,8 @@ import java.util.HashMap;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.catalog.beans.VnfComponentsRecipe;
 import org.onap.so.db.request.beans.InfraActiveRequests;
index d98625f..e157d92 100644 (file)
@@ -26,8 +26,8 @@ import java.util.HashMap;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.catalog.beans.VnfRecipe;
 import org.onap.so.db.request.beans.InfraActiveRequests;
index 52f7ee9..48a8aa2 100644 (file)
@@ -26,7 +26,7 @@ import java.util.HashMap;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.logger.LogConstants;
 import org.onap.so.serviceinstancebeans.ModelType;
index e8d00ed..d3fb798 100644 (file)
@@ -42,7 +42,6 @@ import org.onap.so.logger.LoggingAnchor;
 import org.apache.http.HttpStatus;
 import org.onap.so.apihandler.common.ErrorNumbers;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
@@ -51,6 +50,7 @@ import org.onap.so.apihandlerinfra.tenantisolationbeans.Action;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.OperationalEnvironment;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestReferences;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.TenantSyncResponse;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.exceptions.ValidationException;
index 20e8fed..e9cd303 100644 (file)
@@ -88,9 +88,9 @@ public class CloudResourcesOrchestration {
     public Response unlockOrchestrationRequest(String requestJSON, @PathParam("requestId") String requestId,
             @PathParam("version") String version) throws ApiException {
         TenantIsolationRequest msoRequest = new TenantIsolationRequest(requestId);
-        InfraActiveRequests infraActiveRequest = null;
+        InfraActiveRequests infraActiveRequest;
 
-        CloudOrchestrationRequest cor = null;
+        CloudOrchestrationRequest cor;
 
         logger.debug("requestId is: {}", requestId);
 
@@ -140,8 +140,8 @@ public class CloudResourcesOrchestration {
 
         } else {
             String status = infraActiveRequest.getRequestStatus();
-            if (status.equalsIgnoreCase("IN_PROGRESS") || status.equalsIgnoreCase("PENDING")
-                    || status.equalsIgnoreCase("PENDING_MANUAL_TASK")) {
+            if ("IN_PROGRESS".equalsIgnoreCase(status) || "PENDING".equalsIgnoreCase(status)
+                    || "PENDING_MANUAL_TASK".equalsIgnoreCase(status)) {
                 infraActiveRequest.setRequestStatus("UNLOCKED");
                 infraActiveRequest.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
                 infraActiveRequest.setRequestId(requestId);
@@ -181,8 +181,7 @@ public class CloudResourcesOrchestration {
             String requestId = requestIdKey.get(0);
 
             CloudOrchestrationResponse cloudOrchestrationGetResponse = new CloudOrchestrationResponse();
-            TenantIsolationRequest tenantIsolationRequest = new TenantIsolationRequest(requestId);
-            InfraActiveRequests requestDB = null;
+            InfraActiveRequests requestDB;
 
             try {
                 requestDB = requestDbClient.getInfraActiveRequestbyRequestId(requestId);
@@ -213,8 +212,8 @@ public class CloudResourcesOrchestration {
 
         } else {
             TenantIsolationRequest tenantIsolationRequest = new TenantIsolationRequest();
-            List<InfraActiveRequests> activeRequests = null;
-            CloudOrchestrationRequestList orchestrationList = null;
+            List<InfraActiveRequests> activeRequests;
+            CloudOrchestrationRequestList orchestrationList;
 
 
             Map<String, String> orchestrationMap;
@@ -233,7 +232,7 @@ public class CloudResourcesOrchestration {
             }
             activeRequests = requestDbClient.getCloudOrchestrationFiltersFromInfraActive(orchestrationMap);
             orchestrationList = new CloudOrchestrationRequestList();
-            List<CloudOrchestrationResponse> requestLists = new ArrayList<CloudOrchestrationResponse>();
+            List<CloudOrchestrationResponse> requestLists = new ArrayList<>();
 
             for (InfraActiveRequests infraActive : activeRequests) {
 
index b2933df..2165884 100644 (file)
@@ -75,8 +75,7 @@ public class ModelDistributionRequest {
     @Transactional
     public Response updateModelDistributionStatus(String requestJSON, @PathParam("version") String version,
             @PathParam("distributionId") String distributionId) throws ApiException {
-        long startTime = System.currentTimeMillis();
-        Distribution distributionRequest = null;
+        Distribution distributionRequest;
 
         try {
             ObjectMapper mapper = new ObjectMapper();
@@ -146,7 +145,7 @@ public class ModelDistributionRequest {
         }
         re.setServiceException(se);
 
-        String requestErrorStr = null;
+        String requestErrorStr;
         try {
             ObjectMapper mapper = new ObjectMapper();
             mapper.setSerializationInclusion(Include.NON_DEFAULT);
index 007ea93..efdc52b 100644 (file)
@@ -30,7 +30,6 @@ import java.util.Map.Entry;
 import javax.ws.rs.core.MultivaluedMap;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.Action;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.Manifest;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.OperationalEnvironment;
@@ -42,6 +41,7 @@ import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestParameters;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.ResourceType;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.ServiceModelList;
 import org.onap.so.apihandlerinfra.vnfbeans.RequestStatusType;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.exceptions.ValidationException;
index fe81a07..5eb4a67 100644 (file)
@@ -145,7 +145,7 @@ public class CreateVnfOperationalEnvironment {
             throws TenantIsolationException {
         List<ServiceEndPoint> endpointList = serviceEndPointList.getServiceEndPointList();
         logger.debug("Number of service endpoints from GRM: {}", endpointList.size());
-        List<ServiceEndPointRequest> serviceEndPointRequestList = new ArrayList<ServiceEndPointRequest>();
+        List<ServiceEndPointRequest> serviceEndPointRequestList = new ArrayList<>();
         for (ServiceEndPoint serviceEndpoint : endpointList) {
             serviceEndPointRequestList.add(buildServiceEndpoint(serviceEndpoint));
         }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application-local.yaml b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application-local.yaml
deleted file mode 100644 (file)
index a39d280..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-# will be used as entry in DB to say SITE OFF/ON for healthcheck\r
-\r
-server:\r
-    port: 8080\r
-    tomcat:\r
-        max-threads: 50\r
-ssl-enable: false\r
-\r
-apih-healthcheck-urn: /ecomp/mso/healthcheck,/ecomp/mso/homing/healthcheck,/ecomp/mso/infra/healthcheck,/asdc/healthcheck,/dbadapters/healthcheck,/ecomp/mso/catalog/v2/healthcheck\r
-jra-healthcheck-urn: /networks/rest/healthcheck,/adapters/rest/healthcheck,/vnfs/rest/healthcheck,/tenants/rest/healthcheck,/appc/rest/healthcheck,/workflows/messages/healthcheck\r
-camunda-healthcheck-urn: /mso/healthcheck\r
-\r
-apih-nodehealthcheck-urn: /ecomp/mso/infra/nodehealthcheck\r
-jra-nodehealthcheck-urn: /adapters/rest/nodehealthcheck\r
-camunda-nodehealthcheck-urn: /mso/nodehealthcheck\r
-\r
-\r
-\r
-mso:\r
-  health:\r
-    endpoints:\r
-      catalogdb: http://localhost:8800\r
-      sdnc: http://localhost:8400\r
-      openstack: http://localhost:8300\r
-      requestdb: http://localhost:8700\r
-      bpmn: http://localhost:8200\r
-      asdc: http://localhost:8400\r
-      requestdbattsvc: http://localhost:8600\r
-      \r
-  adapters:\r
-    requestDb:\r
-      auth: Basic YnBlbDptc28tZGItMTUwNyE=\r
-      endpoint: http://localhost:8081\r
-  logPath: logs\r
-  site-name: mtanj\r
-  catalog:\r
-    db:\r
-      spring:\r
-        endpoint: "http://localhost:8080"\r
-  db:\r
-    auth: Basic YnBlbDptc28tZGItMTUwNyE=\r
-  config: \r
-    path: /src/main/resources/\r
-  infra:\r
-    default:\r
-      alacarte:\r
-        orchestrationUri: /mso/async/services/ALaCarteOrchestrator\r
-        recipeTimeout: 180\r
-        testApi: VNF_API\r
-      service:\r
-        macro:\r
-          default:\r
-            testApi: GR_API\r
-  apih:\r
-    homing:\r
-      sdna:\r
-        url: http://localhost:8089/\r
-        password: 4E0BDC08EE8EDC0572ABBE9FD2D59B62DB725A00B8469E39393D6C86D64284C5D34A57D56F7B58C375316F\r
-  camundaURL: http://localhost:8089/\r
-  camundaAuth: E8E19DD16CC90D2E458E8FF9A884CC0452F8F3EB8E321F96038DE38D5C1B0B02DFAE00B88E2CF6E2A4101AB2C011FC161212EE\r
-  async:\r
-    core-pool-size: 50\r
-    max-pool-size: 50\r
-    queue-capacity: 500\r
-  sdc:\r
-    client:\r
-      auth: 97FF88AB352DA16E00DDD81E3876431DEF8744465DACA489EB3B3BE1F10F63EDA1715E626D0A4827A3E19CD88421BF\r
-    activate:\r
-      instanceid: test\r
-      userid: cs0008\r
-    endpoint: http://localhost:28090\r
-  msoKey: 07a7159d3bf51a0e53be7a8f89699be7\r
-  tenant:\r
-    isolation:\r
-      retry:\r
-        count: 3\r
-  aai:\r
-    endpoint: http://localhost:28090\r
-    auth: 5E12ACACBD552A415E081E29F2C4772F9835792A51C766CCFDD7433DB5220B59969CB2798C\r
-  grm:\r
-    endpoint: http://localhost:28090\r
-    username: gmruser\r
-    password: test\r
-  so:\r
-    operational-environment:\r
-      dmaap:\r
-        username: testuser\r
-        password: VjR5NDcxSzA=\r
-        host: http://localhost:28090\r
-      publisher:\r
-        topic: com.att.ecomp.mso.operationalEnvironmentEvent\r
-\r
-# controls what actions the infra API (APIH) allows sent in on REST request\r
-vnf:\r
-  v1:\r
-    ApiAllowableActions: \r
-  v2:\r
-    ApiAllowableActions: \r
-  v3:\r
-    ApiAllowableActions: \r
-  \r
-network:\r
-  v1:\r
-    ApiAllowableActions: \r
-  v2:\r
-    ApiAllowableActions: \r
-  v3:\r
-    ApiAllowableActions: \r
-  \r
-volume:\r
-  v1:\r
-    ApiAllowableActions: \r
-  v2:\r
-    ApiAllowableActions: \r
-  v3:\r
-    ApiAllowableActions: \r
-\r
-# H2\r
-spring:\r
-  datasource:\r
-    url: jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE\r
-    username: sa\r
-    password: sa\r
-    driver-class-name: org.h2.Driver\r
-    intialize: true\r
-  h2:\r
-    console:\r
-      enabled: true\r
-      path: /h2\r
-\r
-  jpa:\r
-      show-sql: true\r
-      hibernate:\r
-        dialect: org.hibernate.dialect.H2Dialect\r
-        ddl-auto: validate\r
-        naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy\r
-        enable_lazy_load_no_trans: true\r
-  jersey:\r
-    type: filter\r
-  security:\r
-    usercredentials:\r
-    -  \r
-      username: sitecontrol\r
-      password: '$2a$12$VBUF.qBmeK1FNyO2MqTpD.P2M1tvlesZlhCkAjjHvF9hmYNVdMDmu'\r
-      role: SiteControl-Client \r
-    -  \r
-      username: gui\r
-      password: '$2a$12$9Y4daXavh.oX5fz6t/e7TuCdj7EKW5B5ibqq425fN3/xpp0/Fhyti'\r
-      role: GUI-Client  \r
-    -  \r
-      username: infraportal\r
-      password: '$2a$12$IpUEhQijWTNbq0fGYVkA9upZrDvdIK6QfblIaKAiwi0vBQRE.C6Ri'\r
-      role: InfraPortal-Client        \r
-    -  \r
-      username: bpel\r
-      password: '$2a$12$1xyutEZNfjGewIZRfKaE8eZE99f5sYFUmmM80BobI65KNjmcK0JuO'\r
-      role: BPEL-Client   \r
-    -  \r
-      username: mso_admin\r
-      password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'\r
-      role: ACTUATOR      \r
-request:\r
-  datasource:\r
-    url: jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE\r
-    username: sa\r
-    password: sa\r
-    driver-class-name: org.h2.Driver\r
-    intialize: true \r
-\r
-#Actuator\r
-management: \r
-  context-path: /manage\r
-\r
-org:\r
-  onap:\r
-    so:\r
-      adapters:\r
-        network:\r
-          encryptionKey: aa3871669d893c7fb8abbcda31b88b4f\r
index 99ff4ff..fc548a7 100644 (file)
@@ -23,16 +23,10 @@ package org.onap.so.apihandlerinfra;
 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import javax.ws.rs.core.Response;
-import org.apache.http.HttpStatus;
+import org.apache.commons.lang.StringUtils;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -40,11 +34,11 @@ import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.Spy;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandler.common.ResponseBuilder;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
+import org.onap.so.constants.OrchestrationRequestFormat;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.serviceinstancebeans.InstanceReferences;
@@ -64,7 +58,6 @@ public class OrchestrationRequestsUnitTest {
     @Rule
     public ExpectedException thrown = ExpectedException.none();
     @InjectMocks
-    @Spy
     private OrchestrationRequests orchestrationRequests;
 
     private static final String REQUEST_ID = "7cb9aa56-dd31-41e5-828e-d93027d4ebba";
@@ -72,14 +65,13 @@ public class OrchestrationRequestsUnitTest {
     private static final String ORIGINAL_REQUEST_ID = "8f2d38a6-7c20-465a-bd7e-075645f1394b";
     private static final String SERVICE = "service";
     private static final String EXT_SYSTEM_ERROR_SOURCE = "external system error source";
-    private static final String ROLLBACK_EXT_SYSTEM_ERROR_SOURCE = "SDNC";
+    private static final String FLOW_STATUS = "FlowStatus";
+    private static final String RETRY_STATUS_MESSAGE = "RetryStatusMessage";
+    private static final String ROLLBACK_STATUS_MESSAGE = "RollbackStatusMessage";
     private InfraActiveRequests iar;
     boolean includeCloudRequest = false;
-    boolean extSystemErrorSource = false;
-
-    private static final String VERSION = "v7";
+    private static final String ROLLBACK_EXT_SYSTEM_ERROR_SOURCE = "SDNC";
 
-    List<org.onap.so.db.request.beans.RequestProcessingData> requestProcessingData = new ArrayList<>();
 
     @Before
     public void setup() {
@@ -87,12 +79,6 @@ public class OrchestrationRequestsUnitTest {
         iar.setRequestScope(SERVICE);
         iar.setRequestId(REQUEST_ID);
         iar.setServiceInstanceId(SERVICE_INSTANCE_ID);
-        when(requestDbClient.getInfraActiveRequestbyRequestId(Mockito.eq(REQUEST_ID))).thenReturn(iar);
-        when(requestDbClient.getRequestProcessingDataBySoRequestId(Mockito.eq(REQUEST_ID)))
-                .thenReturn(requestProcessingData);
-
-        when(builder.buildResponse(Mockito.eq(HttpStatus.SC_OK), Mockito.eq(REQUEST_ID), any(Object.class),
-                any(String.class))).thenReturn(response);
     }
 
     @Test
@@ -100,6 +86,7 @@ public class OrchestrationRequestsUnitTest {
         InstanceReferences instanceReferences = new InstanceReferences();
         instanceReferences.setServiceInstanceId(SERVICE_INSTANCE_ID);
         RequestStatus requestStatus = new RequestStatus();
+        requestStatus.setRequestState(iar.getRequestStatus());
         Request expected = new Request();
         expected.setRequestId(REQUEST_ID);
         expected.setOriginalRequestId(ORIGINAL_REQUEST_ID);
@@ -109,8 +96,8 @@ public class OrchestrationRequestsUnitTest {
 
         iar.setOriginalRequestId(ORIGINAL_REQUEST_ID);
 
-        Request result =
-                orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest, extSystemErrorSource);
+        Request result = orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest,
+                OrchestrationRequestFormat.DETAIL.toString());
         assertThat(result, sameBeanAs(expected));
     }
 
@@ -119,22 +106,24 @@ public class OrchestrationRequestsUnitTest {
         InstanceReferences instanceReferences = new InstanceReferences();
         instanceReferences.setServiceInstanceId(SERVICE_INSTANCE_ID);
         RequestStatus requestStatus = new RequestStatus();
+        requestStatus.setRequestState(iar.getRequestStatus());
         Request expected = new Request();
         expected.setRequestId(REQUEST_ID);
         expected.setInstanceReferences(instanceReferences);
         expected.setRequestStatus(requestStatus);
         expected.setRequestScope(SERVICE);
 
-        Request result =
-                orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest, extSystemErrorSource);
+        Request result = orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest,
+                OrchestrationRequestFormat.DETAIL.toString());
         assertThat(result, sameBeanAs(expected));
     }
 
     @Test
-    public void mapExtSystemErrorSourceToRequestFalseTest() throws ApiException {
+    public void mapRequestStatusAndExtSysErrSrcToRequestFalseTest() throws ApiException {
         InstanceReferences instanceReferences = new InstanceReferences();
         instanceReferences.setServiceInstanceId(SERVICE_INSTANCE_ID);
         RequestStatus requestStatus = new RequestStatus();
+        requestStatus.setRequestState(iar.getRequestStatus());
 
         Request expected = new Request();
         expected.setRequestId(REQUEST_ID);
@@ -142,21 +131,24 @@ public class OrchestrationRequestsUnitTest {
         expected.setRequestStatus(requestStatus);
         expected.setRequestScope(SERVICE);
 
-        extSystemErrorSource = false;
         includeCloudRequest = false;
 
-        Request actual =
-                orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest, extSystemErrorSource);
+        Request actual = orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest,
+                OrchestrationRequestFormat.DETAIL.toString());
         assertThat(actual, sameBeanAs(expected));
     }
 
     @Test
-    public void mapExtSystemErrorSourceToRequestTrueTest() throws ApiException {
+    public void mapRequestStatusAndExtSysErrSrcToRequestStatusDetailTest() throws ApiException {
         InstanceReferences instanceReferences = new InstanceReferences();
         instanceReferences.setServiceInstanceId(SERVICE_INSTANCE_ID);
         RequestStatus requestStatus = new RequestStatus();
         requestStatus.setExtSystemErrorSource(EXT_SYSTEM_ERROR_SOURCE);
         requestStatus.setRollbackExtSystemErrorSource(ROLLBACK_EXT_SYSTEM_ERROR_SOURCE);
+        requestStatus.setRequestState(iar.getRequestStatus());
+        requestStatus.setFlowStatus(FLOW_STATUS);
+        requestStatus.setRollbackStatusMessage(ROLLBACK_STATUS_MESSAGE);
+        requestStatus.setRetryStatusMessage(RETRY_STATUS_MESSAGE);
 
         Request expected = new Request();
         expected.setRequestId(REQUEST_ID);
@@ -164,24 +156,44 @@ public class OrchestrationRequestsUnitTest {
         expected.setRequestStatus(requestStatus);
         expected.setRequestScope(SERVICE);
 
-        extSystemErrorSource = true;
         includeCloudRequest = false;
         iar.setExtSystemErrorSource(EXT_SYSTEM_ERROR_SOURCE);
         iar.setRollbackExtSystemErrorSource(ROLLBACK_EXT_SYSTEM_ERROR_SOURCE);
+        iar.setFlowStatus(FLOW_STATUS);
+        iar.setRollbackStatusMessage(ROLLBACK_STATUS_MESSAGE);
+        iar.setRetryStatusMessage(RETRY_STATUS_MESSAGE);
 
-        Request actual =
-                orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest, extSystemErrorSource);
+        Request actual = orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest,
+                OrchestrationRequestFormat.STATUSDETAIL.toString());
         assertThat(actual, sameBeanAs(expected));
     }
 
     @Test
-    public void mapExtSystemErrorSourceToRequestMethodInvokedTest() throws ApiException, IOException {
-        extSystemErrorSource = true;
+    public void mapRequestStatusAndExtSysErrSrcToRequestDetailTest() throws ApiException {
+        InstanceReferences instanceReferences = new InstanceReferences();
+        instanceReferences.setServiceInstanceId(SERVICE_INSTANCE_ID);
+        RequestStatus requestStatus = new RequestStatus();
+        requestStatus.setRequestState(iar.getRequestStatus());
+        requestStatus.setStatusMessage(String.format("FLOW STATUS: %s RETRY STATUS: %s ROLLBACK STATUS: %s",
+                FLOW_STATUS, RETRY_STATUS_MESSAGE, ROLLBACK_STATUS_MESSAGE));
+
+        Request expected = new Request();
+        expected.setRequestId(REQUEST_ID);
+        expected.setInstanceReferences(instanceReferences);
+        expected.setRequestStatus(requestStatus);
+        expected.setRequestScope(SERVICE);
+
         includeCloudRequest = false;
-        orchestrationRequests.getOrchestrationRequest(REQUEST_ID, VERSION, includeCloudRequest, extSystemErrorSource);
+        iar.setExtSystemErrorSource(EXT_SYSTEM_ERROR_SOURCE);
+        iar.setRollbackExtSystemErrorSource(ROLLBACK_EXT_SYSTEM_ERROR_SOURCE);
+        iar.setFlowStatus(FLOW_STATUS);
+        iar.setRollbackStatusMessage(ROLLBACK_STATUS_MESSAGE);
+        iar.setRetryStatusMessage(RETRY_STATUS_MESSAGE);
 
-        verify(orchestrationRequests, times(1)).mapExtSystemErrorSourceToRequest(Mockito.eq(iar), Mockito.any(),
-                Mockito.eq(extSystemErrorSource));
+        Request actual = orchestrationRequests.mapInfraActiveRequestToRequest(iar, includeCloudRequest,
+                OrchestrationRequestFormat.DETAIL.toString());
+
+        assertThat(actual, sameBeanAs(expected));
     }
 
     @Test
@@ -190,4 +202,22 @@ public class OrchestrationRequestsUnitTest {
         requestStatus.setExtSystemErrorSource(EXT_SYSTEM_ERROR_SOURCE);
         assertThat(requestStatus.getExtSystemErrorSource(), is(equalTo(EXT_SYSTEM_ERROR_SOURCE)));
     }
+
+    @Test
+    public void mapRequestStatusToRequestForFormatDetailTest() throws ApiException {
+        iar.setRequestStatus(Status.ABORTED.toString());
+        String result =
+                orchestrationRequests.mapRequestStatusToRequest(iar, OrchestrationRequestFormat.DETAIL.toString());
+
+        assertEquals(Status.ABORTED.toString(), result);
+    }
+
+
+    @Test
+    public void mapRequestStatusToRequestForFormatEmptyStringTest() throws ApiException {
+        iar.setRequestStatus(Status.ABORTED.toString());
+        String result = orchestrationRequests.mapRequestStatusToRequest(iar, StringUtils.EMPTY);
+
+        assertEquals(Status.FAILED.toString(), result);
+    }
 }
index 91ca756..d4b0c3a 100644 (file)
@@ -41,6 +41,7 @@ import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.VfModule;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
index 398966b..1e75541 100644 (file)
@@ -52,6 +52,7 @@ import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.serviceinstancebeans.ModelInfo;
index 8ff7517..5930821 100644 (file)
@@ -40,9 +40,9 @@ import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
 import org.onap.so.apihandlerinfra.infra.rest.handler.NetworkRestHandler;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
index 56d57aa..c1e6347 100644 (file)
@@ -41,10 +41,10 @@ import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
 import org.onap.so.apihandlerinfra.infra.rest.exception.RequestConflictedException;
 import org.onap.so.apihandlerinfra.infra.rest.handler.ServiceInstanceRestHandler;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.catalog.beans.ServiceRecipe;
 import org.onap.so.db.catalog.client.CatalogDbClient;
index 280ae9c..7d14679 100644 (file)
@@ -41,9 +41,9 @@ import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
 import org.onap.so.apihandlerinfra.infra.rest.handler.VFModuleRestHandler;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.catalog.beans.VnfComponentsRecipe;
 import org.onap.so.db.catalog.client.CatalogDbClient;
index 2ea537b..03725ec 100644 (file)
@@ -40,9 +40,9 @@ import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
 import org.onap.so.apihandlerinfra.infra.rest.handler.VnfRestHandler;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.catalog.beans.ServiceRecipe;
 import org.onap.so.db.catalog.client.CatalogDbClient;
index 2721f8a..efa2774 100644 (file)
@@ -40,9 +40,9 @@ import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.Action;
 import org.onap.so.apihandlerinfra.Constants;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.infra.rest.exception.NoRecipeException;
 import org.onap.so.apihandlerinfra.infra.rest.handler.VolumeRestHandler;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
index 9ae1e5b..a74c11c 100644 (file)
@@ -35,9 +35,9 @@ import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.onap.so.apihandlerinfra.BaseTest;
-import org.onap.so.apihandlerinfra.Status;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.Action;
 import org.onap.so.apihandlerinfra.tenantisolationbeans.TenantIsolationRequest;
+import org.onap.so.constants.Status;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
index f890dab..4dbf22c 100644 (file)
@@ -30,7 +30,6 @@
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-rest</artifactId>
-      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>com.h2database</groupId>
diff --git a/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/configuration/ExposeEntityIdResourceConfiguration.java b/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/configuration/ExposeEntityIdResourceConfiguration.java
new file mode 100644 (file)
index 0000000..575e5ff
--- /dev/null
@@ -0,0 +1,21 @@
+package org.onap.so.db.request.configuration;
+
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ExposeEntityIdResourceConfiguration extends RepositoryRestConfigurerAdapter {
+
+    /**
+     * Spring Data Rest hides the ID by default, in order to have it in the JSON you have to manually configure that for
+     * your entity
+     *
+     * @param config
+     */
+    @Override
+    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
+        config.exposeIdsFor(RequestProcessingData.class);
+    }
+}
index 1abc21d..7081713 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -34,5 +34,11 @@ public interface RequestProcessingDataRepository extends JpaRepository<RequestPr
     RequestProcessingData findOneBySoRequestIdAndGroupingIdAndName(@Param("SO_REQUEST_ID") String soRequestId,
             @Param("GROUPING_ID") String groupingId, @Param("NAME") String name);
 
+    RequestProcessingData findOneBySoRequestIdAndName(@Param("SO_REQUEST_ID") String soRequestId,
+            @Param("NAME") String name);
+
     List<RequestProcessingData> findBySoRequestIdOrderByGroupingIdDesc(@Param("SO_REQUEST_ID") String soRequestId);
+
+    List<RequestProcessingData> findByGroupingIdAndNameAndTag(@Param("GROUPING_ID") String groupingId,
+            @Param("NAME") String name, @Param("TAG") String tag);
 }
index 9ab0f3b..4d16d9c 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -26,6 +26,8 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import javax.annotation.PostConstruct;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriBuilder;
@@ -72,6 +74,9 @@ public class RequestsDbClient {
     private static final String REQUEST_ID = "REQUEST_ID";
     private static final String OPERATIONAL_ENVIRONMENT_ID = "OPERATIONAL_ENV_ID";
     private static final String SERVICE_MODEL_VERSION_ID = "SERVICE_MODEL_VERSION_ID";
+    private static final String TAG = "TAG";
+    private static final String FLOW_EXECUTION_PATH = "flowExecutionPath";
+    private static final String BPMN_EXECUTION_DATA_TAG = "BPMNExecutionData";
 
     @Value("${mso.adapters.requestDb.endpoint:#{null}}")
     protected String endpoint;
@@ -95,6 +100,8 @@ public class RequestsDbClient {
 
     private String findOneByServiceIdAndOperationIdURI = "/findOneByServiceIdAndOperationId";
 
+    private String findOneByRequestId = "/infraActiveRequests/search/findOneByRequestId";
+
     private String findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestIdURI =
             "/findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestId";
 
@@ -110,9 +117,13 @@ public class RequestsDbClient {
     private static final String findBySoRequestIdAndGroupIdAndName =
             "/requestProcessingData/search/findOneBySoRequestIdAndGroupingIdAndName";
 
+    private static final String findBySoRequestIdAndName = "/requestProcessingData/search/findOneBySoRequestIdAndName";
+
     private static final String findBySoRequestIdOrderByGroupingIdDesc =
             "/requestProcessingData/search/findBySoRequestIdOrderByGroupingIdDesc";
 
+    private static final String findByGroupingIdAndNameAndTag =
+            "/requestProcessingData/search/findByGroupingIdAndNameAndTag";
 
     @Autowired
     protected RestTemplate restTemplate;
@@ -136,6 +147,7 @@ public class RequestsDbClient {
                         + findOneByOperationalEnvIdAndServiceModelVersionIdAndRequestIdURI;
         findAllByOperationalEnvIdAndRequestIdURI =
                 endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findAllByOperationalEnvIdAndRequestIdURI;
+        findOneByRequestId = endpoint + findOneByRequestId;
     }
 
     private ClientFactory getClientFactory() {
@@ -342,7 +354,7 @@ public class RequestsDbClient {
 
     public void updateRequestProcessingData(RequestProcessingData requestProcessingData) {
         HttpHeaders headers = getHttpHeaders();
-        URI uri = getUri(requestProcessingDataURI);
+        URI uri = getUri(requestProcessingDataURI + "/" + requestProcessingData.getId());
         HttpEntity<RequestProcessingData> entity = new HttpEntity<>(requestProcessingData, headers);
         restTemplate.put(uri, entity);
     }
@@ -361,6 +373,41 @@ public class RequestsDbClient {
                         .queryParam(GROUPING_ID, groupingId).build().toString()));
     }
 
+    public List<RequestProcessingData> getRequestProcessingDataByGroupingIdAndNameAndTag(String groupingId, String name,
+            String tag) {
+        Iterable<RequestProcessingData> requestProcessingDataListIt =
+                getClientFactory().create(RequestProcessingData.class)
+                        .getAll(getUri(UriBuilder.fromUri(endpoint + findByGroupingIdAndNameAndTag)
+                                .queryParam(GROUPING_ID, groupingId).queryParam(NAME, name).queryParam(TAG, tag).build()
+                                .toString()));
+
+        List<RequestProcessingData> requestProcessingDataList =
+                StreamSupport.stream(requestProcessingDataListIt.spliterator(), false).collect(Collectors.toList());
+
+        return requestProcessingDataList;
+    }
+
+    public RequestProcessingData getRequestProcessingDataBySoRequestIdAndName(String soRequestId, String name) {
+        return getClientFactory().create(RequestProcessingData.class)
+                .get(getUri(UriBuilder.fromUri(endpoint + findBySoRequestIdAndName)
+                        .queryParam(SO_REQUEST_ID, soRequestId).queryParam(NAME, name).build().toString()));
+    }
+
+
+    public void persistProcessingData(String flowExecutionPath, String requestId) {
+
+        HttpHeaders headers = getHttpHeaders();
+        URI uri = getUri(requestProcessingDataURI);
+        RequestProcessingData rpd = new RequestProcessingData();
+        rpd.setName(FLOW_EXECUTION_PATH);
+        rpd.setSoRequestId(requestId);
+        rpd.setValue(flowExecutionPath);
+        rpd.setTag(BPMN_EXECUTION_DATA_TAG);
+
+        HttpEntity<RequestProcessingData> entity = new HttpEntity<>(rpd, headers);
+        restTemplate.postForLocation(uri, entity);
+    }
+
     private List<RequestProcessingData> getRequestProcessingData(URI uri) {
         Iterable<RequestProcessingData> requestProcessingDataIterator =
                 getClientFactory().create(RequestProcessingData.class).getAll(uri);
@@ -370,6 +417,20 @@ public class RequestsDbClient {
         return requestProcessingDataList;
     }
 
+    public InfraActiveRequests findOneByRequestId(String requestId) {
+        try {
+            HttpEntity<?> entity = getHttpEntity();
+            return restTemplate.exchange(
+                    getUri(UriBuilder.fromUri(findOneByRequestId).queryParam(REQUEST_ID, requestId).build().toString()),
+                    HttpMethod.GET, entity, InfraActiveRequests.class).getBody();
+        } catch (HttpClientErrorException e) {
+            if (HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()) {
+                return null;
+            }
+            throw e;
+        }
+    }
+
     // From and To are defaulted to ignore start/endtime on query to database
     public List<InfraActiveRequests> getRequest(final Map<String, String[]> filters) {
         String url = UriBuilder.fromUri(getUri(getInfraActiveRequests)).queryParam("from", "0")
diff --git a/mso-api-handlers/mso-requests-db/src/test/java/org/onap/so/db/request/client/RequestDbClientTest.java b/mso-api-handlers/mso-requests-db/src/test/java/org/onap/so/db/request/client/RequestDbClientTest.java
new file mode 100644 (file)
index 0000000..fdbc04a
--- /dev/null
@@ -0,0 +1,35 @@
+package org.onap.so.db.request.client;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.Mockito.times;
+import java.net.URI;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.springframework.http.HttpEntity;
+import org.springframework.web.client.RestTemplate;
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class RequestDbClientTest {
+
+    @InjectMocks
+    protected RequestsDbClient requestsDbClient;
+
+    @Mock
+    protected RestTemplate restTemplate;
+
+    @Test
+    public void updateRequestProcessingDataTest() {
+        RequestProcessingData requestProcessingData = new RequestProcessingData();
+        requestProcessingData.setId(1);
+        URI uri = URI.create("/requestProcessingData/1");
+        requestsDbClient.updateRequestProcessingData(requestProcessingData);
+        Mockito.verify(restTemplate, times(1)).put(eq(uri), isA(HttpEntity.class));
+    }
+}
index 9c257bd..b82c17d 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -170,4 +170,5 @@ public class CatalogDbClientTest {
         CvnfcCustomization aCvnfc = catalogDbClient.findCvnfcCustomizationInAList(cvnfcCustomizationUuid, cvnfcs);
         assertTrue(aCvnfc.getModelCustomizationUUID().equals("a123"));
     }
+
 }
diff --git a/pom.xml b/pom.xml
index 58f8afa..a27c149 100644 (file)
--- a/pom.xml
+++ b/pom.xml
       </resource>
     </resources>
     <plugins>
-      <plugin>
+      <!-- <plugin>
         <groupId>org.sonatype.plugins</groupId>
         <artifactId>nexus-staging-maven-plugin</artifactId>
         <version>1.6.7</version>
           <stagingProfileId>176c31dfe190a</stagingProfileId>
           <serverId>ecomp-staging</serverId>
         </configuration>
-      </plugin>
+      </plugin> -->
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-deploy-plugin</artifactId>
diff --git a/so-monitoring/readme.md b/so-monitoring/readme.md
new file mode 100644 (file)
index 0000000..d4b876c
--- /dev/null
@@ -0,0 +1,35 @@
+# SO Monitoring
+
+----
+
+## Introduction
+
+SO Monitoring provides multiple useful features:
+* Search/Filtering Menu
+* A graphical user interface
+* Workflow pathing
+* Subflow navigation
+* Access to the workflow variables
+
+## Compiling / Running
+
+Compiling is simple: `mvn clean install`
+Compilation may fail if your code is not formatted properly. 
+
+## Components
+
+### so-monitoring-handler
+
+
+### so-monitoring-service
+
+Backend API for so-monitoring. Requires basic auth to access it.
+
+Default credentials:
+- with role GUI-Client: gui/password1$
+
+Note that these default users should be changed for production.
+
+### so-monitoring-ui
+
+UI for so-monitoring has a separate README.md - so-monitoring/so-monitoring-ui/src/main/frontend/README.md
index ff70a77..f5448aa 100644 (file)
       <artifactId>spring-boot-configuration-processor</artifactId>
       <scope>compile</scope>
     </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/so-monitoring/so-monitoring-service/src/main/java/org/onap/so/monitoring/rest/api/UserController.java b/so-monitoring/so-monitoring-service/src/main/java/org/onap/so/monitoring/rest/api/UserController.java
new file mode 100644 (file)
index 0000000..3959631
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Samsung
+ * ================================================================================
+ * 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.monitoring.rest.api;
+
+import java.security.Principal;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class UserController {
+
+    @RequestMapping("/user")
+    public Principal user(Principal user) {
+        return user;
+    }
+}
index cadd60b..2b53ed8 100644 (file)
@@ -2,7 +2,9 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
+  * 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
  * 
@@ -21,16 +23,15 @@ package org.onap.so.monitoring.rest.api;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 /**
  * @author waqas.ikram@ericsson.com
  */
 @Configuration
-public class WebApplicationConfig extends WebMvcConfigurerAdapter {
+public class WebApplicationConfig implements WebMvcConfigurer {
     @Override
     public void addViewControllers(final ViewControllerRegistry registry) {
-        super.addViewControllers(registry);
         registry.addViewController("/details/**").setViewName("forward:/");
     }
 }
diff --git a/so-monitoring/so-monitoring-service/src/main/java/org/onap/so/monitoring/rest/api/WebSecurityConfigImpl.java b/so-monitoring/so-monitoring-service/src/main/java/org/onap/so/monitoring/rest/api/WebSecurityConfigImpl.java
new file mode 100644 (file)
index 0000000..298f52b
--- /dev/null
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Samsung
+ * ================================================================================
+ * 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.monitoring.rest.api;
+
+import org.onap.so.security.WebSecurityConfig;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+
+@EnableWebSecurity
+@Configuration("att-security-config")
+@Order(2)
+public class WebSecurityConfigImpl extends WebSecurityConfig {
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.authorizeRequests().antMatchers("/actuator", "/actuator/*", "/login", "/", "/index.html", "/*.js",
+                "/*.js.map", "/favicon.png").permitAll().anyRequest().authenticated().and().httpBasic();
+    }
+}
index 8235c74..347845e 100644 (file)
@@ -16,3 +16,10 @@ mso:
         url: http://so-request-db-adapter.onap:8083/infraActiveRequests/
         auth: Basic YnBlbDpwYXNzd29yZDEk
 
+spring:
+  security:
+    usercredentials:
+    -
+      username: gui
+      password: '$2a$10$Fh9ffgPw2vnmsghsRD3ZauBL1aKXebigbq3BB1RPWtE62UDILsjke'
+      role: GUI-Client
index 329de0f..65731cd 100644 (file)
@@ -6,6 +6,15 @@ This project was generated with [Angular CLI](https://github.com/angular/angular
 \r
 Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.\r
 \r
+FYI: You may need to change environments.ts to hit to your backend: not so-monitoring:30224 but localhost:8088  \r
+\r
+### Logging in\r
+\r
+Backend API for so-monitoring. Requires basic auth to access it.\r
+\r
+Default credentials:\r
+- with role GUI-Client: gui/password1$\r
+\r
 ## Code scaffolding\r
 \r
 Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.\r
index 428998d..03e77fc 100644 (file)
@@ -1,6 +1,8 @@
 /**
 ============LICENSE_START=======================================================
  Copyright (C) 2018 Ericsson. All rights reserved.
+================================================================================
+ Modifications Copyright (c) 2019 Samsung
 ================================================================================
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -24,17 +26,25 @@ import { NgModule } from '@angular/core';
 import { Routes, RouterModule } from '@angular/router';
 import { HomeComponent } from './home/home.component';
 import { DetailsComponent } from './details/details.component';
+import {AuthGuard} from "./auth.guard";
+import {LoginComponent} from "./login/login.component";
 
 const routes: Routes = [
   {
     // Route to home page
     path: '',
-    component: HomeComponent
+    component: HomeComponent,
+    canActivate: [AuthGuard]
   },
   {
     // Route to page to show individual process based on ID
     path: 'details/:id',
     component: DetailsComponent
+  },
+  {
+    // Route to login page
+    path: 'login',
+    component: LoginComponent
   }
 ];
 
index 2330863..71294bf 100644 (file)
@@ -1,6 +1,8 @@
 /**
 ============LICENSE_START=======================================================
  Copyright (C) 2018 Ericsson. All rights reserved.
+================================================================================
+ Modifications Copyright (c) 2019 Samsung
 ================================================================================
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -28,7 +30,7 @@ import { AppComponent } from './app.component';
 import { SidebarComponent } from './sidebar/sidebar.component';
 import { TopbarComponent } from './topbar/topbar.component';
 import { HomeComponent } from './home/home.component';
-import { HttpClientModule } from '@angular/common/http';
+import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { DetailsComponent } from './details/details.component';
 import { ToastrNotificationService } from './toastr-notification-service.service';
@@ -37,6 +39,9 @@ import { MatFormFieldModule, MatInputModule, MatTableModule, MatTabsModule, MatS
 import { NgxSpinnerModule } from 'ngx-spinner';
 import { RouterModule, Routes } from '@angular/router';
 import { APP_BASE_HREF } from '@angular/common';
+import { LoginComponent } from './login/login.component';
+import {BasicAuthInterceptor} from "./basic-auth.interceptor";
+import {ErrorInterceptor} from "./error.interceptor";
 
 @NgModule({
   declarations: [
@@ -44,7 +49,8 @@ import { APP_BASE_HREF } from '@angular/common';
     SidebarComponent,
     TopbarComponent,
     HomeComponent,
-    DetailsComponent
+    DetailsComponent,
+    LoginComponent
   ],
   imports: [
     BrowserModule,
@@ -64,12 +70,16 @@ import { APP_BASE_HREF } from '@angular/common';
     RouterModule,
     MatPaginatorModule,
     MatSortModule,
-    RouterModule.forRoot([])
+    RouterModule.forRoot([]),
+    ReactiveFormsModule
   ],
   schemas: [
     CUSTOM_ELEMENTS_SCHEMA
   ],
-  providers: [ToastrNotificationService],
+  providers: [
+    { provide: HTTP_INTERCEPTORS, useClass: BasicAuthInterceptor, multi: true },
+    { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
+    ToastrNotificationService],
   bootstrap: [AppComponent]
 })
 export class AppModule { }
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/auth.guard.ts b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/auth.guard.ts
new file mode 100644 (file)
index 0000000..f437a21
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ ============LICENSE_START=======================================================
+ Copyright (C) 2019 Samsung. 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.
+
+ SPDX-License-Identifier: Apache-2.0
+ ============LICENSE_END=========================================================
+
+ @authors: k.kazak@samsung.com
+ **/
+
+import { Injectable } from '@angular/core';
+import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from '@angular/router';
+import { Observable } from 'rxjs';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AuthGuard implements CanActivate {
+
+  constructor(private router:Router) { }
+
+  canActivate(
+    next: ActivatedRouteSnapshot,
+    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
+      if (localStorage.getItem('authdata')) {
+        // logged in
+        return true;
+      }
+
+      // not logged in
+      this.router.navigate(['/login'], { queryParams: {returnUrl: state.url}});
+      return false;
+  }
+}
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/authentication.service.ts b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/authentication.service.ts
new file mode 100644 (file)
index 0000000..d7610ee
--- /dev/null
@@ -0,0 +1,50 @@
+/**
+ ============LICENSE_START=======================================================
+ Copyright (C) 2019 Samsung. 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.
+
+ SPDX-License-Identifier: Apache-2.0
+ ============LICENSE_END=========================================================
+
+ @authors: k.kazak@samsung.com
+ **/
+
+import {Injectable} from '@angular/core';
+import {HttpClient} from "@angular/common/http";
+import {environment} from "../environments/environment";
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AuthenticationService {
+
+  constructor(private http: HttpClient) {
+  }
+
+  login(username: string, password: string) {
+    // remove old data from storage
+    localStorage.removeItem('authdata');
+    // add to local storage
+    var authdata = window.btoa(username + ':' + password);
+    localStorage.setItem('authdata', authdata);
+
+    // make request
+    return this.http.get(environment.authBackendURL);
+  }
+
+  logout() {
+    // remove from local storage
+    localStorage.removeItem('authdata');
+  }
+}
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/basic-auth.interceptor.ts b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/basic-auth.interceptor.ts
new file mode 100644 (file)
index 0000000..4990d05
--- /dev/null
@@ -0,0 +1,43 @@
+/**
+ ============LICENSE_START=======================================================
+ Copyright (C) 2019 Samsung. 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.
+
+ SPDX-License-Identifier: Apache-2.0
+ ============LICENSE_END=========================================================
+
+ @authors: k.kazak@samsung.com
+ **/
+
+import { Injectable } from '@angular/core';
+import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+@Injectable()
+export class BasicAuthInterceptor implements HttpInterceptor {
+  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
+    //add authorization header with basic auth credentials if available
+    let auth = localStorage.getItem('authdata');
+    if (auth) {
+        const authReq = request.clone({
+          headers: request.headers.set('Authorization', 'Basic Z3VpOnBhc3N3b3JkMSQ=')
+        });
+
+        // send cloned request with header to the next handler.
+        return next.handle(authReq);
+   }
+
+    return next.handle(request);
+  }
+}
index b391672..8dfae3d 100644 (file)
@@ -21,7 +21,7 @@ SPDX-License-Identifier: Apache-2.0
 */
 
 import { Injectable } from '@angular/core';
-import { HttpClient, HttpErrorResponse } from '@angular/common/http';
+import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
 import { BpmnInfraRequest } from './model/bpmnInfraRequest.model';
 import { catchError } from 'rxjs/operators';
 import { Observable } from 'rxjs';
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/error.interceptor.ts b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/error.interceptor.ts
new file mode 100644 (file)
index 0000000..afe792c
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ ============LICENSE_START=======================================================
+ Copyright (C) 2019 Samsung. 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.
+
+ SPDX-License-Identifier: Apache-2.0
+ ============LICENSE_END=========================================================
+
+ @authors: k.kazak@samsung.com
+ **/
+
+import { Injectable } from '@angular/core';
+import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
+import { Observable, throwError } from 'rxjs';
+import { catchError } from 'rxjs/operators';
+import {AuthenticationService} from "./authentication.service";
+
+@Injectable()
+export class ErrorInterceptor implements HttpInterceptor {
+  constructor(private authenticationService: AuthenticationService) {}
+
+  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
+    return next.handle(request).pipe(catchError(err => {
+      if (err.status === 401) {
+        // auto logout if 401 response returned from api
+        this.authenticationService.logout();
+        location.reload(true);
+      }
+
+      const error = err.error.message || err.statusText;
+      return throwError(error);
+    }))
+  }
+}
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.html b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.html
new file mode 100644 (file)
index 0000000..107e1da
--- /dev/null
@@ -0,0 +1,43 @@
+<!--
+============LICENSE_START=======================================================
+Copyright (C) 2019 Samsung. 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.
+
+SPDX-License-Identifier: Apache-2.0
+============LICENSE_END=========================================================
+
+@authors: k.kazak@samsung.com
+-->
+<h2>Login</h2>
+<form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
+  <div class="form-group">
+    <label for="username">Username</label>
+    <input type="text" formControlName="username" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.username.errors }" />
+    <div *ngIf="submitted && f.username.errors" class="invalid-feedback">
+      <div *ngIf="f.username.errors.required">Username is required</div>
+    </div>
+  </div>
+  <div class="form-group">
+    <label for="password">Password</label>
+    <input type="password" formControlName="password" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.password.errors }" />
+    <div *ngIf="submitted && f.password.errors" class="invalid-feedback">
+      <div *ngIf="f.password.errors.required">Password is required</div>
+    </div>
+  </div>
+  <div class="form-group">
+    <button [disabled]="loading" class="btn btn-primary">Login</button>
+    <img *ngIf="loading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
+  </div>
+  <div *ngIf="error" class="alert alert-danger">{{error}}</div>
+</form>
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.spec.ts b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.spec.ts
new file mode 100644 (file)
index 0000000..8cf379d
--- /dev/null
@@ -0,0 +1,108 @@
+/**
+ ============LICENSE_START=======================================================
+ Copyright (C) 2019 Samsung. 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.
+
+ SPDX-License-Identifier: Apache-2.0
+ ============LICENSE_END=========================================================
+
+ @authors: k.kazak@samsung.com
+ **/
+
+import {async, ComponentFixture, inject, TestBed} from '@angular/core/testing';
+
+import {LoginComponent} from './login.component';
+import {AuthenticationService} from "../authentication.service";
+import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core";
+import {FormsModule, ReactiveFormsModule} from '@angular/forms';
+import {RouterTestingModule} from "@angular/router/testing";
+import {ActivatedRoute, Router, RouterModule} from "@angular/router";
+
+describe('LoginComponent', () => {
+  // Create SPY Object for Jasmine tests to mock DataService
+  let spyDataService: jasmine.SpyObj<AuthenticationService>;
+  let component: LoginComponent;
+  let fixture: ComponentFixture<LoginComponent>;
+  let router: Router;
+
+  beforeEach(async(() => {
+    spyDataService = jasmine.createSpyObj('AuthenticationService', ['login', 'logout']);
+
+    TestBed.configureTestingModule({
+      providers: [LoginComponent,
+        {provide: AuthenticationService, useValue: spyDataService},
+        {provide: ActivatedRoute, useValue: { snapshot: {queryParams: { returnUrl: 'test'}}}}
+      ],
+      imports: [RouterTestingModule, ReactiveFormsModule, FormsModule, RouterModule.forRoot([])],
+      declarations: [LoginComponent],
+      schemas: [
+        CUSTOM_ELEMENTS_SCHEMA
+      ]
+    });
+
+    fixture = TestBed.createComponent(LoginComponent);
+    component = fixture.componentInstance;
+    router = TestBed.get(Router);
+  }));
+
+
+  it('should create', inject([LoginComponent],
+    (component: LoginComponent) => {
+      expect(component).toBeTruthy();
+    }));
+
+  it('should logout and route to test directory', inject([LoginComponent],
+    (component: LoginComponent) => {
+      component.ngOnInit();
+      expect(component.returnUrl).toBe('test');
+    }));
+
+  it('should logout and route to root directory', inject([LoginComponent],
+    (component: LoginComponent) => {
+      router.initialNavigation();
+      component.ngOnInit();
+      expect(component.returnUrl).toBe('test');
+    }));
+
+  it('should submit without success', inject([LoginComponent],
+    (component: LoginComponent) => {
+      component.ngOnInit();
+      expect(component.loginForm.valid).toBe(false);
+      component.onSubmit();
+      expect(component.submitted).toBe(true);
+    }));
+
+  it('should submit without success', inject([LoginComponent],
+    (component: LoginComponent) => {
+      component.ngOnInit();
+      expect(component.loginForm.valid).toBe(false);
+      spyDataService.login.and.returnValue(Promise.resolve());
+
+      let compiled = fixture.debugElement.nativeElement;
+      let username = compiled.querySelector('input[type="text"]');
+      let password = compiled.querySelector('input[type="password"]');
+
+      fixture.detectChanges();
+
+      // Change value
+      username.value = 'test';
+      password.value = 'password';
+
+      // dispatch input event
+      dispatchEvent(new Event('input'));
+
+      component.onSubmit();
+      expect(component.submitted).toBe(true);
+    }));
+});
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.ts b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/login/login.component.ts
new file mode 100644 (file)
index 0000000..4a3f4e6
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ ============LICENSE_START=======================================================
+ Copyright (C) 2019 Samsung. 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.
+
+ SPDX-License-Identifier: Apache-2.0
+ ============LICENSE_END=========================================================
+
+ @authors: k.kazak@samsung.com
+ **/
+
+import { Component, OnInit } from '@angular/core';
+import {FormBuilder, FormGroup, Validators, ReactiveFormsModule} from "@angular/forms";
+import {ActivatedRoute, Router} from "@angular/router";
+import {AuthenticationService} from "../authentication.service";
+import {first} from "rxjs/internal/operators";
+
+@Component({
+  selector: 'app-login',
+  templateUrl: './login.component.html',
+  styleUrls: []
+})
+export class LoginComponent implements OnInit {
+
+  loginForm: FormGroup;
+  loading = false;
+  submitted = false;
+  returnUrl: string;
+  error = '';
+
+  constructor(private formBuilder: FormBuilder,
+              private route: ActivatedRoute,
+              private router: Router,
+              private authenticationService: AuthenticationService) { }
+
+  ngOnInit() {
+    this.loginForm = this.formBuilder.group({
+      username: ['', Validators.required],
+      password: ['', Validators.required]
+    });
+
+    // logout
+    this.authenticationService.logout();
+
+    this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
+  }
+
+  // convenience getter for easy access to form fields
+  get f() { return this.loginForm.controls; }
+
+  onSubmit() {
+    this.submitted = true;
+
+    // stop here if form is invalid
+    if (this.loginForm.invalid) {
+      return;
+    }
+
+    this.loading = true;
+    this.authenticationService.login(this.f.username.value, this.f.password.value)
+    .subscribe(
+       next => {
+           this.router.navigate([this.returnUrl]);
+         },
+         error => {
+           this.error = error;
+           this.loading = false;
+         });
+  }
+}
index e8b54d7..1c62351 100644 (file)
@@ -1,29 +1,34 @@
-<!--\r
-============LICENSE_START=======================================================\r
- Copyright (C) 2018 Ericsson. All rights reserved.\r
-================================================================================\r
-Licensed under the Apache License, Version 2.0 (the "License");\r
-you may not use this file except in compliance with the License.\r
-You may obtain a copy of the License at\r
-\r
-    http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-Unless required by applicable law or agreed to in writing, software\r
-distributed under the License is distributed on an "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-See the License for the specific language governing permissions and\r
- limitations under the License.\r
-\r
-SPDX-License-Identifier: Apache-2.0\r
-============LICENSE_END=========================================================\r
-\r
-@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com\r
--->\r
-\r
-<nav>\r
-  <ul>\r
-    <li>\r
-      <a routerLink="/">Home</a>\r
-    </li>\r
-  </ul>\r
-</nav>\r
+<!--
+============LICENSE_START=======================================================
+ Copyright (C) 2018 Ericsson. All rights reserved.
+================================================================================
+ Modifications Copyright (c) 2019 Samsung
+================================================================================
+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=========================================================
+
+@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com
+-->
+
+<nav>
+  <ul>
+    <li>
+      <a routerLink="/">Home</a>
+    </li>
+    <li>
+      <a routerLink="/login">Logout</a>
+    </li>
+  </ul>
+</nav>
index f0c63fe..484a156 100644 (file)
@@ -1,6 +1,8 @@
 /**
 ============LICENSE_START=======================================================
  Copyright (C) 2018 Ericsson. All rights reserved.
+================================================================================
+ Modifications Copyright (c) 2019 Samsung
 ================================================================================
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -24,5 +26,6 @@ SPDX-License-Identifier: Apache-2.0
 export const environment = {
   production: false,
 
-  soMonitoringBackendURL: 'http://so-monitoring:30224/so/monitoring/'
+  soMonitoringBackendURL: 'http://so-monitoring:30224/so/monitoring/',
+  authBackendURL: 'http://so-monitoring:30224/user'
 };
index c09c5f0..7beccb6 100644 (file)
         <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
     </plugins>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+        <excludes>
+          <exclude>**/*.p12</exclude>
+          <exclude>**/*.jks</exclude>
+        </excludes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <includes>
+          <include>**/*.p12</include>
+          <include>**/*.jks</include>
+        </includes>
+      </resource>
+    </resources>
   </build>
 </project>
index 91b7975..32c05eb 100644 (file)
@@ -4,6 +4,7 @@ import java.net.InetAddress;
 import java.util.Arrays;
 import org.onap.svnfm.simulator.constants.Constant;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.cache.Cache;
@@ -19,6 +20,9 @@ public class ApplicationConfig implements ApplicationRunner {
 
     private static final String PORT = "local.server.port";
 
+    @Value("${server.dns.name:so-vnfm-simulator.onap}")
+    private String serverDnsName;
+
     @Autowired
     private Environment environment;
 
@@ -26,7 +30,7 @@ public class ApplicationConfig implements ApplicationRunner {
 
     @Override
     public void run(final ApplicationArguments args) throws Exception {
-        baseUrl = "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + environment.getProperty(PORT);
+        baseUrl = "https://" + serverDnsName + ":" + environment.getProperty(PORT);
     }
 
     public String getBaseUrl() {
@@ -35,8 +39,8 @@ public class ApplicationConfig implements ApplicationRunner {
 
     @Bean
     public CacheManager cacheManager() {
-        Cache inlineResponse201 = new ConcurrentMapCache(Constant.IN_LINE_RESPONSE_201_CACHE);
-        SimpleCacheManager manager = new SimpleCacheManager();
+        final Cache inlineResponse201 = new ConcurrentMapCache(Constant.IN_LINE_RESPONSE_201_CACHE);
+        final SimpleCacheManager manager = new SimpleCacheManager();
         manager.setCaches(Arrays.asList(inlineResponse201));
         return manager;
     }
index 9c3a02d..d3ff66a 100644 (file)
@@ -168,6 +168,6 @@ public class SvnfmController {
 
         final HttpHeaders headers = new HttpHeaders();
         headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
-        return new ResponseEntity<>(response, headers, HttpStatus.OK);
+        return new ResponseEntity<>(response, headers, HttpStatus.CREATED);
     }
 }
index 60b251c..8f1e299 100644 (file)
@@ -43,9 +43,13 @@ import org.springframework.stereotype.Component;
 @Component
 public class VnfmHelper {
 
-    @Autowired
     private ApplicationConfig applicationConfig;
 
+    @Autowired
+    public VnfmHelper(ApplicationConfig applicationConfig) {
+        this.applicationConfig = applicationConfig;
+    }
+
     /**
      *
      * @param createVNFRequest
index 2ef302c..ea8105d 100644 (file)
@@ -34,6 +34,11 @@ server:
   port: 9093
   tomcat:
     max-threads: 50
+  ssl:
+    key-alias: so@so.onap.org
+    key--store-password: '7Em3&j4.19xYiMelhD5?xbQ.'
+    key-store: classpath:so-vnfm-simulator.p12
+    key-store-type: PKCS12
 
 vnfds:
   vnfdlist:
@@ -56,4 +61,4 @@ vnfds:
      - vnfcid: VNFC4
        resourceTemplateId: vnfd2_vnfc4
        vduId: vnfd2_vduForVnfc4
-       type: COMPUTE
\ No newline at end of file
+       type: COMPUTE
diff --git a/vnfm-simulator/vnfm-service/src/main/resources/so-vnfm-simulator.p12 b/vnfm-simulator/vnfm-service/src/main/resources/so-vnfm-simulator.p12
new file mode 100644 (file)
index 0000000..7ac0285
Binary files /dev/null and b/vnfm-simulator/vnfm-service/src/main/resources/so-vnfm-simulator.p12 differ
diff --git a/vnfm-simulator/vnfm-service/src/test/java/org/onap/svnfm/simulator/services/VnfmHelperTest.java b/vnfm-simulator/vnfm-service/src/test/java/org/onap/svnfm/simulator/services/VnfmHelperTest.java
new file mode 100644 (file)
index 0000000..2b9598e
--- /dev/null
@@ -0,0 +1,104 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Nokia.
+ * ================================================================================
+ * 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.svnfm.simulator.services;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.CreateVnfRequest;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201.InstantiationStateEnum;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201LinksSelf;
+import org.onap.svnfm.simulator.config.ApplicationConfig;
+import org.onap.svnfm.simulator.constants.Constant;
+import org.onap.svnfm.simulator.model.VnfInstance;
+
+public class VnfmHelperTest {
+
+    private static final String VNF_INSTANCE_ID = "vnfInstanceTestId";
+    private static final String VNFD_ID = "vnfdTestId";
+    private static final String VNF_INSTANCE_NAME = "vnfInsNameTest";
+    private static final String VNF_INSTANCE_DESCRIPTION = "vnfInstTestDescr";
+    private static final String APPLICATION_CONFIG_BASE_URL = "appConfUrl";
+    private VnfmHelper testedObject;
+    private ApplicationConfig applicationConfigMock;
+
+    @Before
+    public void setup() {
+        applicationConfigMock = mock(ApplicationConfig.class);
+        testedObject = new VnfmHelper(applicationConfigMock);
+    }
+
+    @Test
+    public void createVnfInstance() {
+        // when
+        VnfInstance result = testedObject.createVnfInstance(createVnfRequest(), VNF_INSTANCE_ID);
+        // then
+        assertThat(result.getId()).isEqualTo(VNF_INSTANCE_ID);
+        assertThat(result.getVnfdId()).isEqualTo(VNFD_ID);
+        assertThat(result.getVnfInstanceName()).isEqualTo(VNF_INSTANCE_NAME);
+        assertThat(result.getVnfInstanceDescription()).isEqualTo(VNF_INSTANCE_DESCRIPTION);
+        assertThat(result.getVnfProvider()).isEqualTo(Constant.VNF_PROVIDER);
+        assertThat(result.getVnfProductName()).isEqualTo(Constant.VNF_PROVIDER_NAME);
+    }
+
+    @Test
+    public void getInlineResponse201() throws Exception {
+        // given
+        when(applicationConfigMock.getBaseUrl()).thenReturn(APPLICATION_CONFIG_BASE_URL);
+        // when
+        InlineResponse201 result = testedObject.getInlineResponse201(prepareVnfInstance());
+        // then
+        assertThat(result.getVnfdVersion()).isEqualTo(Constant.VNFD_VERSION);
+        assertThat(result.getVnfSoftwareVersion()).isEqualTo(Constant.VNF_SOFTWARE_VERSION);
+        assertThat(result.getInstantiationState()).isEqualByComparingTo(InstantiationStateEnum.NOT_INSTANTIATED);
+        verifyAdditionalPropertyInlineResponse201(result);
+    }
+
+    private CreateVnfRequest createVnfRequest() {
+        CreateVnfRequest createVnfRequest = new CreateVnfRequest();
+        createVnfRequest.setVnfdId(VNFD_ID);
+        createVnfRequest.setVnfInstanceName(VNF_INSTANCE_NAME);
+        createVnfRequest.setVnfInstanceDescription(VNF_INSTANCE_DESCRIPTION);
+        return createVnfRequest;
+    }
+
+    private VnfInstance prepareVnfInstance() {
+        VnfInstance vnfInstance = new VnfInstance();
+        vnfInstance.setId(VNF_INSTANCE_ID);
+        return vnfInstance;
+    }
+
+    private void verifyAdditionalPropertyInlineResponse201(InlineResponse201 result) {
+        InlineResponse201LinksSelf expectedVnfInstancesLinksSelf = new InlineResponse201LinksSelf();
+        expectedVnfInstancesLinksSelf
+                .setHref(APPLICATION_CONFIG_BASE_URL + "/vnflcm/v1/vnf_instances/" + VNF_INSTANCE_ID);
+        assertThat(result.getLinks().getSelf()).isEqualTo(expectedVnfInstancesLinksSelf);
+
+        InlineResponse201LinksSelf expectedVnfInstancesLinksSelfInstantiate = new InlineResponse201LinksSelf();
+        expectedVnfInstancesLinksSelfInstantiate.setHref(
+                (APPLICATION_CONFIG_BASE_URL + "/vnflcm/v1/vnf_instances/" + VNF_INSTANCE_ID + "/instantiate"));
+        assertThat(result.getLinks().getInstantiate()).isEqualTo(expectedVnfInstancesLinksSelfInstantiate);
+    }
+
+}