Merge "Remove Swagger UI"
authorSeshu Kumar M <seshu.kumar.m@huawei.com>
Sun, 6 Jan 2019 15:34:41 +0000 (15:34 +0000)
committerGerrit Code Review <gerrit@onap.org>
Sun, 6 Jan 2019 15:34:41 +0000 (15:34 +0000)
283 files changed:
INFO.yaml
adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/utils/MsoCloudifyUtils.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/config/beans/PoConfig.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoMulticloudUtils.java
adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoTenantUtilsFactoryTest.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/test/resources/application-test.yaml
adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/CatalogDbAdapterRest.java
adapters/mso-catalog-db-adapter/src/main/resources/application.yaml
adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql [new file with mode: 0644]
adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V4.14.2__AddCloudOwnerColumnToNorthBoundRequest.sql [new file with mode: 0644]
adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
adapters/mso-catalog-db-adapter/src/test/resources/db/migration/afterMigrate.sql
adapters/mso-openstack-adapters/src/main/java/db/migration/R__CloudConfigMigration.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
adapters/mso-openstack-adapters/src/main/resources/application.yaml
adapters/mso-openstack-adapters/src/test/resources/application-nomigrate.yaml
adapters/mso-openstack-adapters/src/test/resources/application-test.yaml
adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/MsoRequestsDbAdapterImpl.java
adapters/mso-requests-db-adapter/src/main/resources/application.yaml
adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/sdncrest/BPRestCallback.java
adapters/mso-vfc-adapter/src/main/java/org/onap/so/adapters/vfc/util/RestfulUtil.java
asdc-controller/src/main/java/org/onap/so/asdc/Application.java
asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
asdc-controller/src/main/java/org/onap/so/asdc/installer/ToscaResourceStructure.java
asdc-controller/src/main/java/org/onap/so/asdc/installer/bpmn/BpmnInstaller.java
asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
bpmn/MSOCommonBPMN/pom.xml
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/AaiUtil.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CatalogDbUtils.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CatalogDbUtilsFactory.groovy [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ConfirmVolumeGroupName.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ConfirmVolumeGroupNameFactory.groovy [moved from bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/AaiPropertiesConfiguration.java with 65% similarity]
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/DecomposeService.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ExceptionUtil.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ExternalAPIUtil.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ExternalAPIUtilFactory.groovy [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/GenerateVfModuleName.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/MsoUtils.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/NetworkUtils.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/OofHoming.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/OofUtils.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/PrepareUpdateAAIVfModule.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapter.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV1.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SniroHomingV1.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIVfModule.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VfModuleBase.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VnfAdapterRestV1.groovy
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/ResourceRequestBuilder.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/L3Network.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/entities/ResourceKey.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/modelinfo/ModelInfoInstanceGroup.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/CloudInfoFromAAI.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java
bpmn/MSOCommonBPMN/src/main/resources/subprocess/ConfirmVolumeGroupName.bpmn
bpmn/MSOCommonBPMN/src/main/resources/subprocess/FalloutHandler.bpmn
bpmn/MSOCommonBPMN/src/main/resources/subprocess/SDNCAdapterV1.bpmn
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/CatalogDbUtilsTest.groovy [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/ConfirmVolumeGroupNameTest.groovy
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/ExternalAPIUtilTest.groovy [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterTest.groovy
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIVfModuleTest.groovy
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/VnfAdapterRestV1Test.groovy
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/BuildingBlockTestDataSetup.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/SDNCAdapterAsyncTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/SDNCAdapterMockTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/SDNCAdapterNetworkTopologyMockTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/VnfAdapterAsyncTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/VnfAdapterCreateMockTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/VnfAdapterDeleteMockTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/VnfAdapterQueryMockTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/VnfAdapterRollbackMockTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/mock/VnfAdapterUpdateMockTransformer.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/CloudInfoFromAAITest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildlingBlockRainyDayTest.java
bpmn/MSOCommonBPMN/src/test/resources/__files/vnfAdapterMocks/vnfAdapterCallback.xml [new file with mode: 0644]
bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/UrnPropertiesReader.java
bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/CompareModelsResult.java
bpmn/mso-infrastructure-bpmn/pom.xml
bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/common/WorkflowTest.java
bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateAndActivatePnfResourceTest.java
bpmn/pom.xml
bpmn/so-bpmn-building-blocks/pom.xml
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateNetworkBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateServiceInstanceBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateVnfBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignNetworkBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignServiceInstanceBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignVnfBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ChangeModelServiceInstanceBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ChangeModelVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ChangeModelVnfBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeactivateNetworkBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeactivateServiceInstanceBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeactivateVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeactivateVnfBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVolumeGroupBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/SDNCHandler.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignNetworkBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignServiceInstanceBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignVnfBB.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/BaseBPMNTest.java
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/ActivateNetworkBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ActivateVfModuleBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ActivateVnfBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/AssignNetworkBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/AssignServiceInstanceBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/AssignVfModuleBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/AssignVnfBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ChangeModelServiceInstanceBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ChangeModelVfModuleBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ChangeModelVnfBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeactivateNetworkBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeactivateServiceInstanceBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeactivateVfModuleBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeactivateVnfBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeleteVfModuleBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeleteVolumeGroupBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignNetworkBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignServiceInstanceBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignVfModuleBBTest.java
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignVnfBBTest.java
bpmn/so-bpmn-infrastructure-common/pom.xml
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/Create3rdONAPE2EServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateVFCNSResource.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateVnfInfra.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/Delete3rdONAPE2EServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DeleteCustomE2EServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCompareModelVersions.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateE2EServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateNetworkInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateNetworkInstanceRollback.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateResources.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVFCNetworkServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVfModule.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVfModuleVolumeV2.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVnfAndModules.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteE2EServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteNetworkInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteResourcesV1.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVFCNetworkServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoScaleVFCNetworkServiceInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateNetworkInstance.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVfModule.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreatePnfEntryInAaiDelegate.java [moved from bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateAaiEntryWithPnfIdDelegate.java with 79% similarity]
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/ExecutionVariableNames.java
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/GeneratePnfUuidDelegate.java [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/PnfCheckInputs.java
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/dmaap/PnfEventReadyDmaapClient.java
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactory.java
bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResourceTest.groovy [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateNetworkInstanceTest.groovy
bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVfModuleVolumeV2Test.groovy
bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreatePnfEntryInAaiDelegateTest.java [moved from bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateAaiEntryWithPnfIdDelegateTest.java with 71% similarity]
bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/GeneratePnfUuidDelegateTest.java [moved from bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/restproperties/RestPropertiesPojoTest.java with 50% similarity]
bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/PnfCheckInputsTest.java
bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateAndActivatePnfResource.bpmn
bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateVcpeResCustService_simplified.bpmn
bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoCreateNetworkInstance.bpmn
bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoDeleteE2EServiceInstance.bpmn
bpmn/so-bpmn-infrastructure-flows/src/test/resources/application-test.yaml
bpmn/so-bpmn-infrastructure-flows/src/test/resources/application-test.yml
bpmn/so-bpmn-tasks/pom.xml
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/AAIUpdateTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignVnf.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasks.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceDeleteTasks.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCActivateTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCAssignTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCChangeAssignTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeactivateTasks.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 [new file with mode: 0644]
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/bpmn/infrastructure/workflow/tasks/WorkflowActionExtractResourcesAAI.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingClient.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingClientResponseValidator.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingRequestObjectBuilder.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIConfigurationResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVnfResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NamingServiceResources.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCNetworkResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCServiceInstanceResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVfModuleResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVnfResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SdnCommonTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java
bpmn/so-bpmn-tasks/src/main/resources/naming-service/swagger.json [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/BaseTaskTest.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/aai/tasks/AAIUpdateTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignVnfTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasksTest.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceDeleteTasksTest.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCActivateTaskTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCAssignTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCChangeAssignTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeactivateTaskTest.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 [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasksTest.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/bpmn/infrastructure/workflow/tasks/WorkflowActionUnitTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapperTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/namingservice/NamingClientResponseValidatorTest.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/namingservice/NamingRequestObjectBuilderTest.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAINetworkResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVnfResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/NamingServiceResourcesTest.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/SDNCNetworkResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/SDNCServiceInstanceResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/SDNCVfModuleResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/SDNCVnfResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/sdn/common/SdnCommonTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/sdnc/SDNCClientIT.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapperTest.java
bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/CreateNetworkCollection.json
bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json
bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssign.json
bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignNoCloud.json [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/VnfMacroReplace.json [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/resources/application-test.yaml
common/pom.xml
common/src/main/java/org/onap/so/client/HttpClient.java
common/src/main/java/org/onap/so/client/HttpClientFactory.java [moved from common/src/main/java/org/onap/so/client/grm/GRMDefaultPropertiesImpl.java with 57% similarity]
common/src/main/java/org/onap/so/client/RestClientSSL.java
common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
common/src/main/java/org/onap/so/client/grm/GRMClient.java
common/src/main/java/org/onap/so/client/grm/GRMProperties.java
common/src/main/java/org/onap/so/client/grm/GRMRestClient.java
common/src/main/java/org/onap/so/client/grm/GRMRestInvoker.java
common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapConsumer.java
common/src/main/java/org/onap/so/serviceinstancebeans/InstanceReferences.java
common/src/main/java/org/onap/so/serviceinstancebeans/RequestStatus.java
common/src/test/java/org/onap/so/client/HttpClientTest.java
common/src/test/java/org/onap/so/client/RestClientTest.java
common/src/test/java/org/onap/so/client/dmaap/DmaapPublisherTest.java
docs/api/offered_consumed_apis.rst
docs/api/swagger/SO_MONITORING_SWAGGER.html [new file with mode: 0644]
docs/architecture/architecture.rst
docs/developer_info/developer_information.rst
docs/images/SO_Architecture_Internal.png [new file with mode: 0644]
docs/release-notes.rst
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/ServiceInstances.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/GrmClientPropertiesImpl.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/SDCClientHelper.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/RelatedInstancesValidation.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/client/grm/GRMClientTest.java [moved from common/src/test/java/org/onap/so/client/grm/GRMClientTest.java with 88% similarity]
mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/OrchestrationFilterResponse.json
mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/OrchestrationList.json
mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getOrchestrationRequest.json
mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getOrchestrationRequestInstanceGroup.json [new file with mode: 0644]
mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/grm/endpoints.json [new file with mode: 0644]
mso-api-handlers/mso-api-handler-infra/src/test/resources/application-test.yaml
mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/macro/NorthBoundRequest.java
mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java
mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/NorthBoundRequestRepository.java
pom.xml

index 78fb0f3..f6b8b4e 100644 (file)
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -2,6 +2,7 @@
 project: 'so'
 project_creation_date: '2017-01-30'
 lifecycle_state: 'Incubation'
+project_category: ''
 project_lead: &onap_releng_ptl
     name: 'Seshu Kumar'
     email: 'seshu.kumar.m@huawei.com'
@@ -13,78 +14,100 @@ issue_tracking:
     type: 'jira'
     url: 'https://jira.onap.org/projects/SO'
     key: 'SO'
+mailing_list:
+    type: 'groups.io'
+    url: 'lists.onap.org'
+    tag: '<[sub-project_name]>'
+realtime_discussion: ''
 meetings:
     - type: 'zoom'
-        agenda: 'https://wiki.onap.org/display/DW/Minutes+Of+Meeting'
-        url: 'https://wiki.onap.org/display/DW/Service+Orchestrator+Project'
-        server: 'n/a'
-        channel: 'n/a'
-        repeats: 'weekly'
-        time: '14:00 UTC'
+      agenda: 'https://wiki.onap.org/display/DW/Minutes+Of+Meeting'
+      url: 'https://wiki.onap.org/display/DW/Service+Orchestrator+Project'
+      server: 'n/a'
+      channel: 'n/a'
+      repeats: 'weekly'
+      time: '14:00 UTC'
+repositories:
+    - so
+    - so-chef-repo
+    - so-docker-config
+    - so-libs
+    - so-so-config
 committers:
     - <<: *onap_releng_ptl
     - name: 'Chuanyu Chen'
-        email: 'chenchuanyu@huawei.com'
-        company: 'Huawei'
-        id: 'boychuanyu'
-        timezone: 'Beijing/China'
+      email: 'chenchuanyu@huawei.com'
+      company: 'Huawei'
+      id: 'boychuanyu'
+      timezone: 'Asia/Shanghai'
     - name: 'Byung-Woo Jun'
-        email: 'byung-woo.jun@ericsson.com'
-        company: 'Ericsson'
-        id: 'byungwoojun'
-        timezone: ''
+      email: 'byung-woo.jun@ericsson.com'
+      company: 'Ericsson'
+      id: 'byungwoojun'
+      timezone: ''
     - name: 'DeWayne Filppi'
-        email: 'dewayne@cloudify.co'
-        company: 'Cloudify'
-        id: 'dfilppi'
-        timezone: ''
-    - name: 'Eric Debeau'
-        email: 'eric.debeau@orange.com'
-        company: 'Orange'
-        id: 'eric.debeau'
-        timezone: ''
-    - name: 'Ethan Lynn'
-        email: 'ethanlynnl@vmware.com'
-        company: 'VMware'
-        id: 'ethanlynnl'
-        timezone: 'France/Lannion'
+      email: 'dewayne@cloudify.co'
+      company: 'Cloudify'
+      id: 'dfilppi'
+      timezone: ''
     - name: 'Rob Daugherty'
-        email: 'rd472p@att.com'
-        company: 'ATT'
-        id: 'rd472p'
-        timezone: ''
-    - name: 'Chengli Wang'
-        email: 'wangchengli@chinamobile.com'
-        company: 'China Mobile'
-        id: 'wangchengli'
-        timezone: 'China/Beijing'
+      email: 'rd472p@att.com'
+      company: 'ATT'
+      id: 'rd472p'
+      timezone: ''
+    - name: 'Yan Yang'
+      email: 'yangyanyj@chinamobile.com'
+      company: 'China Mobile'
+      id: 'yangyan'
+      timezone: 'Asia/Shanghai'
     - name: 'Marcus Williams'
-        email: 'marcus.williams@intel.com'
-        company: 'Intel'
-        id: 'mgkwill'
-        timezone: 'America/Los Angeles'
+      email: 'marcus.williams@intel.com'
+      company: 'Intel'
+      id: 'mgkwill'
+      timezone: 'America/Los Angeles'
     - name: 'Sanchita Pathak'
-        email: 'sanchita@techmahindra.com'
-        company: 'Tech Mahindra'
-        id: 'sanchitap'
-        timezone: 'Asia/Kolkata'
+      email: 'sanchita@techmahindra.com'
+      company: 'Tech Mahindra'
+      id: 'sanchitap'
+      timezone: 'Asia/Kolkata'
+    - name: 'Steve Smokowski'
+      email: 'ss835w@att.com'
+      company: 'ATT'
+      id: 'stevesmokowski'
+      timezone: 'America/New_York'
+    - name: 'Subhash Kumar Singh'
+      email: 'Subhash.Kumar.Singh@huawei.com'
+      company: 'Huawei'
+      id: 'subhash_singh'
+      timezone: 'Asia/Kolkata'
+    - name: 'Lukasz Muszkieta'
+      email: 'lukasz.muszkieta@nokia.com'
+      company: 'Nokia'
+      id: 'lukaszM'
+      timezone: 'Europe/Warsaw'
 tsc:
     approval: 'https://lists.onap.org/pipermail/onap-tsc'
     changes:
         - type: 'removal'
-            name: 'Tal Liron'
-            name: 'Heliu Zhong'
-            name: 'Yuanwei Yang'
-            name: 'Christophe Closset'
-            name: 'Claude Noshpitz'
-            name: 'maopeng zhang'
-            name: 'Bin Hou'
-            name: 'Fu Jinhua'
-            name: 'Jie Feng'
-            name: 'jackie tian'
-            name: 'Deng Hui'
-            link: 'https://lists.onap.org/pipermail/onap-tsc/2018-May/004802.html'
+          name: 'Tal Liron'
+          name: 'Heliu Zhong'
+          name: 'Yuanwei Yang'
+          name: 'Christophe Closset'
+          name: 'Claude Noshpitz'
+          name: 'maopeng zhang'
+          name: 'Bin Hou'
+          name: 'Fu Jinhua'
+          name: 'Jie Feng'
+          name: 'jackie tian'
+          name: 'Deng Hui'
+          link: 'https://lists.onap.org/pipermail/onap-tsc/2018-May/004802.html'
         - type: 'addition'
-            name: 'Marcus Williams'
-            name: 'Sanchita Pathak'
-            link: 'https://lists.onap.org/pipermail/onap-tsc/2018-May/004802.html'
+          name: 'Marcus Williams'
+          name: 'Sanchita Pathak'
+          link: 'https://lists.onap.org/pipermail/onap-tsc/2018-May/004802.html'
+        - type: 'addition'
+          name: 'Steve Smokowski'
+          name: 'Subhash Kumar Singh'
+          name: 'Lukasz Muszkieta'
+          link: 'https://lists.onap.org/g/onap-tsc/message/4320'
+
index 14e5b80..4479a7f 100644 (file)
@@ -121,8 +121,8 @@ public class MsoCloudifyUtils extends MsoCommonUtils implements VduPlugin{
     private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA, MsoCloudifyUtils.class);
 
     // Properties names and variables (with default values)
-    protected String createPollIntervalProp = "ecomp.mso.adapters.po.pollInterval";
-    private String deletePollIntervalProp = "ecomp.mso.adapters.po.pollInterval";
+    protected String createPollIntervalProp = "org.onap.so.adapters.po.pollInterval";
+    private String deletePollIntervalProp = "org.onap.so.adapters.po.pollInterval";
 
     protected String createPollIntervalDefault = "15";
     private String deletePollIntervalDefault = "15";
index 3098a54..9995a23 100644 (file)
@@ -24,12 +24,14 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
-@ConfigurationProperties(prefix="adapters.po")
+@ConfigurationProperties(prefix="org.onap.so.adapters.po")
 public class PoConfig {
 
        private String retryCodes;
        private int retryDelay;
        private int retryCount;
+       private int pollTimeout;
+       private int pollInterval;
        
        public String getRetryCodes() {
                return retryCodes;
@@ -49,5 +51,17 @@ public class PoConfig {
        public void setRetryCount(int retryCount) {
                this.retryCount = retryCount;
        }
+       public int getPollTimeout() {
+               return pollTimeout;
+       }
+       public void setPollTimeout(int pollTimeout) {
+               this.pollTimeout = pollTimeout;
+       }
+       public int getPollInterval() {
+               return pollInterval;
+       }
+       public void setPollInterval(int pollInterval) {
+               this.pollInterval = pollInterval;
+       }
        
 }
index 1f9b6bd..f132f10 100644 (file)
@@ -127,9 +127,9 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin{
     private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA, MsoHeatUtils.class);
 
     // Properties names and variables (with default values)
-    protected String createPollIntervalProp = "onap.so.adapters.po.pollInterval";
-    private String deletePollIntervalProp = "onap.so.adapters.po.pollInterval";
-    private String deletePollTimeoutProp = "onap.so.adapters.po.pollTimeout";
+    protected String createPollIntervalProp = "org.onap.so.adapters.po.pollInterval";
+    private String deletePollIntervalProp = "org.onap.so.adapters.po.pollInterval";
+    private String deletePollTimeoutProp = "org.onap.so.adapters.po.pollTimeout";
 
     protected static final String createPollIntervalDefault = "15";
     private static final String deletePollIntervalDefault = "15";
index 829f6c1..c9b7061 100644 (file)
 package org.onap.so.openstack.utils;
 
 import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Scanner;
 
-import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriBuilderException;
 import javax.ws.rs.core.Response;
 
+import org.onap.so.client.HttpClientFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.onap.so.adapters.vdu.CloudInfo;
@@ -48,7 +49,6 @@ import org.onap.so.openstack.beans.StackInfo;
 import org.onap.so.openstack.exceptions.MsoCloudSiteNotFound;
 import org.onap.so.openstack.exceptions.MsoException;
 import org.onap.so.openstack.exceptions.MsoOpenstackException;
-import org.onap.so.client.HttpClient;
 import org.onap.so.client.RestClient;
 import org.onap.so.db.catalog.beans.CloudSite;
 import org.onap.so.logger.MessageEnum;
@@ -56,13 +56,8 @@ import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.woorea.openstack.heat.model.CreateStackParam;
 
@@ -80,11 +75,11 @@ public class MsoMulticloudUtils extends MsoHeatUtils implements VduPlugin{
     private static final Logger logger = LoggerFactory.getLogger(MsoMulticloudUtils.class);
 
     private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
+    private final HttpClientFactory httpClientFactory = new HttpClientFactory();
 
     @Autowired
     private Environment environment;
 
-
     /******************************************************************************
      *
      * Methods (and associated utilities) to implement the VduPlugin interface
@@ -603,8 +598,9 @@ public class MsoMulticloudUtils extends MsoHeatUtils implements VduPlugin{
     private RestClient getMulticloudClient(String endpoint) {
         RestClient client = null;
         try {
-            client = new HttpClient(UriBuilder.fromUri(endpoint).build().toURL(),
-                    MediaType.APPLICATION_JSON.toString(), TargetEntity.MULTICLOUD);
+            client = httpClientFactory.newJsonClient(
+                new URL(endpoint),
+                TargetEntity.MULTICLOUD);
         } catch (MalformedURLException e) {
             logger.debug(String.format("Encountered malformed URL error getting multicloud rest client %s", e.getMessage()));
         } catch (IllegalArgumentException e) {
diff --git a/adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoTenantUtilsFactoryTest.java b/adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoTenantUtilsFactoryTest.java
new file mode 100644 (file)
index 0000000..fa4c6bf
--- /dev/null
@@ -0,0 +1,38 @@
+package org.onap.so.openstack.utils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowableOfType;
+import static org.mockito.BDDMockito.given;
+
+import java.util.Optional;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.cloud.CloudConfig;
+import org.onap.so.openstack.exceptions.MsoCloudSiteNotFound;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MsoTenantUtilsFactoryTest {
+
+    @Mock
+    private CloudConfig cloudConfig;
+    @InjectMocks
+    private MsoTenantUtilsFactory msoTenantUtilsFactory;
+
+    @Test
+    public void getTenantUtils_shouldThrowException_whenNoCloudSiteFoundForGivenId() {
+        // GIVEN
+        String cloudSiteId = "CloudSiteId";
+        given(cloudConfig.getCloudSite(cloudSiteId)).willReturn(Optional.empty());
+
+        // WHEN
+        MsoCloudSiteNotFound msoCloudSiteNotFound = catchThrowableOfType(
+            () -> msoTenantUtilsFactory.getTenantUtils(cloudSiteId), MsoCloudSiteNotFound.class);
+
+        // THEN
+        assertThat(msoCloudSiteNotFound.getMessage()).contains(cloudSiteId);
+    }
+
+}
\ No newline at end of file
index 011bb14..368df84 100644 (file)
@@ -22,11 +22,14 @@ cloud_config:
       clli: "MTN6"
       aic_version: "3.0"
       identity_service_id: "ORDM3"
-adapters:
-  po:
-    retryCodes: "504"
-    retryDelay: "5"
-    retryCount: "3"
+org:
+  onap:
+    so:
+      adapters:
+        po:
+          retryCodes: "504"
+          retryDelay: "5"
+          retryCount: "3"
   tenant:
     tenant_description: "ECOMP Tenant"
     region_type: "single"
index 2fc1c3d..70f5313 100644 (file)
@@ -520,13 +520,20 @@ public class CatalogDbAdapterRest {
         try {
             if (smUuid != null && !"".equals(smUuid)) {
                 logger.debug("Query Csar by service model uuid: {}",smUuid);
-                ToscaCsar toscaCsar = toscaCsarRepo.findById(smUuid).orElseGet(() -> null);
-                if (toscaCsar != null) {
-                    QueryServiceCsar serviceCsar = new QueryServiceCsar(toscaCsar);
-                    entity = serviceCsar.JSON2(false, false);
+                Service service = serviceRepo.findFirstOneByModelUUIDOrderByModelVersionDesc(smUuid);
+
+                if (service != null) {
+                    ToscaCsar toscaCsar = service.getCsar();
+                    if (toscaCsar != null) {
+                        QueryServiceCsar serviceCsar = new QueryServiceCsar(toscaCsar);
+                        entity = serviceCsar.JSON2(false, false);
+                    } else {
+                        respStatus = HttpStatus.SC_NOT_FOUND;
+                    }
                 } else {
                     respStatus = HttpStatus.SC_NOT_FOUND;
                 }
+
             } else {
                 throw (new Exception("Incoming parameter is null or blank"));
             }
@@ -580,8 +587,9 @@ public class CatalogDbAdapterRest {
 
                 if (null == recipe) {
                     NetworkResource nResource = networkResourceRepo.findResourceByModelUUID(rmUuid);
-                    recipe = networkRecipeRepo.findFirstByModelNameAndActionAndVersionStr(nResource.getModelName(), action, vnf.getModelVersion());
-
+                    if(null!=vnf) {
+                       recipe = networkRecipeRepo.findFirstByModelNameAndActionAndVersionStr(nResource.getModelName(), action, vnf.getModelVersion());
+                    }
                     // for network fetch the default recipe
                     if (recipe == null) {
                         recipe = networkRecipeRepo.findFirstByModelNameAndAction("SDNC_DEFAULT", action);
index ff6f237..749a319 100644 (file)
@@ -14,7 +14,6 @@ mso:
     max-pool-size: 50
     queue-capacity: 500
     
-# CatalogDB
 spring:
   datasource:
     jdbc-url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/catalogdb
@@ -34,7 +33,7 @@ spring:
       fail-on-empty-beans: false
 flyway:
   baseline-on-migrate: false
-  jdbc-url:  jdbc:mariadb://${DB_HOST}:${DB_PORT}/catalogdb
+  url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/catalogdb
   user: ${DB_ADMIN_USERNAME}
   password: ${DB_ADMIN_PASSWORD}
   outOfOrder: true
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql
new file mode 100644 (file)
index 0000000..3fdc3c3
--- /dev/null
@@ -0,0 +1,775 @@
+use catalogdb;
+
+DELETE FROM northbound_request_ref_lookup;
+DELETE FROM orchestration_flow_reference;
+DELETE FROM rainy_day_handler_macro;
+DELETE FROM building_block_detail;
+DELETE FROM orchestration_status_state_transition_directive;
+
+
+INSERT INTO northbound_request_ref_lookup(MACRO_ACTION, ACTION, REQUEST_SCOPE, IS_ALACARTE,IS_TOPLEVELFLOW, MIN_API_VERSION, MAX_API_VERSION, CLOUD_OWNER) VALUES
+('Service-Create', 'createInstance', 'Service', true,true, '7','7', 'cloudOwner'),
+('Service-Delete', 'deleteInstance', 'Service', true,true, '7','7', 'cloudOwner'),
+('Service-Macro-Assign', 'assignInstance', 'Service', false,true, '7','7', 'cloudOwner'),
+('Service-Macro-Activate', 'activateInstance', 'Service', false,true, '7','7', 'cloudOwner'),
+('Service-Macro-Unassign', 'unassignInstance', 'Service', false,true, '7','7', 'cloudOwner'),
+('Service-Macro-Create', 'createInstance', 'Service', false,true, '7','7', 'cloudOwner'),
+('Service-Macro-Delete', 'deleteInstance', 'Service', false,true, '7','7', 'cloudOwner'),
+('Network-Create', 'createInstance', 'Network', true,true, '7','7', 'cloudOwner'),
+('Network-Delete', 'deleteInstance', 'Network', true,true, '7','7', 'cloudOwner'),
+('VNF-Macro-Recreate', 'recreateInstance', 'Vnf', false,true, '7','7', 'cloudOwner'),
+('VNF-Macro-Replace', 'replaceInstance', 'Vnf', false,true, '7','7', 'cloudOwner'),
+('VNF-Create', 'createInstance', 'Vnf', true,true, '7', '7', 'cloudOwner'),
+('VNF-Delete', 'deleteInstance', 'Vnf', true,true, '7', '7', 'cloudOwner'),
+('VolumeGroup-Create', 'createInstance', 'VolumeGroup', true,true, '7','7', 'cloudOwner'),
+('VolumeGroup-Delete', 'deleteInstance', 'VolumeGroup', true,true, '7','7', 'cloudOwner'),
+('VFModule-Create', 'createInstance', 'VfModule', true,true, '7','7', 'cloudOwner'),
+('VFModule-Delete', 'deleteInstance', 'VfModule', true,true, '7','7', 'cloudOwner'),
+('NetworkCollection-Macro-Create', 'createInstance', 'NetworkCollection', false,true, '7','7', 'cloudOwner'),
+('NetworkCollection-Macro-Delete', 'deleteInstance', 'NetworkCollection', false,true, '7','7', 'cloudOwner'),
+('VFModule-ScaleOut', 'createInstance', 'VfModule', true, true, '7','7', 'cloudOwner');
+
+
+INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FLOW_VERSION, NB_REQ_REF_LOOKUP_ID) VALUES
+('Service-Create', '1', 'AssignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Create', '2', 'ActivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Delete', '1', 'DeactivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Delete', '2', 'UnassignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Assign', '1', 'AssignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Assign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Assign', '2', 'AssignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Assign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Assign', '3', 'AssignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Assign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Assign', '4', 'AssignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Assign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Assign', '5', 'AssignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Assign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '1', 'CreateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '2', 'ActivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '3', 'CreateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '4', 'ActivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '5', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '6', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '7', 'ActivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Activate', '8', 'ActivateServiceInstance', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Activate' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Unassign', '1', 'UnassignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Unassign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Unassign', '2', 'UnassignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Unassign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Unassign', '3', 'UnassignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Unassign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Unassign', '4', 'UnassignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Unassign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Unassign', '5', 'UnassignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Unassign' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '1', 'AssignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '2', 'CreateNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '3', 'AssignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '4', 'AssignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '5', 'AssignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '6', 'AssignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '7', 'CreateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '8', 'ActivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '9', 'CreateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '10', 'ActivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '11', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '12', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '13', 'ActivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '14', 'ActivateNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Create', '15', 'ActivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '1', 'DeactivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '2', 'DeleteVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '3', 'DeactivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '4', 'DeleteVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '5', 'DeactivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '6', 'DeactivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '7', 'DeleteNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '8', 'DeactivateNetworkCollectionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '9', 'DeleteNetworkCollectionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '10', 'DeactivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '11', 'UnassignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '12', 'UnassignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '13', 'UnassignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '14', 'UnassignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Service-Macro-Delete', '15', 'UnassignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Network-Create', '1', 'AssignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Network-Create', '2', 'CreateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Network-Create', '3', 'ActivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Create' and CLOUD_OWNER = 'cloudOwner')),
+('Network-Delete', '1', 'DeactivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Network-Delete', '2', 'DeleteNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('Network-Delete', '3', 'UnassignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Create', '1', 'AssignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Create', '2', 'ActivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Delete', '1', 'DeactivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Delete', '2', 'UnassignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '1', 'AAICheckVnfInMaintBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '2', 'AAISetVnfInMaintBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '3', 'DeactivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '4', 'DeleteVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '5', 'DeactivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '6', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '7', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '8', 'ActivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '9', 'SDNOVnfHealthCheckBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Recreate', '10', 'AAIUnsetVnfInMaintBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Recreate' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '1', 'AAICheckVnfInMaintBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '2', 'AAISetVnfInMaintBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '5', 'DeactivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '6', 'DeleteVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '7', 'DeactivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '8', 'ChangeModelVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '9', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '10', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '13', 'ChangeModelVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '14', 'ActivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '15', 'ChangeModelServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '16', 'SDNOVnfHealthCheckBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VNF-Macro-Replace', '17', 'AAIUnsetVnfInMaintBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VNF-Macro-Replace' and CLOUD_OWNER = 'cloudOwner')),
+('VolumeGroup-Create', '1', 'AssignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VolumeGroup-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VolumeGroup-Create', '2', 'CreateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VolumeGroup-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VolumeGroup-Create', '3', 'ActivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VolumeGroup-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VolumeGroup-Delete', '1', 'DeactivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VolumeGroup-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VolumeGroup-Delete', '2', 'DeleteVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VolumeGroup-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VolumeGroup-Delete', '3', 'UnassignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VolumeGroup-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-Create', '1', 'AssignVfModuleBB',  1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-Create', '2', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-Create', '3', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Create' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-Delete', '3', 'DeactivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-Delete', '4', 'DeleteVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-Delete', '5', 'UnassignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Create', '1', 'CreateNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Create', '2', 'AssignNetworkBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Create', '3', 'CreateNetworkBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Create', '4', 'ActivateNetworkBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Create', '5', 'ActivateNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Create' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Delete', '1', 'DeactivateNetworkBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Delete', '2', 'DeleteNetworkBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Delete', '3', 'UnassignNetworkBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Delete', '4', 'DeactivateNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('NetworkCollection-Macro-Delete', '5', 'DeleteNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'NetworkCollection-Macro-Delete' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-ScaleOut', '1', 'GenericVnfHealthCheckBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-ScaleOut' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-ScaleOut', '2', 'AssignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-ScaleOut' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-ScaleOut', '3', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-ScaleOut' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-ScaleOut', '4', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-ScaleOut' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-ScaleOut', '5', 'ConfigurationScaleOutBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-ScaleOut' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-ScaleOut', '6', 'GenericVnfHealthCheckBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-ScaleOut' and CLOUD_OWNER = 'cloudOwner'));
+
+INSERT INTO rainy_day_handler_macro (FLOW_NAME, SERVICE_TYPE, VNF_TYPE, ERROR_CODE, WORK_STEP, POLICY)
+VALUES
+('ActivateNetworkBB', '*', '*', '*', '*' , 'Rollback'),
+('ActivateNetworkCollectionBB', '*', '*', '*', '*' , 'Rollback'),
+('ActivateServiceInstanceBB', '*', '*', '*', '*' , 'Rollback'),
+('ActivateVfModuleBB', '*', '*', '*', '*' , 'RollbackToAssigned'),
+('ActivateVnfBB', '*', '*', '*', '*' , 'Rollback'),
+('ActivateVolumeGroupBB', '*', '*', '*', '*' , 'Rollback'),
+('AssignNetworkBB', '*', '*', '*', '*' , 'Rollback'),
+('AssignServiceInstanceBB', '*', '*', '*', '*' , 'Rollback'),
+('AssignVfModuleBB', '*', '*', '*', '*' , 'Rollback'),
+('AssignVnfBB', '*', '*', '*', '*' , 'Rollback'),
+('AssignVolumeGroupBB', '*', '*', '*', '*' , 'Rollback'),
+('CreateNetworkBB', '*', '*', '*', '*' , 'Retry'),
+('CreateNetworkCollectionBB', '*', '*', '*', '*' , 'Retry'),
+('CreateVfModuleBB', '*', '*', '*', '*' , 'Retry'),
+('CreateVolumeGroupBB', '*', '*', '*', '*' , 'Retry'),
+('ChangeModelServiceInstanceBB', '*', '*', '*', '*' , 'Abort'),
+('ChangeModelVfModuleBB', '*', '*', '*', '*' , 'Abort'),
+('ChangeModelVnfBB', '*', '*', '*', '*' , 'Abort'),
+('CreateCustomerBB', '*', '*', '*', '*' , 'Abort'),
+('DeactivateNetworkBB', '*', '*', '*', '*' , 'Abort'),
+('DeactivateServiceInstanceBB', '*', '*', '*', '*' , 'Abort'),
+('DeactivateVfModuleBB', '*', '*', '*', '*' , 'Abort'),
+('DeactivateVnfBB', '*', '*', '*', '*' , 'Abort'),
+('DeactivateVolumeGroupBB', '*', '*', '*', '*' , 'Abort'),
+('DeleteNetworkBB', '*', '*', '*', '*' , 'Retry'),
+('DeleteNetworkCollectionBB', '*', '*', '*', '*' , 'Retry'),
+('DeleteVfModuleBB', '*', '*', '*', '*' , 'Retry'),
+('DeleteVolumeGroupBB', '*', '*', '*', '*' , 'Retry'),
+('UnassignNetworkBB', '*', '*', '*', '*' , 'Retry'),
+('UnassignServiceInstanceBB', '*', '*', '*', '*' , 'Retry'),
+('UnassignVfModuleBB', '*', '*', '*', '*' , 'Retry'),
+('UnassignVnfBB', '*', '*', '*', '*' , 'Retry'),
+('UnassignVolumeGroupBB', '*', '*', '*', '*' , 'Retry'),
+('UpdateNetworkBB', '*', '*', '*', '*' , 'Retry'),
+('VnfAdapterBB', '*', '*', '*', '*' , 'Retry'),
+('AAICheckVnfInMaintBB', '*', '*', '*', '*' , 'Abort'),
+('AAISetVnfInMaintBB', '*', '*', '*', '*' , 'Abort'),
+('AAIUnsetVnfInMaintBB', '*', '*', '*', '*' , 'Abort');
+
+
+
+INSERT INTO building_block_detail (building_block_name, resource_type, target_action)
+VALUES
+('AssignServiceInstanceBB', 'SERVICE', 'ASSIGN'),
+('AssignVnfBB', 'VNF', 'ASSIGN'),
+('AssignVolumeGroupBB', 'VOLUME_GROUP', 'ASSIGN'),
+('AssignVfModuleBB', 'VF_MODULE', 'ASSIGN'),
+('AssignNetworkBB', 'NETWORK', 'ASSIGN'),
+
+('UnassignServiceInstanceBB', 'SERVICE', 'UNASSIGN'),
+('UnassignVnfBB', 'VNF', 'UNASSIGN'),
+('UnassignVolumeGroup', 'VOLUME_GROUP', 'UNASSIGN'),
+('UnassignNetworkBB', 'NETWORK', 'UNASSIGN'),
+
+('ActivateServiceInstanceBB', 'SERVICE', 'ACTIVATE'),
+('ActivateVnfBB', 'VNF', 'ACTIVATE'),
+('ActivateVolumeGroupBB', 'VOLUME_GROUP', 'ACTIVATE'),
+('ActivateVfModuleBB', 'VF_MODULE', 'ACTIVATE'),
+('ActivateNetworkBB', 'NETWORK', 'ACTIVATE'),
+('ActivateNetworkCollectionBB', 'NETWORK', 'ACTIVATE'),
+
+('DeactivateServiceInstanceBB', 'SERVICE', 'DEACTIVATE'),
+('DeactivateVnfBB', 'VNF', 'DEACTIVATE'),
+('DeactivateVolumeGroupBB', 'VOLUME_GROUP', 'DEACTIVATE'),
+('DeactivateVfModuleBB', 'VF_MODULE', 'DEACTIVATE'),
+('DeactivateNetworkBB', 'NETWORK', 'DEACTIVATE'),
+
+
+('ChangeModelServiceInstanceBB', 'SERVICE', 'CHANGEMODEL'),
+('ChangeModelVnfBB', 'VNF', 'CHANGEMODEL'),
+('ChangeModelVfModuleBB', 'VF_MODULE', 'CHANGEMODEL'),
+
+
+('CreateVolumeGroupBB', 'VOLUME_GROUP', 'CREATE'),
+('CreateVfModuleBB', 'VF_MODULE', 'CREATE'),
+('CreateNetworkBB', 'NETWORK', 'CREATE'),
+('CreateNetworkCollectionBB', 'NETWORK', 'CREATE'),
+
+('DeleteVolumeGroupBB', 'VOLUME_GROUP', 'DELETE'),
+('DeleteVfModuleBB', 'VF_MODULE', 'DELETE'),
+('DeleteNetworkBB', 'NETWORK', 'DELETE'),
+('DeleteNetworkCollectionBB', 'NETWORK', 'DELETE'),
+
+('ConfigurationScaleOutBB', 'VF_MODULE', 'CREATE'),
+('GenericVnfHealthCheckBB', 'VF_MODULE', 'CREATE');
+
+INSERT INTO orchestration_status_state_transition_directive (resource_type, orchestration_status, target_action, flow_directive)
+VALUES
+
+('SERVICE', 'PRECREATED', 'ASSIGN', 'CONTINUE'),
+('VNF', 'PRECREATED', 'ASSIGN', 'CONTINUE'),
+('VOLUME_GROUP', 'PRECREATED', 'ASSIGN', 'CONTINUE'),
+('VF_MODULE', 'PRECREATED', 'ASSIGN', 'CONTINUE'),
+('NETWORK', 'PRECREATED', 'ASSIGN', 'CONTINUE'),
+
+('SERVICE', 'INVENTORIED', 'ASSIGN', 'CONTINUE'),
+('VNF', 'INVENTORIED', 'ASSIGN', 'CONTINUE'),
+('VOLUME_GROUP', 'INVENTORIED', 'ASSIGN', 'FAIL'),
+('VF_MODULE', 'INVENTORIED', 'ASSIGN', 'CONTINUE'),
+('NETWORK', 'INVENTORIED', 'ASSIGN', 'CONTINUE'),
+
+('SERVICE', 'ASSIGNED', 'ASSIGN', 'SILENT_SUCCESS'),
+('VNF', 'ASSIGNED', 'ASSIGN', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'ASSIGNED', 'ASSIGN', 'SILENT_SUCCESS'),
+('VF_MODULE', 'ASSIGNED', 'ASSIGN', 'SILENT_SUCCESS'),
+('NETWORK', 'ASSIGNED', 'ASSIGN', 'SILENT_SUCCESS'),
+
+('SERVICE', 'CREATED', 'ASSIGN', 'SILENT_SUCCESS'),
+('VNF', 'CREATED', 'ASSIGN', 'CONTINUE'),
+('VOLUME_GROUP', 'CREATED', 'ASSIGN', 'FAIL'),
+('VF_MODULE', 'CREATED', 'ASSIGN', 'SILENT_SUCCESS'),
+('NETWORK', 'CREATED', 'ASSIGN', 'SILENT_SUCCESS'),
+
+('SERVICE', 'ACTIVE', 'ASSIGN', 'SILENT_SUCCESS'),
+('VNF', 'ACTIVE', 'ASSIGN', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'ACTIVE', 'ASSIGN', 'SILENT_SUCCESS'),
+('VF_MODULE', 'ACTIVE', 'ASSIGN', 'SILENT_SUCCESS'),
+('NETWORK', 'ACTIVE', 'ASSIGN', 'SILENT_SUCCESS'),
+
+('SERVICE', 'PENDING_CREATE', 'ASSIGN', 'FAIL'),
+('VNF', 'PENDING_CREATE', 'ASSIGN', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_CREATE', 'ASSIGN', 'FAIL'),
+('VF_MODULE', 'PENDING_CREATE', 'ASSIGN', 'CONTINUE'),
+('NETWORK', 'PENDING_CREATE', 'ASSIGN', 'SILENT_SUCCESS'),
+
+('SERVICE', 'PENDING_DELETE', 'ASSIGN', 'SILENT_SUCCESS'),
+('VNF', 'PENDING_DELETE', 'ASSIGN', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'PENDING_DELETE', 'ASSIGN', 'FAIL'),
+('VF_MODULE', 'PENDING_DELETE', 'ASSIGN', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_DELETE', 'ASSIGN', 'SILENT_SUCCESS'),
+
+('SERVICE', 'PENDING_ACTIVATION', 'ASSIGN', 'FAIL'),
+('VNF', 'PENDING_ACTIVATION', 'ASSIGN', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_ACTIVATION', 'ASSIGN', 'FAIL'),
+('VF_MODULE', 'PENDING_ACTIVATION', 'ASSIGN', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_ACTIVATION', 'ASSIGN', 'FAIL'),
+
+('SERVICE', 'PENDING', 'ASSIGN', 'FAIL'),
+('VNF', 'PENDING', 'ASSIGN', 'FAIL'),
+('VOLUME_GROUP', 'PENDING', 'ASSIGN', 'SILENT_SUCCESS'),
+('VF_MODULE', 'PENDING', 'ASSIGN', 'FAIL'),
+('NETWORK', 'PENDING', 'ASSIGN', 'FAIL'),
+
+
+('SERVICE', 'PRECREATED', 'UNASSIGN', 'SILENT_SUCCESS'),
+('VNF', 'PRECREATED', 'UNASSIGN', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'PRECREATED', 'UNASSIGN', 'SILENT_SUCCESS'),
+('VF_MODULE', 'PRECREATED', 'UNASSIGN', 'SILENT_SUCCESS'),
+('NETWORK', 'PRECREATED', 'UNASSIGN', 'SILENT_SUCCESS'),
+
+('SERVICE', 'INVENTORIED', 'UNASSIGN', 'CONTINUE'),
+('VNF', 'INVENTORIED', 'UNASSIGN', 'CONTINUE'),
+('VOLUME_GROUP', 'INVENTORIED', 'UNASSIGN', 'FAIL'),
+('VF_MODULE', 'INVENTORIED', 'UNASSIGN', 'CONTINUE'),
+('NETWORK', 'INVENTORIED', 'UNASSIGN', 'CONTINUE'),
+
+('SERVICE', 'ASSIGNED', 'UNASSIGN', 'CONTINUE'),
+('VNF', 'ASSIGNED', 'UNASSIGN', 'CONTINUE'),
+('VOLUME_GROUP', 'ASSIGNED', 'UNASSIGN', 'CONTINUE'),
+('VF_MODULE', 'ASSIGNED', 'UNASSIGN', 'CONTINUE'),
+('NETWORK', 'ASSIGNED', 'UNASSIGN', 'CONTINUE'),
+
+('SERVICE', 'CREATED', 'UNASSIGN', 'CONTINUE'),
+('VNF', 'CREATED', 'UNASSIGN', 'CONTINUE'),
+('VOLUME_GROUP', 'CREATED', 'UNASSIGN', 'FAIL'),
+('VF_MODULE', 'CREATED', 'UNASSIGN', 'FAIL'),
+('NETWORK', 'CREATED', 'UNASSIGN', 'FAIL'),
+
+('SERVICE', 'ACTIVE', 'UNASSIGN', 'FAIL'),
+('VNF', 'ACTIVE', 'UNASSIGN', 'FAIL'),
+('VOLUME_GROUP', 'ACTIVE', 'UNASSIGN', 'FAIL'),
+('VF_MODULE', 'ACTIVE', 'UNASSIGN', 'FAIL'),
+('NETWORK', 'ACTIVE', 'UNASSIGN', 'FAIL'),
+
+('SERVICE', 'PENDING_CREATE', 'UNASSIGN', 'FAIL'),
+('VNF', 'PENDING_CREATE', 'UNASSIGN', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_CREATE', 'UNASSIGN', 'FAIL'),
+('VF_MODULE', 'PENDING_CREATE', 'UNASSIGN', 'CONTINUE'),
+('NETWORK', 'PENDING_CREATE', 'UNASSIGN', 'CONTINUE'),
+
+('SERVICE', 'PENDING_DELETE', 'UNASSIGN', 'CONTINUE'),
+('VNF', 'PENDING_DELETE', 'UNASSIGN', 'CONTINUE'),
+('VOLUME_GROUP', 'PENDING_DELETE', 'UNASSIGN', 'FAIL'),
+('VF_MODULE', 'PENDING_DELETE', 'UNASSIGN', 'CONTINUE'),
+('NETWORK', 'PENDING_DELETE', 'UNASSIGN', 'CONTINUE'),
+
+('SERVICE', 'PENDING_ACTIVATION', 'UNASSIGN', 'FAIL'),
+('VNF', 'PENDING_ACTIVATION', 'UNASSIGN', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_ACTIVATION', 'UNASSIGN', 'FAIL'),
+('VF_MODULE', 'PENDING_ACTIVATION', 'UNASSIGN', 'CONTINUE'),
+('NETWORK', 'PENDING_ACTIVATION', 'UNASSIGN', 'FAIL'),
+
+('SERVICE', 'PENDING', 'UNASSIGN', 'FAIL'),
+('VNF', 'PENDING', 'UNASSIGN', 'FAIL'),
+('VOLUME_GROUP', 'PENDING', 'UNASSIGN', 'CONTINUE'),
+('VF_MODULE', 'PENDING', 'UNASSIGN', 'FAIL'),
+('NETWORK', 'PENDING', 'UNASSIGN', 'FAIL'),
+
+
+('SERVICE', 'PRECREATED', 'ACTIVATE', 'FAIL'),
+('VNF', 'PRECREATED', 'ACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PRECREATED', 'ACTIVATE', 'FAIL'),
+('VF_MODULE', 'PRECREATED', 'ACTIVATE', 'FAIL'),
+('NETWORK', 'PRECREATED', 'ACTIVATE', 'FAIL'),
+
+('SERVICE', 'INVENTORIED', 'ACTIVATE', 'FAIL'),
+('VNF', 'INVENTORIED', 'ACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'INVENTORIED', 'ACTIVATE', 'FAIL'),
+('VF_MODULE', 'INVENTORIED', 'ACTIVATE', 'FAIL'),
+('NETWORK', 'INVENTORIED', 'ACTIVATE', 'FAIL'),
+
+('SERVICE', 'ASSIGNED', 'ACTIVATE', 'CONTINUE'),
+('VNF', 'ASSIGNED', 'ACTIVATE', 'CONTINUE'),
+('VOLUME_GROUP', 'ASSIGNED', 'ACTIVATE', 'FAIL'),
+('VF_MODULE', 'ASSIGNED', 'ACTIVATE', 'FAIL'),
+('NETWORK', 'ASSIGNED', 'ACTIVATE', 'FAIL'),
+
+('SERVICE', 'CREATED', 'ACTIVATE', 'CONTINUE'),
+('VNF', 'CREATED', 'ACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'CREATED', 'ACTIVATE', 'CONTINUE'),
+('VF_MODULE', 'CREATED', 'ACTIVATE', 'CONTINUE'),
+('NETWORK', 'CREATED', 'ACTIVATE', 'CONTINUE'),
+
+('SERVICE', 'ACTIVE', 'ACTIVATE', 'SILENT_SUCCESS'),
+('VNF', 'ACTIVE', 'ACTIVATE', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'ACTIVE', 'ACTIVATE', 'SILENT_SUCCESS'),
+('VF_MODULE', 'ACTIVE', 'ACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'ACTIVE', 'ACTIVATE', 'SILENT_SUCCESS'),
+
+('SERVICE', 'PENDING_CREATE', 'ACTIVATE', 'FAIL'),
+('VNF', 'PENDING_CREATE', 'ACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_CREATE', 'ACTIVATE', 'FAIL'),
+('VF_MODULE', 'PENDING_CREATE', 'ACTIVATE', 'FAIL'),
+('NETWORK', 'PENDING_CREATE', 'ACTIVATE', 'FAIL'),
+
+('SERVICE', 'PENDING_DELETE', 'ACTIVATE', 'CONTINUE'),
+('VNF', 'PENDING_DELETE', 'ACTIVATE', 'CONTINUE'),
+('VOLUME_GROUP', 'PENDING_DELETE', 'ACTIVATE', 'FAIL'),
+('VF_MODULE', 'PENDING_DELETE', 'ACTIVATE', 'FAIL'),
+('NETWORK', 'PENDING_DELETE', 'ACTIVATE', 'FAIL'),
+
+('SERVICE', 'PENDING_ACTIVATION', 'ACTIVATE', 'FAIL'),
+('VNF', 'PENDING_ACTIVATION', 'ACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_ACTIVATION', 'ACTIVATE', 'FAIL'),
+('VF_MODULE', 'PENDING_ACTIVATION', 'ACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_ACTIVATION', 'ACTIVATE', 'FAIL'),
+
+('SERVICE', 'PENDING', 'ACTIVATE', 'FAIL'),
+('VNF', 'PENDING', 'ACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PENDING', 'ACTIVATE', 'FAIL'),
+('VF_MODULE', 'PENDING', 'ACTIVATE', 'FAIL'),
+('NETWORK', 'PENDING', 'ACTIVATE', 'FAIL'),
+
+('SERVICE', 'PRECREATED', 'DEACTIVATE', 'FAIL'),
+('VNF', 'PRECREATED', 'DEACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PRECREATED', 'DEACTIVATE', 'FAIL'),
+('VF_MODULE', 'PRECREATED', 'DEACTIVATE', 'FAIL'),
+('NETWORK', 'PRECREATED', 'DEACTIVATE', 'FAIL'),
+
+('SERVICE', 'INVENTORIED', 'DEACTIVATE', 'FAIL'),
+('VNF', 'INVENTORIED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'INVENTORIED', 'DEACTIVATE', 'FAIL'),
+('VF_MODULE', 'INVENTORIED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'INVENTORIED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+
+('SERVICE', 'ASSIGNED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VNF', 'ASSIGNED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'ASSIGNED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VF_MODULE', 'ASSIGNED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'ASSIGNED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+
+('SERVICE', 'CREATED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VNF', 'CREATED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'CREATED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VF_MODULE', 'CREATED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'CREATED', 'DEACTIVATE', 'SILENT_SUCCESS'),
+
+('SERVICE', 'ACTIVE', 'DEACTIVATE', 'CONTINUE'),
+('VNF', 'ACTIVE', 'DEACTIVATE', 'CONTINUE'),
+('VOLUME_GROUP', 'ACTIVE', 'DEACTIVATE', 'CONTINUE'),
+('VF_MODULE', 'ACTIVE', 'DEACTIVATE', 'CONTINUE'),
+('NETWORK', 'ACTIVE', 'DEACTIVATE', 'CONTINUE'),
+
+('SERVICE', 'PENDING_CREATE', 'DEACTIVATE', 'FAIL'),
+('VNF', 'PENDING_CREATE', 'DEACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_CREATE', 'DEACTIVATE', 'FAIL'),
+('VF_MODULE', 'PENDING_CREATE', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_CREATE', 'DEACTIVATE', 'SILENT_SUCCESS'),
+
+('SERVICE', 'PENDING_DELETE', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VNF', 'PENDING_DELETE', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VOLUME_GROUP', 'PENDING_DELETE', 'DEACTIVATE', 'FAIL'),
+('VF_MODULE', 'PENDING_DELETE', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_DELETE', 'DEACTIVATE', 'SILENT_SUCCESS'),
+
+('SERVICE', 'PENDING_ACTIVATION', 'DEACTIVATE', 'FAIL'),
+('VNF', 'PENDING_ACTIVATION', 'DEACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PENDING_ACTIVATION', 'DEACTIVATE', 'FAIL'),
+('VF_MODULE', 'PENDING_ACTIVATION', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_ACTIVATION', 'DEACTIVATE', 'FAIL'),
+
+('SERVICE', 'PENDING', 'DEACTIVATE', 'FAIL'),
+('VNF', 'PENDING', 'DEACTIVATE', 'FAIL'),
+('VOLUME_GROUP', 'PENDING', 'DEACTIVATE', 'SILENT_SUCCESS'),
+('VF_MODULE', 'PENDING', 'DEACTIVATE', 'FAIL'),
+('NETWORK', 'PENDING', 'DEACTIVATE', 'FAIL'),
+
+
+('SERVICE', 'PRECREATED', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'PRECREATED', 'CHANGE_MODEL', 'FAIL'),
+('VF_MODULE', 'PRECREATED', 'CHANGE_MODEL', 'FAIL'),
+
+('SERVICE', 'INVENTORIED', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'INVENTORIED', 'CHANGE_MODEL', 'FAIL'),
+('VF_MODULE', 'INVENTORIED', 'CHANGE_MODEL', 'FAIL'),
+
+('SERVICE', 'ASSIGNED', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'ASSIGNED', 'CHANGE_MODEL', 'CONTINUE'),
+('VF_MODULE', 'ASSIGNED', 'CHANGE_MODEL', 'CONTINUE'),
+
+('SERVICE', 'CREATED', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'CREATED', 'CHANGE_MODEL', 'FAIL'),
+('VF_MODULE', 'CREATED', 'CHANGE_MODEL', 'FAIL'),
+
+('SERVICE', 'ACTIVE', 'CHANGE_MODEL', 'CONTINUE'),
+('VNF', 'ACTIVE', 'CHANGE_MODEL', 'CONTINUE'),
+('VF_MODULE', 'ACTIVE', 'CHANGE_MODEL', 'CONTINUE'),
+
+('SERVICE', 'PENDING_CREATE', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'PENDING_CREATE', 'CHANGE_MODEL', 'FAIL'),
+('VF_MODULE', 'PENDING_CREATE', 'CHANGE_MODEL', 'FAIL'),
+
+('SERVICE', 'PENDING_DELETE', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'PENDING_DELETE', 'CHANGE_MODEL', 'CONTINUE'),
+('VF_MODULE', 'PENDING_DELETE', 'CHANGE_MODEL', 'CONTINUE'),
+
+('SERVICE', 'PENDING_ACTIVATION', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'PENDING_ACTIVATION', 'CHANGE_MODEL', 'CONTINUE'),
+('VF_MODULE', 'PENDING_ACTIVATION', 'CHANGE_MODEL', 'CONTINUE'),
+
+('SERVICE', 'PENDING', 'CHANGE_MODEL', 'FAIL'),
+('VNF', 'PENDING', 'CHANGE_MODEL', 'FAIL'),
+('VF_MODULE', 'PENDING', 'CHANGE_MODEL', 'FAIL'),
+
+
+('VOLUME_GROUP', 'PRECREATED', 'CREATE', 'FAIL'),
+('VF_MODULE', 'PRECREATED', 'CREATE', 'FAIL'),
+('NETWORK', 'PRECREATED', 'CREATE', 'FAIL'),
+
+('VOLUME_GROUP', 'INVENTORIED', 'CREATE', 'FAIL'),
+('VF_MODULE', 'INVENTORIED', 'CREATE', 'FAIL'),
+('NETWORK', 'INVENTORIED', 'CREATE', 'FAIL'),
+
+('VOLUME_GROUP', 'ASSIGNED', 'CREATE', 'CONTINUE'),
+('VF_MODULE', 'ASSIGNED', 'CREATE', 'CONTINUE'),
+('NETWORK', 'ASSIGNED', 'CREATE', 'CONTINUE'),
+
+('VOLUME_GROUP', 'CREATED', 'CREATE', 'SILENT_SUCCESS'),
+('VF_MODULE', 'CREATED', 'CREATE', 'SILENT_SUCCESS'),
+('NETWORK', 'CREATED', 'CREATE', 'SILENT_SUCCESS'),
+
+('VOLUME_GROUP', 'ACTIVE', 'CREATE', 'SILENT_SUCCESS'),
+('VF_MODULE', 'ACTIVE', 'CREATE', 'SILENT_SUCCESS'),
+('NETWORK', 'ACTIVE', 'CREATE', 'SILENT_SUCCESS'),
+
+('VOLUME_GROUP', 'PENDING_CREATE', 'CREATE', 'FAIL'),
+('VF_MODULE', 'PENDING_CREATE', 'CREATE', 'FAIL'),
+('NETWORK', 'PENDING_CREATE', 'CREATE', 'CONTINUE'),
+
+('VOLUME_GROUP', 'PENDING_DELETE', 'CREATE', 'FAIL'),
+('VF_MODULE', 'PENDING_DELETE', 'CREATE', 'CONTINUE'),
+('NETWORK', 'PENDING_DELETE', 'CREATE', 'CONTINUE'),
+
+('VOLUME_GROUP', 'PENDING_ACTIVATION', 'CREATE', 'FAIL'),
+('VF_MODULE', 'PENDING_ACTIVATION', 'CREATE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_ACTIVATION', 'CREATE', 'FAIL'),
+
+('VOLUME_GROUP', 'PENDING', 'CREATE', 'CONTINUE'),
+('VF_MODULE', 'PENDING', 'CREATE', 'FAIL'),
+('NETWORK', 'PENDING', 'CREATE', 'FAIL'),
+
+
+('VOLUME_GROUP', 'PRECREATED', 'DELETE', 'FAIL'),
+('VF_MODULE', 'PRECREATED', 'DELETE', 'FAIL'),
+('NETWORK', 'PRECREATED', 'DELETE', 'FAIL'),
+
+('VOLUME_GROUP', 'INVENTORIED', 'DELETE', 'FAIL'),
+('VF_MODULE', 'INVENTORIED', 'DELETE', 'SILENT_SUCCESS'),
+('NETWORK', 'INVENTORIED', 'DELETE', 'SILENT_SUCCESS'),
+
+('VOLUME_GROUP', 'ASSIGNED', 'DELETE', 'CONTINUE'),
+('VF_MODULE', 'ASSIGNED', 'DELETE', 'CONTINUE'),
+('NETWORK', 'ASSIGNED', 'DELETE', 'CONTINUE'),
+
+('VOLUME_GROUP', 'CREATED', 'DELETE', 'CONTINUE'),
+('VF_MODULE', 'CREATED', 'DELETE', 'CONTINUE'),
+('NETWORK', 'CREATED', 'DELETE', 'CONTINUE'),
+
+('VOLUME_GROUP', 'ACTIVE', 'DELETE', 'FAIL'),
+('VF_MODULE', 'ACTIVE', 'DELETE', 'FAIL'),
+('NETWORK', 'ACTIVE', 'DELETE', 'FAIL'),
+
+('VOLUME_GROUP', 'PENDING_CREATE', 'DELETE', 'FAIL'),
+('VF_MODULE', 'PENDING_CREATE', 'DELETE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_CREATE', 'DELETE', 'SILENT_SUCCESS'),
+
+('VOLUME_GROUP', 'PENDING_DELETE', 'DELETE', 'FAIL'),
+('VF_MODULE', 'PENDING_DELETE', 'DELETE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_DELETE', 'DELETE', 'SILENT_SUCCESS'),
+
+('VOLUME_GROUP', 'PENDING_ACTIVATION', 'DELETE', 'FAIL'),
+('VF_MODULE', 'PENDING_ACTIVATION', 'DELETE', 'SILENT_SUCCESS'),
+('NETWORK', 'PENDING_ACTIVATION', 'DELETE', 'FAIL'),
+
+('VOLUME_GROUP', 'PENDING', 'DELETE', 'SILENT_SUCCESS'),
+('VF_MODULE', 'PENDING', 'DELETE', 'FAIL'),
+('NETWORK', 'PENDING', 'DELETE', 'FAIL');
+
+UPDATE orchestration_flow_reference SET FLOW_NAME = 'HomingBB' WHERE FLOW_NAME = 'SniroHoming';
+
+UPDATE orchestration_flow_reference
+SET FLOW_NAME = 'ActivateServiceInstanceBB'
+WHERE FLOW_NAME = 'ActivateServiceInstance';
+
+DELETE FROM orchestration_flow_reference
+WHERE FLOW_NAME = 'DeactivateNetworkCollectionBB';
+
+UPDATE orchestration_flow_reference
+SET SEQ_NO = SEQ_NO - 1
+WHERE COMPOSITE_ACTION = 'Service-Macro-Delete' AND SEQ_NO > 8;
+
+UPDATE orchestration_flow_reference
+SET SEQ_NO = SEQ_NO - 1
+WHERE COMPOSITE_ACTION = 'NetworkCollection-Macro-Delete' AND SEQ_NO > 4;
+
+UPDATE building_block_detail
+SET BUILDING_BLOCK_NAME = 'UnassignVolumeGroupBB'
+WHERE BUILDING_BLOCK_NAME = 'UnassignVolumeGroup';
+
+UPDATE building_block_detail
+SET TARGET_ACTION = 'CHANGE_MODEL'
+WHERE TARGET_ACTION = 'CHANGEMODEL';
+
+INSERT INTO building_block_detail(BUILDING_BLOCK_NAME, RESOURCE_TYPE, TARGET_ACTION)
+VALUES
+('UnassignVfModuleBB', 'VF_MODULE', 'UNASSIGN'),
+('SniroHoming', 'CUSTOM', 'CUSTOM'),
+('DeactivateAndUnassignVpnBondingLinksBB', 'CUSTOM', 'CUSTOM'),
+('DeactivateNetworkCollectionBB', 'CUSTOM', 'CUSTOM'),
+('AAICheckVnfInMaintBB', 'CUSTOM', 'CUSTOM'),
+('AAISetVnfInMaintBB', 'CUSTOM', 'CUSTOM'),
+('AAIUnsetVnfInMaintBB', 'CUSTOM', 'CUSTOM'),
+('SDNOVnfHealthCheckBB', 'CUSTOM', 'CUSTOM'),
+('VNF-Macro-Replace', 'CUSTOM', 'CUSTOM'),
+('HomingBB', 'CUSTOM', 'CUSTOM');
+
+INSERT INTO orchestration_status_state_transition_directive(RESOURCE_TYPE, ORCHESTRATION_STATUS, TARGET_ACTION, FLOW_DIRECTIVE)
+VALUES
+('CUSTOM', 'ACTIVE', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'ASSIGNED', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'CREATED', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'INVENTORIED', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'PENDING', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'PENDING_ACTIVATION', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'PENDING_CREATE', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'PENDING_DELETE', 'CUSTOM', 'CONTINUE'),
+('CUSTOM', 'PRECREATED', 'CUSTOM', 'CONTINUE');
+
+INSERT INTO northbound_request_ref_lookup(MACRO_ACTION, ACTION, REQUEST_SCOPE, IS_ALACARTE, MIN_API_VERSION, MAX_API_VERSION, IS_TOPLEVELFLOW, CLOUD_OWNER) VALUES
+('VFModule-DeactivateAndCloudDelete', 'deactivateAndCloudDelete', 'VfModule', true, '7','7', true, 'cloudOwner');
+
+INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FLOW_VERSION, NB_REQ_REF_LOOKUP_ID) VALUES
+('VFModule-DeactivateAndCloudDelete', '1', 'DeactivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-DeactivateAndCloudDelete' and CLOUD_OWNER = 'cloudOwner')),
+('VFModule-DeactivateAndCloudDelete', '2', 'DeleteVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-DeactivateAndCloudDelete' and CLOUD_OWNER = 'cloudOwner'));
+
+INSERT INTO northbound_request_ref_lookup (REQUEST_SCOPE, MACRO_ACTION, ACTION, IS_ALACARTE, MIN_API_VERSION, MAX_API_VERSION, IS_TOPLEVELFLOW, CLOUD_OWNER)
+values ( 'Service', 'Service-Macro-Deactivate', 'deactivateInstance', '0', '7', '7', '1', 'cloudOwner');
+
+INSERT INTO orchestration_flow_reference (COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FLOW_VERSION, NB_REQ_REF_LOOKUP_ID)
+values ( 'Service-Macro-Deactivate', '1', 'DeactivateServiceInstanceBB', '1', (SELECT id FROM northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Deactivate' and CLOUD_OWNER = 'cloudOwner'));
+
+
+UPDATE northbound_request_ref_lookup SET MIN_API_VERSION = 5 WHERE MACRO_ACTION = 'Service-Macro-Create';
+UPDATE northbound_request_ref_lookup SET MIN_API_VERSION = 5 WHERE MACRO_ACTION = 'Service-Macro-Delete';
+UPDATE northbound_request_ref_lookup SET MIN_API_VERSION = 5 WHERE MACRO_ACTION = 'Service-Macro-Activate';
+
+UPDATE northbound_request_ref_lookup SET MIN_API_VERSION = 5 WHERE MACRO_ACTION = 'Service-Macro-Deactivate';
+
+INSERT INTO northbound_request_ref_lookup(MACRO_ACTION, ACTION, REQUEST_SCOPE, IS_ALACARTE, MIN_API_VERSION, MAX_API_VERSION, IS_TOPLEVELFLOW, CLOUD_OWNER) VALUES
+('Network-Update', 'updateInstance', 'Network', true, '7','7','1', 'cloudOwner');
+INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FLOW_VERSION, NB_REQ_REF_LOOKUP_ID) VALUES
+('Network-Update', '1', 'UpdateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Update' and CLOUD_OWNER = 'cloudOwner'));
+
+INSERT INTO building_block_detail(BUILDING_BLOCK_NAME,RESOURCE_TYPE,TARGET_ACTION) VALUES
+('UpdateNetworkBB','NETWORK','UPDATE');
+
+INSERT INTO orchestration_status_state_transition_directive(RESOURCE_TYPE, ORCHESTRATION_STATUS,TARGET_ACTION,FLOW_DIRECTIVE) VALUES
+('NETWORK','PRECREATED','UPDATE','FAIL'),
+('NETWORK','INVENTORIED','UPDATE','FAIL'),
+('NETWORK','ASSIGNED','UPDATE','FAIL'),
+('NETWORK','CREATED','UPDATE','FAIL'),
+('NETWORK','PENDING_CREATE','UPDATE','FAIL'),
+('NETWORK','PENDING_DELETE','UPDATE','FAIL'),
+('NETWORK','PENDING_ACTIVATION','UPDATE','FAIL'),
+('NETWORK','ACTIVE','UPDATE','CONTINUE');
+
+UPDATE building_block_detail SET RESOURCE_TYPE = 'NETWORK_COLLECTION' WHERE BUILDING_BLOCK_NAME = 'ActivateNetworkCollectionBB';
+UPDATE building_block_detail SET RESOURCE_TYPE = 'NETWORK_COLLECTION' WHERE BUILDING_BLOCK_NAME = 'CreateNetworkCollectionBB';
+UPDATE building_block_detail SET RESOURCE_TYPE = 'NETWORK_COLLECTION' WHERE BUILDING_BLOCK_NAME = 'DeleteNetworkCollectionBB';
+UPDATE building_block_detail SET RESOURCE_TYPE = 'NETWORK_COLLECTION' WHERE BUILDING_BLOCK_NAME = 'DeactivateNetworkCollectionBB';
+UPDATE building_block_detail SET TARGET_ACTION = 'DEACTIVATE' WHERE BUILDING_BLOCK_NAME = 'DeactivateNetworkCollectionBB';
+
+INSERT into orchestration_status_state_transition_directive (RESOURCE_TYPE, ORCHESTRATION_STATUS, TARGET_ACTION, FLOW_DIRECTIVE) values
+('NETWORK_COLLECTION', 'PRECREATED', 'CREATE', 'CONTINUE'),
+('NETWORK_COLLECTION', 'ASSIGNED', 'CREATE', 'FAIL'),
+('NETWORK_COLLECTION', 'CREATED', 'CREATE', 'FAIL'),
+('NETWORK_COLLECTION', 'ACTIVE', 'CREATE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING_CREATE', 'CREATE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING_DELETE', 'CREATE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING_ACTIVATION', 'CREATE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING', 'CREATE', 'FAIL'),
+('NETWORK_COLLECTION', 'INVENTORIED', 'CREATE', 'SILENT_SUCCESS'),
+
+('NETWORK_COLLECTION', 'PRECREATED', 'DELETE', 'FAIL'),
+('NETWORK_COLLECTION', 'ASSIGNED', 'DELETE', 'FAIL'),
+('NETWORK_COLLECTION', 'CREATED', 'DELETE', 'FAIL'),
+('NETWORK_COLLECTION', 'ACTIVE', 'DELETE', 'CONTINUE'),
+('NETWORK_COLLECTION', 'PENDING_CREATE', 'DELETE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING_DELETE', 'DELETE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING_ACTIVATION', 'DELETE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING', 'DELETE', 'FAIL'),
+('NETWORK_COLLECTION', 'INVENTORIED', 'DELETE', 'CONTINUE'),
+
+('NETWORK_COLLECTION', 'PRECREATED', 'ACTIVE', 'FAIL'),
+('NETWORK_COLLECTION', 'ASSIGNED', 'ACTIVE', 'FAIL'),
+('NETWORK_COLLECTION', 'CREATED', 'ACTIVE', 'FAIL'),
+('NETWORK_COLLECTION', 'ACTIVE', 'ACTIVE', 'SILENT_SUCCESS'),
+('NETWORK_COLLECTION', 'PENDING_CREATE', 'ACTIVE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING_DELETE', 'ACTIVE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING_ACTIVATION', 'ACTIVE', 'FAIL'),
+('NETWORK_COLLECTION', 'PENDING', 'ACTIVE', 'FAIL'),
+('NETWORK_COLLECTION', 'INVENTORIED', 'ACTIVE', 'CONTINUE');
+
+UPDATE orchestration_status_state_transition_directive SET TARGET_ACTION = 'ACTIVATE' WHERE TARGET_ACTION = 'ACTIVE';
+
+INSERT INTO orchestration_status_state_transition_directive(RESOURCE_TYPE, ORCHESTRATION_STATUS, TARGET_ACTION, FLOW_DIRECTIVE)
+VALUES
+('CONFIGURATION', 'PRECREATED', 'UNASSIGN', 'SILENT SUCCESS'),
+('CONFIGURATION', 'INVENTORIED', 'UNASSIGN', 'CONTINUE'),
+('CONFIGURATION', 'ASSIGNED', 'UNASSIGN', 'CONTINUE'),
+('CONFIGURATION', 'CREATED', 'UNASSIGN', 'FAIL'),
+('CONFIGURATION', 'ACTIVE', 'UNASSIGN', 'FAIL'),
+('CONFIGURATION', 'PENDING CREATE', 'UNASSIGN', 'FAIL'),
+('CONFIGURATION', 'PENDING DELETE', 'UNASSIGN', 'FAIL'),
+('CONFIGURATION', 'PENDING ACTIVATION', 'UNASSIGN', 'FAIL'),
+('CONFIGURATION', 'PENDING', 'UNASSIGN', 'FAIL');
+
+UPDATE orchestration_flow_reference
+SET SEQ_NO = SEQ_NO + 2 WHERE COMPOSITE_ACTION = 'SERVICE-MACRO-DELETE';
+
+
+INSERT INTO orchestration_status_state_transition_directive(RESOURCE_TYPE, ORCHESTRATION_STATUS, TARGET_ACTION, FLOW_DIRECTIVE)
+VALUES
+('CONFIGURATION', 'PRECREATED', 'ASSIGN', 'CONTINUE'),
+('CONFIGURATION', 'INVENTORIED', 'ASSIGN', 'CONTINUE'),
+('CONFIGURATION', 'ASSIGNED', 'ASSIGN', 'SILENT SUCCESS'),
+('CONFIGURATION', 'CREATED', 'ASSIGN', 'SILENT SUCCESS'),
+('CONFIGURATION', 'ACTIVE', 'ASSIGN', 'SILENT SUCCESS'),
+('CONFIGURATION', 'PENDING CREATE', 'ASSIGN', 'FAIL'),
+('CONFIGURATION', 'PENDING DELETE', 'ASSIGN', 'FAIL'),
+('CONFIGURATION', 'PENDING ACTIVATION', 'ASSIGN', 'FAIL'),
+('CONFIGURATION', 'PENDING', 'ASSIGN', 'FAIL'),
+
+('CONFIGURATION', 'PRECREATED', 'ACTIVATE', 'FAIL'),
+('CONFIGURATION', 'INVENTORIED', 'ACTIVATE', 'FAIL'),
+('CONFIGURATION', 'ASSIGNED', 'ACTIVATE', 'CONTINUE'),
+('CONFIGURATION', 'CREATED', 'ACTIVATE', 'CONTINUE'),
+('CONFIGURATION', 'ACTIVE', 'ACTIVATE', 'SILENT SUCCESS'),
+('CONFIGURATION', 'PENDING CREATE', 'ACTIVATE', 'FAIL'),
+('CONFIGURATION', 'PENDING DELETE', 'ACTIVATE', 'FAIL'),
+('CONFIGURATION', 'PENDING ACTIVATION', 'ACTIVATE', 'FAIL'),
+('CONFIGURATION', 'PENDING', 'ACTIVATE', 'FAIL'),
+
+('CONFIGURATION', 'PRECREATED', 'DEACTIVATE', 'FAIL'),
+('CONFIGURATION', 'INVENTORIED', 'DEACTIVATE', 'SILENT SUCCESS'),
+('CONFIGURATION', 'ASSIGNED', 'DEACTIVATE', 'SILENT SUCCESS'),
+('CONFIGURATION', 'CREATED', 'DEACTIVATE', 'SILENT SUCCESS'),
+('CONFIGURATION', 'ACTIVE', 'DEACTIVATE', 'CONTINUE'),
+('CONFIGURATION', 'PENDING CREATE', 'DEACTIVATE', 'FAIL'),
+('CONFIGURATION', 'PENDING DELETE', 'DEACTIVATE', 'FAIL'),
+('CONFIGURATION', 'PENDING ACTIVATION', 'DEACTIVATE', 'FAIL'),
+('CONFIGURATION', 'PENDING', 'DEACTIVATE', 'FAIL');
+
+UPDATE orchestration_flow_reference
+SET SEQ_NO = SEQ_NO + 2 WHERE COMPOSITE_ACTION = 'Service-Macro-Create' AND SEQ_NO > 12;
+
+UPDATE orchestration_flow_reference
+SET SEQ_NO = SEQ_NO + 1 WHERE COMPOSITE_ACTION = 'Service-Macro-Activate' AND SEQ_NO > 6;
+
+
+
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE POLICY = 'Rollback';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE POLICY = 'Abort';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Rollback' WHERE FLOW_NAME = 'CreateNetworkBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Rollback' WHERE FLOW_NAME = 'CreateNetworkCollectionBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'RollbackToAssigned' WHERE FLOW_NAME = 'CreateVfModuleBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Rollback' WHERE FLOW_NAME = 'CreateVolumeGroupBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'DeleteNetworkBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'DeleteNetworkCollectionBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'DeleteVfModuleBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'DeleteVolumeGroupBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'UnassignNetworkBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'UnassignServiceInstanceBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'UnassignVfModuleBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'UnassignVnfBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Abort' WHERE FLOW_NAME = 'UnassignVolumeGroupBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Rollback' WHERE FLOW_NAME = 'UpdateNetworkBB';
+UPDATE rainy_day_handler_macro SET Secondary_Policy = 'Rollback' WHERE FLOW_NAME = 'VnfAdapterBB';
+
+
+
+
+INSERT INTO rainy_day_handler_macro (FLOW_NAME, SERVICE_TYPE, VNF_TYPE, ERROR_CODE, WORK_STEP, POLICY)
+VALUES
+('GenericVnfHealthCheckBB', '*', '*', '*', "*" , 'Retry'),
+('ConfigurationScaleOutBB', '*', '*', '*', "*" , 'Retry');
\ No newline at end of file
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V4.14.2__AddCloudOwnerColumnToNorthBoundRequest.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V4.14.2__AddCloudOwnerColumnToNorthBoundRequest.sql
new file mode 100644 (file)
index 0000000..664a064
--- /dev/null
@@ -0,0 +1,7 @@
+use catalogdb;
+
+ALTER  TABLE northbound_request_ref_lookup ADD COLUMN CLOUD_OWNER varchar(200) NOT NULL;
+ALTER TABLE northbound_request_ref_lookup
+ DROP INDEX UK_northbound_request_ref_lookup;
+ALTER TABLE northbound_request_ref_lookup                                                                                                                                                                                                                                                               
+ADD UNIQUE INDEX `UK_northbound_request_ref_lookup` (`MIN_API_VERSION` ASC, `REQUEST_SCOPE` ASC, `ACTION` ASC, `IS_ALACARTE` ASC, `MACRO_ACTION` ASC, `CLOUD_OWNER` ASC);
index ec9ad8c..e249285 100644 (file)
 
 package org.onap.so.db.catalog.client;
 
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
 import java.util.List;
 import java.util.UUID;
 
+import javax.ws.rs.core.UriBuilder;
+
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -44,25 +50,31 @@ import org.onap.so.db.catalog.beans.VnfComponentsRecipe;
 import org.onap.so.db.catalog.beans.VnfRecipe;
 import org.onap.so.db.catalog.beans.VnfResource;
 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+import org.onap.so.db.catalog.beans.ExternalServiceToInternalService;
+import org.onap.so.db.catalog.beans.macro.NorthBoundRequest;
 import org.onap.so.db.catalog.beans.macro.RainyDayHandlerStatus;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = CatalogDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 @ActiveProfiles("test")
 public class CatalogDbClientTest {
     public static final String MTN13 = "mtn13";
+    
     @LocalServerPort
     private int port;
 
     @Value("${mso.db.auth}")
     private String msoAdaptersAuth;
-
+       
     @Autowired
     CatalogDbClientPortChanger client;
 
@@ -445,6 +457,21 @@ public class CatalogDbClientTest {
         Assert.assertNull(service);
     }
 
+    @Test
+    public void testGetNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(){
+       NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+       northBoundRequest.setAction("createService");
+       northBoundRequest.setRequestScope("service");
+       northBoundRequest.setIsAlacarte(true);
+       northBoundRequest.setCloudOwner("my-custom-cloud-owner");
+       client.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner("createService", "service", true, "my-custom-cloud-owner");
+       Assert.assertNotNull(northBoundRequest);
+       Assert.assertEquals("createService",northBoundRequest.getAction());
+       Assert.assertEquals("service",northBoundRequest.getRequestScope());
+       Assert.assertEquals(true,northBoundRequest.getIsAlacarte() );
+       Assert.assertEquals("my-custom-cloud-owner", northBoundRequest.getCloudOwner());
+    }
+   
     @Test
     public void testFindServiceRecipeByActionAndServiceModelUUID() {
         ServiceRecipe serviceRecipe = client.findServiceRecipeByActionAndServiceModelUUID("createInstance","4694a55f-58b3-4f17-92a5-796d6f5ffd0d" );
index 4d5105d..98d1917 100644 (file)
@@ -209,3 +209,11 @@ VALUES
 INSERT INTO vnf_components_recipe (VNF_COMPONENT_TYPE, ACTION, VERSION, DESCRIPTION, ORCHESTRATION_URI, RECIPE_TIMEOUT, VF_MODULE_MODEL_UUID)
 VALUES
 ('volumeGroup', 'createInstance', '1', 'Gr api recipe to create volume-group', '/mso/async/services/WorkflowActionBB', 180, '20c4431c-246d-11e7-93ae-92361f002671');
+
+
+INSERT INTO northbound_request_ref_lookup(MACRO_ACTION, ACTION, REQUEST_SCOPE, IS_ALACARTE, MIN_API_VERSION, MAX_API_VERSION, CLOUD_OWNER) VALUES
+('Service-Create', 'createInstance', 'Service', true, '7','7', 'my-custom-cloud-owner');
+
+
+INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FLOW_VERSION, NB_REQ_REF_LOOKUP_ID) VALUES
+('Service-Create', '1', 'AssignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Create' and CLOUD_OWNER = 'my-custom-cloud-owner'));
index 10dbbf1..257ad3c 100644 (file)
@@ -36,6 +36,7 @@ import org.onap.so.logger.MsoLogger;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Paths;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -66,11 +67,13 @@ public class R__CloudConfigMigration implements JdbcMigration , MigrationInfoPro
         CloudConfig cloudConfig = null;
 
         // Try the override file
-        String configLocation = System.getProperty("spring.config.location");
+        String configLocation = System.getProperty("spring.config.additional-location");
         if (configLocation != null) {
-            try (InputStream stream = new FileInputStream(configLocation)) {
+            try (InputStream stream = new FileInputStream(Paths.get(configLocation).normalize().toString())) {
                 cloudConfig = loadCloudConfig(stream);
-            }
+            }catch(Exception e){
+               LOGGER.warnSimple("Error Loading override.yaml",e);
+            } 
         }
         
         if (cloudConfig == null) {
index 092cefe..b1e4a75 100644 (file)
@@ -2216,6 +2216,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                                vfModuleId = vnfName.substring(vnfName.indexOf('/') + 1);
                        } catch (Exception e) {
                                // do nothing - send what we got for vnfName for both to valet
+                               LOGGER.error("An exception occurred trying to call MsoVnfAdapterImpl.valetDeleteRequest() method", e);
                        }
                        GenericValetResponse<ValetDeleteResponse> deleteReq = this.vci.callValetDeleteRequest(msoRequest.getRequestId(),
                                        cloudSiteId, tenantId, vfModuleId, vfModuleName);
index e07492e..67c4dd3 100644 (file)
@@ -37,15 +37,12 @@ org:
           default_orm_url_replace_with_this: 7080
           default_quota_value: 10
           set_default_quota: false
-ecomp:
-  mso:
-    adapters:
-      po:
-        retryCodes: 504
-        retryDelay: 5
-        retryCount: 3
-        pollTimeout: 7500
-        pollInterval: 15
+        po:
+          retryCodes: 504
+          retryDelay: 5
+          retryCount: 3
+          pollTimeout: 7500
+          pollInterval: 15
       
 server-port: 8080
 ssl-enable: false
index 88099be..bc3bfba 100644 (file)
@@ -13,8 +13,7 @@ mso:
     core-pool-size: 50
     max-pool-size: 50
     queue-capacity: 500
-    
-# CatalogDB
+
 spring:
   datasource:
     jdbc-url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/catalogdb
index 95b48cd..d1a5bd9 100644 (file)
@@ -15,6 +15,12 @@ org:
           retrycount: 5
           retryinterval: -15
           retrylist: 408,429,500,502,503,504,900
+          heat:
+            create:
+              pollInterval: 15
+            delete:
+              pollTimeout: 7500
+              pollInterval: 15
         network:
           bpelauth: 4771D91C24BB25366730561D630B131818CD9FF8D686AA8807F4CB30E1324C46ED16197C07
           sockettimeout: 5
@@ -22,6 +28,12 @@ org:
           retrycount: 5
           retryinterval: -15
           retrylist: 408,429,500,502,503,504,900
+          heat:
+            create:
+              pollInterval: 15
+            delete:
+              pollTimeout: 300
+              pollInterval: 15
         tenant: 
           default_x_aic_orm_client_string: ONAP-SO
           default_keystone_url_version: /v2.0
@@ -40,27 +52,10 @@ org:
           base_url: http://localhost:${wiremock.server.port}
           base_path: /api/valet/placement/v1/
           valet_auth: 
-ecomp:
-  mso:
-    adapters:
-      po:
-        retryCodes: 504
-        retryDelay: 5
-        retryCount: 3
-      vnf:
-        heat:
-          create:
-            pollInterval: 15
-          delete:
-            pollTimeout: 7500
-            pollInterval: 15
-      network:
-        heat:
-          create:
-            pollInterval: 15
-          delete:
-            pollTimeout: 300
-            pollInterval: 15
+        po:
+          retryCodes: 504
+          retryDelay: 5
+          retryCount: 3
       
 server-port: 8080
 ssl-enable: false
index 58bde2e..175b08f 100644 (file)
@@ -15,6 +15,12 @@ org:
           retrycount: 5
           retryinterval: -15
           retrylist: 408,429,500,502,503,504,900
+          heat:
+            create:
+              pollInterval: 15
+            delete:
+              pollTimeout: 7500
+              pollInterval: 15
         network:
           bpelauth: 4771D91C24BB25366730561D630B131818CD9FF8D686AA8807F4CB30E1324C46ED16197C07
           sockettimeout: 5
@@ -23,6 +29,12 @@ org:
           retryinterval: -15
           retrylist: 408,429,500,502,503,504,900
           encryptionKey: aa3871669d893c7fb8abbcda31b88b4f
+          heat:
+            create:
+              pollInterval: 15
+            delete:
+              pollTimeout: 300
+              pollInterval: 15
         tenant:
           default_x_aic_orm_client_string: ONAP-SO
           default_keystone_url_version: /v2.0
@@ -41,27 +53,10 @@ org:
           base_url: http://localhost:${wiremock.server.port}
           base_path: /api/valet/placement/v1/
           valet_auth: 
-ecomp:
-  mso:
-    adapters:
-      po:
-        retryCodes: 504
-        retryDelay: 5
-        retryCount: 3
-      vnf:
-        heat:
-          create:
-            pollInterval: 15
-          delete:
-            pollTimeout: 7500
-            pollInterval: 15
-      network:
-        heat:
-          create:
-            pollInterval: 15
-          delete:
-            pollTimeout: 300
-            pollInterval: 15
+        po:
+          retryCodes: 504
+          retryDelay: 5
+          retryCount: 3
       
 server-port: 8080
 ssl-enable: false
index c8ea165..893156c 100644 (file)
@@ -23,6 +23,8 @@
 package org.onap.so.adapters.requestsdb;
 
 import java.sql.Timestamp;
+import java.util.List;
+
 import javax.jws.WebService;
 import javax.transaction.Transactional;
 import org.onap.so.adapters.requestsdb.exceptions.MsoRequestsDbException;
@@ -304,5 +306,65 @@ public class MsoRequestsDbAdapterImpl implements MsoRequestsDbAdapter {
                resStatus.setErrorCode(errorCode);
                resStatus.setStatusDescription(statusDescription);
                resourceOperationStatusRepository.save(resStatus);
+
+               updateOperationStatusBasedOnResourceStatus(resStatus);
        }
+       
+    /**
+     * update service operation status when a operation resource status updated
+     * <br>
+     * 
+     * @param operStatus the resource operation status
+     * @since ONAP Amsterdam Release
+     */
+    private void updateOperationStatusBasedOnResourceStatus(ResourceOperationStatus operStatus) {
+       String serviceId = operStatus.getServiceId();
+        String operationId = operStatus.getOperationId();
+
+        logger.debug("Request database - update Operation Status Based On Resource Operation Status with service Id:"
+                + serviceId + ", operationId:" + operationId);
+        
+        List<ResourceOperationStatus> lstResourceStatus = resourceOperationStatusRepository.findByServiceIdAndOperationId(serviceId, operationId);
+               if (lstResourceStatus == null) {
+                       logger.error("Unable to retrieve resourceOperStatus Object by ServiceId: " + serviceId + " operationId: " + operationId);
+                       return;
+               }
+               
+               // count the total progress
+        int resourceCount = lstResourceStatus.size();
+        int progress = 0;
+        boolean isFinished = true;
+        for (ResourceOperationStatus lstResourceStatu : lstResourceStatus) {
+            progress = progress + Integer.valueOf(lstResourceStatu.getProgress()) / resourceCount;
+            if (RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatu.getStatus())) {
+                isFinished = false;
+            }
+        }
+        
+        OperationStatus serviceOperStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
+               if (serviceOperStatus == null) {
+                       String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId + " operationId: "
+                                       + operationId;
+                       logger.error(error);
+                       
+                       serviceOperStatus = new OperationStatus();
+                       serviceOperStatus.setOperationId(operationId);
+                       serviceOperStatus.setServiceId(serviceId);
+               }
+        
+        progress = progress > 100 ? 100 : progress;
+        serviceOperStatus.setProgress(String.valueOf(progress));
+        serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
+        // if current resource failed. service failed.
+        if(RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
+            serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
+            serviceOperStatus.setReason(operStatus.getStatusDescription());
+        } else if(isFinished) {
+            // if finished
+            serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
+            serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
+        }
+
+        operationStatusRepository.save(serviceOperStatus);
+    }
 }
index 4d200d2..af99a86 100644 (file)
@@ -46,7 +46,7 @@ spring:
       role: ACTUATOR
 flyway:
   baseline-on-migrate: false
-  jdbc-url:  jdbc:mariadb://${DB_HOST}:${DB_PORT}/requestdb
+  url:  jdbc:mariadb://${DB_HOST}:${DB_PORT}/requestdb
   user: ${DB_ADMIN_USERNAME}
   password: ${DB_ADMIN_PASSWORD}
 
index aaf6cc7..e427423 100644 (file)
@@ -33,6 +33,7 @@ import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.util.EntityUtils;
+import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.so.adapters.sdnc.impl.Constants;
 import org.onap.so.logger.MessageEnum;
 
@@ -40,6 +41,7 @@ import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.onap.so.utils.CryptoUtils;
+import org.slf4j.MDC;
 import org.springframework.core.env.Environment;
 
 /**
@@ -123,6 +125,9 @@ public class BPRestCallback {
                                        env.getProperty(Constants.ENCRYPTION_KEY_PROP));
                                String authorization = "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes());
                                method.setHeader("Authorization", authorization);
+                               method.setHeader(ONAPLogConstants.Headers.REQUEST_ID,MDC.get(ONAPLogConstants.MDCs.REQUEST_ID));
+                               method.setHeader(ONAPLogConstants.Headers.INVOCATION_ID,MDC.get(ONAPLogConstants.MDCs.INVOCATION_ID));
+                               method.setHeader(ONAPLogConstants.Headers.PARTNER_NAME,"SO-SDNCAdapter");
                        } catch (Exception e) {
                                LOGGER.error(MessageEnum.RA_SET_CALLBACK_AUTH_EXC, CAMUNDA, "", MsoLogger.ErrorCode.BusinessProcesssError,
                                        "Unable to set authorization in callback request", e);                  
index 1db9d95..bb7fa70 100644 (file)
@@ -43,7 +43,6 @@ import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.util.EntityUtils;
 import org.onap.so.adapters.vfc.model.RestfulResponse;
 import org.onap.so.logger.MessageEnum;
-
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -66,8 +65,6 @@ public class RestfulUtil {
      */
     private static final MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA, RestfulUtil.class);
 
-
-
     private static final int DEFAULT_TIME_OUT = 60000;
 
     private static final String ONAP_IP = "ONAP_IP";
@@ -82,15 +79,18 @@ public class RestfulUtil {
    private Environment env;
 
     public String getMsbHost() {
-        // MSB_IP will be set as ONAP_IP environment parameter in install flow.
-        String msbIp = System.getenv().get(ONAP_IP);
-       // if ONAP IP is not set. get it from config file.
-        if(null == msbIp || msbIp.isEmpty()) {
-               msbIp = env.getProperty("mso.msb-ip", DEFAULT_MSB_IP);
-       }
+               // MSB_IP will be set as ONAP_IP environment parameter in install flow.
+               String msbIp = System.getenv().get(ONAP_IP);
+               // if ONAP IP is not set. get it from config file.
+               if (null == msbIp || msbIp.isEmpty()) {
+                       msbIp = env.getProperty("mso.msb-ip", DEFAULT_MSB_IP);
+               }
        Integer msbPort = env.getProperty("mso.msb-port", Integer.class, DEFAULT_MSB_PORT);
        
-       return UriBuilder.fromPath("").host(msbIp).port(msbPort).scheme("http").build().toString();
+       String msbEndpoint = UriBuilder.fromPath("").host(msbIp).port(msbPort).scheme("http").build().toString();
+       LOGGER.debug("msbEndpoint in vfc adapter: " + msbEndpoint);
+       
+       return msbEndpoint;
     }
 
     private RestfulUtil() {
@@ -99,7 +99,7 @@ public class RestfulUtil {
 
     public RestfulResponse send(String url, String methodType, String content) {
         String msbUrl = getMsbHost() + url;
-        LOGGER.info(MessageEnum.RA_NS_EXC, "Begin to sent message " + methodType +": " + msbUrl, "org.onap.so.adapters.vfc.util.RestfulUtil",VFC_ADAPTER);
+        LOGGER.debug("Begin to sent message " + methodType +": " + msbUrl);
 
         HttpRequestBase method = null;
         HttpResponse httpResponse = null;
@@ -201,12 +201,10 @@ public class RestfulUtil {
 
     private static void logError(String errMsg, Throwable t) {
         LOGGER.error(MessageEnum.RA_NS_EXC, VFC_ADAPTER, "", MsoLogger.ErrorCode.AvailabilityError, errMsg, t);
-
     }
 
     private static void logError(String errMsg) {
         LOGGER.error(MessageEnum.RA_NS_EXC, VFC_ADAPTER, "", MsoLogger.ErrorCode.AvailabilityError, errMsg);
-
     }
 
     private static RestfulResponse createResponse(int statusCode, String content) {
index bd3b2d1..2f56668 100644 (file)
@@ -22,8 +22,10 @@ package org.onap.so.asdc;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication(scanBasePackages = { "org.onap.so" })
+@EnableScheduling
 public class Application {
 
        private static final String MSO_CONFIG_PATH = "mso.config.path";
index 0321247..9a1392b 100644 (file)
@@ -26,6 +26,7 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.nio.file.Paths;
 import java.util.List;
 
 import org.onap.sdc.api.IDistributionClient;
@@ -355,7 +356,7 @@ public class ASDCController {
                        + artifact.getArtifactUUID ()
                        + ")");
        
-       String filePath = System.getProperty("mso.config.path") + "/ASDC" + "/" + artifact.getArtifactVersion() + "/" + artifact.getArtifactName();
+        String filePath = Paths.get(System.getProperty("mso.config.path"), "ASDC",  artifact.getArtifactVersion(), artifact.getArtifactName()).normalize().toString();
        // make parent directory
        File file = new File(filePath);         
        File fileParent = file.getParentFile();
index 0300351..72aa3c7 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.asdc.installer;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.List;
 
 import org.onap.sdc.api.notification.IArtifactInfo;
@@ -126,7 +127,7 @@ public class ToscaResourceStructure {
                        
                        LOGGER.debug("MSO config path is: " + System.getProperty("mso.config.path"));
                        
-                       String filePath = System.getProperty("mso.config.path") + "/ASDC/" + artifact.getArtifactVersion() + "/" + artifact.getArtifactName();
+                       String filePath = Paths.get(System.getProperty("mso.config.path"), "ASDC",  artifact.getArtifactVersion(), artifact.getArtifactName()).normalize().toString();
 
                        File spoolFile = new File(filePath);
  
index f5215e9..486844a 100644 (file)
 
 package org.onap.so.asdc.installer.bpmn;
 
-import java.io.*;
+import java.io.BufferedOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URI;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.zip.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.http.HttpEntity;
@@ -32,14 +37,13 @@ import org.apache.http.client.HttpClient;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.ContentType;
-import org.apache.http.impl.client.HttpClientBuilder;
-
-import org.onap.so.logger.MessageEnum;
-import org.onap.so.logger.MsoLogger;
+import org.apache.http.entity.mime.FormBodyPartBuilder;
 import org.apache.http.entity.mime.MultipartEntityBuilder;
 import org.apache.http.entity.mime.content.ByteArrayBody;
 import org.apache.http.entity.mime.content.StringBody;
-import org.apache.http.entity.mime.FormBodyPartBuilder;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.onap.so.logger.MessageEnum;
+import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
@@ -57,7 +61,7 @@ public class BpmnInstaller {
        public void installBpmn(String csarFilePath) {
                LOGGER.info("Deploying BPMN files from " + csarFilePath);               
                try {                   
-                       ZipInputStream csarFile = new ZipInputStream(new FileInputStream(csarFilePath));
+                       ZipInputStream csarFile = new ZipInputStream(new FileInputStream(Paths.get(csarFilePath).normalize().toString()));
                        ZipEntry entry = csarFile.getNextEntry();               
         
                        while (entry != null) {                         
@@ -101,28 +105,28 @@ public class BpmnInstaller {
                                csarFilePath,
                                "",
                                "",
-                               ex.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "ASDC reading CSAR with workflows failed");             
+                               ex.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "ASDC reading CSAR with workflows failed");
                }
                return;
        }       
        
-       protected HttpResponse sendDeploymentRequest(String bpmnFileName) throws Exception {                                    
+       protected HttpResponse sendDeploymentRequest(String bpmnFileName) throws Exception {
                HttpClient client = HttpClientBuilder.create().build(); 
-               String deploymentUri = this.env.getProperty(CAMUNDA_URL) + CREATE_DEPLOYMENT_PATH;
+               URI deploymentUri = new URI(this.env.getProperty(CAMUNDA_URL) + CREATE_DEPLOYMENT_PATH);
                HttpPost post = new HttpPost(deploymentUri);
                RequestConfig requestConfig =
                                RequestConfig.custom().setSocketTimeout(1000000).setConnectTimeout(1000).setConnectionRequestTimeout(1000).build();
                post.setConfig(requestConfig);        
-               HttpEntity requestEntity = buildMimeMultipart(bpmnFileName);        
+               HttpEntity requestEntity = buildMimeMultipart(bpmnFileName);
                post.setEntity(requestEntity);
                return client.execute(post);
        }
        
        protected HttpEntity buildMimeMultipart(String bpmnFileName) throws Exception {
-               FileInputStream bpmnFileStream = new FileInputStream (System.getProperty("mso.config.path") + "/ASDC" + "/" + bpmnFileName);
+               FileInputStream bpmnFileStream = new FileInputStream (Paths.get(System.getProperty("mso.config.path"),"ASDC", bpmnFileName).normalize().toString());
 
                byte[] bytesToSend = IOUtils.toByteArray(bpmnFileStream);
-               HttpEntity requestEntity = MultipartEntityBuilder.create()                
+               HttpEntity requestEntity = MultipartEntityBuilder.create()
                                .addPart(FormBodyPartBuilder.create()
                                                .setName("deployment-name")
                                                .setBody(new StringBody("MSO Sample 1", ContentType.TEXT_PLAIN))
@@ -154,14 +158,19 @@ public class BpmnInstaller {
                 return requestEntity;
        }
        
-       protected void extractBpmnFileFromCsar(ZipInputStream zipIn, String fileName) throws IOException {
-               String filePath = System.getProperty("mso.config.path") + "/ASDC" + "/" + fileName;
-               BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath));
+       /* protected void extractBpmnFileFromCsar(ZipInputStream zipIn, String fileName) throws IOException */
+        protected void extractBpmnFileFromCsar(ZipInputStream zipIn, String fileName)  {
+               String filePath = Paths.get(System.getProperty("mso.config.path"), "ASDC", fileName).normalize().toString();
+               /* BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath)); */
+               try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath))){
                byte[] bytesIn = new byte[4096];
                int read = 0;
                while ((read = zipIn.read(bytesIn)) != -1) {
                        outputStream.write(bytesIn, 0, read);
                }
-               outputStream.close();
+               /* outputStream.close(); */
+               } catch (IOException e) {
+              LOGGER.error("Unable to open file.", e);
+        }
        }
 }
index c8f7f05..bde43b0 100644 (file)
@@ -59,12 +59,10 @@ import org.onap.so.db.catalog.beans.AllottedResource;
 import org.onap.so.db.catalog.beans.AllottedResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResource;
-import org.onap.so.db.catalog.beans.CollectionResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization;
 import org.onap.so.db.catalog.beans.ConfigurationResource;
 import org.onap.so.db.catalog.beans.ConfigurationResourceCustomization;
 import org.onap.so.db.catalog.beans.CvnfcCustomization;
-import org.onap.so.db.catalog.beans.ExternalServiceToInternalService;
 import org.onap.so.db.catalog.beans.HeatEnvironment;
 import org.onap.so.db.catalog.beans.HeatFiles;
 import org.onap.so.db.catalog.beans.HeatTemplate;
@@ -141,7 +139,6 @@ public class ToscaResourceInstaller {
 
        protected static final String MSO = "SO";
 
-
        @Autowired
        protected ServiceRepository serviceRepo;
        
@@ -275,9 +272,9 @@ public class ToscaResourceInstaller {
 
        @Transactional(rollbackFor = { ArtifactInstallerException.class })
        public void installTheResource(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStruct)
-                       throws ArtifactInstallerException {             
+                       throws ArtifactInstallerException {
                VfResourceStructure vfResourceStructure = vfResourceStruct;
-               extractHeatInformation(toscaResourceStruct, vfResourceStructure);       
+               extractHeatInformation(toscaResourceStruct, vfResourceStructure);
 
                // PCLO: in case of deployment failure, use a string that will represent
                // the type of artifact that failed...
@@ -286,21 +283,9 @@ public class ToscaResourceInstaller {
                        createToscaCsar(toscaResourceStruct);                   
                        createService(toscaResourceStruct, vfResourceStruct);                   
                        Service service = toscaResourceStruct.getCatalogService();                              
-                       List<NodeTemplate> vfNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceVfList();
-                       
-               
-                       for (NodeTemplate nodeTemplate : vfNodeTemplatesList) { 
-                               
-                               Metadata metadata = nodeTemplate.getMetaData();         
-                               String serviceType = toscaResourceStruct.getCatalogService().getServiceType();                  
-                               String vfCustomizationCategory = toscaResourceStruct.getSdcCsarHelper()
-                                               .getMetadataPropertyValue(metadata, SdcPropertyNames.PROPERTY_NAME_CATEGORY);
-                               processVfModules(toscaResourceStruct, vfResourceStructure, service, nodeTemplate, metadata,
-                                               vfCustomizationCategory);
-                       }
 
-                       List<NodeTemplate> allottedResourceList = toscaResourceStruct.getSdcCsarHelper().getAllottedResources();
-                       processAllottedResources(toscaResourceStruct, service, allottedResourceList);
+                       processVFResources(toscaResourceStruct, service, vfResourceStructure);
+                       processAllottedResources(toscaResourceStruct, service);
                        processNetworks(toscaResourceStruct, service);  
                        // process Network Collections
                        processNetworkCollections(toscaResourceStruct, service);
@@ -390,8 +375,9 @@ public class ToscaResourceInstaller {
         }
        }
 
-       protected void processAllottedResources(ToscaResourceStructure toscaResourceStruct, Service service,
-                       List<NodeTemplate> allottedResourceList) {
+       protected void processAllottedResources(ToscaResourceStructure toscaResourceStruct, Service service) {
+               List<NodeTemplate> allottedResourceList = toscaResourceStruct.getSdcCsarHelper().getAllottedResources();
+               
                if (allottedResourceList != null) {
                        for (NodeTemplate allottedNode : allottedResourceList) {                                                                        
                                service.getAllottedCustomizations()
@@ -463,60 +449,86 @@ public class ToscaResourceInstaller {
                service.getCollectionResourceCustomizations().add(toscaResourceStruct.getCatalogCollectionResourceCustomization());
        }
 
-       protected void processVfModules(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStructure,
-                       Service service, NodeTemplate nodeTemplate, Metadata metadata, String vfCustomizationCategory) throws Exception {
+
+       protected void processVFResources (ToscaResourceStructure toscaResourceStruct, Service service, VfResourceStructure vfResourceStructure)
+                       throws Exception{
+               logger.debug("processVFResources");
                
-               logger.debug("VF Category is : " + vfCustomizationCategory);
+               List<NodeTemplate> vfNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceVfList();
+//             String servicecategory = toscaResourceStruct.getCatalogService().getCategory();
+//             String serviceType = toscaResourceStruct.getCatalogService().getServiceType();
                
-               if(vfResourceStructure.getVfModuleStructure() != null && !vfResourceStructure.getVfModuleStructure().isEmpty())
-               {
-
-                       String vfCustomizationUUID = toscaResourceStruct.getSdcCsarHelper()
-                                       .getMetadataPropertyValue(metadata, SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
-                       logger.debug("VFCustomizationUUID=" + vfCustomizationUUID);     
+               for (NodeTemplate nodeTemplate : vfNodeTemplatesList) {
+                       Metadata metadata = nodeTemplate.getMetaData();
+                       String vfCustomizationCategory = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY);
+                       logger.debug("VF Category is : " + vfCustomizationCategory);
                        
-                       IResourceInstance vfNotificationResource = vfResourceStructure.getResourceInstance();           
-                       
-                       // Make sure the VF ResourceCustomizationUUID from the notification and tosca customizations match before comparing their VF Modules UUID's
-                       logger.debug("Checking if Notification VF ResourceCustomizationUUID: " + vfNotificationResource.getResourceCustomizationUUID() + 
-                                                  " matches Tosca VF Customization UUID: " +  vfCustomizationUUID);
-                       
-                       if(vfCustomizationUUID.equals(vfNotificationResource.getResourceCustomizationUUID())){
-                               
-                               logger.debug("vfCustomizationUUID: " + vfCustomizationUUID + " matches vfNotificationResource CustomizationUUID");
-                       
-                               VnfResourceCustomization vnfResource = createVnfResource(nodeTemplate, toscaResourceStruct, service);
+                       // Do not treat Allotted Resources as VNF resources
+                       if(ALLOTTED_RESOURCE.equalsIgnoreCase(vfCustomizationCategory)){
+                               continue;
+                       }
+
+                       String vfCustomizationUUID = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
+                       logger.debug("VFCustomizationUUID=" + vfCustomizationUUID);
+
+                       IResourceInstance vfNotificationResource = vfResourceStructure.getResourceInstance();
+
+                       // Make sure the VF ResourceCustomizationUUID from the notification and tosca
+                       // customizations match before comparing their VF Modules UUID's
+                       logger.debug("Checking if Notification VF ResourceCustomizationUUID: "
+                                       + vfNotificationResource.getResourceCustomizationUUID() + " matches Tosca VF Customization UUID: "
+                                       + vfCustomizationUUID);
+
+                       if (vfCustomizationUUID.equals(vfNotificationResource.getResourceCustomizationUUID())) {
+                               logger.debug("vfCustomizationUUID: " + vfCustomizationUUID
+                                               + " matches vfNotificationResource CustomizationUUID");                         
                                
-                               Set<CvnfcCustomization> existingCvnfcSet = new HashSet<CvnfcCustomization>(); 
-                               Set<VnfcCustomization> existingVnfcSet = new HashSet<VnfcCustomization>();
-                                                               
-                               for (VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) {
-                                       
-                                       logger.debug("vfModuleStructure:" + vfModuleStructure.toString());
-                                       List<org.onap.sdc.toscaparser.api.Group> vfGroups = toscaResourceStruct
-                                                       .getSdcCsarHelper().getVfModulesByVf(vfCustomizationUUID);
-                                       IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata();     
-                                       
-                                       logger.debug("Comparing Vf_Modules_Metadata CustomizationUUID : " + vfMetadata.getVfModuleModelCustomizationUUID());
-                                       
-                                       Optional<org.onap.sdc.toscaparser.api.Group> matchingObject = vfGroups.stream()
-                                                       .peek(group -> logger.debug("To Csar Group VFModuleModelCustomizationUUID " + group.getMetadata().getValue("vfModuleModelCustomizationUUID")))
-                                                   .filter(group -> group.getMetadata().getValue("vfModuleModelCustomizationUUID").equals(vfMetadata.getVfModuleModelCustomizationUUID()))
-                                                   .findFirst();
-                                       if(matchingObject.isPresent()){
-                                               VfModuleCustomization vfModuleCustomization = createVFModuleResource(matchingObject.get(), nodeTemplate, toscaResourceStruct, 
-                                                                                                                                                                                        vfResourceStructure,vfMetadata, vnfResource, service, existingCvnfcSet, existingVnfcSet);
-                                               vfModuleCustomization.getVfModule().setVnfResources(vnfResource.getVnfResources());
-                                       }else
-                                               throw new Exception("Cannot find matching VFModule Customization in Csar for Vf_Modules_Metadata: " + vfMetadata.getVfModuleModelCustomizationUUID());
-                                       
+                               processVfModules(toscaResourceStruct, vfResourceStructure, service, nodeTemplate, vfCustomizationUUID);
+                       }
+                       else {
+                               logger.debug("Notification VF ResourceCustomizationUUID: "
+                                               + vfNotificationResource.getResourceCustomizationUUID() + " doesn't match "
+                                               + "Tosca VF Customization UUID: " + vfCustomizationUUID);
+                       }
+               }
+       }
+       
+       
+       protected void processVfModules(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStructure,
+                       Service service, NodeTemplate nodeTemplate, String vfCustomizationUUID)
+                       throws Exception {
+               logger.debug("processVfModules for vfCustomizationUUID: " + vfCustomizationUUID);
+               
+               VnfResourceCustomization vnfResource = createVnfResource(nodeTemplate, toscaResourceStruct, service);
+               
+               if (vfResourceStructure.getVfModuleStructure() != null && !vfResourceStructure.getVfModuleStructure().isEmpty()) {
+                       Set<CvnfcCustomization> existingCvnfcSet = new HashSet<CvnfcCustomization>();
+                       Set<VnfcCustomization> existingVnfcSet = new HashSet<VnfcCustomization>();
+
+                       for (VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) {
+
+                               logger.debug("vfModuleStructure:" + vfModuleStructure.toString());
+                               List<org.onap.sdc.toscaparser.api.Group> vfGroups = toscaResourceStruct.getSdcCsarHelper()
+                                               .getVfModulesByVf(vfCustomizationUUID);
+                               IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata();
+
+                               logger.debug("Comparing Vf_Modules_Metadata CustomizationUUID : " + vfMetadata.getVfModuleModelCustomizationUUID());
+
+                               Optional<org.onap.sdc.toscaparser.api.Group> matchingObject = vfGroups.stream()
+                                               .peek(group -> logger.debug("To Csar Group VFModuleModelCustomizationUUID "     + group.getMetadata().getValue("vfModuleModelCustomizationUUID")))
+                                               .filter(group -> group.getMetadata().getValue("vfModuleModelCustomizationUUID").equals(vfMetadata.getVfModuleModelCustomizationUUID()))
+                                               .findFirst();
+                               if (matchingObject.isPresent()) {
+                                       VfModuleCustomization vfModuleCustomization = createVFModuleResource(matchingObject.get(), nodeTemplate, toscaResourceStruct, 
+                                                                                    vfResourceStructure, vfMetadata, vnfResource,service, existingCvnfcSet, existingVnfcSet);
+                                       vfModuleCustomization.getVfModule().setVnfResources(vnfResource.getVnfResources());
+                               } else {
+                                       throw new Exception("Cannot find matching VFModule Customization in Csar for Vf_Modules_Metadata: " + vfMetadata.getVfModuleModelCustomizationUUID());
                                }
-                               service.getVnfCustomizations().add(vnfResource);
-                       } else{
-                               logger.debug("Notification VF ResourceCustomizationUUID: " + vfNotificationResource.getResourceCustomizationUUID() + " doesn't match " +
-                                                    "Tosca VF Customization UUID: " +  vfCustomizationUUID);
                        }
                }
+
+               service.getVnfCustomizations().add(vnfResource);
        }
 
        public void processWatchdog(String distributionId, String servideUUID) {
@@ -1152,7 +1164,7 @@ public class ToscaResourceInstaller {
        }
        
        protected VnfcInstanceGroupCustomization createVNFCInstanceGroup(NodeTemplate vnfcNodeTemplate, Group group,
-                       VnfResourceCustomization vnfResourceCustomization) {
+                       VnfResourceCustomization vnfResourceCustomization, ToscaResourceStructure toscaResourceStructure) {
 
                        Metadata instanceMetadata = group.getMetadata();
                        // Populate InstanceGroup
@@ -1172,7 +1184,17 @@ public class ToscaResourceInstaller {
                        vfcInstanceGroupCustom.setModelCustomizationUUID(vnfResourceCustomization.getModelCustomizationUUID());
                        vfcInstanceGroupCustom.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
                        vfcInstanceGroupCustom.setDescription(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-                       vfcInstanceGroupCustom.setFunction("FUNCTION");
+                                               
+                       String getInputName = null;
+                       String groupProperty = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group, "vfc_instance_group_function"); 
+                       if (groupProperty != null) { 
+                       int getInputIndex = groupProperty.indexOf("{get_input="); 
+                               if (getInputIndex > -1) { 
+                                       getInputName = groupProperty.substring(getInputIndex+11, groupProperty.length()-1); 
+                               } 
+                       }
+                       vfcInstanceGroupCustom.setFunction(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vnfcNodeTemplate, getInputName));
+                       
                        vfcInstanceGroupCustom.setInstanceGroup(vfcInstanceGroup);
                        vfcInstanceGroupCustom.setVnfResourceCust(vnfResourceCustomization);            
                        
@@ -1595,7 +1617,7 @@ public class ToscaResourceInstaller {
                                
                        for (Group group : groupList) { 
                                
-                                       VnfcInstanceGroupCustomization vnfcInstanceGroupCustomization = createVNFCInstanceGroup(vfNodeTemplate, group, vnfResourceCustomization);
+                                       VnfcInstanceGroupCustomization vnfcInstanceGroupCustomization = createVNFCInstanceGroup(vfNodeTemplate, group, vnfResourceCustomization, toscaResourceStructure);
                                        
                                        vnfcInstanceGroupCustomizationRepo.saveAndFlush(vnfcInstanceGroupCustomization);                                
                        }                       
index c85bcd7..934aea8 100644 (file)
                        <version>1.2.4.RELEASE</version>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>org.assertj</groupId>
+                       <artifactId>assertj-core</artifactId>
+                       <version>3.11.1</version>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 </project>
index 8cc232c..8a8e412 100644 (file)
@@ -19,6 +19,9 @@
  */
 
 package org.onap.so.bpmn.common.scripts
+
+import org.onap.so.client.HttpClientFactory
+
 import java.util.regex.Matcher
 import java.util.regex.Pattern
 
@@ -88,7 +91,7 @@ class AaiUtil {
                String regionId = ""
                try{
                        URL Url = new URL(url)
-                       HttpClient client = new HttpClient(Url, MediaType.APPLICATION_XML, TargetEntity.AAI)
+                       HttpClient client = new HttpClientFactory().newXmlClient(Url, TargetEntity.AAI)
                        client.addBasicAuthHeader(UrnPropertiesReader.getVariable("aai.auth", execution), UrnPropertiesReader.getVariable("mso.msoKey", execution))
                        client.addAdditionalHeader("X-FromAppId", "MSO")
                        client.addAdditionalHeader("X-TransactionId", utils.getRequestID())
index f1eab66..df0dfae 100644 (file)
 
 package org.onap.so.bpmn.common.scripts
 
-import org.json.JSONObject;
-import org.json.JSONArray;
-import org.json.XML
-import org.onap.logging.ref.slf4j.ONAPLogConstants
-import org.onap.so.bpmn.core.UrnPropertiesReader;
-import org.springframework.web.util.UriUtils;
-
-import org.onap.so.bpmn.core.json.JsonUtils
-import org.onap.so.client.HttpClient
-import groovy.json.JsonBuilder
-import groovy.json.JsonSlurper
-import groovy.util.slurpersupport.GPathResult
-import groovy.xml.QName;
-
-import javax.ws.rs.core.MediaType
-import javax.ws.rs.core.Response
-import org.camunda.bpm.engine.delegate.DelegateExecution
-
-import org.onap.so.logger.MsoLogger;
-import org.onap.so.utils.TargetEntity
-import org.onap.so.logger.MessageEnum
-
-
-
-/***
- * Utilities for accessing Catalog DB Adapter to retrieve Networks, VNF/VFModules, AllottedResources and complete ServiceResources information
- *
- */
-
-class CatalogDbUtils {
-       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, CatalogDbUtils.class);
-
-
-       MsoUtils utils = new MsoUtils()
-       JsonUtils jsonUtils = new JsonUtils()
-       static private String defaultDbAdapterVersion = "v2"
-
-       public JSONArray getAllNetworksByServiceModelUuid(DelegateExecution execution, String serviceModelUuid) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByServiceModelUuid(DelegateExecution execution, String serviceModelUuid, String catalogUtilsVersion) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       networksList = responseJson.getJSONArray("serviceNetworks")
-                               }
-                               else {
-                                       networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid, String catalogUtilsVersion) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       networksList = responseJson.getJSONArray("serviceNetworks")
-                               }
-                               else {
-                                       networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion, String catalogUtilsVersion) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       networksList = responseJson.getJSONArray("serviceNetworks")
-                               }
-                               else {
-                                       networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByNetworkModelCustomizationUuid(DelegateExecution execution, String networkModelCustomizationUuid) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?networkModelCustomizationUuid=" + UriUtils.encode(networkModelCustomizationUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByNetworkModelCustomizationUuid(DelegateExecution execution, String networkModelCustomizationUuid, String catalogUtilsVersion) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?networkModelCustomizationUuid=" + UriUtils.encode(networkModelCustomizationUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       networksList = responseJson.getJSONArray("serviceNetworks")
-                               }
-                               else {
-                                       networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByNetworkType(DelegateExecution execution, String networkType) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?networkType=" + UriUtils.encode(networkType, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-       public JSONArray getAllNetworksByNetworkType(DelegateExecution execution, String networkType, String catalogUtilsVersion) {
-               JSONArray networksList = null
-               String endPoint = "/serviceNetworks?networkType=" + UriUtils.encode(networkType, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       networksList = responseJson.getJSONArray("serviceNetworks")
-                               }
-                               else {
-                                       networksList = parseNetworksJson(catalogDbResponse, "serviceNetworks", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return networksList
-       }
-
-
-       public JSONArray getAllVnfsByServiceModelUuid(DelegateExecution execution, String serviceModelUuid) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceVnfs?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllVnfsByServiceModelUuid(DelegateExecution execution, String serviceModelUuid, String catalogUtilsVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceVnfs?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray("serviceVnfs")
-                               }
-                               else {
-                                       vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllVnfsByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid) {
-               JSONArray vnfsList = null
-               String endPoint ="/serviceVnfs?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllVnfsByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid, String catalogUtilsVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceVnfs?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray("serviceVnfs")
-                               }
-                               else {
-                                       vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllVnfsByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion) {
-               JSONArray vnfsList = null
-               String endPoint =  "/serviceVnfs?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllVnfsByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion, String catalogUtilsVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceVnfs?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray("serviceVnfs")
-                               }
-                               else {
-                                       vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllVnfsByVnfModelCustomizationUuid(DelegateExecution execution, String vnfModelCustomizationUuid) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceVnfs?vnfModelCustomizationUuid=" + UriUtils.encode(vnfModelCustomizationUuid, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       /**
-        * This method gets a all vnfs for a particular
-        * service from the catalog database using the
-        * service model's model name.
-        *
-        * @param catalogDbEndpoint
-        * @param serviceModelModelName
-        * @return vnfsList      *
-        *
-        */
-       public JSONArray getAllVnfsByServiceModelModelName(DelegateExecution execution, String serviceModelModelName) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceVnfs?serviceModelName=" + UriUtils.encode(serviceModelModelName, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", defaultDbAdapterVersion)
-                       }
-               }catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-               return vnfsList
-       }
-
-       public JSONArray getAllVnfsByVnfModelCustomizationUuid(DelegateExecution execution, String vnfModelCustomizationUuid, String catalogUtilsVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceVnfs?vnfModelCustomizationUuid=" + UriUtils.encode(vnfModelCustomizationUuid, "UTF-8")
-               try {
-                       msoLogger.debug("ENDPOINT: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray("serviceVnfs")
-                               }
-                               else {
-                                       vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       /**
-        * This method gets a single vf module from
-        * the catalog database using the vf module's
-        * model name. It returns that vf module as
-        * a JSONObject
-        *
-        * @param catalogDbEndpoint
-        * @param vfModuleModelName
-        * @return vfModule
-        */
-       public JSONObject getVfModuleByVfModuleModelName(DelegateExecution execution, String vfModuleModelName) {
-               JSONObject vfModule = null
-               String endPoint = "/vfModules?vfModuleModelName=" + UriUtils.encode(vfModuleModelName, "UTF-8")
-               try{
-                       msoLogger.debug("Get VfModule By VfModule ModelName Endpoint is: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vfModule = parseVfModuleJson(catalogDbResponse, "vfModules", "v1")
-                       }
-               }
-               catch(Exception e){
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vfModule
-       }
-
-       /**
-        * This method gets a single vf module from
-        * the catalog database using the vf module's
-        * model name. It returns that vf module as
-        * a JSONObject
-        *
-        * @param catalogDbEndpoint
-        * @param vfModuleModelName
-        * @param catalogUtilsVersion
-        * @return vfModules
-        */
-       public JSONObject getVfModuleByVfModuleModelName(DelegateExecution execution, String vfModuleModelName, String catalogUtilsVersion)  {
-               JSONObject vfModule = null
-               String endPoint = "/vfModules?vfModuleModelName=" + UriUtils.encode(vfModuleModelName, "UTF-8")
-               try{
-                       msoLogger.debug("Get VfModule By VfModule ModelName Endpoint is: " + endPoint)
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vfModule = parseVfModuleJson(catalogDbResponse, "vfModules", "v1")
-                       }
-               }
-               catch(Exception e){
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vfModule
-       }
-
-
-       public JSONArray getAllottedResourcesByServiceModelUuid(DelegateExecution execution, String serviceModelUuid) {
-               JSONArray vnfsList = null
-               String endPoint = "/ServiceAllottedResources?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllottedResourcesByServiceModelUuid(DelegateExecution execution, String serviceModelUuid, String catalogUtilsVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/ServiceAllottedResources?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray("serviceAllottedResources")
-                               }
-                               else {
-                                       vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllottedResourcesByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceAllottedResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllottedResourcesByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid, String catalogUtilsVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceAllottedResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray()
-                               }
-                               else {
-                                       vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.getStackTrace());
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllottedResourcesByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceAllottedResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
-
-       public JSONArray getAllottedResourcesByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion, String catalogUtilsVersion) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceAllottedResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               if (!catalogUtilsVersion.equals("v1")) {
-                                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray("serviceAllottedResources")
-                               }
-                               else {
-                                       vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", catalogUtilsVersion)
-                               }
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return vnfsList
-       }
+import org.apache.commons.lang3.StringUtils
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.json.JSONArray
+import org.json.JSONObject
+import org.onap.logging.ref.slf4j.ONAPLogConstants
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
+import org.onap.so.logger.MessageEnum
+import org.onap.so.logger.MsoLogger
+import org.onap.so.utils.TargetEntity
+import org.springframework.web.util.UriUtils
 
+import javax.ws.rs.core.MediaType
+import javax.ws.rs.core.Response
 
-       public JSONArray getAllottedResourcesByArModelCustomizationUuid(DelegateExecution execution, String arModelCustomizationUuid) {
-               JSONArray vnfsList = null
-               String endPoint = "/serviceAllottedResources?serviceModelCustomizationUuid=" + UriUtils.encode(arModelCustomizationUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
+/***
+ * Utilities for accessing Catalog DB Adapter to retrieve Networks, VNF/VFModules, AllottedResources and complete ServiceResources information
+ *
+ */
 
-                       if (catalogDbResponse != null) {
-                               vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", "v1")
-                       }
+class CatalogDbUtils {
+       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, CatalogDbUtils.class);
 
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
+       private HttpClientFactory httpClientFactory
+       private MsoUtils msoUtils
+       private  JsonUtils jsonUtils
+       static private String defaultDbAdapterVersion = "v2"
 
-               return vnfsList
+       CatalogDbUtils(HttpClientFactory httpClientFactory, MsoUtils msoUtils, JsonUtils jsonUtils) {
+               this.httpClientFactory = httpClientFactory
+               this.msoUtils = msoUtils
+               this.jsonUtils = jsonUtils
        }
 
-       public JSONArray getAllottedResourcesByArModelCustomizationUuid(DelegateExecution execution, String arModelCustomizationUuid, String catalogUtilsVersion) {
+       public JSONArray getAllVnfsByVnfModelCustomizationUuid(DelegateExecution execution, String vnfModelCustomizationUuid, String catalogUtilsVersion) {
                JSONArray vnfsList = null
-               String endPoint = "/serviceAllottedResources?serviceModelCustomizationUuid=" + UriUtils.encode(arModelCustomizationUuid, "UTF-8")
+               String endPoint = "/serviceVnfs?vnfModelCustomizationUuid=" + UriUtils.encode(vnfModelCustomizationUuid, "UTF-8")
                try {
+                       msoLogger.debug("ENDPOINT: " + endPoint)
                        String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
 
                        if (catalogDbResponse != null) {
                                if (!catalogUtilsVersion.equals("v1")) {
                                        JSONObject responseJson = new JSONObject(catalogDbResponse)
-                                       vnfsList = responseJson.getJSONArray("serviceAllottedResources")
+                                       vnfsList = responseJson.getJSONArray("serviceVnfs")
                                }
                                else {
-                                       vnfsList = parseAllottedResourcesJson(catalogDbResponse, "serviceAllottedResources", catalogUtilsVersion)
+                                       vnfsList = parseVnfsJson(catalogDbResponse, "serviceVnfs", catalogUtilsVersion)
                                }
                        }
 
@@ -726,26 +82,6 @@ class CatalogDbUtils {
                return vnfsList
        }
 
-       public JSONObject getServiceResourcesByServiceModelUuid(DelegateExecution execution, String serviceModelUuid) {
-               JSONObject resources = null
-               String endPoint = "/serviceResources?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
-               try {
-                   String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                   if (catalogDbResponse != null) {
-
-                       resources = parseServiceResourcesJson(catalogDbResponse, "v1")
-                   }
-
-               }
-               catch (Exception e) {
-                   utils.log("ERROR", "Exception in Querying Catalog DB: " + e.message)
-                       throw e
-               }
-
-               return resources
-       }
-
        public JSONObject getServiceResourcesByServiceModelUuid(DelegateExecution execution, String serviceModelUuid, String catalogUtilsVersion) {
                JSONObject resources = null
                String endPoint = "/serviceResources?serviceModelUuid=" + UriUtils.encode(serviceModelUuid, "UTF-8")
@@ -762,27 +98,7 @@ class CatalogDbUtils {
                        }
                }
                catch (Exception e) {
-                       utils.log("ERROR", "Exception in Querying Catalog DB: " + e.message)
-                       throw e
-               }
-
-               return resources
-       }
-
-       public JSONObject getServiceResourcesByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid) {
-               JSONObject resources = null
-               String endPoint = "/serviceResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-
-                               resources = parseServiceResourcesJson(catalogDbResponse, "v1")
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
+                       msoUtils.log("ERROR", "Exception in Querying Catalog DB: " + e.message)
                        throw e
                }
 
@@ -790,23 +106,14 @@ class CatalogDbUtils {
        }
 
        public String getServiceResourcesByServiceModelInvariantUuidString(DelegateExecution execution, String serviceModelInvariantUuid) {
-               String resources = null
                String endPoint = "/serviceResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8")
                try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-
-                               resources = catalogDbResponse
-                       }
-
+                       return getResponseFromCatalogDb(execution, endPoint)
                }
                catch (Exception e) {
                        msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
                        throw e
                }
-
-               return resources
        }
 
        public JSONObject getServiceResourcesByServiceModelInvariantUuid(DelegateExecution execution, String serviceModelInvariantUuid, String catalogUtilsVersion) {
@@ -833,27 +140,6 @@ class CatalogDbUtils {
                return resources
        }
 
-
-       public JSONObject getServiceResourcesByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion) {
-               JSONObject resources = null
-               String endPoint = "/serviceResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
-               try {
-                       String catalogDbResponse = getResponseFromCatalogDb(execution, endPoint)
-
-                       if (catalogDbResponse != null) {
-                               //TODO this is wrong
-                               resources = parseServiceResourcesJson(catalogDbResponse)
-                       }
-
-               }
-               catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in Querying Catalog DB", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-                       throw e
-               }
-
-               return resources
-       }
-
        public JSONObject getServiceResourcesByServiceModelInvariantUuidAndServiceModelVersion(DelegateExecution execution, String serviceModelInvariantUuid, String serviceModelVersion, String catalogUtilsVersion) {
                JSONObject resources = null
                String endPoint = "/serviceResources?serviceModelInvariantUuid=" + UriUtils.encode(serviceModelInvariantUuid, "UTF-8") + "&serviceModelVersion=" + UriUtils.encode(serviceModelVersion, "UTF-8")
@@ -878,8 +164,6 @@ class CatalogDbUtils {
                return resources
        }
 
-
-
        private JSONArray parseNetworksJson (String catalogDbResponse, String arrayName, String catalogUtilsVersion) {
                JSONArray modelInfos = null
 
@@ -1004,58 +288,6 @@ class CatalogDbUtils {
                return modelInfos
        }
 
-       /**
-        * This method parses a Vf Module from the
-        * Vf Modules array
-        *
-        * @param catalogDbResponse
-        * @param arrayName
-        * @param catalogUtilsVersion
-        * @return vfModulelJson
-        */
-       private JSONObject parseVfModuleJson (String catalogDbResponse, String arrayName, String catalogUtilsVersion) {
-               JSONObject vfModulelJson = new JSONObject()
-               msoLogger.debug("Started Parse Vf Module Json")
-               try {
-                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                       JSONArray vfModules = responseJson.getJSONArray(arrayName)
-                       if(vfModules != null){
-                               JSONObject vfModuleInfo = new JSONObject()
-                               for (int i = 0; i < vfModules.length(); i++) {
-                                       JSONObject vfModule = vfModules.getJSONObject(i)
-                                       JSONObject vfModuleModelInfo = buildModelInfo("vfModule", vfModule, catalogUtilsVersion)
-                                       vfModulelJson.put("modelInfo", vfModuleModelInfo)
-                                       String vfModuleType = jsonUtils.getJsonValueForKey(vfModule, "type")
-                                       vfModulelJson.put("vfModuleType", vfModuleType)
-                                       switch(catalogUtilsVersion) {
-                                               case "v1":
-                                                       Integer isBase = jsonUtils.getJsonIntValueForKey(vfModule, "isBase")
-                                                       if (isBase.intValue() == 1) {
-                                                               vfModulelJson.put("isBase", "true")
-                                                       }
-                                                       else {
-                                                               vfModulelJson.put("isBase", "false")
-                                                       }
-                                                       break
-                                               default:
-                                                       boolean isBase = jsonUtils.getJsonBooleanValueForKey(vfModule, "isBase")
-                                                       vfModulelJson.put("isBase", isBase)
-                                                       break
-                                       }
-                                       String vfModuleLabel = jsonUtils.getJsonValueForKey(vfModule, "label")
-                                       vfModulelJson.put("vfModuleLabel", vfModuleLabel)
-                                       Integer initialCount = jsonUtils.getJsonIntValueForKey(vfModule, "initialCount")
-                                       vfModulelJson.put("initialCount", initialCount.intValue())
-                               }
-                       }
-                       msoLogger.debug("Completed Parsing Vf Module: " + vfModulelJson.toString())
-               }catch (Exception e){
-                       msoLogger.debug("Exception while parsing Vf Modules from Catalog DB Response: " + e.message)
-               }
-
-               return vfModulelJson
-       }
-
        private JSONArray parseAllottedResourcesJson (String catalogDbResponse, String arrayName, String catalogUtilsVersion) {
                JSONArray modelInfos = null
 
@@ -1108,37 +340,9 @@ class CatalogDbUtils {
                return modelInfos
        }
 
-       //TODO this is wrong
-       private JSONObject parseServiceResourcesJson (String catalogDbResponse) {
-               JSONObject serviceResources = new JSONObject()
-               String catalogUtilsVersion = "v1"
-
-               try {
-                       // Create array of jsons
-
-                       JSONObject responseJson = new JSONObject(catalogDbResponse)
-                       JSONObject serviceResourcesRoot = responseJson.getJSONObject("serviceResources")
-                       JSONArray vnfsArray = parseVnfsJson(serviceResourcesRoot.toString(), "vnfResources", catalogUtilsVersion)
-                       serviceResources.put("vnfs", vnfsArray)
-                       JSONArray networksArray = parseNetworksJson(serviceResourcesRoot.toString(), "networkResourceCustomization", catalogUtilsVersion)
-                       serviceResources.put("networks", networksArray)
-                       JSONArray allottedResourcesArray = parseAllottedResourcesJson(serviceResourcesRoot.toString(), "allottedResourceCustomization", catalogUtilsVersion)
-                       serviceResources.put("allottedResources", allottedResourcesArray)
-
-                       String serviceResourcesString = serviceResources.toString()
-                       msoLogger.debug("Returning serviceResources JSON: " + serviceResourcesString)
-
-               } catch (Exception e) {
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in parsing Catalog DB Response", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
-               }
-
-               return serviceResources
-       }
-
        private JSONObject parseServiceResourcesJson (String catalogDbResponse, String catalogUtilsVersion) {
                JSONObject serviceResources = new JSONObject()
                JSONObject serviceResourcesObject = new JSONObject()
-               String serviceResourcesString = ""
 
                try {
                        // Create array of jsons
@@ -1154,9 +358,7 @@ class CatalogDbUtils {
                        JSONArray allottedResourcesArray = parseAllottedResourcesJson(serviceResourcesRoot.toString(), "serviceAllottedResources", catalogUtilsVersion)
                        serviceResources.put("serviceAllottedResources", allottedResourcesArray)
                        serviceResourcesObject.put("serviceResources", serviceResources)
-
-                       serviceResourcesString = serviceResourcesObject.toString()
-                       msoLogger.debug("Returning serviceResources JSON: " + serviceResourcesString)
+                       msoLogger.debug("Returning serviceResources JSON: " + serviceResourcesObject.toString())
 
                } catch (Exception e) {
                        msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception in parsing Catalog DB Response", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.message);
@@ -1216,19 +418,12 @@ class CatalogDbUtils {
                        String catalogDbEndpoint = UrnPropertiesReader.getVariable("mso.catalog.db.endpoint",execution)
                        String queryEndpoint = catalogDbEndpoint + "/" + defaultDbAdapterVersion + endPoint
                        def responseData = ''
-                       def bpmnRequestId = UUID.randomUUID().toString()
-
-                       URL url = new URL(queryEndpoint)
-                       HttpClient client = new HttpClient(url, MediaType.APPLICATION_JSON, TargetEntity.CATALOG_DB)
-                       client.addAdditionalHeader(ONAPLogConstants.Headers.REQUEST_ID, bpmnRequestId)
+                       HttpClient client = httpClientFactory.newJsonClient(new URL(queryEndpoint), TargetEntity.CATALOG_DB)
+                       client.addAdditionalHeader(ONAPLogConstants.Headers.REQUEST_ID, UUID.randomUUID().toString())
                        client.addAdditionalHeader('X-FromAppId', "BPMN")
                        client.addAdditionalHeader('Accept', MediaType.APPLICATION_JSON)
                        String basicAuthCred = execution.getVariable("BasicAuthHeaderValueDB")
-                       if (basicAuthCred != null && !"".equals(basicAuthCred)) {
-                               client.addAdditionalHeader("Authorization", basicAuthCred)
-                       }else {
-                               client.addAdditionalHeader("Authorization", getBasicDBAuthHeader(execution))
-                       }
+                       client.addAdditionalHeader("Authorization", StringUtils.defaultIfEmpty(basicAuthCred, getBasicDBAuthHeader(execution)))
 
                        msoLogger.debug('sending GET to Catalog DB endpoint: ' + endPoint)
                        Response response = client.get()
@@ -1270,7 +465,7 @@ class CatalogDbUtils {
                        }
                }
                catch (Exception e) {
-                       utils.log("ERROR", "Exception in Querying Catalog DB: " + e.message)
+                       msoUtils.log("ERROR", "Exception in Querying Catalog DB: " + e.message)
                        throw e
                }
 
@@ -1282,13 +477,13 @@ class CatalogDbUtils {
                String encodedString = null
                try {
                        String basicAuthValueDB = UrnPropertiesReader.getVariable("mso.adapters.db.auth", execution)
-                       utils.log("DEBUG", " Obtained BasicAuth userid password for Catalog DB adapter: " + basicAuthValueDB)
+                       msoUtils.log("DEBUG", " Obtained BasicAuth userid password for Catalog DB adapter: " + basicAuthValueDB)
 
-                       encodedString = utils.getBasicAuth(basicAuthValueDB, UrnPropertiesReader.getVariable("mso.msoKey", execution))
+                       encodedString = msoUtils.getBasicAuth(basicAuthValueDB, UrnPropertiesReader.getVariable("mso.msoKey", execution))
                        execution.setVariable("BasicAuthHeaderValueDB",encodedString)
                } catch (IOException ex) {
                        String dataErrorMessage = " Unable to encode Catalog DB user/password string - " + ex.getMessage()
-                       utils.log("ERROR", dataErrorMessage)
+                       msoUtils.log("ERROR", dataErrorMessage)
                }
                return encodedString
        }
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CatalogDbUtilsFactory.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CatalogDbUtilsFactory.groovy
new file mode 100644 (file)
index 0000000..faa0037
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 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.so.bpmn.common.scripts
+
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.client.HttpClientFactory
+
+public class CatalogDbUtilsFactory {
+
+    CatalogDbUtils create() {
+        return new CatalogDbUtils(new HttpClientFactory(), new MsoUtils(), new JsonUtils())
+    }
+}
index c309c3b..f4e7926 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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
  */
 
 package org.onap.so.bpmn.common.scripts
+
+import joptsimple.internal.Strings
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.springframework.http.HttpStatus
+
 import javax.ws.rs.core.UriBuilder
 
 import org.camunda.bpm.engine.delegate.DelegateExecution
@@ -33,8 +40,12 @@ import org.onap.so.logger.MsoLogger
 public class ConfirmVolumeGroupName extends AbstractServiceTaskProcessor{
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, ConfirmVolumeGroupName.class);
 
-       def Prefix="CVGN_"
-       ExceptionUtil exceptionUtil = new ExceptionUtil()
+       def static final Prefix = "CVGN_"
+       private final ExceptionUtil exceptionUtil
+
+       ConfirmVolumeGroupName(ExceptionUtil exceptionUtil) {
+               this.exceptionUtil = exceptionUtil
+       }
 
        public void initProcessVariables(DelegateExecution execution) {
                execution.setVariable("prefix",Prefix)
@@ -74,40 +85,39 @@ public class ConfirmVolumeGroupName extends AbstractServiceTaskProcessor{
                try {
                        Optional<VolumeGroup> volumeGroupOp = getAAIClient().get(VolumeGroup.class,  resourceUri)
             if(volumeGroupOp.isPresent()){
-                execution.setVariable("CVGN_queryVolumeGroupResponseCode", 200)
+                execution.setVariable("CVGN_queryVolumeGroupResponseCode", HttpStatus.OK.value())
                 execution.setVariable("CVGN_queryVolumeGroupResponse", volumeGroupOp.get())
             }else{
-                execution.setVariable("CVGN_queryVolumeGroupResponseCode", 404)
+                execution.setVariable("CVGN_queryVolumeGroupResponseCode", HttpStatus.NOT_FOUND.value())
                 execution.setVariable("CVGN_queryVolumeGroupResponse", "Volume Group not Found!")
             }
                } catch (Exception ex) {
                        msoLogger.debug("Exception occurred while executing AAI GET:" + ex.getMessage())
-                       execution.setVariable("CVGN_queryVolumeGroupResponseCode", 500)
+                       execution.setVariable("CVGN_queryVolumeGroupResponseCode", HttpStatus.INTERNAL_SERVER_ERROR.value())
                        execution.setVariable("CVGN_queryVolumeGroupResponse", "AAI GET Failed:" + ex.getMessage())
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, "AAI GET Failed")
+                       exceptionUtil.buildAndThrowWorkflowException(execution, HttpStatus.INTERNAL_SERVER_ERROR.value(), "AAI GET Failed")
                }
        }
 
        // process the result from queryAAIVolumeGroupId()
 
        public void checkAAIQueryResult(DelegateExecution execution) {
-               def result = execution.getVariable("CVGN_queryVolumeGroupResponse")
-
         def actualVolumeGroupName = ""
-        if (execution.getVariable("CVGN_queryVolumeGroupResponseCode") == 404) {
+        if (execution.getVariable("CVGN_queryVolumeGroupResponseCode") == HttpStatus.NOT_FOUND.value()) {
                        msoLogger.debug('volumeGroupId does not exist in AAI')
                }
-               else if (execution.getVariable("CVGN_queryVolumeGroupResponseCode") == 200) {
+               else if (execution.getVariable("CVGN_queryVolumeGroupResponseCode") == HttpStatus.OK.value()) {
             VolumeGroup volumeGroup = execution.getVariable("CVGN_queryVolumeGroupResponse")
-            if(volumeGroup.getVolumeGroupName()!=null){
+
+            if (!Strings.isNullOrEmpty(volumeGroup.getVolumeGroupName())) {
                 actualVolumeGroupName =  volumeGroup.getVolumeGroupName()
-            }
-                       msoLogger.debug("volumeGroupId exists in AAI")
+                               msoLogger.debug("volumeGroupId exists in AAI")
+                       }
                }
                execution.setVariable("CVGN_volumeGroupNameMatches", false)
                def volumeGroupName = execution.getVariable("CVGN_volumeGroupName")
 
-               if (volumeGroupName.equals(actualVolumeGroupName)) {
+               if (!actualVolumeGroupName.isEmpty() && volumeGroupName.equals(actualVolumeGroupName)) {
                        msoLogger.debug('Volume Group Name Matches AAI records')
                        execution.setVariable("CVGN_volumeGroupNameMatches", true)
                }
@@ -121,8 +131,8 @@ public class ConfirmVolumeGroupName extends AbstractServiceTaskProcessor{
 
        // generates a WorkflowException if the volume group name does not match AAI record for this volume group
        public void handleVolumeGroupNameNoMatch(DelegateExecution execution) {
-               def errorNotAssociated = "Error occurred - volume group id " + execution.getVariable("CVGN_volumeGroupId") +
-                       " is not associated with  " + execution.getVariable("CVGN_volumeGroupName")
+               def errorNotAssociated = "Error occurred - volume group id ${execution.getVariable('CVGN_volumeGroupId')} " +
+                               "is not associated with ${execution.getVariable('CVGN_volumeGroupName')}"
                msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, errorNotAssociated, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "");
                exceptionUtil.buildAndThrowWorkflowException(execution, 1002, errorNotAssociated)
        }
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP - SO
  * ================================================================================
- * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 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.
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.restproperties;
+package org.onap.so.bpmn.common.scripts
 
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
+import org.onap.so.bpmn.common.scripts.ConfirmVolumeGroupName
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
 
-@Service
-public class AaiPropertiesConfiguration {
+public class ConfirmVolumeGroupNameFactory {
 
-       @Value("${aai.endpoint}")
-       private String endpoint;
-
-       @Value("${aai.auth}")
-       private String auth;
-
-       public String getEndpoint() {
-               return endpoint;
-       }
-
-       public String getAuth() {
-               return auth;
-       }
+    ConfirmVolumeGroupName create() {
+        return  new ConfirmVolumeGroupName(new ExceptionUtil());
+    }
 }
index 739bc4b..1c1d5eb 100644 (file)
@@ -20,9 +20,6 @@
 
 package org.onap.so.bpmn.common.scripts
 
-import static org.apache.commons.lang3.StringUtils.*;
-
-import org.apache.commons.lang3.*
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.json.JSONObject;
@@ -56,7 +53,7 @@ public class DecomposeService extends AbstractServiceTaskProcessor {
 
        String Prefix="DDS_"
        ExceptionUtil exceptionUtil = new ExceptionUtil()
-       CatalogDbUtils catalogDbUtils = new CatalogDbUtils()
+       CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
        JsonUtils jsonUtils = new JsonUtils()
 
        public void preProcessRequest (DelegateExecution execution) {
index 4b701e6..e132b41 100644 (file)
@@ -293,7 +293,7 @@ class ExceptionUtil extends AbstractServiceTaskProcessor {
                execution.setVariable("WorkflowException", exception);
                msoLogger.debug("Outgoing WorkflowException is " + exception)
                msoLogger.debug("Throwing MSOWorkflowException")
-               throw new BpmnError("MSOWorkflowException")
+               throw new BpmnError(errorCode.toString(), String.format("MSOWorkflowException: %s", errorMessage))
        }
 
        /**
index 5c935e9..94c82f5 100644 (file)
  */
 
 package org.onap.so.bpmn.common.scripts
-import org.camunda.bpm.engine.delegate.BpmnError
+
+
 import org.camunda.bpm.engine.delegate.DelegateExecution
-import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor;
+import org.onap.logging.ref.slf4j.ONAPLogConstants
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
 import org.onap.so.logger.MsoLogger
-import org.apache.commons.lang3.StringEscapeUtils
-import java.util.regex.Matcher
-import java.util.regex.Pattern
+import org.onap.so.utils.TargetEntity
 
 import javax.ws.rs.core.MediaType
 import javax.ws.rs.core.Response
-import org.onap.so.utils.TargetEntity
+import java.util.regex.Matcher
+import java.util.regex.Pattern
 
 class ExternalAPIUtil {
 
        String Prefix="EXTAPI_"
 
-       public MsoUtils utils = new MsoUtils()
-
-       ExceptionUtil exceptionUtil = new ExceptionUtil()
-
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, ExternalAPIUtil.class)
 
+       private final HttpClientFactory httpClientFactory;
+       private final MsoUtils utils;
+       private final ExceptionUtil exceptionUtil;
+
        public static final String PostServiceOrderRequestsTemplate =
        "{\n" +
        "\t\"externalId\": <externalId>,\n" +
@@ -85,7 +86,10 @@ class ExternalAPIUtil {
     "\t} \n" +
     "}"
 
-       public ExternalAPIUtil() {
+       ExternalAPIUtil(HttpClientFactory httpClientFactory, MsoUtils utils, ExceptionUtil exceptionUtil) {
+               this.httpClientFactory = httpClientFactory
+               this.utils = utils
+               this.exceptionUtil = exceptionUtil
        }
 
 //     public String getUri(DelegateExecution execution, resourceName) {
@@ -137,8 +141,7 @@ class ExternalAPIUtil {
                        msoLogger.debug( "Generated uuid is: " + uuid)
                        msoLogger.debug( "URL to be used is: " + url)
 
-                       URL Url = new URL(url)
-                       HttpClient client = new HttpClient(Url, MediaType.APPLICATION_JSON, TargetEntity.EXTERNAL)
+                       HttpClient client = httpClientFactory.newJsonClient(new URL(url), TargetEntity.EXTERNAL)
                        client.addBasicAuthHeader(execution.getVariable("URN_externalapi_auth"), execution.getVariable("URN_mso_msoKey"))
                        client.addAdditionalHeader("X-FromAppId", "MSO")
                        client.addAdditionalHeader(ONAPLogConstants.Headers.REQUEST_ID, uuid)
@@ -166,17 +169,15 @@ class ExternalAPIUtil {
         * @return Response
         *
         */
-       public Response executeExternalAPIPostCall(DelegateExecution execution, String urlString, String payload){
+       public Response executeExternalAPIPostCall(DelegateExecution execution, String url, String payload){
                msoLogger.debug( " ======== Started Execute ExternalAPI Post Process ======== ")
                Response apiResponse = null
                try{
                        String uuid = utils.getRequestID()
                        msoLogger.debug( "Generated uuid is: " + uuid)
-                       msoLogger.debug( "URL to be used is: " + urlString)
-
-                       URL url = new URL(urlString);
+                       msoLogger.debug( "URL to be used is: " + url)
 
-                       HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.AAI)
+                       HttpClient httpClient = httpClientFactory.newJsonClient(new URL(url), TargetEntity.AAI)
                        httpClient.addBasicAuthHeader(execution.getVariable("URN_externalapi_auth"), execution.getVariable("URN_mso_msoKey"))
                        httpClient.addAdditionalHeader("X-FromAppId", "MSO")
                        httpClient.addAdditionalHeader("X-TransactionId", uuid)
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ExternalAPIUtilFactory.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ExternalAPIUtilFactory.groovy
new file mode 100644 (file)
index 0000000..e7f4646
--- /dev/null
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 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.so.bpmn.common.scripts
+
+import org.onap.so.client.HttpClientFactory
+
+class ExternalAPIUtilFactory {
+
+    ExternalAPIUtil create() {
+        return new ExternalAPIUtil(new HttpClientFactory(), new MsoUtils(), new ExceptionUtil())
+    }
+}
index c961dd0..1be24c4 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.bpmn.common.scripts
 
 import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.client.HttpClientFactory
 
 import java.io.Serializable;
 
@@ -86,7 +87,8 @@ public class GenerateVfModuleName extends AbstractServiceTaskProcessor{
                        msoLogger.debug("AAI endPoint: " + endPoint)
 
                        try {
-                               HttpClient client = new HttpClient(new URL(endPoint), MediaType.APPLICATION_XML, TargetEntity.AAI)
+                               HttpClient client = new HttpClientFactory().newXmlClient(new URL(endPoint), TargetEntity.AAI)
+
                                client.addAdditionalHeader('X-TransactionId', UUID.randomUUID().toString())
                                client.addAdditionalHeader('X-FromAppId', 'MSO')
                                client.addAdditionalHeader('Content-Type', 'application/xml')
index f9ddd0d..2f240fb 100644 (file)
@@ -287,14 +287,6 @@ class MsoUtils {
                        return null
                }
        }
-       def getRelationshipVal(node, name){
-               try{
-                       return node.'**'.find {it.'relationship-key'.text() == name}.'relationship-value'.text()
-               }catch(Exception e){
-                       return null
-               }
-       }
-
        
        def log(logmode,logtxt,isDebugLogEnabled="false"){
                if ("INFO"==logmode) {
index 27d067d..23231df 100644 (file)
@@ -22,11 +22,12 @@ package org.onap.so.bpmn.common.scripts
 
 import groovy.xml.XmlUtil
 import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.HostRoute
 import org.onap.aai.domain.yang.L3Network
+import org.onap.aai.domain.yang.SegmentationAssignment
 import org.onap.aai.domain.yang.Subnet
 import org.onap.aai.domain.yang.Subnets
 import org.onap.so.bpmn.core.UrnPropertiesReader
-import org.onap.so.logger.MsoLogger
 import org.w3c.dom.Document
 import org.w3c.dom.Element
 import org.w3c.dom.Node
@@ -44,8 +45,6 @@ import javax.xml.transform.stream.StreamResult
  * This groovy class supports the any Network processes that need the methods defined here.
  */
 class NetworkUtils {
-       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NetworkUtils.class);
-
 
        public MsoUtils utils = new MsoUtils()
        private AbstractServiceTaskProcessor taskProcessor
@@ -282,187 +281,6 @@ class NetworkUtils {
 
        }
 
-       /**
-        * This method returns the string for Create Volume Request payload
-        * @param groupId the volume-group-id
-        * @param volumeName the volume-group-name
-        * @param vnfType the vnf-type
-        * @param tenantId the value of relationship-key 'tenant.tenant-id'
-        * @return String request payload
-        */
-       def String CreateNetworkVolumeRequest(groupId, volumeName, vnfType, tenantId) {
-
-               String requestPayload =
-               """<volume-group xmlns="http://org.onap.so/v6">
-                               <volume-group-id>${MsoUtils.xmlEscape(groupId)}</volume-group-id>
-                               <volume-group-name>${MsoUtils.xmlEscape(volumeName)}</volume-group-name>
-                               <heat-stack-id></heat-stack-id>
-                               <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
-                               <orchestration-status>Pending</orchestration-status>
-                               <relationship-list>
-                                  <relationship>
-                                          <related-to>tenant</related-to>
-                                          <relationship-data>
-                                                  <relationship-key>tenant.tenant-id</relationship-key>
-                                                  <relationship-value>${MsoUtils.xmlEscape(tenantId)}</relationship-value>
-                                          </relationship-data>
-                                  </relationship>
-                          </relationship-list>
-                  </volume-group>"""
-
-               return requestPayload
-       }
-
-       /**
-        * This method returns the string for Update Volume Request payload
-        * @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
-         * @param heatStackId the value of heat stack id
-        * @return String request payload
-        */
-       def String updateCloudRegionVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId, namespace, modelCustomizationId) {
-               String requestPayload = ""
-               if (requeryAAIVolGrpNameResponse != null) {
-                       def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
-                       def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
-                       def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
-                       def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
-                       def relationshipList = ""
-                       if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
-                               relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
-                       }
-
-                       requestPayload =
-                               """<volume-group xmlns="${namespace}">
-                                       <volume-group-id>${MsoUtils.xmlEscape(groupId)}</volume-group-id>
-                                       <volume-group-name>${MsoUtils.xmlEscape(volumeName)}</volume-group-name>
-                                       <heat-stack-id>${MsoUtils.xmlEscape(heatStackId)}</heat-stack-id>
-                                       <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
-                                       <orchestration-status>Active</orchestration-status>
-                                       <resource-version>${MsoUtils.xmlEscape(resourceVersion)}</resource-version>
-                                       <vf-module-model-customization-id>${MsoUtils.xmlEscape(modelCustomizationId)}</vf-module-model-customization-id>
-                                       ${relationshipList}
-                                </volume-group>"""
-               }
-
-               return requestPayload
-       }
-
-
-       /**
-        * This method returns the string for Update Volume Request payload
-        * @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
-        * @param heatStackId the value of heat stack id
-        * @return String request payload
-        */
-       def String UpdateNetworkVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId) {
-               String requestPayload = ""
-               if (requeryAAIVolGrpNameResponse != null) {
-                       def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
-                       def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
-                       def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
-                       def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
-                       def relationshipList = ""
-                       if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
-                               relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
-                       }
-
-                       requestPayload =
-                               """<volume-group xmlns="http://org.onap.so/v6">
-                                       <volume-group-id>${MsoUtils.xmlEscape(groupId)}</volume-group-id>
-                                       <volume-group-name>${MsoUtils.xmlEscape(volumeName)}</volume-group-name>
-                                       <heat-stack-id>${MsoUtils.xmlEscape(heatStackId)}</heat-stack-id>
-                                       <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
-                                       <orchestration-status>Active</orchestration-status>
-                                       <resource-version>${MsoUtils.xmlEscape(resourceVersion)}</resource-version>
-                                       ${relationshipList}
-                                </volume-group>"""
-               }
-
-               return requestPayload
-       }
-
-       /**
-        * This method returns the string for Create Contrail Network payload
-        * @param requeryIdAAIResponse the response from AAI query by id
-        * @param createNetworkResponse the response of create network
-        * @return String contrailNetworkCreatedUpdate
-        */
-       def ContrailNetworkCreatedUpdate(requeryIdAAIResponse, createNetworkResponse, schemaVersion) {
-
-               String contrailNetworkCreatedUpdate = ""
-               if(requeryIdAAIResponse!=null && createNetworkResponse!=null) {
-
-                       def l3Network = utils.getNodeXml(requeryIdAAIResponse, "l3-network", false).replace("tag0:","").replace(":tag0","")
-                       def createNetworkContrailResponse = ""
-                       if (utils.nodeExists(createNetworkResponse, 'createNetworkResponse')) {
-                          createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "createNetworkResponse", false).replace("tag0:","").replace(":tag0","")
-                       } else {
-                          createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "updateNetworkContrailResponse", false).replace("tag0:","").replace(":tag0","")
-                       }
-
-                       // rebuild network
-                       def networkList = ["network-id", "network-name", "network-type", "network-role", "network-technology", "neutron-network-id", "is-bound-to-vpn", "service-id", "network-role-instance", "resource-version", "resource-model-uuid", "orchestration-status", "heat-stack-id", "mso-catalog-key", "contrail-network-fqdn",
-                                                            "physical-network-name", "is-provider-network", "is-shared-network", "is-external-network"]
-                       String rebuildNetworkElements = buildNetworkElements(l3Network, createNetworkContrailResponse, networkList)
-
-                       // rebuild 'subnets'
-                       def rebuildSubnetList = ""
-                       if (utils.nodeExists(requeryIdAAIResponse, 'subnet')) {
-                            rebuildSubnetList = buildSubnets(requeryIdAAIResponse, createNetworkResponse)
-                       }
-
-                       // rebuild 'segmentation-assignments'
-                       def rebuildSegmentationAssignments = ""
-                       if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignments')) {
-                               List elementList = ["segmentation-id", "resource-version"]
-                               if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignment')) {  // new tag
-                                   rebuildSegmentationAssignments =  buildXMLElements(requeryIdAAIResponse, "segmentation-assignments", "segmentation-assignment", elementList)
-                               } else {
-                                  rebuildSegmentationAssignments =  buildXMLElements(requeryIdAAIResponse, "", "segmentation-assignments", elementList)
-                               }
-                       }
-
-                       // rebuild 'ctag-assignments' / rebuildCtagAssignments
-                       def rebuildCtagAssignmentsList = ""
-                       if (utils.nodeExists(requeryIdAAIResponse, 'ctag-assignment')) {
-                               rebuildCtagAssignmentsList = rebuildCtagAssignments(requeryIdAAIResponse)
-                       }
-
-                       // rebuild 'relationship'
-                       def relationshipList = ""
-                       if (utils.nodeExists(requeryIdAAIResponse, 'relationship-list')) {
-                               String rootRelationshipData = getFirstNodeXml(requeryIdAAIResponse, "relationship-list").drop(38).trim().replace("tag0:","").replace(":tag0","")
-                               if (utils.nodeExists(rootRelationshipData, 'relationship')) {
-                                       relationshipList = rebuildRelationship(rootRelationshipData)
-                               }
-                       }
-
-                       //Check for optional contrail network fqdn within CreateNetworkResponse
-                       String contrailNetworkFQDN
-                       if(utils.nodeExists(createNetworkResponse, "contrail-network-fqdn")){
-                               contrailNetworkFQDN = utils.getNodeXml(createNetworkResponse, "contrail-network-fqdn")
-                               contrailNetworkFQDN = utils.removeXmlNamespaces(contrailNetworkFQDN)
-                               contrailNetworkFQDN = utils.removeXmlPreamble(contrailNetworkFQDN)
-                       }else{
-                               contrailNetworkFQDN = ""
-                       }
-
-                       contrailNetworkCreatedUpdate =
-                                """<l3-network xmlns="${schemaVersion}">
-                                               ${rebuildNetworkElements}
-                                               ${rebuildSubnetList}
-                                               ${rebuildSegmentationAssignments}
-                                               ${rebuildCtagAssignmentsList}
-                                               ${relationshipList}
-                                               ${contrailNetworkFQDN}
-                                     </l3-network>""".trim()
-
-               }
-                       return contrailNetworkCreatedUpdate
-       }
-
-
-
        /**
         * This method returns the value for the name paramName.
         *   Ex:   <network-params>
@@ -487,34 +305,6 @@ class NetworkUtils {
                }
        }
 
-       /**
-        * This method returns the name of param if found/match with paramName.
-        *   Ex:   <network-params>
-        *            <param name="shared">1</param>
-        *            <param name="external">0</external>
-        *         </network-params>
-        *
-        * @param xmlInput the XML document
-        * @param paramName the param name (ex: 'shared', )
-        * @return a param name for 'shared' (ex: 'shared' if found)
-        */
-       def getParameterName(xmlInput, paramName) {
-               def rtn=""
-               if(xmlInput!=null){
-                       def xml= new XmlSlurper().parseText(xmlInput)
-                       try {
-                               rtn= xml.'**'.find {param->param.'@name' == paramName}.'@name'
-                       } catch (Exception ex) {
-                           rtn=""
-                       }
-               }
-               if (rtn==null || rtn=="") {
-                       return ""
-               } else {
-                  return rtn
-               }
-       }
-
        /**
         * This method returns the networkParams xml string.
         *   Ex: input:
@@ -553,222 +343,8 @@ class NetworkUtils {
                return build
        }
 
-       def getVlans(xmlInput) {
-               def rtn = ""
-               if (xmlInput!=null) {
-                       def vlansList = getListWithElements(xmlInput, 'vlans')
-                       def vlansListSize = vlansList.size()
-                       if (vlansListSize > 0) {
-                               for (i in 0..vlansListSize-1) {
-                                  rtn += '<vlans>'+vlansList[i]+'</vlans>'
-                               }
-                       }
-               }
-               return rtn
-
-
-       }
-
-       /**
-        * This method returns the uri value for the vpn bindings.
-        * Return the a list of value of vpn binding in the <related-link> string.
-        * Ex.
-        *   <relationship-list>
-        *      <relationship>
-        *          <related-to>vpn-binding</related-to>
-        *          <related-link>https://aai-app-e2e.test.openecomp.com:8443/aai/v6/network/vpn-bindings/vpn-binding/85f015d0-2e32-4c30-96d2-87a1a27f8017/</related-link>
-        *          <relationship-data>
-        *             <relationship-key>vpn-binding.vpn-id</relationship-key>
-        *             <relationship-value>85f015d0-2e32-4c30-96d2-87a1a27f8017</relationship-value>
-        *          </relationship-data>
-        *       </relationship>
-        *              <relationship>
-        *              <related-to>vpn-binding</related-to>
-        *                      <related-link>https://aai-ext1.test.openecomp.com:8443/aai/v6/network/vpn-bindings/vpn-binding/24a4b507-853a-4a38-99aa-05fcc54be24d/</related-link>
-        *                      <relationship-data>
-        *                         <relationship-key>vpn-binding.vpn-id</relationship-key>
-        *                         <relationship-value>24a4b507-853a-4a38-99aa-05fcc54be24d</relationship-value>
-        *                  </relationship-data>
-        *                      <related-to-property>
-        *                        <property-key>vpn-binding.vpn-name</property-key>
-        *                        <property-value>oam_protected_net_6_MTN5_msotest1</property-value>
-        *                      </related-to-property>
-        *              </relationship>
-        * @param xmlInput the XML document
-        * @return a list of vpn binding values
-        *            ex: ['aai/v6/network/vpn-bindings/vpn-binding/85f015d0-2e32-4c30-96d2-87a1a27f8017/', 'aai/v6/network/vpn-bindings/vpn-binding/c980a6ef-3b88-49f0-9751-dbad8608d0a6/']
-        *
-        **/
-       def getVnfBindingObject(xmlInput) {
-               //def rtn = null
-               List rtn = []
-               if (xmlInput!=null) {
-                       def relationshipList = getListWithElements(xmlInput, 'relationship')
-                       def relationshipListSize = relationshipList.size()
-                       if (relationshipListSize > 0) {
-                               for (i in 0..relationshipListSize-1) {
-                                  def relationshipXml = XmlUtil.serialize(relationshipList[i])
-                                  if (utils.getNodeText(relationshipXml, 'related-to') == "vpn-binding") {
-                                         def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
-                                         if (relatedLink != null || relatedLink != "") {
-                                                rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
-                                         }
-                                  }
-                               }
-                       }
-               }
-               return rtn
-       }
-       /**
-        * similar to VNF bindings method
-       * @param xmlInput the XML document
-       * @return a list of network policy values
-       *            ex: ['aai/v$/network/network-policies/network-policy/cee6d136-e378-4678-a024-2cd15f0ee0cg', 'aai/v$/network/network-policies/network-policy/cee6d136-e378-4678-a024-2cd15f0ee0cg']
-       *
-       **/
-       def getNetworkPolicyObject(xmlInput) {
-               //def rtn = null
-               List rtn = []
-               if (xmlInput!=null) {
-                       def relationshipList = getListWithElements(xmlInput, 'relationship')
-                       def relationshipListSize = relationshipList.size()
-                       if (relationshipListSize > 0) {
-                               for (i in 0..relationshipListSize-1) {
-                                  def relationshipXml = XmlUtil.serialize(relationshipList[i])
-                                  if (utils.getNodeText(relationshipXml, 'related-to') == "network-policy") {
-                                         def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
-                                         if (relatedLink != null || relatedLink != "") {
-                                                rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
-                                         }
-                                  }
-                               }
-                       }
-               }
-               return rtn
-       }
-
-       /**
-        * similar to network policymethod
-       * @param xmlInput the XML document
-       * @return a list of network policy values
-       *            ex: ['aai/v$/network/route-table-references/route-table-reference/refFQDN1', 'aai/v$/network/route-table-references/route-table-reference/refFQDN2']
-       *
-       **/
-       def getNetworkTableRefObject(xmlInput) {
-               //def rtn = null
-               List rtn = []
-               if (xmlInput!=null) {
-                       def relationshipList = getListWithElements(xmlInput, 'relationship')
-                       def relationshipListSize = relationshipList.size()
-                       if (relationshipListSize > 0) {
-                               for (i in 0..relationshipListSize-1) {
-                                  def relationshipXml = XmlUtil.serialize(relationshipList[i])
-                                  if (utils.getNodeText(relationshipXml, 'related-to') == "route-table-reference") {
-                                         def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
-                                         if (relatedLink != null || relatedLink != "") {
-                                                rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
-                                         }
-                                  }
-                               }
-                       }
-               }
-               return rtn
-       }
-
-       /**
-        * similar to network policymethod
-       * @param xmlInput the XML document
-       * @return a list of IDs for related VNF instances
-       *
-       **/
-       def getRelatedVnfIdList(xmlInput) {
-               //def rtn = null
-               List rtn = []
-               if (xmlInput!=null) {
-                       def relationshipList = getListWithElements(xmlInput, 'relationship')
-                       def relationshipListSize = relationshipList.size()
-                       if (relationshipListSize > 0) {
-                               for (i in 0..relationshipListSize-1) {
-                                  def relationshipXml = XmlUtil.serialize(relationshipList[i])
-                                  if (utils.getNodeText(relationshipXml, 'related-to') == "generic-vnf") {
-                                         def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
-                                         if (relatedLink != null || relatedLink != "") {
-                                                if (relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()).contains('/')) {
-                                                        rtn.add(relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()-1))
-                                                } else {
-                                                    rtn.add(relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()))
-                                                }
-                                         }
-                                  }
-                               }
-                       }
-               }
-               return rtn
-       }
-
-       /**
-        * similar to network policymethod
-       * @param xmlInput the XML document
-       * @return a list of IDs for related Network instances
-       *
-       **/
-       def getRelatedNetworkIdList(xmlInput) {
-               //def rtn = null
-               List rtn = []
-               if (xmlInput!=null) {
-                       def relationshipList = getListWithElements(xmlInput, 'relationship')
-                       def relationshipListSize = relationshipList.size()
-                       if (relationshipListSize > 0) {
-                               for (i in 0..relationshipListSize-1) {
-                                  def relationshipXml = XmlUtil.serialize(relationshipList[i])
-                                  if (utils.getNodeText(relationshipXml, 'related-to') == "l3-network") {
-                                         def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
-                                         if (relatedLink != null || relatedLink != "") {
-                                                if (relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()).contains('/')) {
-                                                        rtn.add(relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()-1))
-                                                } else {
-                                                    rtn.add(relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()))
-                                                }
-                                         }
-                                  }
-                               }
-                       }
-               }
-               return rtn
-       }
-
-
-       def isInstanceValueMatch(linkResource, globalSubscriberId, serviceType) {
-               Boolean rtn = false
-               try {
-                       String globalSubscriberIdLink = linkResource.substring(linkResource.indexOf("/customer/")+10, linkResource.indexOf("/service-subscriptions"))
-                       String serviceTypeLink = linkResource.substring(linkResource.indexOf("/service-subscription/")+22, linkResource.indexOf("/service-instances"))
-                       if (globalSubscriberIdLink == globalSubscriberId) {
-                                       rtn = true
-                       } else {
-                               if (serviceTypeLink == serviceType) {
-                                       rtn = true
-                               }
-                       }
-
-               } catch (Exception ex) {
-                   println 'Exception - ' + ex.getMessage()
-                       return false
-               }
-        return rtn
-       }
-
-       def getListWithElements(xmlInput, groupName) {
-               def rtn = ""
-               if (xmlInput != null) {
-                       def relationshipData = new XmlSlurper().parseText(xmlInput)
-                       rtn = relationshipData.'**'.findAll {it.name() == groupName}
-               }
-               return rtn
-
-       }
-
        // build network single elements
+       @Deprecated //TODO remove if not used anywhere
        def buildNetworkElements(l3Network, createNetworkContrailResponse, networkList) {
                def replaceNetworkId = ""
                def replaceNeutronNetworkId = ""
@@ -845,40 +421,6 @@ class NetworkUtils {
                return xmlNetwork
        }
 
-       def buildSubnets(requeryIdAAIResponse, createNetworkResponse) {
-               def rebuildingSubnets = ""
-               if (requeryIdAAIResponse != null && utils.nodeExists(requeryIdAAIResponse, 'subnets')) {
-                       def subnetIdMapValue = ""
-                       def subnetsGroup = utils.getNodeXml(requeryIdAAIResponse, "subnets", false)
-                       def subnetsData = new XmlSlurper().parseText(subnetsGroup)
-                       rebuildingSubnets += "<subnets>"
-                       try {
-                               def subnets = subnetsData.'**'.findAll {it.name() == "subnet"}
-                               def subnetsSize = subnets.size()
-                               for (i in 0..subnetsSize-1) {
-                                  def subnet = subnets[i]
-                                  def subnetXml = XmlUtil.serialize(subnet)
-                                  def orchestrationStatus = utils.getNodeText(subnetXml, "orchestration-status")
-                                  if (orchestrationStatus == "PendingDelete" || orchestrationStatus == "pending-delete") {
-                                          // skip, do not include in processing, remove!!!
-                                  } else {
-                                     def subnetList = ["subnet-id", "neutron-subnet-id", "gateway-address", "network-start-address", "cidr-mask", "ip-version", "orchestration-status", "dhcp-enabled", "dhcp-start", "dhcp-end", "subnet-role", "resource-version", "subnet-name", "ip-assignment-direction", "host-routes"]
-                                     rebuildingSubnets += buildSubNetworkElements(subnetXml, createNetworkResponse, subnetList, "subnet")
-                                  }
-                               }
-                               if (utils.nodeExists(subnetsData, 'relationship')) {
-                                       rebuildingSubnets = rebuildRelationship(requeryIdAAIResponse)
-                               }
-
-                       } catch (Exception ex) {
-                               // error
-                       } finally {
-                               rebuildingSubnets += "</subnets>"
-                       }
-               }
-               return rebuildingSubnets
-       }
-
        def buildSubnets(L3Network network) {
                def rebuildingSubnets = ""
                Subnets subnets = network.getSubnets()
@@ -901,57 +443,6 @@ class NetworkUtils {
                return rebuildingSubnets
        }
 
-
-       // build subnet sub-network single elements
-       def buildSubNetworkElements(subnetXml, createNetworkResponse, elementList, parentName) {
-               String var = ""
-               def xmlBuild = ""
-               if (parentName != "") {
-                  xmlBuild += "<"+parentName+">"
-               }
-               if (subnetXml != null) {
-                       for (element in elementList) {
-                         def xml= new XmlSlurper().parseText(subnetXml)
-                         var = xml.'**'.find {it.name() == element}
-                         if (var != null) {
-                                if (element=="orchestration-status") {
-                                       if(var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {
-                                               xmlBuild += "<"+element+">"+"Created"+"</"+element+">"
-                                       } else { // pending-update or PendingUpdate'
-                                          xmlBuild += "<"+element+">"+"Active"+"</"+element+">"
-                                       }
-                                } else { // "subnet-id", "neutron-subnet-id"
-                                        if (element=="subnet-id") {
-                                                if (utils.nodeExists(createNetworkResponse, "subnetMap")) {
-                                                        xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"
-                                                        String neutronSubnetId = extractNeutSubId(createNetworkResponse, var.toString())
-                                                        xmlBuild += "<neutron-subnet-id>"+neutronSubnetId+"</neutron-subnet-id>"
-                                                }
-                                        } else {
-                                            if (element=="neutron-subnet-id") {
-                               // skip
-                                                } else {
-                                                        if (element=="host-routes") {
-                                                                if (subnetXml.contains("host-routes")) {
-                                                                        List elementRoute = ["host-route-id", "route-prefix", "next-hop", "next-hop-type", "resource-version"]
-                                                                        xmlBuild += buildXMLElements(subnetXml, "host-routes", "host-route", elementRoute)
-                                                                }
-                                                        } else {
-                                                               xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"
-                                                        }
-                                                }
-                                        }
-                                }
-                         }
-                       }
-
-               }
-               if (parentName != "") {
-                  xmlBuild += "</"+parentName+">"
-               }
-               return xmlBuild
-       }
-
        // build subnet sub-network single elements
        def buildSubNetworkElements(Subnet subnet, elementList, parentName) {
 
@@ -986,7 +477,7 @@ class NetworkUtils {
                                                networkStartAddress = subnet.getNetworkStartAddress()
                                        }
                                        if (element == "cidr-mask") {
-                                               xmlBuild += "<cidr>"+networkStartAddress+"/"+var+"</cidr>"
+                                               xmlBuild += "<cidr>"+networkStartAddress+"/"+ subnet.getCidrMask() +"</cidr>"
                                        }
                                }
                                if (element == "dhcp-enabled") {
@@ -1025,236 +516,40 @@ class NetworkUtils {
        }
 
        // rebuild host-routes
-       def buildHostRoutes(subnetXml) {
-               List  routeElementList = ["host-route-id", "route-prefix", "next-hop", "next-hop-type", "resource-version"]
-               def hostRoutes = buildXMLElements(subnetXml, "host-routes", "host-route", routeElementList)
+       def buildHostRoutes(Subnet subnet) {
                def buildHostRoutes = ""
-               def var = ""
-               if (hostRoutes!=null) {
-                       def routesData = new XmlSlurper().parseText(hostRoutes)
-                       def routes = routesData.'**'.findAll {it.name() == "host-route"}
-                       def routesSize = routes.size()
-                       for (i in 0..routesSize-1) {
-                          buildHostRoutes += "<hostRoutes>"
-                          def route = routes[i]
-                          def routeXml = XmlUtil.serialize(route)
-                          List  elementList = ["route-prefix", "next-hop"]
-                          for (element in elementList) {
-                                  def xml= new XmlSlurper().parseText(routeXml)
-                                  var = xml.'**'.find {it.name() == element}
-                                  if (element == "route-prefix") {
-                                          buildHostRoutes += "<prefix>"+var.toString()+"</prefix>"
-                                  }
-                                  if (element == "next-hop") {
-                                          buildHostRoutes += "<nextHop>"+var.toString()+"</nextHop>"
-                                  }
-                          }
-                          buildHostRoutes += "</hostRoutes>"
+               List<HostRoute> routes = subnet.getHostRoutes().getHostRoute()
+               if(!routes.isEmpty()){
+                       for(HostRoute route:routes){
+                               buildHostRoutes += "<hostRoutes>"
+                               buildHostRoutes += "<prefix>" + route.getRoutePrefix() + "</prefix>"
+                               buildHostRoutes += "<nextHop>" + route.getNextHop() + "</nextHop>"
+                               buildHostRoutes += "</hostRoutes>"
                        }
                }
-               return buildHostRoutes
 
+               return buildHostRoutes
        }
 
-       // rebuild ctag-assignments
-       def rebuildCtagAssignments(xmlInput) {
-               def rebuildingCtagAssignments = ""
-               if (xmlInput!=null) {
-                       def ctagAssignmentsData = new XmlSlurper().parseText(xmlInput)
-                       rebuildingCtagAssignments += "<ctag-assignments>"
-                       def ctagAssignments = ctagAssignmentsData.'**'.findAll {it.name() == "ctag-assignment"}
-                       def ctagAssignmentsSize = ctagAssignments.size()
-                       for (i in 0..ctagAssignmentsSize-1) {
-                               def ctagAssignment = ctagAssignments[i]
-                               def ctagAssignmentXml = XmlUtil.serialize(ctagAssignment)
-                               rebuildingCtagAssignments += "<ctag-assignment>"
-                               List elementList = ["vlan-id-inner", "resource-version"]
-                               rebuildingCtagAssignments +=  buildXMLElements(ctagAssignmentXml, ""      , "", elementList)
-                               if (utils.nodeExists(ctagAssignmentXml, 'relationship')) {
-                                       rebuildingCtagAssignments += rebuildRelationship(ctagAssignmentXml)
+       private String buildVlans(L3Network queryIdResponse) { // get seg ids in put in vlan tags
+               String vlans = "<vlans>"
+               if(queryIdResponse.getSegmentationAssignments() != null){
+                       List<SegmentationAssignment> segmentations = queryIdResponse.getSegmentationAssignments().getSegmentationAssignment()
+                       if(!segmentations.isEmpty()){
+                               for(SegmentationAssignment seg:segmentations){
+                                       String vlan = seg.getSegmentationId() + ","
+                                       vlans += vlan
                                }
-                               rebuildingCtagAssignments += "</ctag-assignment>"
                        }
-                       rebuildingCtagAssignments += "</ctag-assignments>"
                }
-               return rebuildingCtagAssignments
-       }
 
-       // rebuild 'relationship-list'
-       def rebuildRelationship(xmlInput) {
-               def rebuildingSubnets = ""
-               if (xmlInput!=null) {
-                       def subnetsData = new XmlSlurper().parseText(xmlInput)
-                       rebuildingSubnets += "<relationship-list>"
-                       def relationships = subnetsData.'**'.findAll {it.name() == "relationship"}
-                       def relationshipsSize = relationships.size()
-                       for (i in 0..relationshipsSize-1) {
-                               def relationship = relationships[i]
-                               def relationshipXml = XmlUtil.serialize(relationship)
-                               rebuildingSubnets += "<relationship>"
-                               def relationshipList = ["related-to", "related-link"]
-                               rebuildingSubnets += buildSubNetworkElements(relationshipXml, "", relationshipList, "")
-                               if (utils.nodeExists(relationshipXml, 'relationship-data')) {
-                                       def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
-                                       def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "relationship-data"}
-                                       def relationshipsDataSize = relationshipsData.size()
-                                       for (j in 0..relationshipsDataSize-1) {
-                                               def relationshipData = relationshipsData[j]
-                                               def relationshipDataXml = XmlUtil.serialize(relationshipData)
-                                               def relationshipDataList =  ["relationship-key", "relationship-value"]
-                                               rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "relationship-data", relationshipDataList)
-                                       }
-                               }
-                               if (utils.nodeExists(relationshipXml, 'related-to-property')) {
-                                       def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
-                                       def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "related-to-property"}
-                                       def relationshipsDataSize = relationshipsData.size()
-                                       for (j in 0..relationshipsDataSize-1) {
-                                               def relationshipData = relationshipsData[j]
-                                               def relationshipDataXml = XmlUtil.serialize(relationshipData)
-                                               def relationshipDataList =  ["property-key", "property-value"]
-                                               rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "related-to-property", relationshipDataList)
-                                       }
-                               }
-
-                               rebuildingSubnets += "</relationship>"
-                       }
-                       rebuildingSubnets += "</relationship-list>"
+               if(vlans.endsWith(",")){
+                       vlans = vlans.substring(0, vlans.length() - 1)
                }
-               return rebuildingSubnets
-       }
-
-       def buildVlans(queryIdResponse) {
-               def rebuildingSubnets = "<vlans>"
-               def subnetsData = new XmlSlurper().parseText(queryIdResponse)
-
-               try {
-                       def subnets = subnetsData.'**'.findAll {it.name() == "segmentation-assignments"}
-                       def subnetsSize = subnets.size()
-                       for (i in 0..subnetsSize-1) {
-                          def subnet = subnets[i]
-                          def subnetXml = XmlUtil.serialize(subnet)
-
-                          String vlan = utils.getNodeText(subnetXml, "segmentation-id")
-                          if (i>0){
-                                  rebuildingSubnets += ","
-                          }
-                          rebuildingSubnets += vlan
-                       }
-               } catch (Exception ex) {
-                  //
-               } finally {
-                 //rebuildingSubnets += "</subnets>"
-               rebuildingSubnets += "</vlans>"
-               }
-               return rebuildingSubnets
-       }
 
-       /* Utility code to rebuild xml/elements in a list:
-        * rebuild xml with 1) unbounded groups of elements; or
-        *                  2) one group of elements; or
-        *                  3) just one or more elements (in a list as argument)
-        * @param xmlInput the XML document
-        * @param parentName the parent name  (ex: 'inputs')
-        * @param childrenName the chilrendName (ex: 'entry' as unbounded/occurs>1)
-        * @param elementList the element list of children (ex: 'key', 'value')
-        * @return a string of rebuild xml
-        *
-        * Ex 1: xmlInput:
-        *    <ws:inputs>
-        *       <ws:entry>
-        *          <ws:key>name</ws:key>
-        *          <ws:value>Edward</ws:value>
-        *       </ws:entry>
-        *       <ws:entry>
-        *          <ws:key>age</ws:key>
-        *          <ws:value>30</ws:value>
-        *       </ws:entry>
-        *       <ws:entry>
-        *          <ws:key>age</ws:key>
-        *          <ws:value>30</ws:value>
-        *       </ws:entry>
-        *    <ws:/inputs>
-        * Usage:
-        * List elementList = ["key", "value"]
-        * String rebuild =  buildXMLElements(xmlInput, "inputs", "entry", elementList)
-        *
-        * Ex 2: xmlInput // no parent tag
-        *   <ws:sdnc-request-header>
-        *    <ws:svc-request-id>fec8ec88-151a-45c9-ad60-8233e0fc8ff2</ws:svc-request-id>
-        *    <ws:svc-notification-url>https://localhost:8443/adapters/rest/SDNCNotify</ws:svc-notification-url>
-        *    <ws:svc-action>assign</ws:svc-action>
-        *   </ws:sdnc-request-header>
-        * Usage:
-        * List elementList = ["svc-request-id", "svc-notification-url", "svc-action"]
-        * String rebuild =  buildXMLElements(xmlInput, ""      , "sdnc-request-header", elementList)  // no parent tag
-        *
-        * Ex 3: xmlInput // elements one after another (with no parent & children tag)
-        * <ws:test-id>myTestid</ws:test-id>
-        * <ws:test-user>myUser</ws:test-user>
-        * Usage:
-        * List elementList = ["test-id", "test-user"]
-        * String rebuild =  buildXMLElements(xmlInput, ""      , "", elementList)
-        *
-        */
-       def buildXMLElements(xmlInput, parentName, childrenName, elementList) {
-               def varChildren = ""
-               def var = ""
-               def xmlBuildUnbounded = ""
-               if (parentName!="") {xmlBuildUnbounded += "<"+parentName+">" +'\n'}
-               if (xmlInput != null) {
-                       def xml= new XmlSlurper().parseText(xmlInput)
-                       if (childrenName!="") {
-                               varChildren = xml.'**'.findAll {it.name() == childrenName}
-                               for (i in 0..varChildren.size()-1) {
-                                       xmlBuildUnbounded += "<"+childrenName+">" +'\n'
-                                       for (element in elementList) {
-                                               var = varChildren[i].'*'.find {it.name() == element}
-                                          if (var != null) {
-                                                 xmlBuildUnbounded += "<"+element+">"+var.toString()+"</"+element+">" +'\n'
-                                          }
-                                       }
-                                       xmlBuildUnbounded += "</"+childrenName+">" +'\n'
-                               }
-                       } else {
-                               for (element in elementList) {
-                                       var = xml.'*'.find {it.name() == element}
-                                       if (var != null) {
-                                               xmlBuildUnbounded += "<"+element+">"+var.toString()+"</"+element+">" +'\n'
-                                       }
-                               }
-                       }
-
-               }
-               if (parentName!="") {xmlBuildUnbounded += "</"+parentName+">" +'\n'}
-               return xmlBuildUnbounded
-        }
-
-       def getFirstNodeXml(xmlInput, element){
-               def nodeAsText = ""
-               def nodeToSerialize =  ""
-               if (xmlInput != null) {
-                       def fxml= new XmlSlurper().parseText(xmlInput)
-                       if (utils.nodeExists(xmlInput, "payload")) {
-                               nodeToSerialize = fxml.'payload'.'l3-network'.'*'.find {it.name() == element}
-                               if (nodeToSerialize!=null) {
-                                       nodeAsText = XmlUtil.serialize(nodeToSerialize)
-                               } else {
-                                   nodeAsText = ""
-                               }
-
-                       } else {
-                               nodeToSerialize = fxml.'*'.find {it.name() == element}
-                               if (nodeToSerialize!=null) {
-                                       nodeAsText = XmlUtil.serialize(nodeToSerialize)
-                               } else {
-                                       nodeAsText = ""
-                               }
-
-                       }
-               }
-               return nodeAsText
+               vlans += "</vlans>"
 
+               return vlans
        }
 
 //TODO: This method still needs to be tested before using.
index ee93f3a..5659c7a 100644 (file)
@@ -31,6 +31,7 @@ import org.onap.so.bpmn.core.domain.Subscriber
 import org.onap.so.bpmn.core.domain.VnfResource
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
 import org.onap.so.logger.MsoLogger
 import org.onap.so.db.catalog.beans.CloudIdentity
 import org.onap.so.db.catalog.beans.CloudSite
@@ -159,8 +160,8 @@ class OofHoming extends AbstractServiceTaskProcessor {
 
 
                                URL url = new URL(urlString);
-                               HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.SNIRO)
-                               httpClient.addAdditionalHeader("Authorization", authHeader)
+                HttpClient httpClient = new HttpClientFactory().newJsonClient(url, TargetEntity.SNIRO)
+                httpClient.addAdditionalHeader("Authorization", authHeader)
                                Response httpResponse = httpClient.post(oofRequest)
 
                                int responseCode = httpResponse.getStatus()
index 46ecc7b..c0da888 100644 (file)
@@ -34,6 +34,7 @@ import org.onap.so.bpmn.core.domain.Subscriber
 import org.onap.so.bpmn.core.domain.VnfResource
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
 import org.onap.so.db.catalog.beans.CloudSite
 import org.onap.so.utils.TargetEntity
 import org.springframework.http.HttpEntity
@@ -507,10 +508,10 @@ class OofUtils {
         String auth = UrnPropertiesReader.getVariable("mso.db.auth", execution)
         String uri = "/cloudSite"
 
-       URL url = new URL(endpoint + uri)
-       HttpClient client = new HttpClient(url, MediaType.APPLICATION_JSON, TargetEntity.EXTERNAL)
-       client.addAdditionalHeader(HttpHeaders.AUTHORIZATION, auth)
-       client.addAdditionalHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON)
+           URL url = new URL(endpoint + uri)
+        HttpClient client = new HttpClientFactory().newJsonClient(url, TargetEntity.EXTERNAL)
+        client.addAdditionalHeader(HttpHeaders.AUTHORIZATION, auth)
+           client.addAdditionalHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON)
 
         Response response = client.post(request.getBody().toString())
 
index 8f0e481..15f00ac 100644 (file)
@@ -223,7 +223,7 @@ public class PrepareUpdateAAIVfModule extends VfModuleBase {
                        AAIResourcesClient client = new AAIResourcesClient()
                        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId)
                        client.update(uri, vfModule)
-
+                       execution.setVariable('PUAAIVfMod_updateVfModuleResponseCode', 200)
                        // Set the output for this flow.  The updated VfModule is an output, the generic VNF name, and for
                        // backward compatibilty, the heat-stack-id is an output
                        execution.setVariable('PUAAIVfMod_outVfModule', vfModule)
@@ -238,9 +238,11 @@ public class PrepareUpdateAAIVfModule extends VfModuleBase {
 
                        msoLogger.trace('Exited ' + method)
                } catch (BpmnError e) {
+                       execution.setVariable('PUAAIVfMod_updateVfModuleResponseCode', 500)
                        throw e;
                } catch (Exception e) {
                        msoLogger.error(e)
+                       execution.setVariable('PUAAIVfMod_updateVfModuleResponseCode', 500)
                        exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in updateVfModule(): ' + e.getMessage())
                }
        }
index 852f8d7..a430cdb 100644 (file)
@@ -28,11 +28,10 @@ import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 
-
+import static org.apache.commons.lang3.StringUtils.*
 
 
 // SDNC Adapter Request/Response processing
-
 public class SDNCAdapter extends AbstractServiceTaskProcessor {
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCAdapter.class);
 
@@ -58,6 +57,11 @@ public class SDNCAdapter extends AbstractServiceTaskProcessor {
                        execution.setVariable("SDNCA_SuccessIndicator", false)
                        execution.setVariable("SDNCA_InterimNotify", false)
 
+                       String requestId = execution.getVariable("mso-request-id")
+                       if(isBlank(requestId)){
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 400, 'mso-request-id not provided by calling flow')
+                       }
+
                        // Authorization Info
                        String basicAuthValue = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution)
 
@@ -118,8 +122,8 @@ public class SDNCAdapter extends AbstractServiceTaskProcessor {
                        msoLogger.debug("source: " + source)
 
                        //calling process should pass a generated uuid if sending multiple sdnc requests
-                       def requestId = utils.getNodeText(requestHeader, "RequestId")
-                       execution.setVariable(Prefix + "requestId", requestId)
+                       def sdncRequestId = utils.getNodeText(requestHeader, "RequestId")
+                       execution.setVariable(Prefix + "requestId", sdncRequestId)
 
                        // Prepare SDNC Request to the SDNC Adapter
                        String sdncAdapterRequest = """
@@ -127,7 +131,7 @@ public class SDNCAdapter extends AbstractServiceTaskProcessor {
                        <SOAP-ENV:Body>
                        <aetgt:SDNCAdapterRequest xmlns:aetgt="http://org.onap/workflow/sdnc/adapter/schema/v1" xmlns:sdncadaptersc="http://org.onap/workflow/sdnc/adapter/schema/v1">
                        <sdncadapter:RequestHeader xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
-                       <sdncadapter:RequestId>${MsoUtils.xmlEscape(requestId)}</sdncadapter:RequestId>"""
+                       <sdncadapter:RequestId>${MsoUtils.xmlEscape(sdncRequestId)}</sdncadapter:RequestId>"""
 
                        if (sdnca_svcInstanceId != null) {
                                sdncAdapterRequest += """
@@ -180,7 +184,7 @@ public class SDNCAdapter extends AbstractServiceTaskProcessor {
                                callbackHeader = callbackHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
 
                                callbackRequestData = callbackRequestData.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
-                               
+
                                msoLogger.trace("EnhancedCallbackRequestData:\n" + callbackRequestData)
                                execution.setVariable("enhancedCallbackRequestData", callbackRequestData)
 
index d7fc6ac..9f1570e 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.so.bpmn.common.scripts
 
+import org.onap.so.client.HttpClientFactory
+
 import java.text.SimpleDateFormat
 import javax.ws.rs.core.Response
 import java.net.URLEncoder
@@ -207,7 +209,10 @@ class SDNCAdapterRestV1 extends AbstractServiceTaskProcessor {
 
                        URL url = new URL(sdncAdapterUrl);
 
-                       HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.SDNC_ADAPTER)
+                       HttpClient httpClient = new HttpClientFactory().newJsonClient(url, TargetEntity.SDNC_ADAPTER)
+                       httpClient.addAdditionalHeader("X-ONAP-RequestID", execution.getVariable("mso-request-id"))
+                       httpClient.addAdditionalHeader("X-ONAP-InvocationID", UUID.randomUUID().toString())
+                       httpClient.addAdditionalHeader("X-ONAP-PartnerName", "SO-SDNCAdapter")
                        httpClient.addAdditionalHeader("mso-request-id", execution.getVariable("mso-request-id"))
                        httpClient.addAdditionalHeader("mso-service-instance-id", execution.getVariable("mso-service-instance-id"))
                        httpClient.addAdditionalHeader("Authorization", execution.getVariable(prefix + "basicAuthHeaderValue"))
index 401cac9..9556ae7 100644 (file)
@@ -34,6 +34,7 @@ import org.onap.so.bpmn.core.domain.Subscriber
 import org.onap.so.bpmn.core.domain.VnfResource
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
 import org.onap.so.utils.TargetEntity
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 
@@ -133,7 +134,7 @@ class SniroHomingV1 extends AbstractServiceTaskProcessor{
                                msoLogger.debug("Sniro Url is: " + urlString)
 
                                URL url = new URL(urlString);
-                               HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.SNIRO)
+                               HttpClient httpClient = new HttpClientFactory().newJsonClient(url, TargetEntity.SNIRO)
                                httpClient.addAdditionalHeader("Authorization", authHeader)
                                Response httpResponse = httpClient.post(sniroRequest)
 
index 6691a82..3c4edd2 100644 (file)
@@ -174,23 +174,27 @@ public class UpdateAAIVfModule extends AbstractServiceTaskProcessor {
                                personaModelVersionEntry = updateVfModuleNode(origRequest,  'persona-model-version')
                        }
                        String contrailServiceInstanceFqdnEntry = updateVfModuleNode(origRequest,  'contrail-service-instance-fqdn')
-                       def payload = """
-                                       {       ${orchestrationStatusEntry}
-                                               ${heatStackIdEntry}
-                                               ${personaModelVersionEntry}
-                                               ${contrailServiceInstanceFqdnEntry}
-                                               "vf-module-id": "${vfModuleId}"                                         
-                                       }
-                       """
+                       org.onap.aai.domain.yang.VfModule payload = new org.onap.aai.domain.yang.VfModule();
+                       payload.setVfModuleId(vfModuleId)
+                       payload.setOrchestrationStatus(orchestrationStatusEntry)
+                       payload.setHeatStackId(heatStackIdEntry)
+                       payload.setPersonaModelVersion(personaModelVersionEntry)
+                       payload.setContrailServiceInstanceFqdn(contrailServiceInstanceFqdnEntry)
 
             try {
                 AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId)
                 getAAIClient().update(resourceUri, payload)
+                               execution.setVariable('UAAIVfMod_updateVfModuleResponseCode', 200)
+                               execution.setVariable('UAAIVfMod_updateVfModuleResponse', "Success")
             }catch(NotFoundException ignored){
                 msoLogger.debug("VF-Module not found!!")
+                               execution.setVariable('UAAIVfMod_updateVfModuleResponseCode', 404)
+                execution.setVariable('UAAIVfMod_updateVfModuleResponse', ignored.getMessage())
                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "vf-module " + vfModuleId + " not found for under vnf " + vnfId + " in A&AI!")
             }
             catch(Exception ex){
+                               execution.setVariable('UAAIVfMod_updateVfModuleResponseCode', 500)
+                               execution.setVariable('UAAIVfMod_updateVfModuleResponse', 'AAI PATCH Failed:' + ex.getMessage())
                                exceptionUtil.buildAndThrowWorkflowException(execution, 2500, 'Exception occurred while executing AAI PATCH:' + ex.getMessage())
             }
                } catch (BpmnError e) {
@@ -210,87 +214,19 @@ public class UpdateAAIVfModule extends AbstractServiceTaskProcessor {
        private String updateVfModuleNode(String origRequest, String elementName) {
 
                if (!utils.nodeExists(origRequest, elementName)) {
-                       return "" 
+                       return null
                }
                def elementValue = utils.getNodeText(origRequest, elementName)
 
                if (elementValue.equals('DELETE')) {
-                       // Set the element being deleted to null
-                       return """"${elementName}": null,"""
+                       // Set the element being deleted to empty string
+                       return ""
                }
                else {
-                       return """"${elementName}": "${elementValue}","""
+                       return elementValue
                }               
        }
 
-       
-       /**
-        * Check the Volume Group ID from the incoming update request against the Volume Group ID from the
-        * given VF Module.  If they are equal or if they are both 'null', then that is acceptable and 'null'
-        * is returned.  Otherwise a message describing how the values are unacceptable/incompatible is returned.
-        * 
-        * @param origRequest Incoming update request with VF Module elements to be updated.
-        * @param vfModuleNode VF Module (as a Node) retrieved from AAI.
-        * @param isDebugLogEnabled Is DEBUG log enabled?
-        * @return 'null' if the Volume Group IDs are acceptable. Otherwise return a message describing how the
-        * values are unacceptable/incompatible.
-        */
-       private String checkVolumeGroupId(String origRequest, Node vfModuleNode, String isDebugLogEnabled) {
-               def requestVolumeGroupId = utils.getNodeText(origRequest, 'volume-group-id')
-               def currVolumeGroupId = getCurrVolumeGroupId(vfModuleNode)
-               
-               msoLogger.debug('Check volume-group-id: volume-group-id in original request is \'' + requestVolumeGroupId + '\', volume-group-id from VF Module is \'' + currVolumeGroupId + '\'')
-               
-               def result = null
-               
-               if (requestVolumeGroupId == null) {
-                       if (currVolumeGroupId == null) {
-                               // This is OK
-                       } else {
-                               result = 'Cannot detach a volume group from an existing VF Module'
-                       }
-               } else {
-                       if (currVolumeGroupId == null) {
-                               result = 'Cannot add a volume gruop to an existing VF Module'
-                       } else {
-                               if (!requestVolumeGroupId.equals(currVolumeGroupId)) {
-                                       result = 'Cannot change the volume group on an existing VF Module'
-                               }
-                       }
-               }
-               
-               return result
-       }
-       
-       /**
-        * Find and return the value of the Volume Group ID for the specified VF Module.  If
-        * the value of the Volume Group ID cannot be found for any reason, 'null' is returned.
-        * 
-        * @param vfModuleNode VF Module (as a Node) retrieved from AAI.
-        * @return the value of the Volume Group ID for the specified VF Module.  If the
-        * value of the Volume Group ID cannot be found for any reason, 'null' is returned.
-        */
-       private String getCurrVolumeGroupId(Node vfModuleNode) {
-               def Node relationshipList = utils.getChildNode(vfModuleNode, 'relationship-list')
-               if (relationshipList == null) {
-                       return null
-               }
-               def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
-               for (Node relationshipNode in relationships) {
-                       def String relatedTo = utils.getChildNodeText(relationshipNode, 'related-to')
-                       if ((relatedTo != null) && relatedTo.equals('volume-group')) {
-                               def NodeList relationshipDataList = utils.getIdenticalChildren(relationshipNode, 'relationship-data')
-                               for (Node relationshipDataNode in relationshipDataList) {
-                                       def String relationshipKey = utils.getChildNodeText(relationshipDataNode, 'relationship-key')
-                                       if ((relationshipKey != null) && relationshipKey.equals('volume-group.volume-group-id')) {
-                                               return utils.getChildNodeText(relationshipDataNode, 'relationship-value')
-                                       }
-                               }
-                       }
-               }
-               return null
-       }
-
        /**
         * Generates a WorkflowException if the AAI query returns a response code other than 200.
         *
index fec140d..c1cd42e 100644 (file)
 
 package org.onap.so.bpmn.common.scripts;
 
-import java.io.ObjectInputStream.BlockDataInputStream
-
-import java.io.ObjectInputStream.BlockDataInputStream
-
-//import groovy.util.Node;
-
 import javax.xml.parsers.DocumentBuilder
 import javax.xml.parsers.DocumentBuilderFactory
 
-import org.apache.commons.lang3.*
 import org.w3c.dom.Document
 import org.w3c.dom.Element
 import org.w3c.dom.Node
@@ -38,9 +31,6 @@ import org.xml.sax.InputSource
 import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 
-
-
-
 public abstract class VfModuleBase extends AbstractServiceTaskProcessor {
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VfModuleBase.class);
 
@@ -195,39 +185,7 @@ public abstract class VfModuleBase extends AbstractServiceTaskProcessor {
                }
                return entries
        }
-       
-       /**
-        * Extract the Tenant Id from the Volume Group information returned by AAI.
-        * 
-        * @param volumeGroupXml Volume Group XML returned by AAI.
-        * @return the Tenant Id extracted from the Volume Group information. 'null' is returned if
-        * the Tenant Id is missing or could not otherwise be extracted.
-        */
-       protected String getTenantIdFromVolumeGroup(String volumeGroupXml) {
-               def groovy.util.Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)
-               def groovy.util.Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')
-               if (relationshipList != null) {
-                       def groovy.util.NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
-                       for (groovy.util.Node relationship in relationships) {
-                               def groovy.util.Node relatedTo = utils.getChildNode(relationship, 'related-to')
-                               if ((relatedTo != null) && (relatedTo.text().equals('tenant'))) {
-                                       def groovy.util.NodeList relationshipDataList = utils.getIdenticalChildren(relationship, 'relationship-data')
-                                       for (groovy.util.Node relationshipData in relationshipDataList) {
-                                               def groovy.util.Node relationshipKey = utils.getChildNode(relationshipData, 'relationship-key')
-                                               if ((relationshipKey != null) && (relationshipKey.text().equals('tenant.tenant-id'))) {
-                                                       def groovy.util.Node relationshipValue = utils.getChildNode(relationshipData, 'relationship-value')
-                                                       if (relationshipValue != null) {
-                                                               return relationshipValue.text()
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-               return null
-       }
-       
-       
+
        /*
         * Parses VNF parameters passed in on the incoming requests and SDNC parameters returned from SDNC get response
         * and puts them into the format expected by VNF adapter.
index 13cc7f8..78af876 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.so.bpmn.common.scripts
 
+import org.onap.so.client.HttpClientFactory
+
 import javax.ws.rs.core.Response
 import org.apache.commons.lang3.*
 import org.camunda.bpm.engine.delegate.BpmnError
@@ -29,6 +31,8 @@ import org.onap.so.client.HttpClient
 import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 import org.onap.so.utils.TargetEntity
+import java.util.UUID
+
 
 
 
@@ -309,9 +313,12 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
 
                        URL url = new URL(vnfAdapterUrl);
 
-                       HttpClient httpClient = new HttpClient(url, "application/xml", TargetEntity.VNF_ADAPTER)
+                       HttpClient httpClient = new HttpClientFactory().newXmlClient(url, TargetEntity.VNF_ADAPTER)
                        httpClient.addAdditionalHeader("Authorization", execution.getVariable(prefix + "basicAuthHeaderValue"))
-
+                       
+                       httpClient.addAdditionalHeader("X-ONAP-RequestID", execution.getVariable("mso-request-id"))
+                       httpClient.addAdditionalHeader("X-ONAP-InvocationID", UUID.randomUUID().toString())
+                       httpClient.addAdditionalHeader("X-ONAP-PartnerName", "SO-VNFAdapter")
                        Response response;
 
                        if ("GET".equals(vnfAdapterMethod)) {
@@ -358,16 +365,15 @@ class VnfAdapterRestV1 extends AbstractServiceTaskProcessor {
                        // TODO: Should deprecate use of processKey+Response variable for the response. Will use "WorkflowResponse" instead.
                        execution.setVariable("WorkflowResponse", callback)
 
+                       callback = utils.removeXmlPreamble(callback)
+
                        Node root = new XmlParser().parseText(callback)
                        if (root.name().endsWith('Exception')) {
                                vnfAdapterWorkflowException(execution, callback)
                        }
                } catch (Exception e) {
-                       e.printStackTrace()
-                       callback = callback == null || String.valueOf(callback).isEmpty() ? "NONE" : callback
-                       String msg = "Received error from VnfAdapter: " + callback
-                       msoLogger.debug(getProcessKey(execution) + ': ' + msg)
-                       exceptionUtil.buildWorkflowException(execution, 7020, msg)
+                       msoLogger.debug("Error encountered within VnfAdapterRest ProcessCallback method", e)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7020, "Error encountered within VnfAdapterRest ProcessCallback method")
                }
        }
 
index 1989ca8..12a4b2a 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.so.bpmn.common.resource;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -45,7 +46,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input;
 import org.onap.so.bpmn.core.UrnPropertiesReader;
 import org.onap.so.bpmn.core.json.JsonUtils;
 import org.onap.so.client.HttpClient;
-import org.onap.so.logger.MessageEnum;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -259,19 +260,24 @@ public class ResourceRequestBuilder {
 
     private static String getCsarFromUuid(String uuid) throws Exception {
                String catalogEndPoint = UrnPropertiesReader.getVariable("mso.catalog.db.endpoint");
-       HttpClient client = new HttpClient(UriBuilder.fromUri(catalogEndPoint).path(SERVICE_URL_TOSCA_CSAR).queryParam("serviceModelUuid", uuid).build().toURL(), "application/json", TargetEntity.CATALOG_DB);
+       HttpClient client = new HttpClientFactory().newJsonClient(
+           UriBuilder.fromUri(catalogEndPoint).path(SERVICE_URL_TOSCA_CSAR).queryParam("serviceModelUuid", uuid).build().toURL(),
+            TargetEntity.CATALOG_DB);
        
+       client.addAdditionalHeader("Accept", "application/json");
+//     client.addBasicAuthHeader (UrnPropertiesReader.getVariable("mso.adapters.db.auth"), UrnPropertiesReader.getVariable("mso.msoKey"));
+       client.addAdditionalHeader("Authorization", UrnPropertiesReader.getVariable("mso.db.auth"));
         Response response = client.get();
         String value = response.readEntity(String.class);
 
         HashMap<String, String> map = new Gson().fromJson(value, new TypeToken<HashMap<String, String>>() {}.getType());
 
-        String filePath = System.getProperty("mso.config.path") + "/ASDC/" +  map.get("version") + "/" + map.get("name");
+        String filePath = Paths.get(System.getProperty("mso.config.path"), "ASDC",  map.get("version"), map.get("name")).normalize().toString();
 
         File csarFile = new File(filePath);
 
         if(!csarFile.exists()) {
-            throw new Exception("csar file does not exist.");
+            throw new Exception("csar file does not exist in filePath:" + csarFile.getAbsolutePath());
         }
 
         return csarFile.getAbsolutePath();
@@ -283,7 +289,7 @@ public class ResourceRequestBuilder {
         try {
             return mapper.readValue(jsonstr, type);
         } catch(IOException e) {
-            LOGGER.error(MessageEnum.RA_NS_EXC, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "fail to unMarshal json", e);
+            LOGGER.error("fail to unMarshal json" + e.getMessage ());
         }
         return null;
     }
index 343bd95..781eba3 100644 (file)
@@ -101,6 +101,8 @@ public class L3Network implements Serializable, ShallowCopy<L3Network> {
        private ModelInfoNetwork modelInfoNetwork;
        @JsonProperty("aggregate-routes")
     private List<AggregateRoute> aggregateRoutes = new ArrayList<>();
+       @JsonProperty("vpn-binding")
+    private List<VpnBinding> vpnBindings = new ArrayList<>();
 
        public ModelInfoNetwork getModelInfoNetwork() {
                return modelInfoNetwork;
@@ -261,6 +263,10 @@ public class L3Network implements Serializable, ShallowCopy<L3Network> {
                return aggregateRoutes;
        }
 
+       public List<VpnBinding> getVpnBindings(){
+               return vpnBindings;
+       }
+
        @Override
        public boolean equals(final Object other) {
                if (!(other instanceof L3Network)) {
index 4662db2..9709cce 100644 (file)
@@ -30,5 +30,6 @@ public enum ResourceKey {
        CONFIGURATION_ID,
        NETWORK_COLLECTION_ID,
        VPN_ID,
-    VPN_BONDING_LINK_ID;
+    VPN_BONDING_LINK_ID,
+    INSTANCE_GROUP_ID;
 }
index 1f02fea..e03ee35 100644 (file)
@@ -28,7 +28,6 @@ public class ModelInfoInstanceGroup  implements Serializable {
        private static final long serialVersionUID = -8279040393230356226L;
        
        public static final String TYPE_L3_NETWORK = "L3-NETWORK";
-       public static final String TYPE_NETWORK_INSTANCE_GROUP = "networkInstanceGroup";
        public static final String TYPE_VNFC = "VNFC";
                
        @JsonProperty("model-uuid")
index 5296d59..63f832d 100644 (file)
@@ -90,6 +90,7 @@ import org.onap.so.serviceinstancebeans.Vnfs;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
@@ -112,6 +113,9 @@ public class BBInputSetup implements JavaDelegate {
 
        @Autowired
        private BBInputSetupMapperLayer mapperLayer;
+       
+       @Autowired
+       private CloudInfoFromAAI cloudInfoFromAAI;
 
        @Autowired
        private ExceptionBuilder exceptionUtil;
@@ -121,6 +125,10 @@ public class BBInputSetup implements JavaDelegate {
        public BBInputSetupUtils getBbInputSetupUtils() {
                return bbInputSetupUtils;
        }
+       
+       public void setCloudInfoFromAAI(CloudInfoFromAAI cloudInfoFromAAI) {
+               this.cloudInfoFromAAI = cloudInfoFromAAI;
+       }
 
        public void setBbInputSetupUtils(BBInputSetupUtils bbInputSetupUtils) {
                this.bbInputSetupUtils = bbInputSetupUtils;
@@ -382,16 +390,10 @@ public class BBInputSetup implements JavaDelegate {
                                ModelInfo vnfModelInfo = new ModelInfo();
                                vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
                                this.mapCatalogVnf(tempVnf, vnfModelInfo, service);
-                               if (lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID) == null) {
-                                       for(VolumeGroup volumeGroup : tempVnf.getVolumeGroups()) {
-                                               String volumeGroupCustId = 
-                                                               this.bbInputSetupUtils.getAAIVolumeGroup(cloudConfiguration.getCloudOwner(), 
-                                                                               cloudConfiguration.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()).getModelCustomizationId();
-                                               if(modelInfo.getModelCustomizationId().equalsIgnoreCase(volumeGroupCustId)) {
-                                                       lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, volumeGroup.getVolumeGroupId());
-                                                       break;
-                                               }
-                                       }
+                               Optional<String> volumeGroupIdOp = getVolumeGroupIdRelatedToVfModule(tempVnf, modelInfo, cloudConfiguration.getCloudOwner(), 
+                                               cloudConfiguration.getLcpCloudRegionId(), lookupKeyMap);
+                               if(volumeGroupIdOp.isPresent()) {
+                                       lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, volumeGroupIdOp.get());
                                }
                                break;
                        }
@@ -420,6 +422,21 @@ public class BBInputSetup implements JavaDelegate {
                        throw new Exception("Could not find relevant information for related VNF");
                }
        }
+       
+       protected Optional<String> getVolumeGroupIdRelatedToVfModule(GenericVnf vnf, ModelInfo modelInfo, 
+                       String cloudOwner, String cloudRegionId, Map<ResourceKey, String> lookupKeyMap) {
+               if (lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID) == null) {
+                       for(VolumeGroup volumeGroup : vnf.getVolumeGroups()) {
+                               String volumeGroupCustId = 
+                                               bbInputSetupUtils.getAAIVolumeGroup(cloudOwner, 
+                                                               cloudRegionId, volumeGroup.getVolumeGroupId()).getModelCustomizationId();
+                               if(modelInfo.getModelCustomizationId().equalsIgnoreCase(volumeGroupCustId)) {
+                                       return Optional.of(volumeGroup.getVolumeGroupId());
+                               }
+                       }
+               }
+               return Optional.empty();
+       }
 
        protected void mapCatalogVfModule(VfModule vfModule, ModelInfo modelInfo, Service service,
                        String vnfModelCustomizationUUID) {
@@ -592,16 +609,27 @@ public class BBInputSetup implements JavaDelegate {
                        vnf = createGenericVnf(lookupKeyMap, instanceName, platform, lineOfBusiness,
                                        resourceId, generatedVnfType, instanceParams);
                        serviceInstance.getVnfs().add(vnf);
+                       mapVnfcCollectionInstanceGroup(vnf, modelInfo, service);
                }
                if(vnf != null) {
                        mapCatalogVnf(vnf, modelInfo, service);
-                       mapVnfcCollectionInstanceGroup(vnf, modelInfo, service);
-                       if (instanceGroupId != null && instanceGroupModelInfo != null) {
+                       if (instanceGroupId != null && instanceGroupModelInfo != null
+                                       && instanceGroupModelInfo.getModelType().equals(ModelType.networkInstanceGroup)
+                                       && !instanceGroupInList(vnf, instanceGroupId)) {
                                mapNetworkCollectionInstanceGroup(vnf, instanceGroupId);
                        }
                }
        }
 
+       protected boolean instanceGroupInList(GenericVnf vnf, String instanceGroupId) {
+               for(InstanceGroup instanceGroup : vnf.getInstanceGroups()) {
+                       if(instanceGroup.getId() != null && instanceGroup.getId().equalsIgnoreCase(instanceGroupId)) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        protected void mapVnfcCollectionInstanceGroup(GenericVnf genericVnf, ModelInfo modelInfo, Service service) {
                VnfResourceCustomization vnfResourceCustomization = getVnfResourceCustomizationFromService(modelInfo, service);
                if(vnfResourceCustomization != null) {
@@ -609,8 +637,9 @@ public class BBInputSetup implements JavaDelegate {
                                .getVnfcInstanceGroupCustomizations();
                for (VnfcInstanceGroupCustomization vnfcInstanceGroupCust : vnfcInstanceGroups) {
                        InstanceGroup instanceGroup = this.createInstanceGroup();
-                               instanceGroup.setModelInfoInstanceGroup(this.mapperLayer
-                                               .mapCatalogInstanceGroupToInstanceGroup(null, vnfcInstanceGroupCust.getInstanceGroup()));
+                       org.onap.so.db.catalog.beans.InstanceGroup catalogInstanceGroup = bbInputSetupUtils.getCatalogInstanceGroup(vnfcInstanceGroupCust.getModelUUID());
+                       instanceGroup.setModelInfoInstanceGroup(this.mapperLayer
+                                       .mapCatalogInstanceGroupToInstanceGroup(null, catalogInstanceGroup));
                        instanceGroup.getModelInfoInstanceGroup().setFunction(vnfcInstanceGroupCust.getFunction());
                        instanceGroup.setDescription(vnfcInstanceGroupCust.getDescription());
                        genericVnf.getInstanceGroups().add(instanceGroup);
@@ -847,8 +876,13 @@ public class BBInputSetup implements JavaDelegate {
                        String serviceInstanceId, boolean aLaCarte, String bbName) throws Exception {
                ServiceInstance serviceInstance = this.getServiceInstanceHelper(requestDetails, customer, project, owningEntity,
                                lookupKeyMap, serviceInstanceId, aLaCarte, service, bbName);
-               org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI = this.bbInputSetupUtils
-                               .getAAIServiceInstanceById(serviceInstanceId);
+               org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI = null;
+               if(customer != null && customer.getServiceSubscription() != null) {
+                       serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceByIdAndCustomer(customer.getGlobalCustomerId(), 
+                                       customer.getServiceSubscription().getServiceType(), serviceInstanceId);
+               } else {
+                       serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
+               }
                if (serviceInstanceAAI != null
                                && !serviceInstanceAAI.getModelVersionId().equalsIgnoreCase(service.getModelUUID())) {
                        Service tempService = this.bbInputSetupUtils
@@ -872,8 +906,20 @@ public class BBInputSetup implements JavaDelegate {
                        throws Exception {
                String bbName = executeBB.getBuildingBlock().getBpmnFlowName();
                String key = executeBB.getBuildingBlock().getKey();
+               
+               if (requestAction.equalsIgnoreCase("deleteInstance")
+                               || requestAction.equalsIgnoreCase("unassignInstance")
+                               || requestAction.equalsIgnoreCase("activateInstance")
+                               || requestAction.equalsIgnoreCase("activateFabricConfiguration")
+                               || requestAction.equalsIgnoreCase("recreateInstance")
+                               || requestAction.equalsIgnoreCase("replaceInstance")) {
+                       return getGBBMacroExistingService(executeBB, lookupKeyMap, bbName, requestAction,
+                                       requestDetails.getCloudConfiguration());
+               }
+
+               String serviceInstanceId = lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID);
                GeneralBuildingBlock gBB = this.getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap, requestAction,
-                               resourceId);
+                               serviceInstanceId);
                RequestParameters requestParams = requestDetails.getRequestParameters();
                Service service = null;
                if (gBB != null && gBB.getServiceInstance() != null
@@ -896,16 +942,10 @@ public class BBInputSetup implements JavaDelegate {
                if (requestAction.equalsIgnoreCase("deactivateInstance")) {
                        return gBB;
                } else if (requestAction.equalsIgnoreCase("createInstance")) {
-               return getGBBMacroNoUserParamsCreate(executeBB, lookupKeyMap, bbName, key, gBB, service);
-               } else if (requestAction.equalsIgnoreCase("deleteInstance")
-                               || requestAction.equalsIgnoreCase("unassignInstance")
-                               || requestAction.equalsIgnoreCase("activateInstance")
-                               || requestAction.equalsIgnoreCase("activateFabricConfiguration")) {
-                       return getGBBMacroExistingService(executeBB, lookupKeyMap, bbName, gBB, service, requestAction,
-                                       requestDetails.getCloudConfiguration());
+                       return getGBBMacroNoUserParamsCreate(executeBB, lookupKeyMap, bbName, key, gBB, service);
                } else {
-               throw new IllegalArgumentException(
-                               "No user params on requestAction: assignInstance. Please specify user params.");
+                       throw new IllegalArgumentException(
+                                       "No user params on requestAction: assignInstance. Please specify user params.");
                }
        }
 
@@ -977,14 +1017,40 @@ public class BBInputSetup implements JavaDelegate {
        }
 
        protected GeneralBuildingBlock getGBBMacroExistingService(ExecuteBuildingBlock executeBB,
-                       Map<ResourceKey, String> lookupKeyMap, String bbName, GeneralBuildingBlock gBB, Service service,
-                       String requestAction, CloudConfiguration cloudConfiguration) throws Exception {
+                       Map<ResourceKey, String> lookupKeyMap, String bbName, String requestAction, CloudConfiguration cloudConfiguration) throws Exception {
+               org.onap.aai.domain.yang.ServiceInstance aaiServiceInstance = null;
+               String serviceInstanceId = lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID);
+               RequestDetails requestDetails = executeBB.getRequestDetails();
+               GeneralBuildingBlock gBB = null;
+               if (serviceInstanceId != null) {
+                       aaiServiceInstance = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
+               }
+               Service service = null;
+               if (aaiServiceInstance != null) {
+                       service = bbInputSetupUtils.getCatalogServiceByModelUUID(aaiServiceInstance.getModelVersionId());
+               }
+               if (aaiServiceInstance != null && service != null) {
+                       ServiceInstance serviceInstance = this.getExistingServiceInstance(aaiServiceInstance);
+                       serviceInstance.setModelInfoServiceInstance(this.mapperLayer.mapCatalogServiceIntoServiceInstance(service));
+                       gBB = populateGBBWithSIAndAdditionalInfo(requestDetails, serviceInstance, executeBB, requestAction, null);
+               } else {
+                       msoLogger.debug("Related Service Instance from AAI: " + aaiServiceInstance);
+                       msoLogger.debug("Related Service Instance Model Info from AAI: " + service);
+                       throw new Exception("Could not find relevant information for related Service Instance");
+               }
                ServiceInstance serviceInstance = gBB.getServiceInstance();
-               if (cloudConfiguration != null && requestAction.equalsIgnoreCase("deleteInstance")) {
+               CloudRegion cloudRegion = null;
+               if(cloudConfiguration == null) {
+                       Optional<CloudRegion> cloudRegionOp = cloudInfoFromAAI.getCloudInfoFromAAI(serviceInstance);
+                       if(cloudRegionOp.isPresent()) {
+                               cloudRegion = cloudRegionOp.get();
+                       }
+               }
+               if (cloudConfiguration != null) {
                        org.onap.aai.domain.yang.CloudRegion aaiCloudRegion = bbInputSetupUtils.getCloudRegion(cloudConfiguration);
-                       CloudRegion cloudRegion = mapperLayer.mapCloudRegion(cloudConfiguration, aaiCloudRegion);
-                       gBB.setCloudRegion(cloudRegion);
+                       cloudRegion = mapperLayer.mapCloudRegion(cloudConfiguration, aaiCloudRegion);
                }
+               gBB.setCloudRegion(cloudRegion);
                if (bbName.contains(VNF)) {
                        for (GenericVnf genericVnf : serviceInstance.getVnfs()) {
                                if (lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID) != null
@@ -1013,6 +1079,13 @@ public class BBInputSetup implements JavaDelegate {
                                                ModelInfo vfModuleModelInfo = new ModelInfo();
                                                vfModuleModelInfo.setModelCustomizationId(vfModuleCustomizationUUID);
                                                this.mapCatalogVfModule(vfModule, vfModuleModelInfo, service, vnfModelCustomizationUUID);
+                                               if(cloudRegion != null) {
+                                                       Optional<String> volumeGroupIdOp = getVolumeGroupIdRelatedToVfModule(vnf, vfModuleModelInfo, cloudRegion.getCloudOwner(), 
+                                                                       cloudRegion.getLcpCloudRegionId(), lookupKeyMap);
+                                                       if(volumeGroupIdOp.isPresent()) {
+                                                               lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, volumeGroupIdOp.get());
+                                                       }
+                                               }
                                                break;
                                        }
                                }
@@ -1028,9 +1101,9 @@ public class BBInputSetup implements JavaDelegate {
                                                vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
                                                this.mapCatalogVnf(vnf, vnfModelInfo, service);
                                                lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, vnf.getVnfId());
-                                               if (cloudConfiguration != null) {
-                                                       String volumeGroupCustomizationUUID = this.bbInputSetupUtils.getAAIVolumeGroup(cloudConfiguration.getCloudOwner(),
-                                                                       cloudConfiguration.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId())
+                                               if (cloudRegion != null) {
+                                                       String volumeGroupCustomizationUUID = this.bbInputSetupUtils.getAAIVolumeGroup(cloudRegion.getCloudOwner(),
+                                                                       cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId())
                                                                        .getModelCustomizationId();
                                                        ModelInfo volumeGroupModelInfo = new ModelInfo();
                                                        volumeGroupModelInfo.setModelCustomizationId(volumeGroupCustomizationUUID);
@@ -1228,7 +1301,12 @@ public class BBInputSetup implements JavaDelegate {
                                        .getAAIServiceInstanceByName(requestDetails.getRequestInfo().getInstanceName(), customer);
                        }
                        if (serviceInstanceId != null && serviceInstanceAAI == null) {
-                               serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
+                               if(customer != null && customer.getServiceSubscription() != null) {
+                                       serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceByIdAndCustomer(customer.getGlobalCustomerId(), 
+                                                       customer.getServiceSubscription().getServiceType(), serviceInstanceId);
+                               } else {
+                                       serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
+                               }
                        }
                        if (serviceInstanceAAI != null) {
                                lookupKeyMap.put(ResourceKey.SERVICE_INSTANCE_ID, serviceInstanceId);
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/CloudInfoFromAAI.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/CloudInfoFromAAI.java
new file mode 100644 (file)
index 0000000..3708802
--- /dev/null
@@ -0,0 +1,93 @@
+package org.onap.so.bpmn.servicedecomposition.tasks;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
+import org.onap.so.client.aai.entities.Relationships;
+import org.onap.so.logger.MsoLogger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+@Component
+public class CloudInfoFromAAI {
+
+       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, CloudInfoFromAAI.class);
+       @Autowired
+       private BBInputSetupUtils bbInputSetupUtils;
+       
+       public void setBbInputSetupUtils(BBInputSetupUtils bbInputSetupUtils) {
+               this.bbInputSetupUtils = bbInputSetupUtils;
+       }
+       
+       protected Optional<CloudRegion> getCloudInfoFromAAI(ServiceInstance serviceInstance) throws JsonProcessingException {
+               Optional<Relationships> relationshipsOp = Optional.empty();
+               if(!serviceInstance.getVnfs().isEmpty()) {
+                       GenericVnf vnf = serviceInstance.getVnfs().get(0);
+                       org.onap.aai.domain.yang.GenericVnf aaiVnf = bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId());
+                       AAIResultWrapper vnfWrapper = new AAIResultWrapper(
+                                       new AAICommonObjectMapperProvider().getMapper().writeValueAsString(aaiVnf));
+                       relationshipsOp = getRelationshipsFromWrapper(vnfWrapper);
+               } else if(!serviceInstance.getNetworks().isEmpty()) {
+                       L3Network network = serviceInstance.getNetworks().get(0);
+                       org.onap.aai.domain.yang.L3Network aaiL3Network = bbInputSetupUtils.getAAIL3Network(network.getNetworkId());
+                       AAIResultWrapper networkWrapper = new AAIResultWrapper(
+                                       new AAICommonObjectMapperProvider().getMapper().writeValueAsString(aaiL3Network));
+                       relationshipsOp = getRelationshipsFromWrapper(networkWrapper);
+               } else {
+                       msoLogger.debug("BBInputSetup could not find a cloud region or tenant, since there are no resources under the SI.");
+                       return Optional.empty();
+               }
+               if (relationshipsOp.isPresent()) {
+                       return getRelatedCloudRegionAndTenant(relationshipsOp.get());
+               } else {
+                       msoLogger.debug("BBInputSetup could not find a cloud region or tenant");
+                       return Optional.empty();
+               }
+       }
+
+       protected Optional<Relationships> getRelationshipsFromWrapper(AAIResultWrapper wrapper) {
+               Optional<Relationships> relationshipsOp;
+               relationshipsOp = wrapper.getRelationships();
+               if(relationshipsOp.isPresent()) {
+                       return relationshipsOp;
+               }
+               return Optional.empty();
+       }
+
+       protected Optional<CloudRegion> getRelatedCloudRegionAndTenant(Relationships relationships) {
+               CloudRegion cloudRegion = new CloudRegion();
+               List<AAIResultWrapper> cloudRegions = relationships.getByType(AAIObjectType.CLOUD_REGION);
+               List<AAIResultWrapper> tenants = relationships.getByType(AAIObjectType.TENANT);
+               if(!cloudRegions.isEmpty()) {
+                       AAIResultWrapper cloudRegionWrapper = cloudRegions.get(0);
+                       Optional<org.onap.aai.domain.yang.CloudRegion> aaiCloudRegionOp = cloudRegionWrapper
+                                       .asBean(org.onap.aai.domain.yang.CloudRegion.class);
+                       if(aaiCloudRegionOp.isPresent()) {
+                               org.onap.aai.domain.yang.CloudRegion aaiCloudRegion = aaiCloudRegionOp.get();
+                               cloudRegion.setCloudOwner(aaiCloudRegion.getCloudOwner());
+                               cloudRegion.setCloudRegionVersion(aaiCloudRegion.getCloudRegionVersion());
+                               cloudRegion.setLcpCloudRegionId(aaiCloudRegion.getCloudRegionId());
+                               cloudRegion.setComplex(aaiCloudRegion.getComplexName());
+                       }
+               }
+               if(!tenants.isEmpty()) {
+                       AAIResultWrapper tenantWrapper = tenants.get(0);
+                       Optional<org.onap.aai.domain.yang.Tenant> aaiTenantOp = tenantWrapper
+                                       .asBean(org.onap.aai.domain.yang.Tenant.class);
+                       if(aaiTenantOp.isPresent()) {
+                               org.onap.aai.domain.yang.Tenant aaiTenant = aaiTenantOp.get();
+                               cloudRegion.setTenantId(aaiTenant.getTenantId());
+                       }
+               }
+               return Optional.of(cloudRegion);
+       }
+}
index ba9426d..6c2df13 100644 (file)
@@ -76,43 +76,54 @@ public class ExecuteBuildingBlockRainyDay {
                        Map<ResourceKey, String> lookupKeyMap = (Map<ResourceKey, String>) execution.getVariable("lookupKeyMap");
                        String serviceType = ASTERISK;
                        boolean aLaCarte = (boolean) execution.getVariable("aLaCarte");
-                       try {
-                               serviceType = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0).getModelInfoServiceInstance().getServiceType();
-                       } catch (Exception ex) {
-                               // keep default serviceType value
-                       }
-                       String vnfType = ASTERISK;
-                       try {
-                               for(GenericVnf vnf : gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0).getVnfs()) {
-                                       if(vnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) {
-                                               vnfType = vnf.getVnfType();
+                       boolean suppressRollback = (boolean) execution.getVariable("suppressRollback");
+                       String handlingCode = "";
+                       if(suppressRollback){
+                               handlingCode = "Abort";
+                       }else{
+                               try {
+                                       serviceType = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0).getModelInfoServiceInstance().getServiceType();
+                               } catch (Exception ex) {
+                                       // keep default serviceType value
+                               }
+                               String vnfType = ASTERISK;
+                               try {
+                                       for(GenericVnf vnf : gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0).getVnfs()) {
+                                               if(vnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) {
+                                                       vnfType = vnf.getVnfType();
+                                               }
                                        }
+                               } catch (Exception ex) {
+                                       // keep default vnfType value
                                }
-                       } catch (Exception ex) {
-                               // keep default vnfType value
-                       }
-                       WorkflowException workflowException = (WorkflowException) execution.getVariable("WorkflowException");
-                       String errorCode = ASTERISK;
-                       try {
-                               errorCode = "" + workflowException.getErrorCode();
-                       } catch (Exception ex) {
-                               // keep default errorCode value
-                       }
-                       String workStep = ASTERISK;
-                       try {
-                               workStep = workflowException.getWorkStep();
-                       } catch (Exception ex) {
-                               // keep default workStep value
-                       }
-                       //Extract error data to be returned to WorkflowAction
-                       execution.setVariable("WorkflowExceptionErrorMessage", workflowException.getErrorMessage());
-                       RainyDayHandlerStatus rainyDayHandlerStatus;
-                       String handlingCode = "";
-                       rainyDayHandlerStatus = catalogDbClient.getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(bbName,serviceType,vnfType,errorCode,workStep);
-                       if(rainyDayHandlerStatus==null){
-                               rainyDayHandlerStatus = catalogDbClient.getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(bbName,ASTERISK,ASTERISK,ASTERISK,ASTERISK);
+                               WorkflowException workflowException = (WorkflowException) execution.getVariable("WorkflowException");
+                               String errorCode = ASTERISK;
+                               try {
+                                       errorCode = "" + workflowException.getErrorCode();
+                               } catch (Exception ex) {
+                                       // keep default errorCode value
+                               }
+                               String workStep = ASTERISK;
+                               try {
+                                       workStep = workflowException.getWorkStep();
+                               } catch (Exception ex) {
+                                       // keep default workStep value
+                               }
+                               //Extract error data to be returned to WorkflowAction
+                               execution.setVariable("WorkflowExceptionErrorMessage", workflowException.getErrorMessage());
+                               RainyDayHandlerStatus rainyDayHandlerStatus;
+                               rainyDayHandlerStatus = catalogDbClient.getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(bbName,serviceType,vnfType,errorCode,workStep);
                                if(rainyDayHandlerStatus==null){
-                                       handlingCode = "Abort";
+                                       rainyDayHandlerStatus = catalogDbClient.getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(bbName,ASTERISK,ASTERISK,ASTERISK,ASTERISK);
+                                       if(rainyDayHandlerStatus==null){
+                                               handlingCode = "Abort";
+                                       }else{
+                                               if(primaryPolicy){
+                                                       handlingCode = rainyDayHandlerStatus.getPolicy();
+                                               }else{
+                                                       handlingCode = rainyDayHandlerStatus.getSecondaryPolicy();
+                                               }
+                                       }
                                }else{
                                        if(primaryPolicy){
                                                handlingCode = rainyDayHandlerStatus.getPolicy();
@@ -120,26 +131,20 @@ public class ExecuteBuildingBlockRainyDay {
                                                handlingCode = rainyDayHandlerStatus.getSecondaryPolicy();
                                        }
                                }
-                       }else{
-                               if(primaryPolicy){
-                                       handlingCode = rainyDayHandlerStatus.getPolicy();
-                               }else{
-                                       handlingCode = rainyDayHandlerStatus.getSecondaryPolicy();
+                               if(!primaryPolicy){
+                                       try{
+                                               InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
+                                               request.setRetryStatusMessage("Retries have been exhausted.");
+                                               requestDbclient.updateInfraActiveRequests(request);
+                                       } catch(Exception ex){
+                                               msoLogger.debug(ex.toString());
+                                               msoLogger.error("Failed to update Request Db Infra Active Requests with Retry Status");
+                                       }
                                }
-                       }
-                       if(!primaryPolicy){
-                               try{
-                                       InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
-                                       request.setRetryStatusMessage("Retries have been exhausted.");
-                                       requestDbclient.updateInfraActiveRequests(request);
-                               } catch(Exception ex){
-                                       msoLogger.debug(ex.toString());
-                                       msoLogger.error("Failed to update Request Db Infra Active Requests with Retry Status");
+                               if(handlingCode.equals("RollbackToAssigned")&&!aLaCarte){
+                                       handlingCode = "Rollback";
                                }
                        }
-                       if(handlingCode.equals("RollbackToAssigned")&&!aLaCarte){
-                               handlingCode = "Rollback";
-                       }
                        msoLogger.debug("RainyDayHandler Status Code is: " + handlingCode);
                        execution.setVariable(HANDLING_CODE, handlingCode);
                } catch (Exception e) {
index 0e99ce9..403be98 100644 (file)
@@ -13,7 +13,7 @@
       <bpmn2:incoming>SequenceFlow_23</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_18</bpmn2:outgoing>
       <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
-def cvgn= new ConfirmVolumeGroupName()
+def cvgn= new ConfirmVolumeGroupNameFactory().create()
 cvgn.handleAAIQueryFailure(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_18" name="" sourceRef="AAIQueryFailure" targetRef="EndEvent_7"/>
@@ -25,7 +25,7 @@ cvgn.handleAAIQueryFailure(execution)]]></bpmn2:script>
       <bpmn2:incoming>SequenceFlow_38</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_39</bpmn2:outgoing>
       <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
-def cvgn= new ConfirmVolumeGroupName()
+def cvgn= new ConfirmVolumeGroupNameFactory().create()
 cvgn.queryAAIForVolumeGroupId(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_39" name="" sourceRef="QueryAAIForVolumeGroupId" targetRef="ExclusiveGateway_3"/>
@@ -33,7 +33,7 @@ cvgn.queryAAIForVolumeGroupId(execution)]]></bpmn2:script>
       <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_38</bpmn2:outgoing>
       <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
-def cvgn= new ConfirmVolumeGroupName()
+def cvgn= new ConfirmVolumeGroupNameFactory().create()
 cvgn.preProcessRequest(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_38" name="" sourceRef="InitializeVariables" targetRef="QueryAAIForVolumeGroupId"/>
@@ -42,7 +42,7 @@ cvgn.preProcessRequest(execution)]]></bpmn2:script>
       <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>
       <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
-def cvgn= new ConfirmVolumeGroupName()
+def cvgn= new ConfirmVolumeGroupNameFactory().create()
 cvgn.checkAAIQueryResult(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_4" name="" sourceRef="CheckAAIQueryResult" targetRef="ExclusiveGateway_1"/>
@@ -50,7 +50,7 @@ cvgn.checkAAIQueryResult(execution)]]></bpmn2:script>
       <bpmn2:incoming>SequenceFlow_7</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_11</bpmn2:outgoing>
       <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
-def cvgn= new ConfirmVolumeGroupName()
+def cvgn= new ConfirmVolumeGroupNameFactory().create()
 cvgn.handleVolumeGroupNameNoMatch(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:exclusiveGateway id="ExclusiveGateway_1" default="SequenceFlow_7">
index 990863e..6914e75 100644 (file)
@@ -70,6 +70,7 @@ falloutHandler.postProcessResponse(execution)]]></bpmn2:script>
               <camunda:map>
                 <camunda:entry key="content-type">application/soap+xml</camunda:entry>
                 <camunda:entry key="Authorization">#{BasicAuthHeaderValueDB}</camunda:entry>
+                <camunda:entry key="X-ONAP-RequestID">#{FH_request_id}</camunda:entry>
               </camunda:map>
             </camunda:inputParameter>
             <camunda:inputParameter name="payload">
index 2ae2ff7..0032b0e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_l2hJ8CccEeW3d--PaFJMbg" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.13.1" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_l2hJ8CccEeW3d--PaFJMbg" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="sdncAdapter" name="SDNC Adapter" isExecutable="true">
     <bpmn2:exclusiveGateway id="isResponseOK" name="is Response Ok?" default="badSynchronousResponse">
       <bpmn2:incoming>SequenceFlow_15</bpmn2:incoming>
@@ -8,28 +8,29 @@
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="badSynchronousResponse" name="Bad synchronous response" sourceRef="isResponseOK" targetRef="setBadResponse" />
     <bpmn2:sequenceFlow id="goodSynchronousResponse" name="Good synchronous response" sourceRef="isResponseOK" targetRef="resetCallbackRequest">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("SDNCA_ResponseCode")=='200'}</bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("SDNCA_ResponseCode")=='200'}]]></bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:scriptTask id="setBadResponse" name="Set Bad Response&#10;&#10;Exception" scriptFormat="groovy">
       <bpmn2:incoming>badSynchronousResponse</bpmn2:incoming>
       <bpmn2:outgoing>Exception</bpmn2:outgoing>
-      <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
+      <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
 
 int responseCode = execution.getVariable("SDNCA_ResponseCode")
 ExceptionUtil exceptionUtil = new ExceptionUtil()
-exceptionUtil.buildWorkflowException(execution, 7000, "Could not communicate with the SDNC Adapter" )</bpmn2:script>
+exceptionUtil.buildWorkflowException(execution, 7000, "Could not communicate with the SDNC Adapter" )]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="Exception" name="Exception" sourceRef="setBadResponse" targetRef="badResponseEndFlow" />
     <bpmn2:serviceTask id="invokeSDNCAdapter" name="Invoke SDNC Adapter" camunda:asyncAfter="true" camunda:class="">
       <bpmn2:extensionElements>
         <camunda:connector>
           <camunda:inputOutput>
-            <camunda:inputParameter name="url">${execution.getVariable("mso.adapters.sdnc.endpoint")}</camunda:inputParameter>
+            <camunda:inputParameter name="url"><![CDATA[${execution.getVariable("mso.adapters.sdnc.endpoint")}]]></camunda:inputParameter>
             <camunda:inputParameter name="method">POST</camunda:inputParameter>
             <camunda:inputParameter name="headers">
               <camunda:map>
                 <camunda:entry key="content-type">application/soap+xml</camunda:entry>
                 <camunda:entry key="Authorization">#{BasicAuthHeaderValue}</camunda:entry>
+                <camunda:entry key="X-ONAP-RequestID"><![CDATA[#{execution.getVariable("mso-request-id")}]]></camunda:entry>
               </camunda:map>
             </camunda:inputParameter>
             <camunda:inputParameter name="payload">${sdncAdapterRequest}</camunda:inputParameter>
@@ -65,20 +66,18 @@ exceptionUtil.buildWorkflowException(execution, 7000, "Could not communicate wit
       </bpmn2:extensionElements>
       <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_8</bpmn2:outgoing>
-      <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
+      <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
 def sdnc= new SDNCAdapter()
-sdnc.preProcessRequest(execution)
-</bpmn2:script>
+sdnc.preProcessRequest(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_8" sourceRef="processMessage" targetRef="invokeSDNCAdapter" />
     <bpmn2:scriptTask id="returnWorkflowResult" name="Return workflow result" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_9</bpmn2:incoming>
       <bpmn2:incoming>SequenceFlow_11ah5pw</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_14</bpmn2:outgoing>
-      <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
+      <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
 def sdnc= new SDNCAdapter()
-sdnc.postProcessResponse(execution)
-</bpmn2:script>
+sdnc.postProcessResponse(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_14" sourceRef="returnWorkflowResult" targetRef="timeoutError" />
     <bpmn2:exclusiveGateway id="timeoutError" name="Did Timeout occur?" default="noTimeoutError">
@@ -88,7 +87,7 @@ sdnc.postProcessResponse(execution)
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="noTimeoutError" name="No Timeout" sourceRef="timeoutError" targetRef="ExclusiveGateway_1" />
     <bpmn2:sequenceFlow id="SequenceFlow_19" name="Timeout" sourceRef="timeoutError" targetRef="endEventException">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("asynchronousResponseTimeout")==true}</bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("asynchronousResponseTimeout")==true}]]></bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:subProcess id="SubProcess" name="Wait for asynchronous message" camunda:asyncAfter="true">
       <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
@@ -111,17 +110,17 @@ sdnc.postProcessResponse(execution)
     <bpmn2:scriptTask id="setTimeoutEx" name="Set Timeout&#10;and Stop Listening for Callback" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_0mzs1ze</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_11ah5pw</bpmn2:outgoing>
-      <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
+      <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
 def sdnc= new SDNCAdapter()
-sdnc.setTimeout(execution)</bpmn2:script>
+sdnc.setTimeout(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:scriptTask id="resetCallbackRequest" name="Reset callback request and set timer value" scriptFormat="groovy">
       <bpmn2:incoming>goodSynchronousResponse</bpmn2:incoming>
       <bpmn2:incoming>SequenceFlow_26</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>
-      <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
+      <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
 def sdnc= new SDNCAdapter()
-sdnc.resetCallbackRequest(execution)</bpmn2:script>
+sdnc.resetCallbackRequest(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_2" name="" sourceRef="resetCallbackRequest" targetRef="SubProcess" />
     <bpmn2:exclusiveGateway id="ExclusiveGateway_1" name="Check final indicator" default="Done">
@@ -131,14 +130,14 @@ sdnc.resetCallbackRequest(execution)</bpmn2:script>
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="Done" name="Done" sourceRef="ExclusiveGateway_1" targetRef="ResetInterimNotificationFlag" />
     <bpmn2:sequenceFlow id="SequenceFlow_30" name="Not Done" sourceRef="ExclusiveGateway_1" targetRef="ParallelGateway_3">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("continueListening")==true}</bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("continueListening")==true}]]></bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:scriptTask id="toggleSuccessIndicator" name="Toggle Success Indicator" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_1w1za5m</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_17</bpmn2:outgoing>
-      <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
+      <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
 def sdnc= new SDNCAdapter()
-sdnc.toggleSuccessIndicator(execution)</bpmn2:script>
+sdnc.toggleSuccessIndicator(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_17" name="" sourceRef="toggleSuccessIndicator" targetRef="endEventFlow" />
     <bpmn2:endEvent id="endEventFlow" name="End Event Flow">
@@ -168,9 +167,9 @@ sdnc.toggleSuccessIndicator(execution)</bpmn2:script>
       <bpmn2:scriptTask id="assignError" name="Assign Error" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_22</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_27</bpmn2:outgoing>
-        <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
+        <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
 def sdnc= new SDNCAdapter()
-sdnc.assignError(execution)</bpmn2:script>
+sdnc.assignError(execution)]]></bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_27" name="" sourceRef="assignError" targetRef="EndEvent_5" />
       <bpmn2:endEvent id="EndEvent_5">
@@ -183,7 +182,7 @@ sdnc.assignError(execution)</bpmn2:script>
       <bpmn2:outgoing>SequenceFlow_23</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="SequenceFlow_4" name="Yes" sourceRef="ExclusiveGateway_2" targetRef="SetInterimNotificationFlag">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("serviceConfigActivate")==true}</bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("serviceConfigActivate")==true}]]></bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="SequenceFlow_23" name="No" sourceRef="ExclusiveGateway_2" targetRef="EndEvent_1" />
     <bpmn2:endEvent id="EndEvent_1">
@@ -215,7 +214,7 @@ sdnc.assignError(execution)</bpmn2:script>
     <bpmn2:scriptTask id="SetInterimNotificationFlag" name="Set Interim Notification Flag" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_193cb6p</bpmn2:outgoing>
-      <bpmn2:script>execution.setVariable("SDNCA_InterimNotify", true)</bpmn2:script>
+      <bpmn2:script><![CDATA[execution.setVariable("SDNCA_InterimNotify", true)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_193cb6p" sourceRef="SetInterimNotificationFlag" targetRef="CallActivity_11xgv33" />
     <bpmn2:endEvent id="EndEvent_18rq0b6">
@@ -225,9 +224,27 @@ sdnc.assignError(execution)</bpmn2:script>
     <bpmn2:scriptTask id="ResetInterimNotificationFlag" name="Reset Interim Notification Flag" scriptFormat="groovy">
       <bpmn2:incoming>Done</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1w1za5m</bpmn2:outgoing>
-      <bpmn2:script>execution.setVariable("SDNCA_InterimNotify", false)</bpmn2:script>
+      <bpmn2:script><![CDATA[execution.setVariable("SDNCA_InterimNotify", false)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_1w1za5m" sourceRef="ResetInterimNotificationFlag" targetRef="toggleSuccessIndicator" />
+    <bpmn2:subProcess id="SubProcess_1j2zu8s" name="Java Exception Handling Sub Process" triggeredByEvent="true">
+      <bpmn2:startEvent id="StartEvent_10rxj2o">
+        <bpmn2:outgoing>SequenceFlow_1cnxq0j</bpmn2:outgoing>
+        <bpmn2:errorEventDefinition errorRef="Error_2" camunda:errorCodeVariable="BPMN_javaExpCode" camunda:errorMessageVariable="BPMN_javaExpMsg" />
+      </bpmn2:startEvent>
+      <bpmn2:endEvent id="EndEvent_0tzire9">
+        <bpmn2:incoming>SequenceFlow_1j9sip1</bpmn2:incoming>
+      </bpmn2:endEvent>
+      <bpmn2:sequenceFlow id="SequenceFlow_1cnxq0j" sourceRef="StartEvent_10rxj2o" targetRef="Task_1damf23" />
+      <bpmn2:sequenceFlow id="SequenceFlow_1j9sip1" sourceRef="Task_1damf23" targetRef="EndEvent_0tzire9" />
+      <bpmn2:scriptTask id="Task_1damf23" name="Process Error" scriptFormat="groovy">
+        <bpmn2:incoming>SequenceFlow_1cnxq0j</bpmn2:incoming>
+        <bpmn2:outgoing>SequenceFlow_1j9sip1</bpmn2:outgoing>
+        <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.processJavaException(execution)]]></bpmn2:script>
+      </bpmn2:scriptTask>
+    </bpmn2:subProcess>
   </bpmn2:process>
   <bpmn2:message id="Message_1" name="sdncAdapterWorkflowRequest" />
   <bpmn2:message id="Message_2" name="sdncAdapterCallbackRequest" />
@@ -264,23 +281,23 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_5" bpmnElement="badSynchronousResponse" sourceElement="_BPMNShape_ExclusiveGateway_29" targetElement="_BPMNShape_ScriptTask_24">
-        <di:waypoint x="544" y="153" />
-        <di:waypoint x="544" y="122" />
-        <di:waypoint x="600" y="122" />
+        <di:waypoint xsi:type="dc:Point" x="544" y="153" />
+        <di:waypoint xsi:type="dc:Point" x="544" y="122" />
+        <di:waypoint xsi:type="dc:Point" x="600" y="122" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="441" y="99" width="164" height="22" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="_BPMNShape_StartEvent_33" targetElement="_BPMNShape_ScriptTask_3">
-        <di:waypoint x="147" y="179" />
-        <di:waypoint x="194" y="179" />
+        <di:waypoint xsi:type="dc:Point" x="147" y="179" />
+        <di:waypoint xsi:type="dc:Point" x="194" y="179" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="171" y="179" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_4" bpmnElement="goodSynchronousResponse" sourceElement="_BPMNShape_ExclusiveGateway_29" targetElement="_BPMNShape_ScriptTask_27">
-        <di:waypoint x="544" y="203" />
-        <di:waypoint x="544" y="246" />
+        <di:waypoint xsi:type="dc:Point" x="544" y="203" />
+        <di:waypoint xsi:type="dc:Point" x="544" y="246" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="459" y="208" width="172" height="22" />
         </bpmndi:BPMNLabel>
@@ -292,24 +309,24 @@ sdnc.assignError(execution)</bpmn2:script>
         <dc:Bounds x="194" y="139" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_8" bpmnElement="SequenceFlow_8" sourceElement="_BPMNShape_ScriptTask_3" targetElement="_BPMNShape_ServiceTask_62">
-        <di:waypoint x="294" y="179" />
-        <di:waypoint x="342" y="179" />
+        <di:waypoint xsi:type="dc:Point" x="294" y="179" />
+        <di:waypoint xsi:type="dc:Point" x="342" y="179" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="300" y="153" width="30" height="22" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_14" bpmnElement="SequenceFlow_14" sourceElement="_BPMNShape_ServiceTask_68" targetElement="_BPMNShape_ExclusiveGateway_53">
-        <di:waypoint x="1204" y="277" />
-        <di:waypoint x="1248" y="276" />
+        <di:waypoint xsi:type="dc:Point" x="1204" y="277" />
+        <di:waypoint xsi:type="dc:Point" x="1248" y="276" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1211" y="251" width="37" height="22" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_15" bpmnElement="SequenceFlow_15" sourceElement="_BPMNShape_ServiceTask_62" targetElement="_BPMNShape_ExclusiveGateway_29">
-        <di:waypoint x="442" y="179" />
-        <di:waypoint x="480" y="179" />
-        <di:waypoint x="480" y="178" />
-        <di:waypoint x="519" y="178" />
+        <di:waypoint xsi:type="dc:Point" x="442" y="179" />
+        <di:waypoint xsi:type="dc:Point" x="480" y="179" />
+        <di:waypoint xsi:type="dc:Point" x="480" y="178" />
+        <di:waypoint xsi:type="dc:Point" x="519" y="178" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="468" y="153" width="37" height="22" />
         </bpmndi:BPMNLabel>
@@ -330,8 +347,8 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_9" bpmnElement="SequenceFlow_9" sourceElement="_BPMNShape_SubProcess_11">
-        <di:waypoint x="998" y="278" />
-        <di:waypoint x="1104" y="277" />
+        <di:waypoint xsi:type="dc:Point" x="998" y="278" />
+        <di:waypoint xsi:type="dc:Point" x="1104" y="277" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1051" y="262.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -340,8 +357,8 @@ sdnc.assignError(execution)</bpmn2:script>
         <dc:Bounds x="600" y="82" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_3" bpmnElement="Exception" sourceElement="_BPMNShape_ScriptTask_24" targetElement="_BPMNShape_EndEvent_65">
-        <di:waypoint x="700" y="122" />
-        <di:waypoint x="762" y="122" />
+        <di:waypoint xsi:type="dc:Point" x="700" y="122" />
+        <di:waypoint xsi:type="dc:Point" x="762" y="122" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="699" y="99" width="64" height="22" />
         </bpmndi:BPMNLabel>
@@ -350,8 +367,8 @@ sdnc.assignError(execution)</bpmn2:script>
         <dc:Bounds x="941" y="372" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_16" bpmnElement="SequenceFlow_16" sourceElement="_BPMNShape_IntermediateCatchEvent_16">
-        <di:waypoint x="817" y="275" />
-        <di:waypoint x="926" y="275" />
+        <di:waypoint xsi:type="dc:Point" x="817" y="275" />
+        <di:waypoint xsi:type="dc:Point" x="926" y="275" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="872" y="260" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -363,16 +380,16 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_17" bpmnElement="noTimeoutError" sourceElement="_BPMNShape_ExclusiveGateway_53" targetElement="_BPMNShape_ExclusiveGateway_54">
-        <di:waypoint x="1273" y="301" />
-        <di:waypoint x="1273" y="359" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="301" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="359" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1280" y="324" width="72" height="22" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_19" bpmnElement="SequenceFlow_19" sourceElement="_BPMNShape_ExclusiveGateway_53" targetElement="_BPMNShape_ScriptTask_25">
-        <di:waypoint x="1273" y="251" />
-        <di:waypoint x="1273" y="95" />
-        <di:waypoint x="1560" y="95" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="251" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="95" />
+        <di:waypoint xsi:type="dc:Point" x="1560" y="95" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1301" y="169.45283018867923" width="39" height="12" />
         </bpmndi:BPMNLabel>
@@ -384,8 +401,8 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_7" bpmnElement="Done" sourceElement="_BPMNShape_ExclusiveGateway_54" targetElement="_BPMNShape_ScriptTask_247">
-        <di:waypoint x="1298" y="384" />
-        <di:waypoint x="1386" y="385" />
+        <di:waypoint xsi:type="dc:Point" x="1298" y="384" />
+        <di:waypoint xsi:type="dc:Point" x="1386" y="385" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1322" y="384.219838851959" width="27" height="13" />
         </bpmndi:BPMNLabel>
@@ -394,17 +411,17 @@ sdnc.assignError(execution)</bpmn2:script>
         <dc:Bounds x="494" y="246" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_12" bpmnElement="SequenceFlow_2" sourceElement="_BPMNShape_ScriptTask_27" targetElement="_BPMNShape_SubProcess_11">
-        <di:waypoint x="594" y="286" />
-        <di:waypoint x="607" y="286" />
-        <di:waypoint x="607" y="275" />
-        <di:waypoint x="619" y="275" />
+        <di:waypoint xsi:type="dc:Point" x="594" y="286" />
+        <di:waypoint xsi:type="dc:Point" x="607" y="286" />
+        <di:waypoint xsi:type="dc:Point" x="607" y="275" />
+        <di:waypoint xsi:type="dc:Point" x="619" y="275" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="622" y="280.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_38" bpmnElement="SequenceFlow_30" sourceElement="_BPMNShape_ExclusiveGateway_54" targetElement="_BPMNShape_ParallelGateway_14">
-        <di:waypoint x="1273" y="409" />
-        <di:waypoint x="1273" y="467" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="409" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="467" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1273" y="423" width="60" height="22" />
         </bpmndi:BPMNLabel>
@@ -416,8 +433,8 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_13" bpmnElement="SequenceFlow_4" sourceElement="_BPMNShape_ExclusiveGateway_55" targetElement="CallActivity_11xgv33_di">
-        <di:waypoint x="1273" y="602" />
-        <di:waypoint x="1273" y="664" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="602" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="664" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1237" y="635.9906427957554" width="18" height="13" />
         </bpmndi:BPMNLabel>
@@ -429,8 +446,8 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_28" bpmnElement="SequenceFlow_21" sourceElement="_BPMNShape_ParallelGateway_14">
-        <di:waypoint x="1272" y="516" />
-        <di:waypoint x="1273" y="552" />
+        <di:waypoint xsi:type="dc:Point" x="1272" y="516" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="552" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1273" y="519" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -442,17 +459,17 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_30" bpmnElement="SequenceFlow_23" sourceElement="_BPMNShape_ExclusiveGateway_55" targetElement="_BPMNShape_EndEvent_96">
-        <di:waypoint x="1298" y="577" />
-        <di:waypoint x="1330" y="577" />
-        <di:waypoint x="1440" y="577" />
+        <di:waypoint xsi:type="dc:Point" x="1298" y="577" />
+        <di:waypoint xsi:type="dc:Point" x="1330" y="577" />
+        <di:waypoint xsi:type="dc:Point" x="1440" y="577" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1309" y="590.5" width="14" height="13" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_33" bpmnElement="SequenceFlow_26" sourceElement="_BPMNShape_ParallelGateway_14" targetElement="_BPMNShape_ScriptTask_27">
-        <di:waypoint x="1248" y="492" />
-        <di:waypoint x="544" y="492" />
-        <di:waypoint x="544" y="326" />
+        <di:waypoint xsi:type="dc:Point" x="1248" y="492" />
+        <di:waypoint xsi:type="dc:Point" x="544" y="492" />
+        <di:waypoint xsi:type="dc:Point" x="544" y="326" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="782" y="467" width="73" height="48" />
         </bpmndi:BPMNLabel>
@@ -461,47 +478,47 @@ sdnc.assignError(execution)</bpmn2:script>
         <dc:Bounds x="1540" y="344" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_26" bpmnElement="SequenceFlow_17" sourceElement="_BPMNShape_ScriptTask_247" targetElement="_BPMNShape_EndEvent_64">
-        <di:waypoint x="1640" y="384" />
-        <di:waypoint x="1699" y="384" />
+        <di:waypoint xsi:type="dc:Point" x="1640" y="384" />
+        <di:waypoint xsi:type="dc:Point" x="1699" y="384" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1670" y="369" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="_BPMNShape_SubProcess_19" bpmnElement="errorHandlingSubProcess" isExpanded="true">
-        <dc:Bounds x="207" y="692" width="353" height="193" />
+        <dc:Bounds x="250" y="598" width="353" height="193" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="_BPMNShape_StartEvent_63" bpmnElement="catchErrors">
-        <dc:Bounds x="242" y="771" width="36" height="36" />
+        <dc:Bounds x="285" y="677" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="245" y="812" width="29" height="12" />
+          <dc:Bounds x="288" y="718" width="29" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="_BPMNShape_EndEvent_213" bpmnElement="EndEvent_5">
-        <dc:Bounds x="482" y="771" width="36" height="36" />
+        <dc:Bounds x="525" y="677" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="455" y="812" width="90" height="0" />
+          <dc:Bounds x="498" y="718" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="_BPMNShape_ScriptTask_249" bpmnElement="assignError">
-        <dc:Bounds x="326" y="749" width="100" height="80" />
+        <dc:Bounds x="369" y="655" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_29" bpmnElement="SequenceFlow_22" sourceElement="_BPMNShape_StartEvent_63" targetElement="_BPMNShape_ScriptTask_249">
-        <di:waypoint x="278" y="789" />
-        <di:waypoint x="326" y="789" />
+        <di:waypoint xsi:type="dc:Point" x="321" y="695" />
+        <di:waypoint xsi:type="dc:Point" x="369" y="695" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="263" y="789" width="90" height="0" />
+          <dc:Bounds x="306" y="695" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_34" bpmnElement="SequenceFlow_27" sourceElement="_BPMNShape_ScriptTask_249" targetElement="_BPMNShape_EndEvent_213">
-        <di:waypoint x="426" y="789" />
-        <di:waypoint x="482" y="789" />
+        <di:waypoint xsi:type="dc:Point" x="469" y="695" />
+        <di:waypoint xsi:type="dc:Point" x="525" y="695" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="409" y="789" width="90" height="0" />
+          <dc:Bounds x="452" y="695" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1eciucn_di" bpmnElement="SequenceFlow_1eciucn">
-        <di:waypoint x="691" y="275" />
-        <di:waypoint x="781" y="275" />
+        <di:waypoint xsi:type="dc:Point" x="691" y="275" />
+        <di:waypoint xsi:type="dc:Point" x="781" y="275" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="736" y="260" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -519,17 +536,17 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0mzs1ze_di" bpmnElement="SequenceFlow_0mzs1ze">
-        <di:waypoint x="800" y="364" />
-        <di:waypoint x="800" y="412" />
-        <di:waypoint x="941" y="412" />
+        <di:waypoint xsi:type="dc:Point" x="800" y="364" />
+        <di:waypoint xsi:type="dc:Point" x="800" y="412" />
+        <di:waypoint xsi:type="dc:Point" x="941" y="412" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="815" y="388" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_11ah5pw_di" bpmnElement="SequenceFlow_11ah5pw">
-        <di:waypoint x="1041" y="412" />
-        <di:waypoint x="1154" y="412" />
-        <di:waypoint x="1154" y="317" />
+        <di:waypoint xsi:type="dc:Point" x="1041" y="412" />
+        <di:waypoint xsi:type="dc:Point" x="1154" y="412" />
+        <di:waypoint xsi:type="dc:Point" x="1154" y="317" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1098" y="397" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -547,8 +564,8 @@ sdnc.assignError(execution)</bpmn2:script>
         <dc:Bounds x="1223" y="666" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_193cb6p_di" bpmnElement="SequenceFlow_193cb6p">
-        <di:waypoint x="1273" y="746" />
-        <di:waypoint x="1273" y="795" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="746" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="795" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1288" y="770.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -560,8 +577,8 @@ sdnc.assignError(execution)</bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1em7gys_di" bpmnElement="SequenceFlow_1em7gys">
-        <di:waypoint x="1273" y="875" />
-        <di:waypoint x="1273" y="920" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="875" />
+        <di:waypoint xsi:type="dc:Point" x="1273" y="920" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1288" y="897.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -570,12 +587,44 @@ sdnc.assignError(execution)</bpmn2:script>
         <dc:Bounds x="1386" y="345" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1w1za5m_di" bpmnElement="SequenceFlow_1w1za5m">
-        <di:waypoint x="1486" y="385" />
-        <di:waypoint x="1540" y="384" />
+        <di:waypoint xsi:type="dc:Point" x="1486" y="385" />
+        <di:waypoint xsi:type="dc:Point" x="1540" y="384" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1513" y="369.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="SubProcess_009jbzr_di" bpmnElement="SubProcess_1j2zu8s" isExpanded="true">
+        <dc:Bounds x="252" y="817" width="350" height="200" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_1cwwku2_di" bpmnElement="StartEvent_10rxj2o">
+        <dc:Bounds x="288" y="904" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="306" y="944" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_0tzire9_di" bpmnElement="EndEvent_0tzire9">
+        <dc:Bounds x="530" y="904" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="548" y="944" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1cnxq0j_di" bpmnElement="SequenceFlow_1cnxq0j">
+        <di:waypoint xsi:type="dc:Point" x="324" y="922" />
+        <di:waypoint xsi:type="dc:Point" x="378" y="922" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="351" y="901" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1j9sip1_di" bpmnElement="SequenceFlow_1j9sip1">
+        <di:waypoint xsi:type="dc:Point" x="478" y="922" />
+        <di:waypoint xsi:type="dc:Point" x="530" y="922" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="504" y="901" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1n6d3r0_di" bpmnElement="Task_1damf23">
+        <dc:Bounds x="378" y="882" width="100" height="80" />
+      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn2:definitions>
diff --git a/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/CatalogDbUtilsTest.groovy b/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/CatalogDbUtilsTest.groovy
new file mode 100644 (file)
index 0000000..d6a7cf0
--- /dev/null
@@ -0,0 +1,145 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 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.so.bpmn.common.scripts
+
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake
+import org.json.JSONArray
+import org.json.JSONObject
+import org.junit.Before
+import org.junit.Test
+import org.onap.logging.ref.slf4j.ONAPLogConstants
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
+import org.onap.so.utils.TargetEntity
+import org.skyscreamer.jsonassert.JSONAssert
+import org.skyscreamer.jsonassert.JSONCompareMode
+import org.springframework.core.env.Environment
+
+import javax.ws.rs.core.MediaType
+import javax.ws.rs.core.Response
+
+import static org.assertj.core.api.Assertions.assertThat
+import static org.mockito.ArgumentMatchers.anyString
+import static org.mockito.Mockito.eq
+import static org.mockito.Mockito.mock
+import static org.mockito.Mockito.when
+import static org.mockito.Mockito.verify
+
+class CatalogDbUtilsTest {
+
+    private static final String AUTHORIZATION_HEADER = "AuthHeaderTest"
+    private static final String RESPONSE_FROM_CATALOG_DB = "{\"serviceVnfs\": [{\"name\": \"service1\"," +
+            "\"vfModules\": [{\"name\": \"module1\", \"isBase\":true, \"initialCount\":1}]}]}"
+    private HttpClientFactory httpClientFactoryMock
+    private MsoUtils msoUtilsMock
+    private JsonUtils jsonUtilsMock
+    private HttpClient httpClientMock
+    private DelegateExecutionFake executionFake
+    private CatalogDbUtils testedObject
+
+
+    @Before
+    void setUp() {
+        httpClientFactoryMock = mock(HttpClientFactory.class)
+        msoUtilsMock = mock(MsoUtils.class)
+        jsonUtilsMock = mock(JsonUtils.class)
+        httpClientMock = mock(HttpClient.class)
+        executionFake = new DelegateExecutionFake()
+        testedObject = new CatalogDbUtils(httpClientFactoryMock, msoUtilsMock, jsonUtilsMock)
+    }
+
+    @Test
+    void getAllVnfsByVnfModelCustomizationUuid_CatVer1_success() {
+        // given
+        executionFake.setVariable("BasicAuthHeaderValueDB", AUTHORIZATION_HEADER)
+        mockGetResponseFromCatalogDb("http://testUrl/v2/serviceVnfs?vnfModelCustomizationUuid=testModel")
+        //when
+        JSONArray vnfsListResult = testedObject.getAllVnfsByVnfModelCustomizationUuid(executionFake, "testModel", "v1")
+        //then
+        verifyHeadersInHttpClient()
+        JSONAssert.assertEquals("[{\"vfModules\":[{\"initialCount\":1,\"modelInfo\":{\"modelType\":\"vfModule\"},\"isBase\":true}],\"modelInfo\":{\"modelType\":\"vnf\"}}]", vnfsListResult, JSONCompareMode.LENIENT)
+    }
+
+    @Test
+    void getAllVnfsByVnfModelCustomizationUuid_CatVer2_success() {
+        // given
+        executionFake.setVariable("BasicAuthHeaderValueDB", AUTHORIZATION_HEADER)
+        mockGetResponseFromCatalogDb("http://testUrl/v2/serviceVnfs?vnfModelCustomizationUuid=testModel")
+        // when
+        JSONArray vnfsListResult = testedObject.getAllVnfsByVnfModelCustomizationUuid(executionFake, "testModel", "v2")
+        // then
+        verifyHeadersInHttpClient()
+        JSONAssert.assertEquals("[{\"vfModules\":[{\"initialCount\":1,\"name\":\"module1\",\"isBase\":true}],\"name\":\"service1\"}]", vnfsListResult, JSONCompareMode.LENIENT)
+    }
+
+    @Test
+    void getServiceResourcesByServiceModelUuid_success() {
+        // given
+        executionFake.setVariable("BasicAuthHeaderValueDB", AUTHORIZATION_HEADER)
+        mockGetResponseFromCatalogDb("http://testUrl/v2/serviceResources?serviceModelUuid=testModel")
+        // when
+        JSONObject result = testedObject.getServiceResourcesByServiceModelUuid(executionFake, "testModel", "v2")
+        // then
+        verifyHeadersInHttpClient()
+        JSONAssert.assertEquals("{\"serviceVnfs\": [{\"name\": \"service1\",\"vfModules\": [{\"name\": \"module1\", \"isBase\":true, \"initialCount\":1}]}]}", result, JSONCompareMode.LENIENT)
+    }
+
+
+    @Test
+    void getServiceResourcesByServiceModelInvariantUuidString_success() {
+        // given
+        executionFake.setVariable("BasicAuthHeaderValueDB", AUTHORIZATION_HEADER)
+        mockGetResponseFromCatalogDb("http://testUrl/v2/serviceResources?serviceModelInvariantUuid=testModel")
+        // when
+        String result = testedObject.getServiceResourcesByServiceModelInvariantUuidString(executionFake, "testModel")
+        // then
+        verifyHeadersInHttpClient()
+        assertThat(result).isEqualTo(RESPONSE_FROM_CATALOG_DB)
+    }
+
+    private Environment createEnvironmentMock() {
+        Environment mockEnvironment = mock(Environment.class)
+        UrnPropertiesReader urnPropertiesReader = new UrnPropertiesReader()
+        urnPropertiesReader.setEnvironment(mockEnvironment)
+        return mockEnvironment
+    }
+
+    private void mockGetResponseFromCatalogDb(String queryEndpoint) {
+        Environment environmentMock = createEnvironmentMock()
+        when(environmentMock.getProperty("mso.catalog.db.endpoint")).thenReturn("http://testUrl")
+        when(httpClientFactoryMock.newJsonClient(new URL(queryEndpoint), TargetEntity.CATALOG_DB)).thenReturn(httpClientMock)
+
+        Response responseMock = mock(Response.class)
+        when(httpClientMock.get()).thenReturn(responseMock)
+        when(responseMock.readEntity(String.class)) thenReturn(RESPONSE_FROM_CATALOG_DB)
+        when(responseMock.getStatus()).thenReturn(200)
+    }
+
+    private void verifyHeadersInHttpClient() {
+        verify(httpClientMock).addAdditionalHeader(eq(ONAPLogConstants.Headers.REQUEST_ID), anyString())
+        verify(httpClientMock).addAdditionalHeader("X-FromAppId", "BPMN")
+        verify(httpClientMock).addAdditionalHeader("Accept", MediaType.APPLICATION_JSON)
+        verify(httpClientMock).addAdditionalHeader("Authorization", AUTHORIZATION_HEADER)
+    }
+
+}
index a96127a..79aacdf 100644 (file)
@@ -4,12 +4,14 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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.
 
 package org.onap.so.bpmn.common.scripts
 
-import static org.mockito.Mockito.*
-
-import javax.ws.rs.core.UriBuilder
-
+import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
-import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
 import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake
-import org.junit.Assert
 import org.junit.Before
 import org.junit.Test
-import org.mockito.ArgumentCaptor
-import org.mockito.Captor
-import org.mockito.Mockito
+import org.mockito.Mock
 import org.mockito.MockitoAnnotations
-import org.mockito.Spy
+import org.onap.aai.domain.yang.RelationshipList
 import org.onap.aai.domain.yang.VolumeGroup
+import org.onap.so.bpmn.common.scripts.ConfirmVolumeGroupName
+import org.onap.so.bpmn.common.scripts.ConfirmVolumeGroupNameFactory
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.client.aai.AAIObjectType
+import org.onap.so.client.aai.AAIResourcesClient
 import org.onap.so.client.aai.entities.uri.AAIResourceUri
 import org.onap.so.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.constants.Defaults
+import org.springframework.http.HttpStatus
+
+import javax.ws.rs.core.UriBuilder
+
+import static org.assertj.core.api.Assertions.catchThrowableOfType
+import static org.junit.Assert.assertEquals
+import static org.junit.Assert.assertFalse
+import static org.junit.Assert.assertTrue
+import static org.mockito.Mockito.spy
+import static org.mockito.Mockito.when
+
+class ConfirmVolumeGroupNameTest {
+
+    private static final AAIResourceUri RESOURCE_URI = AAIUriFactory.createResourceFromExistingURI(
+            AAIObjectType.VOLUME_GROUP, UriBuilder.fromPath('/aai/test/volume-groups/volume-group/testVolumeGroup').build())
+
+    private ConfirmVolumeGroupName confirmVolumeGroupName
+    @Mock
+    private VolumeGroup volumeGroup
+    @Mock
+    private AAIResourcesClient client
+    private ExceptionUtilFake exceptionUtilFake
+
+    private DelegateExecution delegateExecution
+
+    @Before
+    public void init() throws IOException {
+        exceptionUtilFake = new ExceptionUtilFake()
+        confirmVolumeGroupName = spy(new ConfirmVolumeGroupName(exceptionUtilFake))
+        MockitoAnnotations.initMocks(this)
+        delegateExecution = new DelegateExecutionFake()
+        volumeGroup = createVolumeGroup()
+        when(confirmVolumeGroupName.getAAIClient()).thenReturn(client)
+    }
+
+    @Test
+    public void preProcessRequest_shouldSetUpVariables() {
+        String volumeGroupId = "volume-group-id-1"
+        String volumeGroupName = "volume-group-name-1"
+        String aicCloudRegion = "aic-cloud-region-1"
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, Defaults.CLOUD_OWNER, aicCloudRegion, volumeGroupId)
+
+        delegateExecution.setVariable("ConfirmVolumeGroupName_volumeGroupId", volumeGroupId)
+        delegateExecution.setVariable("ConfirmVolumeGroupName_volumeGroupName", volumeGroupName)
+        delegateExecution.setVariable("ConfirmVolumeGroupName_aicCloudRegion", aicCloudRegion)
+        delegateExecution.setVariable("CVGN_volumeGroupGetEndpoint", uri)
+
+        confirmVolumeGroupName.preProcessRequest(delegateExecution)
+
+        assertEquals(ConfirmVolumeGroupName.Prefix, delegateExecution.getVariable("prefix"))
+
+        assertEquals(volumeGroupId, delegateExecution.getVariable("CVGN_volumeGroupId"))
+        assertEquals(volumeGroupName, delegateExecution.getVariable("CVGN_volumeGroupName"))
+        assertEquals(aicCloudRegion, delegateExecution.getVariable("CVGN_aicCloudRegion"))
+    }
+
+    @Test
+    public void queryAAIForVolumeGroupId_shouldSucceed_whenVolumeGroupExists() {
+        delegateExecution.setVariable("CVGN_queryVolumeGroupResponseCode", HttpStatus.OK)
+        delegateExecution.setVariable("CVGN_queryVolumeGroupResponse", volumeGroup)
+        delegateExecution.setVariable("CVGN_volumeGroupGetEndpoint", RESOURCE_URI)
+        when(client.get(VolumeGroup.class, RESOURCE_URI)).thenReturn(Optional.of(volumeGroup))
+
+        confirmVolumeGroupName.queryAAIForVolumeGroupId(delegateExecution)
+
+        assertEquals(HttpStatus.OK.value(), delegateExecution.getVariable("CVGN_queryVolumeGroupResponseCode"))
+        assertEquals(volumeGroup, delegateExecution.getVariable("CVGN_queryVolumeGroupResponse"))
+    }
+
+    @Test
+    public void queryAAIForVolumeGroupId_shouldFailWith404_whenVolumeGroupDoesNotExist() {
+        delegateExecution.setVariable("CVGN_volumeGroupGetEndpoint", RESOURCE_URI)
+        when(client.get(VolumeGroup.class, RESOURCE_URI)).thenReturn(Optional.empty())
+
+        confirmVolumeGroupName.queryAAIForVolumeGroupId(delegateExecution)
+
+        assertEquals(HttpStatus.NOT_FOUND.value(), delegateExecution.getVariable("CVGN_queryVolumeGroupResponseCode"))
+        assertEquals("Volume Group not Found!", delegateExecution.getVariable("CVGN_queryVolumeGroupResponse"))
+    }
+
+    @Test
+    public void queryAAIForVolumeGroupId_shouldThrowWorkflowException_whenRuntimeExceptionIsThrown() throws BpmnError {
+        delegateExecution.setVariable("CVGN_volumeGroupGetEndpoint", RESOURCE_URI)
+        delegateExecution.setVariable("testProcessKey", "process-key1")
+
+        def errorMsg = "my runtime exception"
+        when(client.get(VolumeGroup.class, RESOURCE_URI)).thenThrow(new RuntimeException(errorMsg))
+
+        def exceptionMsg = "AAI GET Failed"
+
+        BpmnError error = catchThrowableOfType(
+                { -> confirmVolumeGroupName.queryAAIForVolumeGroupId(delegateExecution) }, BpmnError.class)
+
+        assertEquals(String.format("MSOWorkflowException: %s", exceptionMsg), error.getMessage())
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value().toString(), error.getErrorCode())
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value(), delegateExecution.getVariable("CVGN_queryVolumeGroupResponseCode"))
+        assertEquals(String.format("AAI GET Failed:%s", errorMsg), delegateExecution.getVariable("CVGN_queryVolumeGroupResponse"))
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value(), exceptionUtilFake.getErrorCode())
+        assertEquals(exceptionMsg, exceptionUtilFake.getErrorMessage())
+        assertEquals(delegateExecution, exceptionUtilFake.getDelegateExecution())
+    }
+
+    @Test
+    public void checkAAIQueryResult_shouldSetVolumeGroupNameMatchesToFalse_whenResponseCodeIs404() {
+        delegateExecution.setVariable("CVGN_queryVolumeGroupResponseCode", HttpStatus.NOT_FOUND)
+        delegateExecution.setVariable("CVGN_volumeGroupName", "")
+
+        confirmVolumeGroupName.checkAAIQueryResult(delegateExecution)
+
+        assertFalse(delegateExecution.getVariable("CVGN_volumeGroupNameMatches"))
+    }
+
+    @Test
+    public void checkAAIQueryResult_shouldSetVolumeGroupNameMatchesToTrue_whenResponseCodeIs200AndVolumeGroupNameExists() {
+        delegateExecution.setVariable("CVGN_queryVolumeGroupResponseCode", HttpStatus.OK.value())
+        delegateExecution.setVariable("CVGN_queryVolumeGroupResponse", volumeGroup)
+        delegateExecution.setVariable("CVGN_volumeGroupName", volumeGroup.getVolumeGroupName())
+
+        confirmVolumeGroupName.checkAAIQueryResult(delegateExecution)
+
+        assertTrue(delegateExecution.getVariable("CVGN_volumeGroupNameMatches"))
+    }
+
+    @Test
+    public void handleVolumeGroupNameNoMatch_shouldThrowBpmnErrorException() {
+        def volumeGroupId = "volume-group-id"
+        def volumeGroupName = "volume-group-name"
+
+        delegateExecution.setVariable("CVGN_volumeGroupId", volumeGroupId)
+        delegateExecution.setVariable("CVGN_volumeGroupName", volumeGroupName)
+
+        def errorMessage = String.format("Error occurred - volume group id %s is not associated with %s",
+                delegateExecution.getVariable('CVGN_volumeGroupId'), delegateExecution.getVariable('CVGN_volumeGroupName'))
+
+        BpmnError error = catchThrowableOfType(
+                { -> confirmVolumeGroupName.handleVolumeGroupNameNoMatch(delegateExecution) }, BpmnError.class)
+
+        assertEquals(String.format("MSOWorkflowException: %s", errorMessage), error.getMessage())
+        assertEquals("1002", error.getErrorCode())
+
+        assertEquals(1002, exceptionUtilFake.getErrorCode())
+        assertEquals(errorMessage, exceptionUtilFake.getErrorMessage())
+        assertEquals(delegateExecution, exceptionUtilFake.getDelegateExecution())
+    }
+
+    @Test
+    public void reportSuccess_shouldSetWorkflowResponseToEmptyString() {
+        confirmVolumeGroupName.reportSuccess(delegateExecution)
+        assertEquals("", delegateExecution.getVariable("WorkflowResponse"))
+    }
+
+    private VolumeGroup createVolumeGroup() {
+        VolumeGroup volumeGroup = new VolumeGroup()
+
+        volumeGroup.setVolumeGroupId("volume-group-id")
+        volumeGroup.setVolumeGroupName("volume-group-name")
+        volumeGroup.setHeatStackId("heat-stack-id")
+        volumeGroup.setVnfType("vnf-type")
+        volumeGroup.setOrchestrationStatus("orchestration-status")
+        volumeGroup.setModelCustomizationId("model-customization-id")
+        volumeGroup.setVfModuleModelCustomizationId("vf-module-model-customization-id")
+        volumeGroup.setResourceVersion("resource-version")
+        volumeGroup.setRelationshipList(new RelationshipList())
+
+        return volumeGroup
+    }
+
+    private static class ExceptionUtilFake extends ExceptionUtil {
+
+        private int errorCode
+        private String errorMessage
+        private DelegateExecution execution
+
+        @Override
+        public void buildAndThrowWorkflowException(DelegateExecution execution, int errorCode, String errorMessage) {
+            this.errorCode = errorCode
+            this.errorMessage = errorMessage
+            this.execution = execution
+            throw new BpmnError(errorCode.toString(), "MSOWorkflowException: ${errorMessage}")
+        }
+
+        public int getErrorCode() {
+            return errorCode
+        }
+
+        public String getErrorMessage() {
+            return errorMessage
+        }
+
+        public DelegateExecution getDelegateExecution() {
+            return execution
+        }
+    }
 
-class ConfirmVolumeGroupNameTest extends MsoGroovyTest {
-       
-       @Spy
-       private ConfirmVolumeGroupName confirmVolumeGroupName;
-
-       @Before
-       public void init() throws IOException {
-               super.init("ConfirmVolumeGroupName")
-               MockitoAnnotations.initMocks(this);
-               when(confirmVolumeGroupName.getAAIClient()).thenReturn(client)
-
-       }
-
-       @Test
-       public void testQueryAAIForVolumeGroupId() {
-
-               AAIResourceUri resourceUri = AAIUriFactory.createResourceFromExistingURI(AAIObjectType.VOLUME_GROUP, UriBuilder.fromPath('/aai/test/volume-groups/volume-group/testVolumeGroup').build());
-               when(mockExecution.getVariable("CVGN_volumeGroupGetEndpoint")).thenReturn(resourceUri)
-               VolumeGroup volumeGroup = new VolumeGroup()
-               volumeGroup.setVolumeGroupId("Test")
-               when(client.get(VolumeGroup.class,resourceUri)).thenReturn(Optional.of(volumeGroup))
-               confirmVolumeGroupName.queryAAIForVolumeGroupId(mockExecution)
-        Mockito.verify(mockExecution).setVariable("CVGN_queryVolumeGroupResponseCode",200)
-        Mockito.verify(mockExecution).setVariable("CVGN_queryVolumeGroupResponse",volumeGroup)
-       }
-
-       @Test
-       public void testQueryAAIForVolumeGroupId_404() {
-               AAIResourceUri resourceUri = AAIUriFactory.createResourceFromExistingURI(AAIObjectType.VOLUME_GROUP, UriBuilder.fromPath('/aai/test/volume-groups/volume-group/testVolumeGroup').build());
-               when(client.get(VolumeGroup.class,  resourceUri)).thenReturn(Optional.empty())
-               DelegateExecution execution = new DelegateExecutionFake()
-               try {
-                       execution.setVariable("CVGN_volumeGroupGetEndpoint", resourceUri)
-                       confirmVolumeGroupName.queryAAIForVolumeGroupId(execution)
-               }
-               catch(Exception ex){}
-               Assert.assertEquals(404, execution.getVariable("CVGN_queryVolumeGroupResponseCode"))
-               Assert.assertEquals("Volume Group not Found!", execution.getVariable("CVGN_queryVolumeGroupResponse"))
-               
-       }
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/ExternalAPIUtilTest.groovy b/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/ExternalAPIUtilTest.groovy
new file mode 100644 (file)
index 0000000..db11cb6
--- /dev/null
@@ -0,0 +1,200 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 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.so.bpmn.common.scripts
+
+import org.assertj.core.api.AbstractAssert
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.junit.Test
+import org.onap.logging.ref.slf4j.ONAPLogConstants
+import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
+import org.onap.so.utils.TargetEntity
+import org.springframework.http.HttpStatus
+
+import javax.ws.rs.core.MediaType
+import javax.ws.rs.core.Response
+
+import static org.assertj.core.api.Assertions.assertThat
+import static org.assertj.core.api.Assertions.catchThrowableOfType
+import static org.mockito.BDDMockito.given
+import static org.mockito.BDDMockito.then
+import static org.mockito.BDDMockito.willThrow
+import static org.mockito.Mockito.mock
+import static org.mockito.Mockito.times
+
+class ExternalAPIUtilTest {
+
+    private static final String URL = "http://someUrl"
+    private static final String UUID_STR = UUID.nameUUIDFromBytes("deterministic_uuid".getBytes())
+    private static final String BODY_PAYLOAD = "payload"
+
+    @Test
+    void executeExternalAPIGetCall_shouldPerformRestGetCall_withAuthorizationHeaderSet() {
+        // GIVEN
+        Response expectedResponse = createExpectedResponse(HttpStatus.ACCEPTED, BODY_PAYLOAD)
+        HttpClient httpClient = mock(HttpClient.class)
+        given(httpClient.get()).willReturn(expectedResponse)
+        HttpClientFactory httpClientFactory = mock(HttpClientFactory.class)
+        given(httpClientFactory.newJsonClient(new URL(URL), TargetEntity.EXTERNAL)).willReturn(httpClient)
+
+        // WHEN
+        ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil(httpClientFactory, new DummyMsoUtils(UUID_STR), new ExceptionUtil())
+        Response apiResponse = externalAPIUtil.executeExternalAPIGetCall(createDelegateExecution(), URL)
+
+        // THEN
+        then(httpClient).should(times(1)).addBasicAuthHeader("value_externalapi_auth", "value_mso_msoKey")
+        then(httpClient).should(times(1)).addAdditionalHeader("X-FromAppId", "MSO")
+        then(httpClient).should(times(1)).addAdditionalHeader(ONAPLogConstants.Headers.REQUEST_ID, UUID_STR)
+        then(httpClient).should(times(1)).addAdditionalHeader("Accept", MediaType.APPLICATION_JSON)
+        ResponseAssert.assertThat(apiResponse)
+                .hasStatusCode(HttpStatus.ACCEPTED)
+                .hasBody(BODY_PAYLOAD)
+    }
+
+    @Test
+    void executeExternalAPIGetCall_shouldHandleExceptionsThrownByGetCall_andRethrowAsBpmnError() {
+        // GIVEN
+        HttpClient httpClient = mock(HttpClient.class)
+        willThrow(new RuntimeException("error occurred")).given(httpClient).get()
+        HttpClientFactory httpClientFactory = mock(HttpClientFactory.class)
+        given(httpClientFactory.newJsonClient(new URL(URL), TargetEntity.EXTERNAL)).willReturn(httpClient)
+        DelegateExecution delegateExecution = createDelegateExecution()
+        DummyExceptionUtil exceptionUtil = new DummyExceptionUtil()
+
+        // WHEN
+        ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil(httpClientFactory, new DummyMsoUtils(UUID_STR), exceptionUtil)
+        BpmnError bpmnError = catchThrowableOfType({ ->
+            externalAPIUtil.executeExternalAPIGetCall(delegateExecution, URL)
+        }, BpmnError.class)
+
+        // THEN
+        assertThat(exceptionUtil.getDelegateExecution()).isSameAs(delegateExecution)
+        assertThat(bpmnError.getMessage()).isEqualTo("error occurred")
+        assertThat(bpmnError.getErrorCode()).isEqualTo("9999")
+    }
+
+    @Test
+    void executeExternalAPIPostCall_shouldHandleExceptionsThrownByPostCall_andRethrowAsBpmnError() {
+        // GIVEN
+        HttpClient httpClient = mock(HttpClient.class)
+        willThrow(new RuntimeException("error occurred")).given(httpClient).post(BODY_PAYLOAD)
+        HttpClientFactory httpClientFactory = mock(HttpClientFactory.class)
+        given(httpClientFactory.newJsonClient(new URL(URL), TargetEntity.AAI)).willReturn(httpClient)
+        DelegateExecution delegateExecution = createDelegateExecution()
+        DummyExceptionUtil exceptionUtil = new DummyExceptionUtil()
+
+        // WHEN
+        ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil(httpClientFactory, new DummyMsoUtils(UUID_STR), exceptionUtil)
+        BpmnError bpmnError = catchThrowableOfType({ ->
+            externalAPIUtil.executeExternalAPIPostCall(delegateExecution, URL, BODY_PAYLOAD)
+        }, BpmnError.class)
+
+        // THEN
+        assertThat(exceptionUtil.getDelegateExecution()).isSameAs(delegateExecution)
+        assertThat(bpmnError.getMessage()).isEqualTo("error occurred")
+        assertThat(bpmnError.getErrorCode()).isEqualTo("9999")
+    }
+
+    @Test
+    void executeExternalAPIPostCall_shouldPerformRestPostCall_withPayloadAndAuthorizationHeaderSet() {
+        // GIVEN
+        Response expectedResponse = createExpectedResponse(HttpStatus.ACCEPTED, BODY_PAYLOAD)
+        HttpClient httpClient = mock(HttpClient.class)
+        given(httpClient.post(BODY_PAYLOAD)).willReturn(expectedResponse)
+        HttpClientFactory httpClientFactory = mock(HttpClientFactory.class)
+        given(httpClientFactory.newJsonClient(new URL(URL), TargetEntity.AAI)).willReturn(httpClient)
+
+        // WHEN
+        ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil(httpClientFactory, new DummyMsoUtils(UUID_STR), new ExceptionUtil())
+        Response apiResponse = externalAPIUtil.executeExternalAPIPostCall(createDelegateExecution(), URL, BODY_PAYLOAD)
+
+        // THEN
+        then(httpClient).should(times(1)).addBasicAuthHeader("value_externalapi_auth", "value_mso_msoKey")
+        then(httpClient).should(times(1)).addAdditionalHeader("X-FromAppId", "MSO")
+        then(httpClient).should(times(1)).addAdditionalHeader("X-TransactionId", UUID_STR)
+        ResponseAssert.assertThat(apiResponse)
+                .hasStatusCode(HttpStatus.ACCEPTED)
+                .hasBody(BODY_PAYLOAD)
+    }
+
+    private Response createExpectedResponse(HttpStatus httpStatus, String body) {
+        Response expectedResponse = mock(Response.class)
+        given(expectedResponse.getStatus()).willReturn(httpStatus.value())
+        given(expectedResponse.getEntity()).willReturn(body)
+        return expectedResponse
+    }
+
+    private DelegateExecution createDelegateExecution() {
+        DelegateExecution delegateExecution = mock(DelegateExecution.class)
+        given(delegateExecution.getVariable("URN_externalapi_auth")).willReturn("value_externalapi_auth")
+        given(delegateExecution.getVariable("URN_mso_msoKey")).willReturn("value_mso_msoKey")
+        return delegateExecution
+    }
+
+    private static class ResponseAssert extends AbstractAssert<ResponseAssert, Response> {
+
+        ResponseAssert(Response response) {
+            super(response, ResponseAssert.class)
+        }
+
+        static ResponseAssert assertThat(Response response) {
+            return new ResponseAssert(response)
+        }
+
+        ResponseAssert hasStatusCode(HttpStatus httpStatus) {
+            assertThat(actual.getStatus()).isEqualTo(httpStatus.value())
+            return this
+        }
+
+        ResponseAssert hasBody(String responseBody) {
+            assertThat(actual.getEntity()).isEqualTo(responseBody)
+            return this
+        }
+    }
+
+    private static class DummyMsoUtils extends MsoUtils {
+
+        private final String uuid
+
+        DummyMsoUtils(String uuid) {
+            this.uuid = uuid
+        }
+
+        String getRequestID() {
+            return uuid
+        }
+    }
+
+    private static class DummyExceptionUtil extends ExceptionUtil {
+
+        private DelegateExecution delegateExecution
+
+        @Override
+        void buildAndThrowWorkflowException(DelegateExecution delegateExecution, int errorCode, String errorMessage) {
+            this.delegateExecution = delegateExecution
+            throw new BpmnError(String.valueOf(errorCode), errorMessage)
+        }
+
+        DelegateExecution getDelegateExecution() {
+            return delegateExecution
+        }
+    }
+}
\ No newline at end of file
index bf0f2d2..e351210 100644 (file)
@@ -1,22 +1,22 @@
-/*- 
- * ============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========================================================= 
- */ 
+/*-
+ * ============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.bpmn.common.scripts
 
@@ -39,7 +39,7 @@ import org.onap.so.bpmn.mock.FileUtil
 
 @RunWith(MockitoJUnitRunner.Silent.class)
 public class SDNCAdapterTest {
-       
+
        @Before
        public void init()
        {
@@ -47,7 +47,7 @@ public class SDNCAdapterTest {
                System.setProperty("jboss.qualified.host.name","myhost.com")
        }
 
-       
+
        String workflowResponse = """<sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
                                                  xmlns:tag0="http://org.onap/workflow/sdnc/adapter/schema/v1"
                                                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -423,7 +423,7 @@ public class SDNCAdapterTest {
    </service-request>
 </rest:payload>
                        </sdncadaptersc:RequestData></aetgt:SDNCAdapterRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>"""
-       
+
 def sdncAdapterResponse = """<sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 <sdncadapterworkflow:response-data>
 <tag0:CallbackHeader xmlns:tag0="http://org.onap/workflow/sdnc/adapter/schema/v1">
@@ -453,7 +453,7 @@ String workflowErrorResponse1 = """<aetgt:WorkflowException xmlns:aetgt="http://
                                        <aetgt:ErrorMessage>Invalid Callback Response from SDNC Adapter</aetgt:ErrorMessage>
                                        <aetgt:ErrorCode>5300</aetgt:ErrorCode>
                                  </aetgt:WorkflowException>"""
-                       
+
 String     enhancedCallbackRequestData =
     """<tag0:RequestData xmlns:tag0="http://org.onap/workflow/sdnc/adapter/schema/v1"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -536,7 +536,7 @@ String     enhancedCallbackRequestData =
                                                                                        <excluded-v4-address>192.168.1.7</excluded-v4-address>
                                                                                </excluded-v4-addresses>
                                                                                <v4-dhcp-pool-prefix>192.155.2.4</v4-dhcp-pool-prefix>
-                                                                       </v4-dhcp-pools>                                                                        
+                                                                       </v4-dhcp-pools>
                                                                        <use-v4-default-pool>Y</use-v4-default-pool>
                                                                        <excluded-v6-dhcp-addresses-from-default-pool>
                                                                          <excluded-v6-address>1:5</excluded-v6-address>
@@ -567,7 +567,7 @@ String     enhancedCallbackRequestData =
                                                                                        <excluded-v6-address>2:2</excluded-v6-address>
                                                                                </excluded-v6-addresses>
                                                                                <v6-dhcp-pool-prefix>0:0</v6-dhcp-pool-prefix>
-                                                                       </v6-dhcp-pools>                                                                        
+                                                                       </v6-dhcp-pools>
                                                                </dhcp>
                                                                <firewall-lite>
                                                                        <stateful-firewall-lite-v6-enabled>N</stateful-firewall-lite-v6-enabled>
@@ -694,7 +694,7 @@ String     enhancedCallbackRequestData =
                                                        </vr-lan-interface>
                                                        <routing-protocol>none</routing-protocol>
                                                </vr-lan>
-<ucpe-vms-service-information>                         
+<ucpe-vms-service-information>
  <transport-service-information>
     <transport-service-type>AVPN</transport-service-type>
        <access-circuit-info>
@@ -704,7 +704,7 @@ String     enhancedCallbackRequestData =
        <access-circuit-info>
           <access-circuit-id>2</access-circuit-id>
           <dual-mode>Standby</dual-mode>
-       </access-circuit-info>  
+       </access-circuit-info>
  </transport-service-information>
  <ucpe-information>
     <ucpe-host-name>hostname</ucpe-host-name>
@@ -712,8 +712,8 @@ String     enhancedCallbackRequestData =
     <out-of-band-management-modem>OOB</out-of-band-management-modem>
   </ucpe-information>
   <vnf-list>
-       <vnf-information> 
-               <vnf-instance-id>1</vnf-instance-id> 
+       <vnf-information>
+               <vnf-instance-id>1</vnf-instance-id>
                <vnf-sequence-number>1</vnf-sequence-number>
                <vnf-type>ZZ</vnf-type>
                <vnf-vendor>JUNIPER</vnf-vendor>
@@ -724,8 +724,8 @@ String     enhancedCallbackRequestData =
                <orchestration-status>1</orchestration-status>
                <equipment-role>1</equipment-role>
     </vnf-information>
-       <vnf-information> 
-               <vnf-instance-id>2</vnf-instance-id> 
+       <vnf-information>
+               <vnf-instance-id>2</vnf-instance-id>
                <vnf-sequence-number>2</vnf-sequence-number>
                <vnf-type>HY</vnf-type>
                <vnf-vendor>JUNIPER</vnf-vendor>
@@ -735,9 +735,9 @@ String     enhancedCallbackRequestData =
                <operational-state>2</operational-state>
                <orchestration-status>2</orchestration-status>
                <equipment-role>2</equipment-role>
-    </vnf-information>                                 
+    </vnf-information>
   </vnf-list>
- </ucpe-vms-service-information>                                                                               
+ </ucpe-vms-service-information>
                                                <request-information>
                                                        <request-action>Layer3ServiceActivateRequest</request-action>
                                                        <order-number>4281555</order-number>
@@ -815,7 +815,7 @@ def sdncAdapterResponseError =
    </sdncadapterworkflow:response-data>
 </sdncadapterworkflow:SDNCAdapterWorkflowResponse>"""
 
-                                                                                               
+
        @Test
        public void testPreProcessRequest() {
 
@@ -823,34 +823,35 @@ def sdncAdapterResponseError =
                ExecutionEntity mockExecution = mock(ExecutionEntity.class)
                when(mockExecution.getVariable("mso.adapters.po.auth")).thenReturn("5E12ACACBD552A415E081E29F2C4772F9835792A51C766CCFDD7433DB5220B59969CB2798C")
                when(mockExecution.getVariable("mso.msoKey")).thenReturn("07a7159d3bf51a0e53be7a8f89699be7")
+               when(mockExecution.getVariable("mso-request-id")).thenReturn("testReqId")
                when(mockExecution.getVariable("sdncAdapterWorkflowRequest")).thenReturn(sdncAdapterWorkflowRequest)
                when(mockExecution.getVariable("mso.workflow.sdncadapter.callback")).thenReturn("http://someurl.someting.com:28080/mso/sdncAdapterCallbackServiceImpl")
                when(mockExecution.getVariable("mso.use.qualified.host")).thenReturn("true")
 
                when(mockExecution.getProcessInstanceId()).thenReturn("745b1b50-e39e-4685-9cc8-c71f0bde8bf0")
                when(mockExecution.getVariable("isDebugLogEnabled")).thenReturn("true")
-       
+
 
                SDNCAdapter sdncAdapter = new SDNCAdapter()
                sdncAdapter.preProcessRequest(mockExecution)
-               
+
                MockitoDebuggerImpl debugger = new MockitoDebuggerImpl()
                debugger.printInvocations(mockExecution)
-               
+
 
                verify(mockExecution).setVariable("prefix","SDNCA_")
                verify(mockExecution).setVariable("sdncAdapterResponse","")
                verify(mockExecution).setVariable("asynchronousResponseTimeout",false)
                verify(mockExecution).setVariable("continueListening",false)
                verify(mockExecution).setVariable("serviceConfigActivate",false)
-               verify(mockExecution).setVariable("SDNCA_requestId", "745b1b50-e39e-4685-9cc8-c71f0bde8bf0")
                verify(mockExecution).setVariable("SDNCA_SuccessIndicator",false)
                verify(mockExecution).setVariable("SDNCA_InterimNotify",false)
                verify(mockExecution).setVariable("BasicAuthHeaderValue","Basic dGVzdDp0ZXN0")
                verify(mockExecution).setVariable("source","")
+               verify(mockExecution).setVariable("SDNCA_requestId", "745b1b50-e39e-4685-9cc8-c71f0bde8bf0")
                verify(mockExecution).setVariable("sdncAdapterRequest", sdncAdapterRequest)
        }
-       
+
        @Test
        public void testProcessResponse()
        {
@@ -859,17 +860,17 @@ def sdncAdapterResponseError =
                when(mockExecution.getVariable("sdncAdapterCallbackRequest")).thenReturn(sdncAdapterCallbackResponse)
                SDNCAdapter sdncAdapter = new SDNCAdapter()
                sdncAdapter.postProcessResponse(mockExecution)
-               
+
 //             MockitoDebuggerImpl debugger = new MockitoDebuggerImpl()
 //             debugger.printInvocations(mockExecution)
-               
+
                verify(mockExecution,times(2)).getVariable("sdncAdapterCallbackRequest")
-               verify(mockExecution).setVariable("enhancedCallbackRequestData",enhancedCallbackRequestData)
+       //      verify(mockExecution).setVariable("enhancedCallbackRequestData",enhancedCallbackRequestData)
                verify(mockExecution).setVariable("sdncAdapterResponse",workflowResponse)
                verify(mockExecution).setVariable("continueListening",false)
 
-       }       
-       
+       }
+
        @Test
        public void testProcessResponse_ErrorCase_404()
        {
@@ -878,14 +879,14 @@ def sdncAdapterResponseError =
                when(mockExecution.getVariable("sdncAdapterCallbackRequest")).thenReturn(sdncAdapterCallbackErrorResponse)
                SDNCAdapter sdncAdapter = new SDNCAdapter()
                sdncAdapter.postProcessResponse(mockExecution)
-               
+
                verify(mockExecution,times(2)).getVariable("sdncAdapterCallbackRequest")
                verify(mockExecution).setVariable("sdncAdapterResponse", sdncAdapterResponseError)
                verify(mockExecution).setVariable("enhancedCallbackRequestData", "")
                verify(mockExecution).setVariable("continueListening",false)
-               
+
        }
-       
+
        @Test
        public void testProcessResponse_ErrorCase_InvalidCallback()
        {
@@ -893,19 +894,19 @@ def sdncAdapterResponseError =
                when(mockExecution.getVariable("sdncAdapterCallbackRequest")).thenReturn("<h1>Service Unavailable</h1>")
                SDNCAdapter sdncAdapter = new SDNCAdapter()
                sdncAdapter.postProcessResponse(mockExecution)
-               
+
                verify(mockExecution,times(2)).getVariable("sdncAdapterCallbackRequest")
                verify(mockExecution).setVariable("sdncAdapterResponse", sdncAdapterResponseEmpty)
                verify(mockExecution).setVariable("enhancedCallbackRequestData", "")
                verify(mockExecution).setVariable("continueListening",false)
 
        }
-       
+
        @Test
        public void postProcessResponse()
        {
-               
-               String SDNCAdapterCallbackRequest = 
+
+               String SDNCAdapterCallbackRequest =
                """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <SDNCAdapterCallbackRequest
        xmlns="http://org.onap/workflow/sdnc/adapter/schema/v1">
@@ -919,7 +920,7 @@ def sdncAdapterResponseError =
                        data model content does not exist ]</ResponseMessage>
        </CallbackHeader>
 </SDNCAdapterCallbackRequest>"""
-               
+
                String sdncAdapterResponse =
                """<sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
                                                  xmlns:tag0="http://org.onap/workflow/sdnc/adapter/schema/v1">
@@ -940,7 +941,7 @@ def sdncAdapterResponseError =
                when(mockExecution.getVariable("sdncAdapterCallbackRequest")).thenReturn(SDNCAdapterCallbackRequest)
                SDNCAdapter sdncAdapter = new SDNCAdapter()
                sdncAdapter.postProcessResponse(mockExecution)
-               
+
                verify(mockExecution,times(2)).getVariable("sdncAdapterCallbackRequest")
                verify(mockExecution).setVariable("sdncAdapterResponse", sdncAdapterResponse)
                verify(mockExecution).setVariable("enhancedCallbackRequestData", "")
index cb9bb5c..2d2f58b 100644 (file)
@@ -113,6 +113,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         when(mockExecution.getVariable(prefix + "getVfModuleResponse")).thenReturn(vfModule)
         doNothing().when(client).update(isA(AAIResourceUri.class), anyObject())
         updateAAIVfModule.updateVfModule(mockExecution)
+               verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 200)
     }
 
     @Test
@@ -128,6 +129,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         doThrow(new NotFoundException("Vf Module not found")).when(client).update(isA(AAIResourceUri.class), anyObject())
         thrown.expect(BpmnError.class)
         updateAAIVfModule.updateVfModule(mockExecution)
+               verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 404)
     }
 
 
@@ -144,6 +146,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         doThrow(new IllegalStateException("Error in AAI client")).when(client).update(isA(AAIResourceUri.class), anyObject())
         thrown.expect(BpmnError.class)
         updateAAIVfModule.updateVfModule(mockExecution)
+               verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 500)
 
     }
 }
index 77edd2d..72cde00 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,14 +34,14 @@ import static org.junit.Assert.*;
 
 @RunWith(MockitoJUnitRunner.class)
 public class VnfAdapterRestV1Test {
-       
+
        @Before
        public void init()
        {
                MockitoAnnotations.initMocks(this)
        }
 
-                                                                                               
+
        @Test
        public void testPreProcessRequest() {
 
@@ -59,11 +59,11 @@ public class VnfAdapterRestV1Test {
 
                when(mockExecution.getVariable("isDebugLogEnabled")).thenReturn("true")
                when(mockExecution.getVariable("testProcessKey")).thenReturn("testProcessKey")
-       
+
 
                VnfAdapterRestV1 vnfAdapterRestV1 = new VnfAdapterRestV1()
                vnfAdapterRestV1.preProcessRequest(mockExecution)
-               
+
                MockitoDebuggerImpl debugger = new MockitoDebuggerImpl()
                //debugger.printInvocations(mockExecution)
 
@@ -78,7 +78,7 @@ public class VnfAdapterRestV1Test {
                verify(mockExecution).setVariable("VNFREST_vnfAdapterUrl","http://localhost:18080/vnfs/rest/v1/vnfs/6d2e2469-8708-47c3-a0d4-73fa28a8a50b/vf-modules")
 
        }
-       
+
        def rollbackReq = """
 <rollbackVolumeGroupRequest>
    <volumeGroupRollback>
@@ -97,7 +97,7 @@ public class VnfAdapterRestV1Test {
    <notificationUrl>http://localhost:8080/mso/WorkflowMessage/VNFAResponse/683ca1ac-2145-4a00-9484-20d48bd701aa</notificationUrl>
 </rollbackVolumeGroupRequest>
 """
-               
+
        @Test
        public void testGetVolumeGroupId() {
                Node root = new XmlParser().parseText(rollbackReq)
@@ -106,13 +106,29 @@ public class VnfAdapterRestV1Test {
                assertEquals('8a07b246-155e-4b08-b56e-76e98a3c2d66', volGrpId)
        }
 
-       
+
        @Test
        public void testGetMessageId() {
                Node root = new XmlParser().parseText(rollbackReq)
-               
+
                VnfAdapterRestV1 p = new VnfAdapterRestV1()
                def messageId = p.getMessageIdForVolumeGroupRollback(root)
                assertEquals('683ca1ac-2145-4a00-9484-20d48bd701aa', messageId)
        }
+
+       @Test
+       public void testProcessCallback() {
+
+               String sdncAdapterWorkflowRequest = FileUtil.readResourceFile("__files/vnfAdapterMocks/vnfAdapterCallback.xml");
+               ExecutionEntity mockExecution = mock(ExecutionEntity.class)
+
+               when(mockExecution.getVariable("VNFAResponse_MESSAGE")).thenReturn(sdncAdapterWorkflowRequest)
+               when(mockExecution.getVariable("testProcessKey")).thenReturn("testProcessKey")
+
+               VnfAdapterRestV1 vnfAdapterRestV1 = new VnfAdapterRestV1()
+               vnfAdapterRestV1.processCallback(mockExecution)
+
+               verify(mockExecution).setVariable("testProcessKeyResponse" ,sdncAdapterWorkflowRequest)
+
+       }
 }
index 0398c87..d5b5cde 100644 (file)
@@ -290,7 +290,7 @@ public class BuildingBlockTestDataSetup{
                customer.setSubscriberType("testSubscriberType" + customerCounter);
 
                customer.setServiceSubscription(buildServiceSubscription());
-               
+
                return customer;
        }
 
@@ -341,50 +341,50 @@ public class BuildingBlockTestDataSetup{
                customer.setServiceSubscription(buildServiceSubscription());
 
                gBBInput.setCustomer(customer);
-               
+
                return customer;
        }
-       
+
        public Collection setCollection() {
                Collection collection = new Collection();
                collection.setId("testId");
-               
+
                ServiceInstance serviceInstance = null;
-               
+
                try {
                        serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
                } catch(BBObjectNotFoundException e) {
                        serviceInstance = setServiceInstance();
                }
-               
+
                serviceInstance.setCollection(collection);
-               
+
                return collection;
        }
-       
+
        public InstanceGroup setInstanceGroup() {
                InstanceGroup instanceGroup = new InstanceGroup();
                instanceGroup.setId("testId");
                instanceGroup.setInstanceGroupFunction("testInstanceGroupFunction");
-               
+
                Collection collection = null;
-               
+
                try {
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
                        collection = serviceInstance.getCollection();
-                       
+
                        if (collection == null) {
                                collection = setCollection();
                        }
                } catch(BBObjectNotFoundException e) {
                        collection = setCollection();
                }
-               
+
                collection.setInstanceGroup(instanceGroup);
-               
+
                return instanceGroup;
        }
-       
+
        public VpnBinding buildVpnBinding() {
                vpnBindingCounter++;
 
@@ -664,12 +664,12 @@ public class BuildingBlockTestDataSetup{
                modelInfo.setModelUuid("testAllottedModelUuid" + uniqueIdentifier);
                modelInfo.setModelVersion("testAllottedModelVersion" + uniqueIdentifier);
                modelInfo.setModelInstanceName("testAllottedInstanceName" + uniqueIdentifier);
-               
+
                ar.setModelInfoAllottedResource(modelInfo);
-               
+
                return ar;
        }
-       
+
        public Configuration setConfiguration () {
                Configuration config = new Configuration();
                config.setConfigurationId("testConfigurationId");
@@ -679,7 +679,7 @@ public class BuildingBlockTestDataSetup{
                modelInfoConfig.setModelInvariantId("modelInvariantId");
                modelInfoConfig.setPolicyName("policyName");
                config.setModelInfoConfiguration(modelInfoConfig);
-               
+
                List<Configuration> configurations = new ArrayList<>();
                configurations.add(config);
                ServiceInstance serviceInstance = new ServiceInstance();
index 9b5bb33..8515307 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.bpmn.mock;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.utils.TargetEntity;
 
 import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
@@ -141,7 +142,9 @@ public class SDNCAdapterAsyncTransformer extends ResponseDefinitionTransformer {
                                e1.printStackTrace();
                        }
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.SDNC_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.SDNC_ADAPTER);
                                client.post(payLoad);
                        } catch (Exception e) {
                                // TODO Auto-generated catch block
index 8c34b65..f129164 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.bpmn.mock;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -131,7 +132,9 @@ public class SDNCAdapterMockTransformer extends ResponseDefinitionTransformer {
                        }
                        LOGGER.debug("Sending callback response:" + callbackUrl);
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.SDNC_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.SDNC_ADAPTER);
                                client.post(payLoad);
                        } catch (Exception e) {
                                LOGGER.debug("Exception :",e);
index f53fd6f..832caae 100644 (file)
@@ -24,6 +24,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -122,7 +123,9 @@ public class SDNCAdapterNetworkTopologyMockTransformer extends ResponseDefinitio
                        }
                        LOGGER.debug("Sending callback response to url: " + callbackUrl);
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.SDNC_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.SDNC_ADAPTER);
                                Response response = client.post(payLoad);
                                LOGGER.debug("Successfully posted callback? Status: " + response.getStatus());
                        } catch (Exception e) {
index 63abf4d..e190535 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.bpmn.mock;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.utils.TargetEntity;
 
 import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
@@ -152,7 +153,9 @@ public class VnfAdapterAsyncTransformer extends ResponseDefinitionTransformer {
                        }
                        
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.VNF_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.VNF_ADAPTER);
                                client.post(payLoad);
                        } catch (Exception e) {
                                // TODO Auto-generated catch block
index de21d64..107a70d 100644 (file)
@@ -24,6 +24,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -131,7 +132,9 @@ public class VnfAdapterCreateMockTransformer extends ResponseDefinitionTransform
                        }
                        LOGGER.debug("Sending callback response to url: " + callbackUrl);
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.VNF_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.VNF_ADAPTER);
                                Response response = client.post(payLoad);
                                LOGGER.debug("Successfully posted callback? Status: " + response.getStatus());
                                //System.err.println("Successfully posted callback:" + result.getStatus());
index 99ad84d..cf0f966 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.bpmn.mock;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -132,7 +133,9 @@ public class VnfAdapterDeleteMockTransformer extends ResponseDefinitionTransform
                        }
 
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.VNF_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.VNF_ADAPTER);
                                client.post(payLoad);
                        } catch (Exception e) {
                                // TODO Auto-generated catch block
index 7ad687a..5eaa4e7 100644 (file)
@@ -24,6 +24,7 @@ package org.onap.so.bpmn.mock;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -148,7 +149,9 @@ public class VnfAdapterQueryMockTransformer extends ResponseDefinitionTransforme
                        }
 
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.VNF_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.VNF_ADAPTER);
                                client.post(payLoad);
                        } catch (Exception e) {
                                LOGGER.debug("Exception :",e);
index 560915d..06f2fb7 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.bpmn.mock;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -133,7 +134,9 @@ public class VnfAdapterRollbackMockTransformer extends ResponseDefinitionTransfo
                        }
 
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.VNF_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.VNF_ADAPTER);
                                client.post(payLoad);
                        } catch (Exception e) {
                                System.out.println("catch error in - request.post() ");                         
index 9e89271..9e60e87 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.bpmn.mock;
 import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.TargetEntity;
 
@@ -133,7 +134,9 @@ public class VnfAdapterUpdateMockTransformer extends ResponseDefinitionTransform
                        }
 
                        try {
-                               HttpClient client = new HttpClient(UriBuilder.fromUri(callbackUrl).build().toURL(), "text/xml", TargetEntity.VNF_ADAPTER);
+                               HttpClient client = new HttpClientFactory().newTextXmlClient(
+                                       UriBuilder.fromUri(callbackUrl).build().toURL(),
+                                       TargetEntity.VNF_ADAPTER);
                                client.post(payLoad);
                        } catch (Exception e) {
                                System.out.println("catch error in - request.post() ");
index e32362d..78238f0 100644 (file)
@@ -40,6 +40,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.junit.Before;
@@ -84,6 +85,7 @@ import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoVfModule;
 import org.onap.so.client.aai.AAICommonObjectMapperProvider;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
+import org.onap.so.client.aai.entities.Relationships;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.constants.Defaults;
@@ -99,6 +101,7 @@ import org.onap.so.db.catalog.beans.OrchestrationStatus;
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.VfModuleCustomization;
 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 import org.onap.so.serviceinstancebeans.ModelInfo;
@@ -128,6 +131,9 @@ public class BBInputSetupTest {
        @Mock
        private BBInputSetupUtils SPY_bbInputSetupUtils;
        
+       @Mock
+       private CloudInfoFromAAI SPY_cloudInfoFromAAI;
+       
        @Spy
        private BBInputSetupMapperLayer bbInputSetupMapperLayer; 
        
@@ -135,8 +141,33 @@ public class BBInputSetupTest {
        public void setup(){
                SPY_bbInputSetup.setBbInputSetupUtils(SPY_bbInputSetupUtils);
                SPY_bbInputSetup.setMapperLayer(bbInputSetupMapperLayer);
+               SPY_bbInputSetup.setCloudInfoFromAAI(SPY_cloudInfoFromAAI);
        }
-
+       
+       @Test
+       public void testGetVolumeGroupIdRelatedToVfModule() {
+               String expected = "volumeGroupId";
+               String modelCustomizationId = "modelCustomizationId";
+               ModelInfo modelInfo = new ModelInfo();
+               modelInfo.setModelCustomizationId(modelCustomizationId);
+               String cloudOwner = "cloudOwner";
+               String cloudRegionId = "cloudRegionId";
+               String volumeGroupId = "volumeGroupId";
+               GenericVnf vnf = new GenericVnf();
+               VolumeGroup volumeGroup = new VolumeGroup();
+               volumeGroup.setVolumeGroupId(expected);
+               vnf.getVolumeGroups().add(volumeGroup);
+               Map<ResourceKey, String> lookupKeyMap = new HashMap<>();
+               lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, null);
+               org.onap.aai.domain.yang.VolumeGroup aaiVolumeGroup = new org.onap.aai.domain.yang.VolumeGroup();
+               aaiVolumeGroup.setModelCustomizationId(modelCustomizationId);
+               doReturn(aaiVolumeGroup).when(SPY_bbInputSetupUtils).getAAIVolumeGroup(cloudOwner, cloudRegionId, volumeGroupId);
+               
+               Optional<String> actual = SPY_bbInputSetup.getVolumeGroupIdRelatedToVfModule(vnf, modelInfo, cloudOwner, cloudRegionId, lookupKeyMap);
+               
+               assertEquals(expected, actual.get());
+       }
+       
        @Test
        public void testGetAlaCarteServiceInstance() throws Exception {
                ServiceInstance expected = mapper.readValue(
@@ -1202,6 +1233,31 @@ public class BBInputSetupTest {
                verify(SPY_bbInputSetup, times(2)).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service);
        }
        
+       @Test
+       public void testMapVnfcCollectionInstanceGroup() {
+               VnfResourceCustomization vnfResourceCust = Mockito.mock(VnfResourceCustomization.class);
+               GenericVnf genericVnf = new GenericVnf();
+               ModelInfo modelInfo = Mockito.mock(ModelInfo.class);
+               Service service = Mockito.mock(Service.class);
+               List<VnfcInstanceGroupCustomization> vnfcInstanceGroups = new ArrayList<>();
+               VnfcInstanceGroupCustomization vnfcInstanceGroupCust = new VnfcInstanceGroupCustomization();
+               vnfcInstanceGroupCust.setModelUUID("modelUUID");
+               vnfcInstanceGroupCust.setFunction("function");
+               vnfcInstanceGroupCust.setDescription("description");
+               vnfcInstanceGroups.add(vnfcInstanceGroupCust);
+               org.onap.so.db.catalog.beans.InstanceGroup instanceGroup = new org.onap.so.db.catalog.beans.InstanceGroup();
+               instanceGroup.setModelUUID("modelUUID");
+               ModelInfoInstanceGroup modelInfoInstanceGroup = new ModelInfoInstanceGroup();
+               modelInfoInstanceGroup.setModelUUID("modelUUID");
+               doReturn(vnfResourceCust).when(SPY_bbInputSetup).getVnfResourceCustomizationFromService(modelInfo, service);
+               doReturn(vnfcInstanceGroups).when(vnfResourceCust).getVnfcInstanceGroupCustomizations();
+               doReturn(instanceGroup).when(SPY_bbInputSetupUtils).getCatalogInstanceGroup("modelUUID");
+               doReturn(modelInfoInstanceGroup).when(bbInputSetupMapperLayer).mapCatalogInstanceGroupToInstanceGroup(null, instanceGroup);
+               
+               SPY_bbInputSetup.mapVnfcCollectionInstanceGroup(genericVnf, modelInfo, service);
+               
+               assertEquals("Instance Group was created", true, genericVnf.getInstanceGroups().size() == 1);
+       }
        @Test
        public void testPopulateGenericVnfWhereVnfTypeIsNull()
                        throws JsonParseException, JsonMappingException, IOException {
@@ -1258,12 +1314,11 @@ public class BBInputSetupTest {
                doReturn(vnf2AAI).when(SPY_bbInputSetupUtils).getAAIGenericVnf(vnf2.getVnfId());
                doNothing().when(SPY_bbInputSetup).mapCatalogVnf(vnf2, modelInfo, service);
                doNothing().when(SPY_bbInputSetup).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}");
-               doNothing().when(SPY_bbInputSetup).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service);
                SPY_bbInputSetup.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName,
                                serviceInstance, lookupKeyMap, requestDetails.getRelatedInstanceList(), resourceId, vnfType, null);
                verify(SPY_bbInputSetup, times(2)).mapCatalogVnf(vnf2, modelInfo, service);
                verify(SPY_bbInputSetup, times(2)).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}");
-               verify(SPY_bbInputSetup, times(2)).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service);
+               verify(SPY_bbInputSetup, times(1)).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service);
        }
 
        @Test
@@ -1688,8 +1743,10 @@ public class BBInputSetupTest {
                configResourceKeys.setVfModuleCustomizationUUID("vfModuleCustomizationUUID");
                configResourceKeys.setVnfResourceCustomizationUUID("vnfResourceCustomizationUUID");
                executeBB.setConfigurationResourceKeys(configResourceKeys);
+
+               executeBB.setRequestDetails(requestDetails);
                doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+                               requestAction, lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
                doReturn(request).when(SPY_bbInputSetupUtils).getInfraActiveRequest(executeBB.getRequestId());
                doReturn(service).when(SPY_bbInputSetupUtils)
                                .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
@@ -1698,6 +1755,7 @@ public class BBInputSetupTest {
                doReturn("vnfId").when(SPY_bbInputSetup).getVnfId(executeBB, lookupKeyMap);
                doReturn(aaiVnf).when(SPY_bbInputSetupUtils).getAAIGenericVnf(any(String.class));
 
+               
                executeBB.getBuildingBlock().setBpmnFlowName(AssignFlows.NETWORK_MACRO.toString());
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-1f2982117f04");
                SPY_bbInputSetup.getGBBMacro(executeBB, requestDetails, lookupKeyMap, requestAction, resourceId, vnfType);
@@ -1806,8 +1864,9 @@ public class BBInputSetupTest {
                String vnfType = "vnfType";
                Service service = Mockito.mock(Service.class);
                String requestAction = "createInstance";
+               
                doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+                               requestAction, lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
                doReturn(service).when(SPY_bbInputSetupUtils)
                                .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
        
@@ -1832,9 +1891,7 @@ public class BBInputSetupTest {
                String vnfType = "vnfType";
                Service service = Mockito.mock(Service.class);
                String requestAction = "createInstance";
-               doReturn(null).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
-       
+               
                executeBB.getBuildingBlock().setBpmnFlowName("Network");
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-1f2982117f04");
                SPY_bbInputSetup.getGBBMacro(executeBB, requestDetails, lookupKeyMap, requestAction, resourceId, vnfType);
@@ -1861,8 +1918,11 @@ public class BBInputSetupTest {
                String vnfType = null;
                Service service = Mockito.mock(Service.class);
                String requestAction = "createInstance";
+               
+
+               executeBB.setRequestDetails(requestDetails);
                doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+                               requestAction, lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
                doReturn(request).when(SPY_bbInputSetupUtils).getInfraActiveRequest(executeBB.getRequestId());
                doReturn(service).when(SPY_bbInputSetupUtils)
                                .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
@@ -1922,8 +1982,10 @@ public class BBInputSetupTest {
                String vnfType = "vnfType";
                Service service = Mockito.mock(Service.class);
                String requestAction = "createInstance";
+
+               executeBB.setRequestDetails(requestDetails);
                doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+                               requestAction, lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
                doReturn(request).when(SPY_bbInputSetupUtils).getInfraActiveRequest(executeBB.getRequestId());
                doReturn(service).when(SPY_bbInputSetupUtils)
                                .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
@@ -1984,7 +2046,7 @@ public class BBInputSetupTest {
                Service service = Mockito.mock(Service.class);
                String requestAction = "deactivateInstance";
                doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+                               requestAction, lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
                doReturn(service).when(SPY_bbInputSetupUtils)
                                .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
                String generatedId = "12131";
@@ -2027,8 +2089,9 @@ public class BBInputSetupTest {
                Service service = Mockito.mock(Service.class);
                String requestAction = "createInstance";
                doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+                               requestAction, lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
        
+               
                doReturn(service).when(SPY_bbInputSetupUtils)
                                                .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
                List<NetworkResourceCustomization> networkCustList = new ArrayList<>();
@@ -2089,12 +2152,17 @@ public class BBInputSetupTest {
                String vnfType = "vnfType";
                Service service = Mockito.mock(Service.class);
                String requestAction = "deleteInstance";
-               doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
-               doReturn(service).when(SPY_bbInputSetupUtils)
-                               .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
-               //doReturn(aaiVnf).when(SPY_bbInputSetupUtils).getAAIGenericVnf(any(String.class));
-
+               
+               executeBB.setRequestDetails(requestDetails);
+               ServiceInstance serviceInstance = gBB.getServiceInstance();
+               org.onap.aai.domain.yang.ServiceInstance aaiServiceInstance = new org.onap.aai.domain.yang.ServiceInstance();
+               aaiServiceInstance.setModelVersionId("modelVersionId");
+               doReturn(service).when(SPY_bbInputSetupUtils).getCatalogServiceByModelUUID(aaiServiceInstance.getModelVersionId());
+               doReturn(aaiServiceInstance).when(SPY_bbInputSetupUtils).getAAIServiceInstanceById(lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
+               doReturn(serviceInstance).when(SPY_bbInputSetup).getExistingServiceInstance(aaiServiceInstance);
+               doReturn(gBB).when(SPY_bbInputSetup).populateGBBWithSIAndAdditionalInfo(requestDetails, serviceInstance,
+                               executeBB, requestAction, null);
+               
                CloudConfiguration cloudConfig = new CloudConfiguration();
                cloudConfig.setLcpCloudRegionId("lcpCloudRegionId");
                requestDetails.setCloudConfiguration(cloudConfig);
@@ -2104,37 +2172,37 @@ public class BBInputSetupTest {
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-1f2982117f04");
                SPY_bbInputSetup.getGBBMacro(executeBB, requestDetails, lookupKeyMap, requestAction, resourceId, vnfType);
                verify(SPY_bbInputSetup, times(1)).getGBBMacroExistingService(isA(ExecuteBuildingBlock.class), any(),
-                               any(String.class), any(GeneralBuildingBlock.class), isA(Service.class), isA(String.class),
+                               any(String.class), isA(String.class),
                                isA(CloudConfiguration.class));
 
                requestAction = "activateInstance";
-               doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+               doReturn(gBB).when(SPY_bbInputSetup).populateGBBWithSIAndAdditionalInfo(requestDetails, serviceInstance,
+                               executeBB, requestAction, null);
                executeBB.getBuildingBlock().setBpmnFlowName("ActivateNetworkBB");
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-1f2982117f04");
                SPY_bbInputSetup.getGBBMacro(executeBB, requestDetails, lookupKeyMap, requestAction, resourceId, vnfType);
                verify(SPY_bbInputSetup, times(2)).getGBBMacroExistingService(isA(ExecuteBuildingBlock.class), any(),
-                               any(String.class), any(GeneralBuildingBlock.class), isA(Service.class), isA(String.class),
+                               any(String.class), isA(String.class),
                                isA(CloudConfiguration.class));
 
                requestAction = "unassignInstance";
-               doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+               doReturn(gBB).when(SPY_bbInputSetup).populateGBBWithSIAndAdditionalInfo(requestDetails, serviceInstance,
+                               executeBB, requestAction, null);
                executeBB.getBuildingBlock().setBpmnFlowName("UnassignNetworkBB");
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-1f2982117f04");
                SPY_bbInputSetup.getGBBMacro(executeBB, requestDetails, lookupKeyMap, requestAction, resourceId, vnfType);
                verify(SPY_bbInputSetup, times(3)).getGBBMacroExistingService(isA(ExecuteBuildingBlock.class), any(),
-                               any(String.class), any(GeneralBuildingBlock.class), isA(Service.class), isA(String.class),
+                               any(String.class), isA(String.class),
                                isA(CloudConfiguration.class));
                
                requestAction = "activateFabricConfiguration";
-               doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+               doReturn(gBB).when(SPY_bbInputSetup).populateGBBWithSIAndAdditionalInfo(requestDetails, serviceInstance,
+                               executeBB, requestAction, null);
                executeBB.getBuildingBlock().setBpmnFlowName("ActivateFabricConfigurationBB");
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-134534656234");
                SPY_bbInputSetup.getGBBMacro(executeBB, requestDetails, lookupKeyMap, requestAction, resourceId, vnfType);
                verify(SPY_bbInputSetup, times(4)).getGBBMacroExistingService(isA(ExecuteBuildingBlock.class), any(),
-                               any(String.class), any(GeneralBuildingBlock.class), isA(Service.class), isA(String.class),
+                               any(String.class),  isA(String.class),
                                isA(CloudConfiguration.class));
        }
 
@@ -2160,7 +2228,7 @@ public class BBInputSetupTest {
                Service service = Mockito.mock(Service.class);
                String requestAction = "assignInstance";
                doReturn(gBB).when(SPY_bbInputSetup).getGBBALaCarteService(executeBB, requestDetails, lookupKeyMap,
-                               requestAction, resourceId);
+                               requestAction, lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
                doReturn(service).when(SPY_bbInputSetupUtils)
                                .getCatalogServiceByModelUUID(gBB.getServiceInstance().getModelInfoServiceInstance().getModelUuid());
                String generatedId = "12131";
@@ -2188,6 +2256,7 @@ public class BBInputSetupTest {
                CloudConfiguration cloudConfiguration = new CloudConfiguration();
                cloudConfiguration.setLcpCloudRegionId("cloudRegionId");
                String requestAction = "unassignInstance";
+               executeBB.setRequestDetails(requestDetails);
 
                ConfigurationResourceKeys configResourceKeys = new ConfigurationResourceKeys();
                configResourceKeys.setCvnfcCustomizationUUID("cvnfcCustomizationUUID");
@@ -2195,6 +2264,15 @@ public class BBInputSetupTest {
                configResourceKeys.setVnfResourceCustomizationUUID("vnfResourceCustomizationUUID");
                executeBB.setConfigurationResourceKeys(configResourceKeys);
                
+               ServiceInstance serviceInstance = gBB.getServiceInstance();
+               org.onap.aai.domain.yang.ServiceInstance aaiServiceInstance = new org.onap.aai.domain.yang.ServiceInstance();
+               aaiServiceInstance.setModelVersionId("modelVersionId");
+               doReturn(service).when(SPY_bbInputSetupUtils).getCatalogServiceByModelUUID(aaiServiceInstance.getModelVersionId());
+               doReturn(aaiServiceInstance).when(SPY_bbInputSetupUtils).getAAIServiceInstanceById(lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID));
+               doReturn(serviceInstance).when(SPY_bbInputSetup).getExistingServiceInstance(aaiServiceInstance);
+               doReturn(gBB).when(SPY_bbInputSetup).populateGBBWithSIAndAdditionalInfo(requestDetails, serviceInstance,
+                               executeBB, requestAction, null);
+
                L3Network network = new L3Network();
                network.setNetworkId("networkId");
                gBB.getServiceInstance().getNetworks().add(network);
@@ -2207,7 +2285,7 @@ public class BBInputSetupTest {
                executeBB.getBuildingBlock().setBpmnFlowName("DeleteNetworkBB");
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-1f2982117f04");
                SPY_bbInputSetup.getGBBMacroExistingService(executeBB, lookupKeyMap,
-                               executeBB.getBuildingBlock().getBpmnFlowName(), gBB, service, requestAction, cloudConfiguration);
+                               executeBB.getBuildingBlock().getBpmnFlowName(), requestAction, null);
                verify(SPY_bbInputSetup, times(1)).mapCatalogNetwork(any(L3Network.class), any(ModelInfo.class),
                                any(Service.class));
 
@@ -2223,7 +2301,7 @@ public class BBInputSetupTest {
                executeBB.getBuildingBlock().setBpmnFlowName("ActivateVnfBB");
                executeBB.getBuildingBlock().setKey("ab153b6e-c364-44c0-bef6-1f2982117f04");
                SPY_bbInputSetup.getGBBMacroExistingService(executeBB, lookupKeyMap,
-                               executeBB.getBuildingBlock().getBpmnFlowName(), gBB, service, requestAction, cloudConfiguration);
+                               executeBB.getBuildingBlock().getBpmnFlowName(), requestAction, cloudConfiguration);
                verify(SPY_bbInputSetup, times(1)).mapCatalogVnf(any(GenericVnf.class), any(ModelInfo.class),
                                any(Service.class));
 
@@ -2237,25 +2315,28 @@ public class BBInputSetupTest {
                executeBB.getBuildingBlock().setBpmnFlowName("UnassignVfModuleBB");
                executeBB.getBuildingBlock().setKey("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f");
                SPY_bbInputSetup.getGBBMacroExistingService(executeBB, lookupKeyMap,
-                               executeBB.getBuildingBlock().getBpmnFlowName(), gBB, service, requestAction, cloudConfiguration);
+                               executeBB.getBuildingBlock().getBpmnFlowName(), requestAction, cloudConfiguration);
                verify(SPY_bbInputSetup, times(2)).mapCatalogVnf(any(GenericVnf.class), any(ModelInfo.class),
                                any(Service.class));
                verify(SPY_bbInputSetup, times(1)).mapCatalogVfModule(any(VfModule.class), any(ModelInfo.class),
                                any(Service.class), any(String.class));
 
-               org.onap.aai.domain.yang.CloudRegion aaiCloudRegion = Mockito.mock(org.onap.aai.domain.yang.CloudRegion.class);
+               CloudRegion cloudRegion = new CloudRegion();
+               cloudRegion.setLcpCloudRegionId("cloudRegionId");
+               cloudRegion.setCloudOwner("CloudOwner");
+               doReturn(Optional.of(cloudRegion)).when(SPY_cloudInfoFromAAI).getCloudInfoFromAAI(gBB.getServiceInstance());
                VolumeGroup volumeGroup = new VolumeGroup();
                volumeGroup.setVolumeGroupId("volumeGroupId");
                gBB.getServiceInstance().getVnfs().get(0).getVolumeGroups().add(volumeGroup);
                org.onap.aai.domain.yang.VolumeGroup aaiVolumeGroup = new org.onap.aai.domain.yang.VolumeGroup();
                aaiVolumeGroup.setModelCustomizationId("modelCustId");
-               doReturn(aaiVolumeGroup).when(SPY_bbInputSetupUtils).getAAIVolumeGroup(Defaults.CLOUD_OWNER.toString(),
-                               cloudConfiguration.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId());
+               doReturn(aaiVolumeGroup).when(SPY_bbInputSetupUtils).getAAIVolumeGroup(cloudRegion.getCloudOwner(),
+                               cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId());
 
                executeBB.getBuildingBlock().setBpmnFlowName("UnassignVolumeGroupBB");
                executeBB.getBuildingBlock().setKey("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
                SPY_bbInputSetup.getGBBMacroExistingService(executeBB, lookupKeyMap,
-                               executeBB.getBuildingBlock().getBpmnFlowName(), gBB, service, requestAction, cloudConfiguration);
+                               executeBB.getBuildingBlock().getBpmnFlowName(), requestAction, null);
                verify(SPY_bbInputSetup, times(3)).mapCatalogVnf(any(GenericVnf.class), any(ModelInfo.class),
                                any(Service.class));
                verify(SPY_bbInputSetup, times(1)).mapCatalogVolumeGroup(isA(VolumeGroup.class), isA(ModelInfo.class),
@@ -2272,7 +2353,7 @@ public class BBInputSetupTest {
                executeBB.getBuildingBlock().setBpmnFlowName("ActivateFabricConfigurationBB");
                executeBB.getBuildingBlock().setKey("72d9d1cd-f46d-447a-abdb-451d6fb05fa9");
                SPY_bbInputSetup.getGBBMacroExistingService(executeBB, lookupKeyMap,
-                               executeBB.getBuildingBlock().getBpmnFlowName(), gBB, service, requestAction, cloudConfiguration);
+                               executeBB.getBuildingBlock().getBpmnFlowName(), requestAction, cloudConfiguration);
                verify(SPY_bbInputSetup, times(1)).mapCatalogConfiguration(any(Configuration.class), any(ModelInfo.class),
                                any(Service.class), isA(ConfigurationResourceKeys.class));
        }
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/CloudInfoFromAAITest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/CloudInfoFromAAITest.java
new file mode 100644 (file)
index 0000000..ccaa97b
--- /dev/null
@@ -0,0 +1,142 @@
+package org.onap.so.bpmn.servicedecomposition.tasks;
+
+import static com.shazam.shazamcrest.MatcherAssert.assertThat;
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.doReturn;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.Spy;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
+import org.onap.so.client.aai.entities.Relationships;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CloudInfoFromAAITest {
+
+       private static final String RESOURCE_PATH = "src/test/resources/__files/ExecuteBuildingBlock/";
+
+       @Spy
+       private CloudInfoFromAAI SPY_CloudInfoFromAAI = new CloudInfoFromAAI();
+
+       protected ObjectMapper mapper = new ObjectMapper();
+       
+       @Mock
+       private BBInputSetupUtils SPY_bbInputSetupUtils;
+
+       @Before
+       public void setup(){
+               SPY_CloudInfoFromAAI.setBbInputSetupUtils(SPY_bbInputSetupUtils);
+       }
+       
+       @Test
+       public void testGetCloudInfoFromAAI() throws JsonParseException, JsonMappingException, IOException {
+               //Test vnfs
+               ServiceInstance serviceInstance = mapper.readValue(
+                               new File(RESOURCE_PATH + "ServiceInstance_getServiceInstanceNOAAIExpected.json"),
+                               ServiceInstance.class);
+               CloudRegion expected = new CloudRegion();
+               GenericVnf vnf = new GenericVnf();
+               String vnfId = "vnfId";
+               vnf.setVnfId(vnfId);
+               serviceInstance.getVnfs().add(vnf);
+               org.onap.aai.domain.yang.GenericVnf aaiVnf = new org.onap.aai.domain.yang.GenericVnf();
+               aaiVnf.setVnfId(vnfId);
+               Relationships relationships = Mockito.mock(Relationships.class);
+               Optional<Relationships> relationshipsOp= Optional.of(relationships);
+               doReturn(aaiVnf).when(SPY_bbInputSetupUtils).getAAIGenericVnf(vnf.getVnfId());
+               doReturn(relationshipsOp).when(SPY_CloudInfoFromAAI).getRelationshipsFromWrapper(isA(AAIResultWrapper.class));
+               doReturn(Optional.of(expected)).when(SPY_CloudInfoFromAAI).getRelatedCloudRegionAndTenant(relationships);
+               Optional<CloudRegion> actual = SPY_CloudInfoFromAAI.getCloudInfoFromAAI(serviceInstance);
+               assertThat(actual.get(), sameBeanAs(expected));
+               
+               //Test networks
+               serviceInstance = mapper.readValue(
+                               new File(RESOURCE_PATH + "ServiceInstance_getServiceInstanceNOAAIExpected.json"),
+                               ServiceInstance.class);
+               L3Network l3Network = new L3Network();
+               String networkId = "networkId";
+               l3Network.setNetworkId(networkId);
+               serviceInstance.getNetworks().add(l3Network);
+               org.onap.aai.domain.yang.L3Network aaiL3Network = new org.onap.aai.domain.yang.L3Network();
+               aaiL3Network.setNetworkId(networkId);
+               doReturn(aaiL3Network).when(SPY_bbInputSetupUtils).getAAIL3Network(l3Network.getNetworkId());
+               actual = SPY_CloudInfoFromAAI.getCloudInfoFromAAI(serviceInstance);
+               assertThat(actual.get(), sameBeanAs(expected));
+               
+               //Test no relationships
+               
+               doReturn(Optional.empty()).when(SPY_CloudInfoFromAAI).getRelationshipsFromWrapper(isA(AAIResultWrapper.class));
+               actual = SPY_CloudInfoFromAAI.getCloudInfoFromAAI(serviceInstance);
+               assertEquals(actual, Optional.empty());
+               
+               //Test null
+               serviceInstance = mapper.readValue(
+                               new File(RESOURCE_PATH + "ServiceInstance_getServiceInstanceNOAAIExpected.json"),
+                               ServiceInstance.class);
+               actual = SPY_CloudInfoFromAAI.getCloudInfoFromAAI(serviceInstance);
+               assertEquals(actual, Optional.empty());
+       }
+       
+       @Test
+       public void testGetRelatedCloudRegionAndTenant() throws JsonProcessingException {
+               String cloudOwner = "cloudOwner";
+               String cloudRegionId = "cloudRegionId";
+               String cloudRegionVersion = "cloudRegionVersion";
+               String cloudRegionComplexName = "cloudRegionComplexName";
+               String tenantId = "tenantId";
+               CloudRegion expected = new CloudRegion();
+               expected.setCloudOwner(cloudOwner);
+               expected.setCloudRegionVersion(cloudRegionVersion);
+               expected.setComplex(cloudRegionComplexName);
+               expected.setLcpCloudRegionId(cloudRegionId);
+               expected.setTenantId(tenantId);
+               
+               Relationships relationships = Mockito.mock(Relationships.class);
+               List<AAIResultWrapper> cloudRegions = new ArrayList<>();
+               org.onap.aai.domain.yang.CloudRegion cloudRegion = new org.onap.aai.domain.yang.CloudRegion();
+               cloudRegion.setCloudOwner(cloudOwner);
+               cloudRegion.setCloudRegionId(cloudRegionId);
+               cloudRegion.setCloudRegionVersion(cloudRegionVersion);
+               cloudRegion.setComplexName(cloudRegionComplexName);
+               AAIResultWrapper cloudRegionWrapper = new AAIResultWrapper(
+                               new AAICommonObjectMapperProvider().getMapper().writeValueAsString(cloudRegion));
+               cloudRegions.add(cloudRegionWrapper);
+               
+               doReturn(cloudRegions).when(relationships).getByType(AAIObjectType.CLOUD_REGION);
+               List<AAIResultWrapper> tenants = new ArrayList<>();
+               org.onap.aai.domain.yang.Tenant tenant = new org.onap.aai.domain.yang.Tenant();
+               tenant.setTenantId(tenantId);
+               AAIResultWrapper tenantWrapper = new AAIResultWrapper(
+                               new AAICommonObjectMapperProvider().getMapper().writeValueAsString(tenant));
+               tenants.add(tenantWrapper);
+               doReturn(tenants).when(relationships).getByType(AAIObjectType.TENANT);
+               
+               Optional<CloudRegion> actual = SPY_CloudInfoFromAAI.getRelatedCloudRegionAndTenant(relationships);
+               
+               assertThat(actual.get(), sameBeanAs(expected));
+       }
+}
index fc2de43..9af9b2f 100644 (file)
@@ -91,7 +91,9 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                customer.getServiceSubscription().getServiceInstances().add(serviceInstance);
                serviceInstance.getModelInfoServiceInstance().setServiceType("st1");
                vnf.setVnfType("vnft1");
-               delegateExecution.setVariable("aLaCarte", true);
+               delegateExecution.setVariable("aLaCarte", true);                
+               delegateExecution.setVariable("suppressRollback", false);
+
                RainyDayHandlerStatus rainyDayHandlerStatus = new RainyDayHandlerStatus();
                rainyDayHandlerStatus.setErrorCode("7000");
                rainyDayHandlerStatus.setFlowName("AssignServiceInstanceBB");
@@ -113,6 +115,8 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                serviceInstance.getModelInfoServiceInstance().setServiceType("st1");
                vnf.setVnfType("vnft1");
                delegateExecution.setVariable("aLaCarte", true);
+               delegateExecution.setVariable("suppressRollback", false);
+               
                RainyDayHandlerStatus rainyDayHandlerStatus = new RainyDayHandlerStatus();
                rainyDayHandlerStatus.setErrorCode(ASTERISK);
                rainyDayHandlerStatus.setFlowName("AssignServiceInstanceBB");
@@ -136,7 +140,8 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                vnf.setVnfType("vnft1");
                delegateExecution.setVariable("aLaCarte", true);
                doReturn(null).when(MOCK_catalogDbClient).getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(isA(String.class), isA(String.class), isA(String.class), isA(String.class), isA(String.class));
-
+               delegateExecution.setVariable("suppressRollback", false);
+               
                executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution,true);
                
                assertEquals("Abort", delegateExecution.getVariable("handlingCode"));
@@ -147,6 +152,7 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                doThrow(RuntimeException.class).when(MOCK_catalogDbClient).getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(isA(String.class), isA(String.class), isA(String.class), isA(String.class), isA(String.class));
                delegateExecution.setVariable("aLaCarte", true);
                executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution,true);
+               delegateExecution.setVariable("suppressRollback", false);
                
                assertEquals("Abort", delegateExecution.getVariable("handlingCode"));
        }
@@ -157,6 +163,7 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                serviceInstance.getModelInfoServiceInstance().setServiceType("st1");
                vnf.setVnfType("vnft1");
                delegateExecution.setVariable("aLaCarte", true);
+               delegateExecution.setVariable("suppressRollback", false);
                
                RainyDayHandlerStatus rainyDayHandlerStatus = new RainyDayHandlerStatus();
                rainyDayHandlerStatus.setErrorCode("7000");
@@ -180,6 +187,7 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                serviceInstance.getModelInfoServiceInstance().setServiceType("st1");
                vnf.setVnfType("vnft1");
                delegateExecution.setVariable("aLaCarte", false);
+               delegateExecution.setVariable("suppressRollback", false);
                
                RainyDayHandlerStatus rainyDayHandlerStatus = new RainyDayHandlerStatus();
                rainyDayHandlerStatus.setErrorCode("7000");
@@ -203,6 +211,7 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                serviceInstance.getModelInfoServiceInstance().setServiceType("st1");
                vnf.setVnfType("vnft1");
                delegateExecution.setVariable("aLaCarte", true);
+               delegateExecution.setVariable("suppressRollback", false);
                
                RainyDayHandlerStatus rainyDayHandlerStatus = new RainyDayHandlerStatus();
                rainyDayHandlerStatus.setErrorCode("7000");
@@ -220,4 +229,12 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                assertEquals("RollbackToAssigned", delegateExecution.getVariable("handlingCode"));
        }
        
+       @Test
+       public void suppressRollbackTest() throws Exception {
+               delegateExecution.setVariable("suppressRollback", true);
+               delegateExecution.setVariable("aLaCarte", true);
+               executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution,true);
+               assertEquals("Abort", delegateExecution.getVariable("handlingCode"));
+       }
+       
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/vnfAdapterMocks/vnfAdapterCallback.xml b/bpmn/MSOCommonBPMN/src/test/resources/__files/vnfAdapterMocks/vnfAdapterCallback.xml
new file mode 100644 (file)
index 0000000..d63a5ec
--- /dev/null
@@ -0,0 +1,21 @@
+
+
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<createVfModuleResponse>
+    <messageId>255ca199-7f53-4800-8ab0-c55954b3ff0f</messageId>
+    <rollback>
+        <cloudSiteId>mtwnj1a</cloudSiteId>
+        <messageId>255ca199-7f53-4800-8ab0-c55954b3ff0f</messageId>
+        <msoRequest/>
+        <tenantId>c2141e3fcae940fcb4797ec9115e5a7a</tenantId>
+        <vfModuleCreated>true</vfModuleCreated>
+        <vfModuleId>b70a3ba5-d172-4e9e-98f6-39516446b25b</vfModuleId>
+        <vfModuleStackId>USISTDMTWNJVVHP529_migrated.base.module-0/hnportal-1902-1214-1217-144843702565</vfModuleStackId>
+        <vnfId>USISTDMTWNJVVHP529_migrated.base.module-0/hnportal-1902-1214-1217-144843702565</vnfId>
+    </rollback>
+    <vfModuleCreated>true</vfModuleCreated>
+    <vfModuleId>b70a3ba5-d172-4e9e-98f6-39516446b25b</vfModuleId>
+    <vfModuleOutputs/>
+    <vfModuleStackId>USISTDMTWNJVVHP529_migrated.base.module-0/hnportal-1902-1214-1217-144843702565</vfModuleStackId>
+    <vnfId>e64e62e1-7c02-4148-ad9c-e51406da508a</vnfId>
+</createVfModuleResponse>
\ No newline at end of file
index 750cd24..5100085 100644 (file)
@@ -87,6 +87,20 @@ public class UrnPropertiesReader {
         }
     }
     
+    /**
+     * Return the String array URN property value from the environment object
+     * @param variableName URN property name
+     * @return URN property value
+     */
+
+    public static String[] getVariablesArray(String variableName){
+        if (environment != null) {
+            return environment.getProperty(variableName, String[].class);
+        } else {
+            return null;
+        }
+    }
+    
     public static String getVariable(String variableName, String defaultValue) {
        return Optional.ofNullable(getVariable(variableName)).orElse(defaultValue); 
     }
index bb50597..d021394 100644 (file)
@@ -27,9 +27,9 @@ public class CompareModelsResult  extends JsonWrapper implements Serializable
 {
        private static final long serialVersionUID = 1L;
        
-       List<ResourceModelInfo> addedResourceList;      
-       List<ResourceModelInfo> deletedResourceList;
-       List<String> requestInputs;
+       private List<ResourceModelInfo> addedResourceList;      
+       private List<ResourceModelInfo> deletedResourceList;
+       private List<String> requestInputs;
        
        public List<ResourceModelInfo> getAddedResourceList() {
                return addedResourceList;
index e22125b..fb5d010 100644 (file)
                        <artifactId>camunda-bpm-assert</artifactId>
                        <version>2.0-alpha2</version>
                        <scope>test</scope>
-               </dependency>   
+               </dependency>
                <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
-            <version>1.7.0</version>
-            <scope>test</scope>
-        </dependency>  
+                       <groupId>org.assertj</groupId>
+                       <artifactId>assertj-core</artifactId>
+                       <version>1.7.0</version>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 </project>
index 335f346..d24e953 100644 (file)
@@ -56,6 +56,7 @@ import org.camunda.bpm.engine.RuntimeService;
 import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.camunda.bpm.engine.history.HistoricVariableInstance;
 import org.camunda.bpm.engine.runtime.ProcessInstance;
+import org.camunda.bpm.engine.runtime.ProcessInstanceQuery;
 import org.camunda.bpm.engine.test.ProcessEngineRule;
 import org.camunda.bpm.engine.variable.impl.VariableMapImpl;
 import org.custommonkey.xmlunit.DetailedDiff;
@@ -884,13 +885,23 @@ public abstract class WorkflowTest {
                                return null;
                        }
 
+                       ProcessInstanceQuery processInstanceQuery = null;
                        if (processInstance == null) {
-                               processInstance = runtimeService
+                               processInstanceQuery = runtimeService
                                        .createProcessInstanceQuery()
-                                       .processDefinitionKey(processKey)
-                                       .singleResult();
+                                       .processDefinitionKey(processKey);
+                       }
+
+                       if(processInstanceQuery.count() == 1 || processInstanceQuery.count() == 0){
+                               processInstance = processInstanceQuery.singleResult();
+                       }else{
+                               //TODO There shouldnt be more than one in the list but seems to be happening, need to figure out why happening and best way to get correct one from list
+                               msoLogger.debug("Process Instance Query returned " + processInstanceQuery.count() + " instance. Getting the last instance in the list");
+                               List<ProcessInstance> processList = processInstanceQuery.list();
+                               processInstance = processList.get((processList.size() - 1));
                        }
 
+
                        if (processInstance != null) {
                                value = runtimeService
                                        .getVariable(processInstance.getId(), variable);
@@ -927,7 +938,7 @@ public abstract class WorkflowTest {
        protected boolean injectSDNCRestCallback(String contentType, String content, long timeout) {
                String sdncRequestId = (String) getProcessVariable("SDNCAdapterRestV1",
                        "SDNCAResponse_CORRELATOR", timeout);
-               
+
                if (sdncRequestId == null) {
                        sdncRequestId = (String) getProcessVariable("SDNCAdapterRestV2",
                                "SDNCAResponse_CORRELATOR", timeout);
@@ -1693,7 +1704,7 @@ public abstract class WorkflowTest {
 
        /**
         * Checks to see if the specified process is ended.
-        * 
+        *
         * @param processInstanceId the process Instance Id
         * @return true if the process is ended
         */
@@ -1705,7 +1716,7 @@ public abstract class WorkflowTest {
 
        /**
         * Checks to see if the specified process is ended.
-        * 
+        *
         * @author cb645j
         */
        //TODO combine into 1
index 74e5a6c..2d0d4b5 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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
@@ -22,10 +24,12 @@ package org.onap.so.bpmn.infrastructure.pnf.delegate;
 
 import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareAssertions.assertThat;
 import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.CORRELATION_ID;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import java.util.UUID;
 import org.assertj.core.api.Assertions;
 import org.camunda.bpm.engine.runtime.ProcessInstance;
 import org.junit.Test;
@@ -35,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
 
     private static final String TIMEOUT_10_S = "PT10S";
+    private static final String VALID_UUID = UUID.nameUUIDFromBytes("testUuid".getBytes()).toString();
 
     @Autowired
     private AaiConnectionTestImpl aaiConnection;
@@ -49,6 +54,7 @@ public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
         Map<String, Object> variables = new HashMap<>();
         variables.put("timeoutForPnfEntryNotification", TIMEOUT_10_S);
         variables.put(CORRELATION_ID, AaiConnectionTestImpl.ID_WITH_ENTRY);
+        variables.put(PNF_UUID, VALID_UUID);
         // when
         ProcessInstance instance = runtimeService
                 .startProcessInstanceByKey("CreateAndActivatePnfResource", "businessKey", variables);
@@ -76,6 +82,7 @@ public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
         Map<String, Object> variables = new HashMap<>();
         variables.put("timeoutForPnfEntryNotification", TIMEOUT_10_S);
         variables.put(CORRELATION_ID, AaiConnectionTestImpl.ID_WITHOUT_ENTRY);
+        variables.put(PNF_UUID, VALID_UUID);
         // when
         ProcessInstance instance = runtimeService
                 .startProcessInstanceByKey("CreateAndActivatePnfResource", "businessKey", variables);
@@ -88,7 +95,7 @@ public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
                 "CheckInputs",
                 "CheckAiiForCorrelationId",
                 "DoesAaiContainInfoAboutPnf",
-                "CreateAndActivatePnf_CreateAaiEntry",
+                "CreatePnfEntryInAai",
                 "AaiEntryExists",
                 "InformDmaapClient",
                 "WaitForDmaapPnfReadyNotification",
index a7b49bc..e28bedd 100644 (file)
                        <dependency>
                                <groupId>org.assertj</groupId>
                                <artifactId>assertj-core</artifactId>
-                               <version>1.7.0</version>
+                               <version>3.11.1</version>
+                               <scope>test</scope>
+                       </dependency>
+                       <dependency>
+                               <groupId>org.camunda.bpm.extension.mockito</groupId>
+                               <artifactId>camunda-bpm-mockito</artifactId>
+                               <version>4.0.0</version>
                                <scope>test</scope>
                        </dependency>
                </dependencies>
index 8f1f2bf..4fe02ee 100644 (file)
                        <version>2.0-alpha2</version>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>org.assertj</groupId>
+                       <artifactId>assertj-core</artifactId>
+                       <version>1.7.0</version>
+                       <scope>test</scope>
+               </dependency>
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-test</artifactId>
index dc6e4a8..78a389a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="ActivateNetworkBB" name="ActivateNetworkBB" isExecutable="true">
     <bpmn2:startEvent id="activateNetwork_startEvent">
       <bpmn2:outgoing>SequenceFlow_05elmhj</bpmn2:outgoing>
@@ -9,15 +9,24 @@
     </bpmn2:endEvent>
     <bpmn2:serviceTask id="Activate_Network_SDNC_ServiceTask" name="&#10;SDNC&#10;Activate&#10;(network)&#10;" camunda:expression="${SDNCActivateTasks.activateNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn2:incoming>SequenceFlow_05elmhj</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0xbvwsu</bpmn2:outgoing>
+      <bpmn2:outgoing>SequenceFlow_0zzlwi7</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:serviceTask id="Activate_Network_AAI_ServiceTask" name="&#10;AAI&#10;Update&#10;(network)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusActiveNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn2:incoming>SequenceFlow_0xbvwsu</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_0wb238v</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_18atf08</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:sequenceFlow id="SequenceFlow_05elmhj" sourceRef="activateNetwork_startEvent" targetRef="Activate_Network_SDNC_ServiceTask" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0xbvwsu" sourceRef="Activate_Network_SDNC_ServiceTask" targetRef="Activate_Network_AAI_ServiceTask" />
     <bpmn2:sequenceFlow id="SequenceFlow_18atf08" sourceRef="Activate_Network_AAI_ServiceTask" targetRef="activateNetwork_EndEvent" />
+    <bpmn2:callActivity id="CallActivity_sdncHandler" name="SDNC Activate (network)" calledElement="SDNCHandler">
+      <bpmn2:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>SequenceFlow_0zzlwi7</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0wb238v</bpmn2:outgoing>
+    </bpmn2:callActivity>
+    <bpmn2:sequenceFlow id="SequenceFlow_0zzlwi7" sourceRef="Activate_Network_SDNC_ServiceTask" targetRef="CallActivity_sdncHandler" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0wb238v" sourceRef="CallActivity_sdncHandler" targetRef="Activate_Network_AAI_ServiceTask" />
   </bpmn2:process>
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmn2:error id="Error_1" name="java.lang.Exception" errorCode="java.lang.Exception" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_10l9a3s_di" bpmnElement="activateNetwork_EndEvent">
-        <dc:Bounds x="975" y="-55" width="36" height="36" />
+        <dc:Bounds x="1115" y="-55" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="971" y="-19" width="46" height="12" />
+          <dc:Bounds x="1089" y="-19" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1k7d8ih_di" bpmnElement="Activate_Network_SDNC_ServiceTask">
         <dc:Bounds x="653" y="-77" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1911vum_di" bpmnElement="Activate_Network_AAI_ServiceTask">
-        <dc:Bounds x="802" y="-77" width="100" height="80" />
+        <dc:Bounds x="969" y="-77" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_05elmhj_di" bpmnElement="SequenceFlow_05elmhj">
         <di:waypoint xsi:type="dc:Point" x="581" y="-37" />
           <dc:Bounds x="617" y="-62" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0xbvwsu_di" bpmnElement="SequenceFlow_0xbvwsu">
+      <bpmndi:BPMNEdge id="SequenceFlow_18atf08_di" bpmnElement="SequenceFlow_18atf08">
+        <di:waypoint xsi:type="dc:Point" x="1069" y="-37" />
+        <di:waypoint xsi:type="dc:Point" x="1115" y="-37" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1047" y="-52" width="90" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_0g1zk8g_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="802" y="-77" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0zzlwi7_di" bpmnElement="SequenceFlow_0zzlwi7">
         <di:waypoint xsi:type="dc:Point" x="753" y="-37" />
-        <di:waypoint xsi:type="dc:Point" x="778" y="-37" />
-        <di:waypoint xsi:type="dc:Point" x="778" y="-37" />
         <di:waypoint xsi:type="dc:Point" x="802" y="-37" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="793" y="-37" width="0" height="0" />
+          <dc:Bounds x="777.5" y="-58" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_18atf08_di" bpmnElement="SequenceFlow_18atf08">
+      <bpmndi:BPMNEdge id="SequenceFlow_0wb238v_di" bpmnElement="SequenceFlow_0wb238v">
         <di:waypoint xsi:type="dc:Point" x="902" y="-37" />
-        <di:waypoint xsi:type="dc:Point" x="939" y="-37" />
-        <di:waypoint xsi:type="dc:Point" x="939" y="-37" />
-        <di:waypoint xsi:type="dc:Point" x="975" y="-37" />
+        <di:waypoint xsi:type="dc:Point" x="969" y="-37" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="954" y="-37" width="0" height="0" />
+          <dc:Bounds x="935.5" y="-58" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index c7b7952..259a334 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.10.0">
+<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.8.2">
   <bpmn:process id="ActivateVfModuleBB" name="ActivateVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="ActivateVfModuleBB_Start">
       <bpmn:outgoing>SequenceFlow_0ieafii</bpmn:outgoing>
     </bpmn:endEvent>
     <bpmn:serviceTask id="ActivateVfModule" name="&#10;SDNC&#10;Activate&#10;(vf module)&#10;" camunda:expression="${SDNCActivateTasks.activateVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0ieafii</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_14kvrbe</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1a495wm</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_14kvrbe" sourceRef="ActivateVfModule" targetRef="UpdateVfModuleActiveStatus" />
     <bpmn:serviceTask id="UpdateVfModuleActiveStatus" name="&#10;AAI&#10;Update&#10;(vf module)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusActivateVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_14kvrbe</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1j4x1ej</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0xsp0pv</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0xsp0pv" sourceRef="UpdateVfModuleActiveStatus" targetRef="ActivateVfModuleBB_End" />
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC Activate (vfModule)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1a495wm</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1j4x1ej</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_1a495wm" sourceRef="ActivateVfModule" targetRef="CallActivity_sdncHandler" />
+    <bpmn:sequenceFlow id="SequenceFlow_1j4x1ej" sourceRef="CallActivity_sdncHandler" targetRef="UpdateVfModuleActiveStatus" />
   </bpmn:process>
   <bpmn:error id="Error_0q258vt" name="gDelegateError" errorCode="7000" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ieafii_di" bpmnElement="SequenceFlow_0ieafii">
         <di:waypoint xsi:type="dc:Point" x="209" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="288" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="262" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="203.5" y="99" width="90" height="12" />
+          <dc:Bounds x="190.5" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1v967li_di" bpmnElement="ActivateVfModuleBB_End">
-        <dc:Bounds x="624" y="102" width="36" height="36" />
+        <dc:Bounds x="736" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="633" y="142" width="19" height="12" />
+          <dc:Bounds x="710" y="142" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0hawa84_di" bpmnElement="ActivateVfModule">
-        <dc:Bounds x="288" y="80" width="100" height="80" />
+        <dc:Bounds x="262" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_14kvrbe_di" bpmnElement="SequenceFlow_14kvrbe">
-        <di:waypoint xsi:type="dc:Point" x="388" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="433" y="120" />
+      <bpmndi:BPMNShape id="ServiceTask_175e9ul_di" bpmnElement="UpdateVfModuleActiveStatus">
+        <dc:Bounds x="600" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0xsp0pv_di" bpmnElement="SequenceFlow_0xsp0pv">
+        <di:waypoint xsi:type="dc:Point" x="700" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="736" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="365.5" y="99" width="90" height="12" />
+          <dc:Bounds x="673" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_175e9ul_di" bpmnElement="UpdateVfModuleActiveStatus">
-        <dc:Bounds x="433" y="80" width="100" height="80" />
+      <bpmndi:BPMNShape id="CallActivity_03jkesd_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="420" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0xsp0pv_di" bpmnElement="SequenceFlow_0xsp0pv">
-        <di:waypoint xsi:type="dc:Point" x="533" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="624" y="120" />
+      <bpmndi:BPMNEdge id="SequenceFlow_1a495wm_di" bpmnElement="SequenceFlow_1a495wm">
+        <di:waypoint xsi:type="dc:Point" x="362" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="420" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="391" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1j4x1ej_di" bpmnElement="SequenceFlow_1j4x1ej">
+        <di:waypoint xsi:type="dc:Point" x="520" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="600" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="533.5" y="99" width="90" height="12" />
+          <dc:Bounds x="560" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index 1147283..e1f80dc 100644 (file)
@@ -1,23 +1,32 @@
 <?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.10.0">
+<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.8.2">
   <bpmn:process id="ActivateVnfBB" name="ActivateVnfBB" isExecutable="true">
     <bpmn:startEvent id="Start_ActivateVnfBB">
       <bpmn:outgoing>SequenceFlow_0k9qnoi</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:sequenceFlow id="SequenceFlow_0k9qnoi" sourceRef="Start_ActivateVnfBB" targetRef="Task_SDNCAdapterVnfTopologyActivate" />
-    <bpmn:sequenceFlow id="SequenceFlow_0r6pzwt" sourceRef="Task_SDNCAdapterVnfTopologyActivate" targetRef="Task_ActivateOrchestrationStatusVnf" />
     <bpmn:endEvent id="End_ActivateVnfBB">
       <bpmn:incoming>SequenceFlow_0vnitwg</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_0vnitwg" sourceRef="Task_ActivateOrchestrationStatusVnf" targetRef="End_ActivateVnfBB" />
     <bpmn:serviceTask id="Task_SDNCAdapterVnfTopologyActivate" name="&#10;SDNC&#10;Activate&#10;(vnf)&#10;" camunda:expression="${SDNCActivateTasks.activateVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0k9qnoi</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_0r6pzwt</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0wk5e4o</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="Task_ActivateOrchestrationStatusVnf" name="&#10;AAI&#10;Update&#10;(vnf)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusActiveVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_0r6pzwt</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0ho00ja</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0vnitwg</bpmn:outgoing>
     </bpmn:serviceTask>
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC Activate (vnf)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0wk5e4o</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0ho00ja</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_0wk5e4o" sourceRef="Task_SDNCAdapterVnfTopologyActivate" targetRef="CallActivity_sdncHandler" />
+    <bpmn:sequenceFlow id="SequenceFlow_0ho00ja" sourceRef="CallActivity_sdncHandler" targetRef="Task_ActivateOrchestrationStatusVnf" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="ActivateVnfBB">
           <dc:Bounds x="199" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0r6pzwt_di" bpmnElement="SequenceFlow_0r6pzwt">
-        <di:waypoint xsi:type="dc:Point" x="379" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="411" y="120" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="350" y="99" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1ad7eym_di" bpmnElement="End_ActivateVnfBB">
-        <dc:Bounds x="580" y="102" width="36" height="36" />
+        <dc:Bounds x="726" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="589" y="142" width="18" height="12" />
+          <dc:Bounds x="699" y="142" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0vnitwg_di" bpmnElement="SequenceFlow_0vnitwg">
-        <di:waypoint xsi:type="dc:Point" x="511" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="580" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="663" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="726" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="500.5" y="99" width="90" height="12" />
+          <dc:Bounds x="649.5" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1k98q3r_di" bpmnElement="Task_SDNCAdapterVnfTopologyActivate">
         <dc:Bounds x="279" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1vg25fs_di" bpmnElement="Task_ActivateOrchestrationStatusVnf">
-        <dc:Bounds x="411" y="80" width="100" height="80" />
+        <dc:Bounds x="563" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1j8aadu_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="418" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0wk5e4o_di" bpmnElement="SequenceFlow_0wk5e4o">
+        <di:waypoint xsi:type="dc:Point" x="379" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="418" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="398.5" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ho00ja_di" bpmnElement="SequenceFlow_0ho00ja">
+        <di:waypoint xsi:type="dc:Point" x="518" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="563" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="540.5" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index 5f7b29b..967e018 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="AssignNetworkBB" name="AssignNetworkBB" isExecutable="true">
     <bpmn2:startEvent id="AssignNetworkBB_start">
       <bpmn2:outgoing>SequenceFlow_11op1ih</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:serviceTask id="ServiceTask_assign_network_sdnc" name="&#10;SDNC&#10;Assign&#10;(network)&#10;" camunda:expression="${SDNCAssignTasks.assignNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn2:incoming>SequenceFlow_16hhbw3</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0oawye1</bpmn2:outgoing>
+      <bpmn2:outgoing>SequenceFlow_0rt36co</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:serviceTask id="ServiceTask_put_network_in_AAI" name="&#10;AAI&#10;Create&#10;(network)&#10;" camunda:expression="${AAICreateTasks.createNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn2:incoming>SequenceFlow_0gkr871</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1ctpnpe</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:serviceTask id="ServiceTask_assign_network_aai" name="&#10;AAI&#10;Update&#10;(network)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusAssignedNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn2:incoming>SequenceFlow_0oawye1</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_1mvf7b9</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0988gld</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:sequenceFlow id="SequenceFlow_017131q" name="Yes" sourceRef="networkFoundByName_ExclusiveGateway" targetRef="ExclusiveGateway_0vtj8n8">
     </bpmn2:inclusiveGateway>
     <bpmn2:sequenceFlow id="SequenceFlow_0jm95hf" sourceRef="ExclusiveGateway_0vtj8n8" targetRef="ServiceTask_get_cloud_region" />
     <bpmn2:sequenceFlow id="SequenceFlow_16hhbw3" sourceRef="ServiceTask_get_cloud_region" targetRef="ServiceTask_assign_network_sdnc" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0oawye1" sourceRef="ServiceTask_assign_network_sdnc" targetRef="ServiceTask_assign_network_aai" />
     <bpmn2:sequenceFlow id="SequenceFlow_0988gld" sourceRef="ServiceTask_assign_network_aai" targetRef="AssignNetworkBB_end" />
+    <bpmn2:callActivity id="CallActivity_sdncHandlerCall" name="SDNC Assign (network)" calledElement="SDNCHandler">
+      <bpmn2:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>SequenceFlow_0rt36co</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_1mvf7b9</bpmn2:outgoing>
+    </bpmn2:callActivity>
+    <bpmn2:sequenceFlow id="SequenceFlow_0rt36co" sourceRef="ServiceTask_assign_network_sdnc" targetRef="CallActivity_sdncHandlerCall" />
+    <bpmn2:sequenceFlow id="SequenceFlow_1mvf7b9" sourceRef="CallActivity_sdncHandlerCall" targetRef="ServiceTask_assign_network_aai" />
     <bpmn2:textAnnotation id="TextAnnotation_0dnksb2">    <bpmn2:text>sets Cloud Region on BB execution for SDNC assign</bpmn2:text>
 </bpmn2:textAnnotation>
     <bpmn2:association id="Association_1rsqd3z" sourceRef="ServiceTask_get_cloud_region" targetRef="TextAnnotation_0dnksb2" />
         <dc:Bounds x="906" y="-49" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_18yks1p_di" bpmnElement="ServiceTask_assign_network_aai">
-        <dc:Bounds x="1909" y="-127" width="100" height="80" />
+        <dc:Bounds x="2106" y="-127" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_017131q_di" bpmnElement="SequenceFlow_017131q">
         <di:waypoint xsi:type="dc:Point" x="863" y="-112" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_083u1a5_di" bpmnElement="AssignNetworkBB_end">
-        <dc:Bounds x="2118" y="-105" width="36" height="36" />
+        <dc:Bounds x="2241" y="-105" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="2113" y="-65" width="46" height="12" />
+          <dc:Bounds x="2214" y="-65" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_11op1ih_di" bpmnElement="SequenceFlow_11op1ih">
           <dc:Bounds x="1750.5" y="-108" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0oawye1_di" bpmnElement="SequenceFlow_0oawye1">
+      <bpmndi:BPMNEdge id="SequenceFlow_0988gld_di" bpmnElement="SequenceFlow_0988gld">
+        <di:waypoint xsi:type="dc:Point" x="2206" y="-87" />
+        <di:waypoint xsi:type="dc:Point" x="2241" y="-87" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="2178.5" y="-108" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_0h7upeg_di" bpmnElement="CallActivity_sdncHandlerCall">
+        <dc:Bounds x="1927" y="-127" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0rt36co_di" bpmnElement="SequenceFlow_0rt36co">
         <di:waypoint xsi:type="dc:Point" x="1869" y="-87" />
-        <di:waypoint xsi:type="dc:Point" x="1909" y="-87" />
+        <di:waypoint xsi:type="dc:Point" x="1927" y="-87" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1889" y="-108" width="0" height="12" />
+          <dc:Bounds x="1898" y="-108" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0988gld_di" bpmnElement="SequenceFlow_0988gld">
-        <di:waypoint xsi:type="dc:Point" x="2009" y="-87" />
-        <di:waypoint xsi:type="dc:Point" x="2118" y="-87" />
+      <bpmndi:BPMNEdge id="SequenceFlow_1mvf7b9_di" bpmnElement="SequenceFlow_1mvf7b9">
+        <di:waypoint xsi:type="dc:Point" x="2027" y="-87" />
+        <di:waypoint xsi:type="dc:Point" x="2106" y="-87" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="2063.5" y="-108" width="0" height="12" />
+          <dc:Bounds x="2066.5" y="-108" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index d1f2286..a98db3a 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.10.0">
+<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.8.2">
   <bpmn:process id="AssignServiceInstanceBB" name="AssignServiceInstanceBB" isExecutable="true">
     <bpmn:startEvent id="Start_AssignServiceInstanceBB">
       <bpmn:outgoing>SequenceFlow_1xr6chl</bpmn:outgoing>
       <bpmn:incoming>SequenceFlow_1t55i01</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0aef1l8</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:serviceTask id="Task_AssignServiceInstance" name="&#10;SDNC&#10;Assign&#10;(svc instance)&#10;" camunda:expression="${SDNCAssignTasks.assignServiceInstance(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+    <bpmn:serviceTask id="Task_AssignServiceInstance" name="&#10;SDNC&#10;Create Assign Request&#10;(svc instance)&#10;" camunda:expression="${SDNCAssignTasks.assignServiceInstance(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0aef1l8</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_07ea5ui</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1vmf5yv</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_1xr6chl" sourceRef="Start_AssignServiceInstanceBB" targetRef="Task_CreateServiceSubscription" />
     <bpmn:sequenceFlow id="SequenceFlow_0czewtx" sourceRef="Task_CreateServiceInstance" targetRef="Task_CreateProject" />
     <bpmn:sequenceFlow id="SequenceFlow_1t55i01" sourceRef="Task_CreateProject" targetRef="Task_CreateOwningEntity" />
-    <bpmn:sequenceFlow id="SequenceFlow_07ea5ui" sourceRef="Task_AssignServiceInstance" targetRef="Task_UpdateServiceOstatusToAssigned" />
     <bpmn:endEvent id="End_AssignServiceInstanceBB">
       <bpmn:incoming>SequenceFlow_14xl505</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_14xl505" sourceRef="Task_UpdateServiceOstatusToAssigned" targetRef="End_AssignServiceInstanceBB" />
     <bpmn:serviceTask id="Task_UpdateServiceOstatusToAssigned" name="&#10;AAI&#10;Update&#10;(svc instance)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusAssignedService(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_07ea5ui</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0c6u1cp</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_14xl505</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_1h6t7yr" sourceRef="Task_CreateServiceSubscription" targetRef="Task_CreateServiceInstance" />
       <bpmn:outgoing>SequenceFlow_1h6t7yr</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0aef1l8" sourceRef="Task_CreateOwningEntity" targetRef="Task_AssignServiceInstance" />
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC Assign (svc instance)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1vmf5yv</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0c6u1cp</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_1vmf5yv" sourceRef="Task_AssignServiceInstance" targetRef="CallActivity_sdncHandler" />
+    <bpmn:sequenceFlow id="SequenceFlow_0c6u1cp" sourceRef="CallActivity_sdncHandler" targetRef="Task_UpdateServiceOstatusToAssigned" />
   </bpmn:process>
   <bpmn:error id="Error_02g61p6" name="gDelegateError" errorCode="7000" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
           <dc:Bounds x="464" y="87" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_07ea5ui_di" bpmnElement="SequenceFlow_07ea5ui">
-        <di:waypoint xsi:type="dc:Point" x="819" y="108" />
-        <di:waypoint xsi:type="dc:Point" x="869" y="108" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="799" y="87" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_0qdq7wj_di" bpmnElement="End_AssignServiceInstanceBB">
-        <dc:Bounds x="1030" y="90" width="36" height="36" />
+        <dc:Bounds x="1150" y="90" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1039" y="130" width="18" height="12" />
+          <dc:Bounds x="1123" y="130" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_14xl505_di" bpmnElement="SequenceFlow_14xl505">
-        <di:waypoint xsi:type="dc:Point" x="969" y="108" />
-        <di:waypoint xsi:type="dc:Point" x="1030" y="108" />
+        <di:waypoint xsi:type="dc:Point" x="1104" y="108" />
+        <di:waypoint xsi:type="dc:Point" x="1150" y="108" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="954.5" y="87" width="90" height="12" />
+          <dc:Bounds x="1082" y="87" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1dgenhy_di" bpmnElement="Task_UpdateServiceOstatusToAssigned">
-        <dc:Bounds x="869" y="68" width="100" height="80" />
+        <dc:Bounds x="1004" y="68" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1h6t7yr_di" bpmnElement="SequenceFlow_1h6t7yr">
         <di:waypoint xsi:type="dc:Point" x="253" y="108" />
           <dc:Bounds x="653" y="87" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_037c9st_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="862" y="68" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1vmf5yv_di" bpmnElement="SequenceFlow_1vmf5yv">
+        <di:waypoint xsi:type="dc:Point" x="819" y="108" />
+        <di:waypoint xsi:type="dc:Point" x="862" y="108" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="840.5" y="87" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0c6u1cp_di" bpmnElement="SequenceFlow_0c6u1cp">
+        <di:waypoint xsi:type="dc:Point" x="962" y="108" />
+        <di:waypoint xsi:type="dc:Point" x="1004" y="108" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="983" y="87" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
-</bpmn:definitions>
\ No newline at end of file
+</bpmn:definitions>
index 3ab34c4..7dee0f7 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.4.0">
+<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.8.2">
   <bpmn:process id="AssignVfModuleBB" name="AssignVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="AssignVfModuleBB_Start">
       <bpmn:outgoing>SequenceFlow_1xr6chl</bpmn:outgoing>
@@ -10,7 +10,7 @@
     </bpmn:serviceTask>
     <bpmn:serviceTask id="AssignVfModule" name="&#10;SDNC&#10;Assign&#10;(vf module)&#10;" camunda:expression="${SDNCAssignTasks.assignVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0574gaa</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_15hn8si</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0269euz</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_1xr6chl" sourceRef="AssignVfModuleBB_Start" targetRef="CreateVfModule" />
     <bpmn:sequenceFlow id="SequenceFlow_0czewtx" sourceRef="CreateVfModule" targetRef="ConnectVfModuleToVolumeGroup" />
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_14xl505" sourceRef="UpdateVfModuleStatus" targetRef="AssignVfModuleBB_End" />
     <bpmn:serviceTask id="UpdateVfModuleStatus" name="&#10;AAI&#10;Update&#10;(vf module)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusAssignedOrPendingActivationVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_15hn8si</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1dttbxh</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_14xl505</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_15hn8si" sourceRef="AssignVfModule" targetRef="UpdateVfModuleStatus" />
     <bpmn:sequenceFlow id="SequenceFlow_0574gaa" sourceRef="ConnectVfModuleToVolumeGroup" targetRef="AssignVfModule" />
     <bpmn:serviceTask id="ConnectVfModuleToVolumeGroup" name="&#10;AAI&#10;Connect&#10;(volume)&#10;" camunda:expression="${AAICreateTasks.connectVfModuleToVolumeGroup(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0czewtx</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0574gaa</bpmn:outgoing>
     </bpmn:serviceTask>
+    <bpmn:callActivity id="CallActivity_sdncHandlerCall" name="SDNC Activate (vfModule)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0269euz</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1dttbxh</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_0269euz" sourceRef="AssignVfModule" targetRef="CallActivity_sdncHandlerCall" />
+    <bpmn:sequenceFlow id="SequenceFlow_1dttbxh" sourceRef="CallActivity_sdncHandlerCall" targetRef="UpdateVfModuleStatus" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="AssignVfModuleBB">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0028k7a_di" bpmnElement="CreateVfModule">
-        <dc:Bounds x="297" y="46" width="100" height="80" />
+        <dc:Bounds x="255" y="46" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_13t22km_di" bpmnElement="AssignVfModule">
-        <dc:Bounds x="632" y="46" width="100" height="80" />
+        <dc:Bounds x="540" y="46" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1xr6chl_di" bpmnElement="SequenceFlow_1xr6chl">
         <di:waypoint xsi:type="dc:Point" x="220" y="86" />
-        <di:waypoint xsi:type="dc:Point" x="297" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="255" y="86" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="214" y="71" width="90" height="0" />
+          <dc:Bounds x="192.5" y="71" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0czewtx_di" bpmnElement="SequenceFlow_0czewtx">
-        <di:waypoint xsi:type="dc:Point" x="397" y="86" />
-        <di:waypoint xsi:type="dc:Point" x="461" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="355" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="400" y="86" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="384" y="71" width="90" height="0" />
+          <dc:Bounds x="332.5" y="71" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_0qdq7wj_di" bpmnElement="AssignVfModuleBB_End">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_14xl505_di" bpmnElement="SequenceFlow_14xl505">
-        <di:waypoint xsi:type="dc:Point" x="906" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="964" y="86" />
         <di:waypoint xsi:type="dc:Point" x="1008" y="86" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="912" y="71" width="90" height="0" />
+          <dc:Bounds x="941" y="71" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1dgenhy_di" bpmnElement="UpdateVfModuleStatus">
-        <dc:Bounds x="806" y="46" width="100" height="80" />
+        <dc:Bounds x="864" y="46" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_15hn8si_di" bpmnElement="SequenceFlow_15hn8si">
-        <di:waypoint xsi:type="dc:Point" x="732" y="86" />
-        <di:waypoint xsi:type="dc:Point" x="806" y="86" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="724" y="71" width="90" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0574gaa_di" bpmnElement="SequenceFlow_0574gaa">
-        <di:waypoint xsi:type="dc:Point" x="561" y="86" />
-        <di:waypoint xsi:type="dc:Point" x="632" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="500" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="540" y="86" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="552" y="71" width="90" height="0" />
+          <dc:Bounds x="475" y="71" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0ekqpfn_di" bpmnElement="ConnectVfModuleToVolumeGroup">
-        <dc:Bounds x="461" y="46" width="100" height="80" />
+        <dc:Bounds x="400" y="46" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0uicgnt_di" bpmnElement="CallActivity_sdncHandlerCall">
+        <dc:Bounds x="701" y="46" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0269euz_di" bpmnElement="SequenceFlow_0269euz">
+        <di:waypoint xsi:type="dc:Point" x="640" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="701" y="86" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="670.5" y="65" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1dttbxh_di" bpmnElement="SequenceFlow_1dttbxh">
+        <di:waypoint xsi:type="dc:Point" x="801" y="86" />
+        <di:waypoint xsi:type="dc:Point" x="864" y="86" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="832.5" y="65" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index 0a06748..f4db92b 100644 (file)
@@ -13,7 +13,7 @@
     </bpmn:endEvent>
     <bpmn:serviceTask id="Task_CreateVnf" name="&#10;AAI&#10;Create&#10;(vnf)&#10;" camunda:expression="${AAICreateTasks.createVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0zaz9o2</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1jwsja5</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0qj7zcn</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0zaz9o2" sourceRef="Start_AssignVnfBB" targetRef="Task_CreateVnf" />
     <bpmn:sequenceFlow id="SequenceFlow_0csh9dc" sourceRef="Task_UpdateVnfOrchestrationStatusAssigned" targetRef="End_AssignVnfBB" />
@@ -25,7 +25,6 @@
       <bpmn:incoming>SequenceFlow_1lppa2m</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1nle8kc</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1jwsja5" sourceRef="Task_CreateVnf" targetRef="Task_createPlatform" />
     <bpmn:sequenceFlow id="SequenceFlow_1nle8kc" sourceRef="Task_createInstanceGroups" targetRef="ExclusiveGateway_02tchpp" />
     <bpmn:sequenceFlow id="SequenceFlow_11jum90" name="no" sourceRef="ExclusiveGateway_02tchpp" targetRef="ExclusiveGateway_1blf52g" />
     <bpmn:sequenceFlow id="SequenceFlow_1uiok7v" name="yes" sourceRef="ExclusiveGateway_02tchpp" targetRef="Task_callHoming">
@@ -45,7 +44,7 @@
     <bpmn:sequenceFlow id="SequenceFlow_169g0ir" sourceRef="Task_createPlatform" targetRef="Task_createLineOfBusiness" />
     <bpmn:sequenceFlow id="SequenceFlow_1lppa2m" sourceRef="Task_createLineOfBusiness" targetRef="Task_createInstanceGroups" />
     <bpmn:serviceTask id="Task_createPlatform" name="&#10;AAI&#10;Connect&#10;(platform)&#10;" camunda:expression="${AAICreateTasks.createPlatform(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_1jwsja5</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_18ixm0j</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_169g0ir</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="Task_createLineOfBusiness" name="&#10;AAI&#10;Create&#10;(line bus)&#10;" camunda:expression="${AAICreateTasks.createLineOfBusiness(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0v8d14a</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1samncw</bpmn:outgoing>
     </bpmn:inclusiveGateway>
+    <bpmn:serviceTask id="ServiceTask_ConnectVnfToCloudRegion" name="&#10;AAI&#10;Connect&#10;(vnf to cloud region)&#10;" camunda:expression="${AAICreateTasks.connectVnfToCloudRegion(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_0qj7zcn</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0nsg48b</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0qj7zcn" sourceRef="Task_CreateVnf" targetRef="ServiceTask_ConnectVnfToCloudRegion" />
+    <bpmn:serviceTask id="ServiceTask_ConnectVnfToTenant" name="&#10;AAI&#10;Connect&#10;(vnf to tenant)&#10;" camunda:expression="${AAICreateTasks.connectVnfToTenant(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_0nsg48b</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_18ixm0j</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0nsg48b" sourceRef="ServiceTask_ConnectVnfToCloudRegion" targetRef="ServiceTask_ConnectVnfToTenant" />
+    <bpmn:sequenceFlow id="SequenceFlow_18ixm0j" sourceRef="ServiceTask_ConnectVnfToTenant" targetRef="Task_createPlatform" />
     <bpmn:callActivity id="CallActivity_sdncAssign" name="SDNC Assign (vnf)" calledElement="SDNCHandler">
       <bpmn:extensionElements>
         <camunda:in source="SDNCRequest" target="SDNCRequest" />
@@ -89,9 +99,9 @@
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="AssignVnfBB">
       <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="Start_AssignVnfBB">
-        <dc:Bounds x="72" y="116" width="36" height="36" />
+        <dc:Bounds x="-249" y="116" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="79" y="152" width="23" height="12" />
+          <dc:Bounds x="-275" y="152" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0m0ikey_di" bpmnElement="Task_SDNCAdapterVnfTopologyAssign">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1r380lg_di" bpmnElement="Task_CreateVnf">
-        <dc:Bounds x="147" y="94" width="100" height="80" />
+        <dc:Bounds x="-159" y="94" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0zaz9o2_di" bpmnElement="SequenceFlow_0zaz9o2">
-        <di:waypoint xsi:type="dc:Point" x="108" y="134" />
-        <di:waypoint xsi:type="dc:Point" x="147" y="134" />
+        <di:waypoint xsi:type="dc:Point" x="-213" y="134" />
+        <di:waypoint xsi:type="dc:Point" x="-159" y="134" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="83" y="113" width="90" height="12" />
+          <dc:Bounds x="-231" y="113" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0csh9dc_di" bpmnElement="SequenceFlow_0csh9dc">
       <bpmndi:BPMNShape id="ServiceTask_0wjy7za_di" bpmnElement="Task_createInstanceGroups">
         <dc:Bounds x="534" y="94" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1jwsja5_di" bpmnElement="SequenceFlow_1jwsja5">
-        <di:waypoint xsi:type="dc:Point" x="247" y="134" />
-        <di:waypoint xsi:type="dc:Point" x="279" y="134" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="218" y="113" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1nle8kc_di" bpmnElement="SequenceFlow_1nle8kc">
         <di:waypoint xsi:type="dc:Point" x="634" y="134" />
         <di:waypoint xsi:type="dc:Point" x="679" y="134" />
           <dc:Bounds x="896" y="163" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0zx2c43_di" bpmnElement="ServiceTask_ConnectVnfToCloudRegion">
+        <dc:Bounds x="-10" y="94" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0qj7zcn_di" bpmnElement="SequenceFlow_0qj7zcn">
+        <di:waypoint xsi:type="dc:Point" x="-59" y="134" />
+        <di:waypoint xsi:type="dc:Point" x="-10" y="134" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="-34.5" y="113" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0y6itfu_di" bpmnElement="ServiceTask_ConnectVnfToTenant">
+        <dc:Bounds x="140" y="94" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0nsg48b_di" bpmnElement="SequenceFlow_0nsg48b">
+        <di:waypoint xsi:type="dc:Point" x="90" y="134" />
+        <di:waypoint xsi:type="dc:Point" x="140" y="134" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="115" y="113" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_18ixm0j_di" bpmnElement="SequenceFlow_18ixm0j">
+        <di:waypoint xsi:type="dc:Point" x="240" y="134" />
+        <di:waypoint xsi:type="dc:Point" x="279" y="134" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="259.5" y="113" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_12uxg1m_di" bpmnElement="CallActivity_sdncAssign">
         <dc:Bounds x="1060" y="94" width="100" height="80" />
       </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
+
index fa0c7f4..c2e9603 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="ChangeModelServiceInstanceBB" name="ChangeModelServiceInstanceBB" isExecutable="true">
     <bpmn2:startEvent id="ChangeModelServiceInstance_Start">
       <bpmn2:outgoing>SequenceFlow_18i4a05</bpmn2:outgoing>
@@ -8,16 +8,25 @@
       <bpmn2:incoming>SequenceFlow_0g502yj</bpmn2:incoming>
     </bpmn2:endEvent>
     <bpmn2:sequenceFlow id="SequenceFlow_18i4a05" sourceRef="ChangeModelServiceInstance_Start" targetRef="SDNCChangeModelServiceInstance" />
-    <bpmn2:sequenceFlow id="SequenceFlow_19kfk17" sourceRef="SDNCChangeModelServiceInstance" targetRef="AAIUpdateModelServiceInstance" />
     <bpmn2:sequenceFlow id="SequenceFlow_0g502yj" sourceRef="AAIUpdateModelServiceInstance" targetRef="ChangeModelServiceInstance_End" />
     <bpmn2:serviceTask id="SDNCChangeModelServiceInstance" name="&#10;SDNC &#10;Change&#10;(svc instance)&#10;" camunda:expression="${SDNCChangeAssignTasks.changeModelServiceInstance(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn2:incoming>SequenceFlow_18i4a05</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_19kfk17</bpmn2:outgoing>
+      <bpmn2:outgoing>SequenceFlow_1q3rjt4</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:serviceTask id="AAIUpdateModelServiceInstance" name="&#10;AAI &#10;Update&#10;(svc Instance)&#10;" camunda:expression="${AAIUpdateTasks.updateServiceInstance(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn2:incoming>SequenceFlow_19kfk17</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_0ycnbyf</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0g502yj</bpmn2:outgoing>
     </bpmn2:serviceTask>
+    <bpmn2:callActivity id="CallActivity_sdncHandlerReq" name="SDNC ChangeModel (svc instance)" calledElement="SDNCHandler">
+      <bpmn2:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>SequenceFlow_1q3rjt4</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0ycnbyf</bpmn2:outgoing>
+    </bpmn2:callActivity>
+    <bpmn2:sequenceFlow id="SequenceFlow_1q3rjt4" sourceRef="SDNCChangeModelServiceInstance" targetRef="CallActivity_sdncHandlerReq" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0ycnbyf" sourceRef="CallActivity_sdncHandlerReq" targetRef="AAIUpdateModelServiceInstance" />
   </bpmn2:process>
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmn2:error id="Error_1" name="java.lang.Exception" errorCode="java.lang.Exception" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_18i4a05_di" bpmnElement="SequenceFlow_18i4a05">
         <di:waypoint xsi:type="dc:Point" x="111" y="106" />
-        <di:waypoint xsi:type="dc:Point" x="234" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="158" y="106" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="127.5" y="85" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_19kfk17_di" bpmnElement="SequenceFlow_19kfk17">
-        <di:waypoint xsi:type="dc:Point" x="334" y="106" />
-        <di:waypoint xsi:type="dc:Point" x="390" y="106" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="317" y="85" width="90" height="12" />
+          <dc:Bounds x="89.5" y="85" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0g502yj_di" bpmnElement="SequenceFlow_0g502yj">
-        <di:waypoint xsi:type="dc:Point" x="490" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="589" y="106" />
         <di:waypoint xsi:type="dc:Point" x="632" y="106" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="516" y="85" width="90" height="12" />
+          <dc:Bounds x="565.5" y="85" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_03km5f0_di" bpmnElement="SDNCChangeModelServiceInstance">
-        <dc:Bounds x="234" y="66" width="100" height="80" />
+        <dc:Bounds x="158" y="66" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_10b2mxq_di" bpmnElement="AAIUpdateModelServiceInstance">
-        <dc:Bounds x="390" y="66" width="100" height="80" />
+        <dc:Bounds x="489" y="66" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1heowq0_di" bpmnElement="CallActivity_sdncHandlerReq">
+        <dc:Bounds x="315" y="66" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1q3rjt4_di" bpmnElement="SequenceFlow_1q3rjt4">
+        <di:waypoint xsi:type="dc:Point" x="258" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="315" y="106" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="286.5" y="85" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ycnbyf_di" bpmnElement="SequenceFlow_0ycnbyf">
+        <di:waypoint xsi:type="dc:Point" x="415" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="489" y="106" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="452" y="85" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn2:definitions>
index fd247d2..28957c6 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.10.0">
+<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.8.2">
   <bpmn:process id="ChangeModelVfModuleBB" name="ChangeModelVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="ChangeModelVfModuleBB_Start">
       <bpmn:outgoing>SequenceFlow_0ieafii</bpmn:outgoing>
     </bpmn:endEvent>
     <bpmn:serviceTask id="ChangeModelVfModule" name="&#10;SDNC&#10;Change &#10;(vf model)&#10;" camunda:expression="${SDNCChangeAssignTasks.changeAssignModelVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0ieafii</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_14kvrbe</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0m403q5</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_14kvrbe" sourceRef="ChangeModelVfModule" targetRef="UpdateVfModuleModel" />
     <bpmn:serviceTask id="UpdateVfModuleModel" name="&#10;AAI&#10;Update&#10;(vf model)&#10;" camunda:expression="${AAIUpdateTasks.updateModelVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_14kvrbe</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0rpp4hi</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0xsp0pv</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0xsp0pv" sourceRef="UpdateVfModuleModel" targetRef="ChangeModelVfModuleBB_End" />
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC ChangeModel (vf module)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0m403q5</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0rpp4hi</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_0m403q5" sourceRef="ChangeModelVfModule" targetRef="CallActivity_sdncHandler" />
+    <bpmn:sequenceFlow id="SequenceFlow_0rpp4hi" sourceRef="CallActivity_sdncHandler" targetRef="UpdateVfModuleModel" />
   </bpmn:process>
   <bpmn:error id="Error_0q258vt" name="gDelegateError" errorCode="7000" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ieafii_di" bpmnElement="SequenceFlow_0ieafii">
         <di:waypoint xsi:type="dc:Point" x="209" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="297" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="259" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="208" y="99" width="90" height="12" />
+          <dc:Bounds x="189" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1v967li_di" bpmnElement="ChangeModelVfModuleBB_End">
-        <dc:Bounds x="636" y="102" width="36" height="36" />
+        <dc:Bounds x="693" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="645" y="142" width="19" height="12" />
+          <dc:Bounds x="667" y="142" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0hawa84_di" bpmnElement="ChangeModelVfModule">
-        <dc:Bounds x="297" y="80" width="100" height="80" />
+        <dc:Bounds x="259" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_14kvrbe_di" bpmnElement="SequenceFlow_14kvrbe">
-        <di:waypoint xsi:type="dc:Point" x="397" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="435" y="120" />
+      <bpmndi:BPMNShape id="ServiceTask_175e9ul_di" bpmnElement="UpdateVfModuleModel">
+        <dc:Bounds x="552" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0xsp0pv_di" bpmnElement="SequenceFlow_0xsp0pv">
+        <di:waypoint xsi:type="dc:Point" x="652" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="693" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="371" y="99" width="90" height="12" />
+          <dc:Bounds x="627.5" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_175e9ul_di" bpmnElement="UpdateVfModuleModel">
-        <dc:Bounds x="435" y="80" width="100" height="80" />
+      <bpmndi:BPMNShape id="CallActivity_1y6gpyq_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="403" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0xsp0pv_di" bpmnElement="SequenceFlow_0xsp0pv">
-        <di:waypoint xsi:type="dc:Point" x="535" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="636" y="120" />
+      <bpmndi:BPMNEdge id="SequenceFlow_0m403q5_di" bpmnElement="SequenceFlow_0m403q5">
+        <di:waypoint xsi:type="dc:Point" x="359" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="403" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="381" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0rpp4hi_di" bpmnElement="SequenceFlow_0rpp4hi">
+        <di:waypoint xsi:type="dc:Point" x="503" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="552" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="540.5" y="99" width="90" height="12" />
+          <dc:Bounds x="527.5" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index b320c12..59c35c3 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="ChangeModelVnfBB" name="ChangeModelVnfBB" isExecutable="true">
     <bpmn2:startEvent id="ChangeModelVnf_Start">
       <bpmn2:outgoing>SequenceFlow_18i4a05</bpmn2:outgoing>
@@ -8,14 +8,13 @@
       <bpmn2:incoming>SequenceFlow_0g502yj</bpmn2:incoming>
     </bpmn2:endEvent>
     <bpmn2:sequenceFlow id="SequenceFlow_18i4a05" sourceRef="ChangeModelVnf_Start" targetRef="SDNCChangeModel" />
-    <bpmn2:sequenceFlow id="SequenceFlow_19kfk17" sourceRef="SDNCChangeModel" targetRef="AAIUpdateModel" />
     <bpmn2:sequenceFlow id="SequenceFlow_0g502yj" sourceRef="AAIUpdateModel" targetRef="ChangeModelVnf_End" />
     <bpmn2:serviceTask id="SDNCChangeModel" name="&#10;SDNC&#10;Change &#10;(vnf model)&#10;" camunda:expression="${SDNCChangeAssignTasks.changeModelVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn2:incoming>SequenceFlow_18i4a05</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_19kfk17</bpmn2:outgoing>
+      <bpmn2:outgoing>SequenceFlow_17yjhsl</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:serviceTask id="AAIUpdateModel" name="&#10;AAI &#10;Update &#10;(vnf model)&#10;" camunda:expression="${AAIUpdateTasks.updateObjectVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn2:incoming>SequenceFlow_19kfk17</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_1h1zrcl</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0g502yj</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:subProcess id="SubProcess_1nibii6" name="Error Handling&#10;&#10;" triggeredByEvent="true">
       </bpmn2:endEvent>
       <bpmn2:sequenceFlow id="SequenceFlow_0s2743f" sourceRef="StartEvent_1fnfrm5" targetRef="EndEvent_124ugc0" />
     </bpmn2:subProcess>
+    <bpmn2:callActivity id="CallActivity_sdncHandlerCall" name="SDNC Change Model (vnf)" calledElement="SDNCHandler">
+      <bpmn2:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>SequenceFlow_17yjhsl</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_1h1zrcl</bpmn2:outgoing>
+    </bpmn2:callActivity>
+    <bpmn2:sequenceFlow id="SequenceFlow_17yjhsl" sourceRef="SDNCChangeModel" targetRef="CallActivity_sdncHandlerCall" />
+    <bpmn2:sequenceFlow id="SequenceFlow_1h1zrcl" sourceRef="CallActivity_sdncHandlerCall" targetRef="AAIUpdateModel" />
   </bpmn2:process>
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmn2:error id="Error_1" name="java.lang.Exception" errorCode="java.lang.Exception" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_18i4a05_di" bpmnElement="SequenceFlow_18i4a05">
         <di:waypoint xsi:type="dc:Point" x="111" y="106" />
-        <di:waypoint xsi:type="dc:Point" x="213" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="158" y="106" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="162" y="85" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_19kfk17_di" bpmnElement="SequenceFlow_19kfk17">
-        <di:waypoint xsi:type="dc:Point" x="313" y="106" />
-        <di:waypoint xsi:type="dc:Point" x="423" y="106" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="368" y="85" width="0" height="12" />
+          <dc:Bounds x="89.5" y="85" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0g502yj_di" bpmnElement="SequenceFlow_0g502yj">
-        <di:waypoint xsi:type="dc:Point" x="523" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="590" y="106" />
         <di:waypoint xsi:type="dc:Point" x="632" y="106" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="577.5" y="85" width="0" height="12" />
+          <dc:Bounds x="566" y="85" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_03km5f0_di" bpmnElement="SDNCChangeModel">
-        <dc:Bounds x="213" y="66" width="100" height="80" />
+        <dc:Bounds x="158" y="66" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_10b2mxq_di" bpmnElement="AAIUpdateModel">
-        <dc:Bounds x="423" y="66" width="100" height="80" />
+        <dc:Bounds x="490" y="66" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="SubProcess_1nibii6_di" bpmnElement="SubProcess_1nibii6" isExpanded="true">
         <dc:Bounds x="164" y="244" width="231" height="135" />
           <dc:Bounds x="287.5" y="297" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_17x4av7_di" bpmnElement="CallActivity_sdncHandlerCall">
+        <dc:Bounds x="322" y="66" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_17yjhsl_di" bpmnElement="SequenceFlow_17yjhsl">
+        <di:waypoint xsi:type="dc:Point" x="258" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="322" y="106" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="290" y="85" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1h1zrcl_di" bpmnElement="SequenceFlow_1h1zrcl">
+        <di:waypoint xsi:type="dc:Point" x="422" y="106" />
+        <di:waypoint xsi:type="dc:Point" x="490" y="106" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="456" y="85" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn2:definitions>
index 5c85d17..29a03c4 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="DeactivateNetworkBB" name="DeactivateNetworkBB" isExecutable="true">
     <bpmn2:startEvent id="DeactivateNetworkBB_Start" name="Start">
       <bpmn2:outgoing>SequenceFlow_05elmhj</bpmn2:outgoing>
@@ -9,15 +9,24 @@
     </bpmn2:endEvent>
     <bpmn2:serviceTask id="DeactivateNetworkSDNC" name="&#10;SDNC&#10;Deactivate Network &#10;" camunda:expression="${SDNCDeactivateTasks.deactivateNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn2:incoming>SequenceFlow_05elmhj</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0xbvwsu</bpmn2:outgoing>
+      <bpmn2:outgoing>SequenceFlow_0hfjdl4</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:serviceTask id="DeactivateNetworkAAI" name="&#10;AAI&#10;Update&#10;(network)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusCreatedNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn2:incoming>SequenceFlow_0xbvwsu</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_0cu0wy4</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_18atf08</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:sequenceFlow id="SequenceFlow_05elmhj" sourceRef="DeactivateNetworkBB_Start" targetRef="DeactivateNetworkSDNC" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0xbvwsu" sourceRef="DeactivateNetworkSDNC" targetRef="DeactivateNetworkAAI" />
     <bpmn2:sequenceFlow id="SequenceFlow_18atf08" sourceRef="DeactivateNetworkAAI" targetRef="DeactivateNetworkBB_End" />
+    <bpmn2:callActivity id="CallActivity_sdncHandler" name="SDNC Deactivate (network)" calledElement="SDNCHandler">
+      <bpmn2:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>SequenceFlow_0hfjdl4</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0cu0wy4</bpmn2:outgoing>
+    </bpmn2:callActivity>
+    <bpmn2:sequenceFlow id="SequenceFlow_0hfjdl4" sourceRef="DeactivateNetworkSDNC" targetRef="CallActivity_sdncHandler" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0cu0wy4" sourceRef="CallActivity_sdncHandler" targetRef="DeactivateNetworkAAI" />
   </bpmn2:process>
   <bpmn2:error id="Error_0pz4sdi" name="gDelegateError" errorCode="7000" />
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_10l9a3s_di" bpmnElement="DeactivateNetworkBB_End">
-        <dc:Bounds x="672" y="100" width="36" height="36" />
+        <dc:Bounds x="773" y="100" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="682" y="136" width="19" height="12" />
+          <dc:Bounds x="783" y="136" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1k7d8ih_di" bpmnElement="DeactivateNetworkSDNC">
-        <dc:Bounds x="350" y="78" width="100" height="80" />
+        <dc:Bounds x="326" y="78" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1911vum_di" bpmnElement="DeactivateNetworkAAI">
-        <dc:Bounds x="499" y="78" width="100" height="80" />
+        <dc:Bounds x="620" y="78" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_05elmhj_di" bpmnElement="SequenceFlow_05elmhj">
         <di:waypoint xsi:type="dc:Point" x="278" y="118" />
-        <di:waypoint xsi:type="dc:Point" x="350" y="118" />
+        <di:waypoint xsi:type="dc:Point" x="326" y="118" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="269" y="93" width="90" height="0" />
+          <dc:Bounds x="257" y="103" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0xbvwsu_di" bpmnElement="SequenceFlow_0xbvwsu">
-        <di:waypoint xsi:type="dc:Point" x="450" y="118" />
-        <di:waypoint xsi:type="dc:Point" x="475" y="118" />
-        <di:waypoint xsi:type="dc:Point" x="475" y="118" />
-        <di:waypoint xsi:type="dc:Point" x="499" y="118" />
+      <bpmndi:BPMNEdge id="SequenceFlow_18atf08_di" bpmnElement="SequenceFlow_18atf08">
+        <di:waypoint xsi:type="dc:Point" x="720" y="118" />
+        <di:waypoint xsi:type="dc:Point" x="773" y="118" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="445" y="118" width="90" height="0" />
+          <dc:Bounds x="701.5" y="103" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_18atf08_di" bpmnElement="SequenceFlow_18atf08">
-        <di:waypoint xsi:type="dc:Point" x="599" y="118" />
-        <di:waypoint xsi:type="dc:Point" x="636" y="118" />
-        <di:waypoint xsi:type="dc:Point" x="636" y="118" />
-        <di:waypoint xsi:type="dc:Point" x="672" y="118" />
+      <bpmndi:BPMNShape id="CallActivity_0q2nryd_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="465" y="78" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0hfjdl4_di" bpmnElement="SequenceFlow_0hfjdl4">
+        <di:waypoint xsi:type="dc:Point" x="426" y="118" />
+        <di:waypoint xsi:type="dc:Point" x="465" y="118" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="445.5" y="97" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0cu0wy4_di" bpmnElement="SequenceFlow_0cu0wy4">
+        <di:waypoint xsi:type="dc:Point" x="565" y="118" />
+        <di:waypoint xsi:type="dc:Point" x="620" y="118" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="606" y="118" width="90" height="0" />
+          <dc:Bounds x="592.5" y="97" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index 5284788..4151787 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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0">
+<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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2">
   <bpmn:process id="DeactivateServiceInstanceBB" name="DeactivateServiceInstanceBB" isExecutable="true">
     <bpmn:startEvent id="Start_DeactivateServiceInstanceBB" name="Start">
       <bpmn:outgoing>SequenceFlow_101w1ck</bpmn:outgoing>
@@ -7,17 +7,26 @@
     <bpmn:endEvent id="End_DeactivateServiceInstanceBB" name="end">
       <bpmn:incoming>SequenceFlow_0pioehv</bpmn:incoming>
     </bpmn:endEvent>
-    <bpmn:sequenceFlow id="SequenceFlow_00q7fsg" sourceRef="Task_DeactivateServiceInstance_SDNC" targetRef="Task_DeactivateServiceInstance_AAI" />
     <bpmn:sequenceFlow id="SequenceFlow_0pioehv" sourceRef="Task_DeactivateServiceInstance_AAI" targetRef="End_DeactivateServiceInstanceBB" />
     <bpmn:serviceTask id="Task_DeactivateServiceInstance_AAI" name="&#10;AAI&#10;Update&#10;(svc instance)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusAssignedService(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_00q7fsg</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1ck1p4o</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0pioehv</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="Task_DeactivateServiceInstance_SDNC" name="&#10;SDNC &#10;Deactivate&#10;(svc instance)&#10;" camunda:expression="${SDNCDeactivateTasks.deactivateServiceInstance(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_101w1ck</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_00q7fsg</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1j9qa4p</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_101w1ck" sourceRef="Start_DeactivateServiceInstanceBB" targetRef="Task_DeactivateServiceInstance_SDNC" />
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC Deactivate (svc instance)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1j9qa4p</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1ck1p4o</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_1ck1p4o" sourceRef="CallActivity_sdncHandler" targetRef="Task_DeactivateServiceInstance_AAI" />
+    <bpmn:sequenceFlow id="SequenceFlow_1j9qa4p" sourceRef="Task_DeactivateServiceInstance_SDNC" targetRef="CallActivity_sdncHandler" />
   </bpmn:process>
   <bpmn:error id="Error_05rnr6a" name="gDelegateError" errorCode="7000" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1qdtskz_di" bpmnElement="End_DeactivateServiceInstanceBB">
-        <dc:Bounds x="416" y="102" width="36" height="36" />
+        <dc:Bounds x="541" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="425" y="142" width="18" height="12" />
+          <dc:Bounds x="550" y="142" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_00q7fsg_di" bpmnElement="SequenceFlow_00q7fsg">
-        <di:waypoint xsi:type="dc:Point" x="216" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="262" y="120" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="239" y="105" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0pioehv_di" bpmnElement="SequenceFlow_0pioehv">
-        <di:waypoint xsi:type="dc:Point" x="362" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="416" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="520" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="541" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="389" y="99" width="0" height="0" />
+          <dc:Bounds x="485.5" y="105" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1d9vh4e_di" bpmnElement="Task_DeactivateServiceInstance_AAI">
-        <dc:Bounds x="262" y="80" width="100" height="80" />
+        <dc:Bounds x="420" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_04l854m_di" bpmnElement="Task_DeactivateServiceInstance_SDNC">
         <dc:Bounds x="116" y="80" width="100" height="80" />
           <dc:Bounds x="87.5" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_0fm7piq_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="265" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ck1p4o_di" bpmnElement="SequenceFlow_1ck1p4o">
+        <di:waypoint xsi:type="dc:Point" x="365" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="420" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="392.5" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1j9qa4p_di" bpmnElement="SequenceFlow_1j9qa4p">
+        <di:waypoint xsi:type="dc:Point" x="216" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="265" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="240.5" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index f30a1f1..37fd2db 100644 (file)
@@ -1,23 +1,32 @@
 <?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.10.0">
+<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.8.2">
   <bpmn:process id="DeactivateVfModuleBB" name="DeactivateVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="DeactivateVfModuleBB_Start" name="Start">
       <bpmn:outgoing>SequenceFlow_0m379r2</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:serviceTask id="DeactivateVfModule" name="&#10;SDNC &#10;Deactivate&#10;(vf module)&#10;" camunda:expression="${SDNCDeactivateTasks.deactivateVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0m379r2</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_01bdpek</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_15ep3y7</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0m379r2" sourceRef="DeactivateVfModuleBB_Start" targetRef="DeactivateVfModule" />
     <bpmn:serviceTask id="UpdateVfModuleDeactivateStatus" name="&#10;AAI &#10;Update&#10;(vf module)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusDeactivateVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_01bdpek</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1gx4xce</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1y1c7fh</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_01bdpek" sourceRef="DeactivateVfModule" targetRef="UpdateVfModuleDeactivateStatus" />
     <bpmn:endEvent id="DeactivateVfModuleBB_End" name="End">
       <bpmn:incoming>SequenceFlow_1y1c7fh</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_1y1c7fh" sourceRef="UpdateVfModuleDeactivateStatus" targetRef="DeactivateVfModuleBB_End" />
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC Deactivate (vf module)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_15ep3y7</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1gx4xce</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_15ep3y7" sourceRef="DeactivateVfModule" targetRef="CallActivity_sdncHandler" />
+    <bpmn:sequenceFlow id="SequenceFlow_1gx4xce" sourceRef="CallActivity_sdncHandler" targetRef="UpdateVfModuleDeactivateStatus" />
   </bpmn:process>
   <bpmn:error id="Error_0qg4xhp" name="gDelegateError" errorCode="7000" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0rz90rp_di" bpmnElement="DeactivateVfModule">
-        <dc:Bounds x="275" y="80" width="100" height="80" />
+        <dc:Bounds x="261" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0m379r2_di" bpmnElement="SequenceFlow_0m379r2">
         <di:waypoint xsi:type="dc:Point" x="209" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="275" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="261" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="242" y="99" width="0" height="12" />
+          <dc:Bounds x="190" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0lyevan_di" bpmnElement="UpdateVfModuleDeactivateStatus">
-        <dc:Bounds x="432" y="80" width="100" height="80" />
+        <dc:Bounds x="550" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_01bdpek_di" bpmnElement="SequenceFlow_01bdpek">
-        <di:waypoint xsi:type="dc:Point" x="375" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="401" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="401" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="432" y="120" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="416" y="114" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1h4ik86_di" bpmnElement="DeactivateVfModuleBB_End">
-        <dc:Bounds x="589" y="102" width="36" height="36" />
+        <dc:Bounds x="686" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="598" y="142" width="19" height="12" />
+          <dc:Bounds x="695" y="142" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1y1c7fh_di" bpmnElement="SequenceFlow_1y1c7fh">
-        <di:waypoint xsi:type="dc:Point" x="532" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="557" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="557" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="589" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="650" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="686" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="623" y="99" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_0pp1hlz_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="401" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_15ep3y7_di" bpmnElement="SequenceFlow_15ep3y7">
+        <di:waypoint xsi:type="dc:Point" x="361" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="401" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="381" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1gx4xce_di" bpmnElement="SequenceFlow_1gx4xce">
+        <di:waypoint xsi:type="dc:Point" x="501" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="550" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="572" y="114" width="0" height="12" />
+          <dc:Bounds x="525.5" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index 790cab1..c627789 100644 (file)
@@ -1,23 +1,32 @@
 <?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.10.0">
+<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.8.2">
   <bpmn:process id="DeactivateVnfBB" name="DeactivateVnfBB" isExecutable="true">
     <bpmn:startEvent id="Start_DeactivateVnfBB" name="start">
       <bpmn:outgoing>SequenceFlow_0k9qnoi</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:sequenceFlow id="SequenceFlow_0k9qnoi" sourceRef="Start_DeactivateVnfBB" targetRef="Task_SDNCAdapterVnfTopologyDeactivate" />
-    <bpmn:sequenceFlow id="SequenceFlow_0r6pzwt" sourceRef="Task_SDNCAdapterVnfTopologyDeactivate" targetRef="Task_DeactivateOrchestrationStatusVnf" />
     <bpmn:endEvent id="End_DeactivateVnfBB" name="end">
       <bpmn:incoming>SequenceFlow_0vnitwg</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_0vnitwg" sourceRef="Task_DeactivateOrchestrationStatusVnf" targetRef="End_DeactivateVnfBB" />
     <bpmn:serviceTask id="Task_SDNCAdapterVnfTopologyDeactivate" name="&#10;SDNC Deactivate&#10;(vnf)&#10;" camunda:expression="${SDNCDeactivateTasks.deactivateVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0k9qnoi</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_0r6pzwt</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_000o6c2</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="Task_DeactivateOrchestrationStatusVnf" name="&#10;AAI &#10;Update&#10;(vnf)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusAssignedVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_0r6pzwt</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1ageldf</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0vnitwg</bpmn:outgoing>
     </bpmn:serviceTask>
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC Deactivate (vnf)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_000o6c2</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1ageldf</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_000o6c2" sourceRef="Task_SDNCAdapterVnfTopologyDeactivate" targetRef="CallActivity_sdncHandler" />
+    <bpmn:sequenceFlow id="SequenceFlow_1ageldf" sourceRef="CallActivity_sdncHandler" targetRef="Task_DeactivateOrchestrationStatusVnf" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DeactivateVnfBB">
           <dc:Bounds x="236" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0r6pzwt_di" bpmnElement="SequenceFlow_0r6pzwt">
-        <di:waypoint xsi:type="dc:Point" x="363" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="422" y="120" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="392.5" y="99" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1ad7eym_di" bpmnElement="End_DeactivateVnfBB">
-        <dc:Bounds x="572" y="102" width="36" height="36" />
+        <dc:Bounds x="753" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="580" y="142" width="20" height="12" />
+          <dc:Bounds x="762" y="142" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0vnitwg_di" bpmnElement="SequenceFlow_0vnitwg">
-        <di:waypoint xsi:type="dc:Point" x="522" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="572" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="708" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="753" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="547" y="99" width="0" height="12" />
+          <dc:Bounds x="685.5" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1k98q3r_di" bpmnElement="Task_SDNCAdapterVnfTopologyDeactivate">
         <dc:Bounds x="263" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1vg25fs_di" bpmnElement="Task_DeactivateOrchestrationStatusVnf">
-        <dc:Bounds x="422" y="80" width="100" height="80" />
+        <dc:Bounds x="608" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1t6shsw_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="431" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_000o6c2_di" bpmnElement="SequenceFlow_000o6c2">
+        <di:waypoint xsi:type="dc:Point" x="363" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="431" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="397" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ageldf_di" bpmnElement="SequenceFlow_1ageldf">
+        <di:waypoint xsi:type="dc:Point" x="531" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="608" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="569.5" y="99" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index bb7abf7..5cf41b6 100644 (file)
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_1537yw5" sourceRef="DeleteVfModuleBB_Start" targetRef="DeleteVfModuleVnfAdapter" />
     <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_02lpx87</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1mxrfqv</bpmn:outgoing>
+      <bpmn:incoming>SequenceFlow_01vfwtp</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_09l7pcg</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_08tvhtf" sourceRef="DeleteVfModuleVnfAdapter" targetRef="VnfAdapter" />
     <bpmn:endEvent id="DeleteVfModuleBB_End">
-      <bpmn:incoming>SequenceFlow_1mxrfqv</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_09l7pcg</bpmn:incoming>
     </bpmn:endEvent>
-    <bpmn:sequenceFlow id="SequenceFlow_1mxrfqv" sourceRef="UpdateVfModuleDeleteStatus" targetRef="DeleteVfModuleBB_End" />
     <bpmn:callActivity id="VnfAdapter" name="Vnf Adapter" calledElement="VnfAdapter">
       <bpmn:extensionElements>
         <camunda:in source="gBuildingBlockExecution" target="gBuildingBlockExecution" />
@@ -29,7 +28,7 @@
       <bpmn:incoming>SequenceFlow_08tvhtf</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_02lpx87</bpmn:outgoing>
     </bpmn:callActivity>
-    <bpmn:sequenceFlow id="SequenceFlow_02lpx87" sourceRef="VnfAdapter" targetRef="UpdateVfModuleDeleteStatus" />
+    <bpmn:sequenceFlow id="SequenceFlow_02lpx87" sourceRef="VnfAdapter" targetRef="UpdateVfModuleHeatStackId" />
     <bpmn:subProcess id="SubProcess_11p7mrh" name="Error Handling&#10;&#10;" triggeredByEvent="true">
       <bpmn:startEvent id="StartEvent_1xp6ewt">
         <bpmn:outgoing>SequenceFlow_0h607z0</bpmn:outgoing>
       </bpmn:endEvent>
       <bpmn:sequenceFlow id="SequenceFlow_0h607z0" sourceRef="StartEvent_1xp6ewt" targetRef="EndEvent_0guhjau" />
     </bpmn:subProcess>
+    <bpmn:serviceTask id="UpdateVfModuleHeatStackId" name="&#10;AAI&#10;Update&#10; (vf module)&#10;" camunda:expression="${AAIUpdateTasks.updateHeatStackIdVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_02lpx87</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_01vfwtp</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_01vfwtp" sourceRef="UpdateVfModuleHeatStackId" targetRef="UpdateVfModuleDeleteStatus" />
+    <bpmn:sequenceFlow id="SequenceFlow_09l7pcg" sourceRef="UpdateVfModuleDeleteStatus" targetRef="DeleteVfModuleBB_End" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DeleteVfModuleBB">
@@ -61,7 +66,7 @@
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0pbhsub_di" bpmnElement="UpdateVfModuleDeleteStatus">
-        <dc:Bounds x="593" y="80" width="100" height="80" />
+        <dc:Bounds x="762" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_08tvhtf_di" bpmnElement="SequenceFlow_08tvhtf">
         <di:waypoint xsi:type="dc:Point" x="361" y="120" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1rn6yvh_di" bpmnElement="DeleteVfModuleBB_End">
-        <dc:Bounds x="746" y="102" width="36" height="36" />
+        <dc:Bounds x="922" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="754" y="142" width="19" height="12" />
+          <dc:Bounds x="940" y="142" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1mxrfqv_di" bpmnElement="SequenceFlow_1mxrfqv">
-        <di:waypoint xsi:type="dc:Point" x="693" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="746" y="120" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="674.5" y="99" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_0whogn3_di" bpmnElement="VnfAdapter">
         <dc:Bounds x="427" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_02lpx87_di" bpmnElement="SequenceFlow_02lpx87">
         <di:waypoint xsi:type="dc:Point" x="527" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="593" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="604" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="560" y="99" width="0" height="12" />
+          <dc:Bounds x="566" y="105" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_11p7mrh_di" bpmnElement="SubProcess_11p7mrh" isExpanded="true">
           <dc:Bounds x="386.5" y="335" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0vlgqod_di" bpmnElement="UpdateVfModuleHeatStackId">
+        <dc:Bounds x="604" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_01vfwtp_di" bpmnElement="SequenceFlow_01vfwtp">
+        <di:waypoint xsi:type="dc:Point" x="704" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="762" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="733" y="95" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_09l7pcg_di" bpmnElement="SequenceFlow_09l7pcg">
+        <di:waypoint xsi:type="dc:Point" x="862" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="922" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="892" y="95" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index f2bd224..746d1f2 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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0">
+<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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.4.0">
   <bpmn:process id="DeleteVolumeGroupBB" name="DeleteVolumeGroupBB" isExecutable="true">
     <bpmn:startEvent id="DeleteVolumeGroupBB_Start" name="Start">
       <bpmn:outgoing>SequenceFlow_1wz1rfg</bpmn:outgoing>
@@ -9,7 +9,7 @@
       <bpmn:incoming>SequenceFlow_0mh0v9h</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:serviceTask id="UpdateVolumeGroupAAI" name="&#10;AAI&#10;Update&#10;(volume grp)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusAssignedVolumeGroup(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_0fkan8t</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0hml0t6</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0mh0v9h</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0mh0v9h" sourceRef="UpdateVolumeGroupAAI" targetRef="DeleteVolumeGroupBB_End" />
@@ -18,7 +18,7 @@
       <bpmn:incoming>SequenceFlow_1wz1rfg</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_13ngwev</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_0fkan8t" sourceRef="VnfAdapter" targetRef="UpdateVolumeGroupAAI" />
+    <bpmn:sequenceFlow id="SequenceFlow_0fkan8t" sourceRef="VnfAdapter" targetRef="UpdateVolumeGroupHeatStackId" />
     <bpmn:callActivity id="VnfAdapter" name="Vnf Adapter" calledElement="VnfAdapter">
       <bpmn:extensionElements>
         <camunda:in source="gBuildingBlockExecution" target="gBuildingBlockExecution" />
       </bpmn:startEvent>
       <bpmn:sequenceFlow id="SequenceFlow_07rsz9o" sourceRef="StartEvent_1gun94q" targetRef="EndEvent_18lpeyi" />
     </bpmn:subProcess>
+    <bpmn:sequenceFlow id="SequenceFlow_0hml0t6" sourceRef="UpdateVolumeGroupHeatStackId" targetRef="UpdateVolumeGroupAAI" />
+    <bpmn:serviceTask id="UpdateVolumeGroupHeatStackId" name="&#10;AAI&#10;Update&#10;(volume grp)&#10;" camunda:expression="${AAIUpdateTasks.updateHeatStackIdVolumeGroup(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_0fkan8t</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0hml0t6</bpmn:outgoing>
+    </bpmn:serviceTask>
   </bpmn:process>
   <bpmn:error id="Error_0pz4sdi" name="gDelegateError" errorCode="7000" />
   <bpmn:escalation id="Escalation_1hjulni" name="Escalation_2cgup2p" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1k6463v_di" bpmnElement="DeleteVolumeGroupBB_End">
-        <dc:Bounds x="824" y="102" width="36" height="36" />
+        <dc:Bounds x="978" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="842" y="142" width="0" height="0" />
+          <dc:Bounds x="996" y="142" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0rytcj0_di" bpmnElement="UpdateVolumeGroupAAI">
-        <dc:Bounds x="665" y="80" width="100" height="80" />
+        <dc:Bounds x="822" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0mh0v9h_di" bpmnElement="SequenceFlow_0mh0v9h">
-        <di:waypoint xsi:type="dc:Point" x="765" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="824" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="922" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="978" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="795" y="99" width="0" height="0" />
+          <dc:Bounds x="950" y="105" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_13ngwev_di" bpmnElement="SequenceFlow_13ngwev">
@@ -89,9 +94,9 @@
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0fkan8t_di" bpmnElement="SequenceFlow_0fkan8t">
         <di:waypoint xsi:type="dc:Point" x="626" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="665" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="678" y="120" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="646" y="105" width="0" height="0" />
+          <dc:Bounds x="652" y="105" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_0li7q97_di" bpmnElement="VnfAdapter">
           <dc:Bounds x="543" y="305" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0hml0t6_di" bpmnElement="SequenceFlow_0hml0t6">
+        <di:waypoint xsi:type="dc:Point" x="778" y="120" />
+        <di:waypoint xsi:type="dc:Point" x="822" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="800" y="105" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_1eatpiw_di" bpmnElement="UpdateVolumeGroupHeatStackId">
+        <dc:Bounds x="678" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index d123153..0be7c55 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.10.0">
+<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.8.2">
   <bpmn:process id="SDNCHandler" name="SDNC" isExecutable="true">
     <bpmn:startEvent id="SDNC_Start">
       <bpmn:outgoing>SequenceFlow_1n0j3hz</bpmn:outgoing>
       <bpmn:incoming>SequenceFlow_0flbj8a</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_07vnhri</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:boundaryEvent id="BoundaryEvent_1lv4854" attachedToRef="Call_SDNC">
-      <bpmn:outgoing>SequenceFlow_0valp88</bpmn:outgoing>
-      <bpmn:errorEventDefinition camunda:errorCodeVariable="SDNCSyncError" />
-    </bpmn:boundaryEvent>
-    <bpmn:sequenceFlow id="SequenceFlow_0valp88" sourceRef="BoundaryEvent_1lv4854" targetRef="Task_1o29lpk" />
     <bpmn:subProcess id="SubProcess_0y8yozw" name="Wait for Callback" camunda:asyncAfter="true" camunda:exclusive="false">
       <bpmn:incoming>SequenceFlow_0rh24pq</bpmn:incoming>
       <bpmn:incoming>SequenceFlow_0yve6l6</bpmn:incoming>
@@ -76,9 +71,6 @@
     <bpmn:serviceTask id="Task_1un0flc" name="Handle Timeout" camunda:expression="${SDNCRequestTasks.handleTimeOutException(execution)}">
       <bpmn:incoming>SequenceFlow_1yifu46</bpmn:incoming>
     </bpmn:serviceTask>
-    <bpmn:serviceTask id="Task_1o29lpk" name="Handle Error" camunda:expression="${SDNCRequestTasks.handleSyncError(execution)}">
-      <bpmn:incoming>SequenceFlow_0valp88</bpmn:incoming>
-    </bpmn:serviceTask>
   </bpmn:process>
   <bpmn:message id="Message_06oc4iz" name="SDNCCallbackMessage" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
       <bpmndi:BPMNShape id="ServiceTask_1i5x1m6_di" bpmnElement="Call_SDNC">
         <dc:Bounds x="15" y="112" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="BoundaryEvent_1wxlsn8_di" bpmnElement="BoundaryEvent_1lv4854">
-        <dc:Bounds x="97" y="174" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="452" y="520" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0valp88_di" bpmnElement="SequenceFlow_0valp88">
-        <di:waypoint xsi:type="dc:Point" x="115" y="210" />
-        <di:waypoint xsi:type="dc:Point" x="115" y="278" />
-        <di:waypoint xsi:type="dc:Point" x="115" y="278" />
-        <di:waypoint xsi:type="dc:Point" x="115" y="312" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="85" y="271.5" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_0y8yozw_di" bpmnElement="SubProcess_0y8yozw" isExpanded="true">
         <dc:Bounds x="278" y="-144" width="340" height="153" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_08b89dm_di" bpmnElement="Task_1un0flc">
         <dc:Bounds x="748" y="-185" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ServiceTask_1cyot3r_di" bpmnElement="Task_1o29lpk">
-        <dc:Bounds x="65" y="312" width="100" height="80" />
-      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index fdae49f..8e4c850 100644 (file)
@@ -1,21 +1,20 @@
 <?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.10.0">
+<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.8.2">
   <bpmn:process id="UnassignNetworkBB" name="UnassignNetworkBB" isExecutable="true">
     <bpmn:startEvent id="Start_UnassignNetworkBB" name="start">
       <bpmn:outgoing>SequenceFlow_0zaz9o2</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:serviceTask id="Task_SNDCUnAssign" name="&#10;SDNC&#10;Unassign&#10;(network)&#10;" camunda:expression="${SDNCUnassignTasks.unassignNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0le4vrj</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1ks8kmt</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1woj6rc</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:endEvent id="End_UnassignNetworkBB" name="end">
       <bpmn:incoming>SequenceFlow_0csh9dc</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_0zaz9o2" sourceRef="Start_UnassignNetworkBB" targetRef="Task_VfModuleRelatioship" />
-    <bpmn:sequenceFlow id="SequenceFlow_1ks8kmt" sourceRef="Task_SNDCUnAssign" targetRef="Task_DeleteNetwork" />
     <bpmn:sequenceFlow id="SequenceFlow_0csh9dc" sourceRef="Task_DeleteNetwork" targetRef="End_UnassignNetworkBB" />
     <bpmn:serviceTask id="Task_DeleteNetwork" name="&#10;AAI&#10;Delete&#10;(network)&#10;" camunda:expression="${AAIDeleteTasks.deleteNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_1ks8kmt</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_15oc7ot</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0csh9dc</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="Task_VfModuleRelatioship" name="Veriyf &#39;vf-module&#39; relationship exists" camunda:expression="${UnassignNetworkBB.checkRelationshipRelatedTo(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)), &#34;vf-module&#34;)}">
       <bpmn:incoming>SequenceFlow_0mxe1a7</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0le4vrj</bpmn:outgoing>
     </bpmn:serviceTask>
+    <bpmn:callActivity id="CallActivity_sdncHandlerCall" name="SDNC Unassign (network)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1woj6rc</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_15oc7ot</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_1woj6rc" sourceRef="Task_SNDCUnAssign" targetRef="CallActivity_sdncHandlerCall" />
+    <bpmn:sequenceFlow id="SequenceFlow_15oc7ot" sourceRef="CallActivity_sdncHandlerCall" targetRef="Task_DeleteNetwork" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="UnassignNetworkBB">
@@ -41,9 +50,9 @@
         <dc:Bounds x="665" y="97" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1h93h9d_di" bpmnElement="End_UnassignNetworkBB">
-        <dc:Bounds x="946" y="119" width="36" height="36" />
+        <dc:Bounds x="1084" y="119" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="955" y="159" width="18" height="12" />
+          <dc:Bounds x="1093" y="159" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0zaz9o2_di" bpmnElement="SequenceFlow_0zaz9o2">
           <dc:Bounds x="295" y="122" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1ks8kmt_di" bpmnElement="SequenceFlow_1ks8kmt">
-        <di:waypoint xsi:type="dc:Point" x="765" y="137" />
-        <di:waypoint xsi:type="dc:Point" x="804" y="137" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="785" y="122" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0csh9dc_di" bpmnElement="SequenceFlow_0csh9dc">
-        <di:waypoint xsi:type="dc:Point" x="904" y="137" />
-        <di:waypoint xsi:type="dc:Point" x="946" y="137" />
+        <di:waypoint xsi:type="dc:Point" x="1054" y="137" />
+        <di:waypoint xsi:type="dc:Point" x="1084" y="137" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="925" y="122" width="0" height="0" />
+          <dc:Bounds x="1024" y="122" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0s6d1be_di" bpmnElement="Task_DeleteNetwork">
-        <dc:Bounds x="804" y="97" width="100" height="80" />
+        <dc:Bounds x="954" y="97" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_194x6el_di" bpmnElement="Task_VfModuleRelatioship">
         <dc:Bounds x="375" y="97" width="100" height="80" />
       <bpmndi:BPMNShape id="ServiceTask_1ev9w69_di" bpmnElement="Task_GetCloudRegionVersion">
         <dc:Bounds x="524" y="97" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_172bbje_di" bpmnElement="CallActivity_sdncHandlerCall">
+        <dc:Bounds x="813" y="97" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1woj6rc_di" bpmnElement="SequenceFlow_1woj6rc">
+        <di:waypoint xsi:type="dc:Point" x="765" y="137" />
+        <di:waypoint xsi:type="dc:Point" x="787" y="137" />
+        <di:waypoint xsi:type="dc:Point" x="787" y="137" />
+        <di:waypoint xsi:type="dc:Point" x="813" y="137" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="802" y="131" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_15oc7ot_di" bpmnElement="SequenceFlow_15oc7ot">
+        <di:waypoint xsi:type="dc:Point" x="913" y="137" />
+        <di:waypoint xsi:type="dc:Point" x="954" y="137" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="933.5" y="116" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index f077c78..08f1746 100644 (file)
@@ -1,23 +1,32 @@
 <?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.10.0">
+<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.8.2">
   <bpmn:process id="UnassignServiceInstanceBB" name="UnassignServiceInstanceBB" isExecutable="true">
     <bpmn:startEvent id="Start_UnassignServiceInstanceBB">
       <bpmn:outgoing>SequenceFlow_0fzrhkc</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:serviceTask id="Task_AAIDeleteServiceInstance" name="&#10;AAI&#10;Delete &#10;(svc instance)&#10;" camunda:expression="${AAIDeleteTasks.deleteServiceInstance(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_0pu9j6i</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0uzdp0c</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0sfeg65</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0sfeg65" sourceRef="Task_AAIDeleteServiceInstance" targetRef="End_UnassignServiceInstanceBB" />
     <bpmn:serviceTask id="Task_SdncUnassignServiceInstance" name="&#10;SDNC&#10;Unassign&#10;(svc instance)&#10;" camunda:expression="${SDNCUnassignTasks.unassignServiceInstance(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_0fzrhkc</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_0pu9j6i</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_00dyi16</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_0pu9j6i" sourceRef="Task_SdncUnassignServiceInstance" targetRef="Task_AAIDeleteServiceInstance" />
     <bpmn:endEvent id="End_UnassignServiceInstanceBB">
       <bpmn:incoming>SequenceFlow_0sfeg65</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_0fzrhkc" sourceRef="Start_UnassignServiceInstanceBB" targetRef="Task_SdncUnassignServiceInstance" />
+    <bpmn:callActivity id="CallActivity_sdncHandlerCall" name="SDNC Unassign (svc instance)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_00dyi16</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0uzdp0c</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_00dyi16" sourceRef="Task_SdncUnassignServiceInstance" targetRef="CallActivity_sdncHandlerCall" />
+    <bpmn:sequenceFlow id="SequenceFlow_0uzdp0c" sourceRef="CallActivity_sdncHandlerCall" targetRef="Task_AAIDeleteServiceInstance" />
   </bpmn:process>
   <bpmn:error id="Error_041z84w" name="gDelegateError" errorCode="7000" />
   <bpmn:error id="Error_027m7l6" name="Failed orchestration status verification" errorCode="7000" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0ltb3dj_di" bpmnElement="Task_AAIDeleteServiceInstance">
-        <dc:Bounds x="708" y="191" width="100" height="80" />
+        <dc:Bounds x="819" y="191" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0sfeg65_di" bpmnElement="SequenceFlow_0sfeg65">
-        <di:waypoint xsi:type="dc:Point" x="808" y="231" />
-        <di:waypoint xsi:type="dc:Point" x="871" y="231" />
+        <di:waypoint xsi:type="dc:Point" x="919" y="231" />
+        <di:waypoint xsi:type="dc:Point" x="961" y="231" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="794.5" y="210" width="90" height="12" />
+          <dc:Bounds x="895" y="210" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_11klnmn_di" bpmnElement="Task_SdncUnassignServiceInstance">
-        <dc:Bounds x="563" y="191" width="100" height="80" />
+        <dc:Bounds x="510" y="191" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0pu9j6i_di" bpmnElement="SequenceFlow_0pu9j6i">
-        <di:waypoint xsi:type="dc:Point" x="663" y="231" />
-        <di:waypoint xsi:type="dc:Point" x="708" y="231" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="640.5" y="210" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1p34ka9_di" bpmnElement="End_UnassignServiceInstanceBB">
-        <dc:Bounds x="871" y="213" width="36" height="36" />
+        <dc:Bounds x="961" y="213" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="883" y="255" width="18" height="12" />
+          <dc:Bounds x="937" y="255" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0fzrhkc_di" bpmnElement="SequenceFlow_0fzrhkc">
         <di:waypoint xsi:type="dc:Point" x="480" y="231" />
-        <di:waypoint xsi:type="dc:Point" x="563" y="231" />
+        <di:waypoint xsi:type="dc:Point" x="510" y="231" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="450" y="210" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_0q2i7pr_di" bpmnElement="CallActivity_sdncHandlerCall">
+        <dc:Bounds x="668" y="191" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_00dyi16_di" bpmnElement="SequenceFlow_00dyi16">
+        <di:waypoint xsi:type="dc:Point" x="610" y="231" />
+        <di:waypoint xsi:type="dc:Point" x="668" y="231" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="639" y="210" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0uzdp0c_di" bpmnElement="SequenceFlow_0uzdp0c">
+        <di:waypoint xsi:type="dc:Point" x="768" y="231" />
+        <di:waypoint xsi:type="dc:Point" x="819" y="231" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="476.5" y="210" width="90" height="12" />
+          <dc:Bounds x="793.5" y="210" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index 0f31381..dd00078 100644 (file)
@@ -1,23 +1,32 @@
 <?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.10.0">
+<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.8.2">
   <bpmn:process id="UnassignVfModuleBB" name="UnassignVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="UnassignVfModuleBB_Start">
       <bpmn:outgoing>SequenceFlow_1kfxl04</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:serviceTask id="DeleteVfModule" name="&#10;AAI &#10;Delete&#10;(vf module)&#10;" camunda:expression="${AAIDeleteTasks.deleteVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_1p2r4og</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0py9tf7</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0qa6sxx</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="UnassignVfModule" name="&#10;SDNC Unassign&#10;(vf module)&#10;" camunda:expression="${SDNCUnassignTasks.unassignVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_1kfxl04</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1p2r4og</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_152ntu2</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:endEvent id="UnassignVfModuleBB_End">
       <bpmn:incoming>SequenceFlow_0qa6sxx</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_1kfxl04" sourceRef="UnassignVfModuleBB_Start" targetRef="UnassignVfModule" />
-    <bpmn:sequenceFlow id="SequenceFlow_1p2r4og" sourceRef="UnassignVfModule" targetRef="DeleteVfModule" />
     <bpmn:sequenceFlow id="SequenceFlow_0qa6sxx" sourceRef="DeleteVfModule" targetRef="UnassignVfModuleBB_End" />
+    <bpmn:callActivity id="CallActivity_sdncHandler" name="SDNC Unassign (vf module)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_152ntu2</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0py9tf7</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_152ntu2" sourceRef="UnassignVfModule" targetRef="CallActivity_sdncHandler" />
+    <bpmn:sequenceFlow id="SequenceFlow_0py9tf7" sourceRef="CallActivity_sdncHandler" targetRef="DeleteVfModule" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="UnassignVfModuleBB">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0028k7a_di" bpmnElement="DeleteVfModule">
-        <dc:Bounds x="537" y="-25" width="100" height="80" />
+        <dc:Bounds x="614" y="-25" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_13t22km_di" bpmnElement="UnassignVfModule">
-        <dc:Bounds x="387" y="-25" width="100" height="80" />
+        <dc:Bounds x="298" y="-25" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_0qdq7wj_di" bpmnElement="UnassignVfModuleBB_End">
         <dc:Bounds x="782" y="-3" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1kfxl04_di" bpmnElement="SequenceFlow_1kfxl04">
         <di:waypoint xsi:type="dc:Point" x="249" y="15" />
-        <di:waypoint xsi:type="dc:Point" x="387" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="298" y="15" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="273" y="0" width="90" height="0" />
+          <dc:Bounds x="228.5" y="0" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1p2r4og_di" bpmnElement="SequenceFlow_1p2r4og">
-        <di:waypoint xsi:type="dc:Point" x="487" y="15" />
-        <di:waypoint xsi:type="dc:Point" x="537" y="15" />
+      <bpmndi:BPMNEdge id="SequenceFlow_0qa6sxx_di" bpmnElement="SequenceFlow_0qa6sxx">
+        <di:waypoint xsi:type="dc:Point" x="714" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="782" y="15" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="467" y="0" width="90" height="0" />
+          <dc:Bounds x="703" y="0" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0qa6sxx_di" bpmnElement="SequenceFlow_0qa6sxx">
-        <di:waypoint xsi:type="dc:Point" x="637" y="15" />
-        <di:waypoint xsi:type="dc:Point" x="782" y="15" />
+      <bpmndi:BPMNShape id="CallActivity_1x5hvzz_di" bpmnElement="CallActivity_sdncHandler">
+        <dc:Bounds x="449" y="-25" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_152ntu2_di" bpmnElement="SequenceFlow_152ntu2">
+        <di:waypoint xsi:type="dc:Point" x="398" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="449" y="15" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="423.5" y="-6" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0py9tf7_di" bpmnElement="SequenceFlow_0py9tf7">
+        <di:waypoint xsi:type="dc:Point" x="549" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="614" y="15" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="664.5" y="0" width="90" height="0" />
+          <dc:Bounds x="581.5" y="-6" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index 4676acf..dec5681 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.10.0">
+<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.8.2">
   <bpmn:process id="UnassignVnfBB" name="UnassignVnfBB" isExecutable="true">
     <bpmn:startEvent id="UnassignVnfBB_Start">
       <bpmn:outgoing>SequenceFlow_1kfxl04</bpmn:outgoing>
@@ -10,7 +10,7 @@
     </bpmn:serviceTask>
     <bpmn:serviceTask id="UnassignVnf" name="&#10;SDNC &#10;Unassign&#10;(vnf)&#10;" camunda:expression="${SDNCUnassignTasks.unassignVnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_1kfxl04</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_02st1i1</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0ielrmh</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:endEvent id="UnassignVnfBB_End">
       <bpmn:incoming>SequenceFlow_0qa6sxx</bpmn:incoming>
     <bpmn:sequenceFlow id="SequenceFlow_1kfxl04" sourceRef="UnassignVnfBB_Start" targetRef="UnassignVnf" />
     <bpmn:sequenceFlow id="SequenceFlow_0qa6sxx" sourceRef="DeleteVnf" targetRef="UnassignVnfBB_End" />
     <bpmn:serviceTask id="DeleteVnfInstanceGroups" name="&#10;AAI &#10;Delete&#10;(instance grp)&#10;" camunda:expression="${UnassignVnf.deleteInstanceGroups(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_02st1i1</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1cpzq86</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0w3s09a</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_02st1i1" sourceRef="UnassignVnf" targetRef="DeleteVnfInstanceGroups" />
     <bpmn:sequenceFlow id="SequenceFlow_0w3s09a" sourceRef="DeleteVnfInstanceGroups" targetRef="DeleteVnf" />
+    <bpmn:callActivity id="CallActivity_sdncHandlerCall" name="SDNC Unassign (vnf)" calledElement="SDNCHandler">
+      <bpmn:extensionElements>
+        <camunda:in source="SDNCRequest" target="SDNCRequest" />
+        <camunda:out source="SDNCResponse" target="SDNCResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0ielrmh</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1cpzq86</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_0ielrmh" sourceRef="UnassignVnf" targetRef="CallActivity_sdncHandlerCall" />
+    <bpmn:sequenceFlow id="SequenceFlow_1cpzq86" sourceRef="CallActivity_sdncHandlerCall" targetRef="DeleteVnfInstanceGroups" />
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="UnassignVnfBB">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0028k7a_di" bpmnElement="DeleteVnf">
-        <dc:Bounds x="723" y="-25" width="100" height="80" />
+        <dc:Bounds x="822" y="-25" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_13t22km_di" bpmnElement="UnassignVnf">
-        <dc:Bounds x="367" y="-25" width="100" height="80" />
+        <dc:Bounds x="309" y="-25" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_0qdq7wj_di" bpmnElement="UnassignVnfBB_End">
         <dc:Bounds x="959" y="-3" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1kfxl04_di" bpmnElement="SequenceFlow_1kfxl04">
         <di:waypoint xsi:type="dc:Point" x="249" y="15" />
-        <di:waypoint xsi:type="dc:Point" x="367" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="309" y="15" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="308" y="0" width="0" height="0" />
+          <dc:Bounds x="234" y="0" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0qa6sxx_di" bpmnElement="SequenceFlow_0qa6sxx">
-        <di:waypoint xsi:type="dc:Point" x="823" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="922" y="15" />
         <di:waypoint xsi:type="dc:Point" x="959" y="15" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="846" y="0" width="90" height="0" />
+          <dc:Bounds x="895.5" y="0" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0b1276e_di" bpmnElement="DeleteVnfInstanceGroups">
-        <dc:Bounds x="546" y="-25" width="100" height="80" />
+        <dc:Bounds x="650" y="-25" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_02st1i1_di" bpmnElement="SequenceFlow_02st1i1">
-        <di:waypoint xsi:type="dc:Point" x="467" y="15" />
-        <di:waypoint xsi:type="dc:Point" x="546" y="15" />
+      <bpmndi:BPMNEdge id="SequenceFlow_0w3s09a_di" bpmnElement="SequenceFlow_0w3s09a">
+        <di:waypoint xsi:type="dc:Point" x="750" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="822" y="15" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="506.5" y="-6" width="0" height="12" />
+          <dc:Bounds x="741" y="-6" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0w3s09a_di" bpmnElement="SequenceFlow_0w3s09a">
-        <di:waypoint xsi:type="dc:Point" x="646" y="15" />
-        <di:waypoint xsi:type="dc:Point" x="723" y="15" />
+      <bpmndi:BPMNShape id="CallActivity_195fzng_di" bpmnElement="CallActivity_sdncHandlerCall">
+        <dc:Bounds x="471" y="-25" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ielrmh_di" bpmnElement="SequenceFlow_0ielrmh">
+        <di:waypoint xsi:type="dc:Point" x="409" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="471" y="15" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="440" y="-6" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1cpzq86_di" bpmnElement="SequenceFlow_1cpzq86">
+        <di:waypoint xsi:type="dc:Point" x="571" y="15" />
+        <di:waypoint xsi:type="dc:Point" x="650" y="15" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="684.5" y="-6" width="0" height="12" />
+          <dc:Bounds x="610.5" y="-6" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index 07460a4..bbb2a8a 100644 (file)
@@ -5,8 +5,8 @@
       <bpmn:outgoing>SequenceFlow_15s0okp</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:endEvent id="End_WorkflowActionBB" name="end">
-      <bpmn:incoming>SequenceFlow_1rscv7d</bpmn:incoming>
       <bpmn:incoming>SequenceFlow_0x4urgp</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1pz6edz</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_15s0okp" sourceRef="Start_WorkflowActionBB" targetRef="Task_RetrieveBBExectuionList" />
     <bpmn:callActivity id="Call_ExecuteBB" name="Execute BB" camunda:asyncBefore="true" calledElement="ExecuteBuildingBlock">
@@ -21,6 +21,7 @@
         <camunda:in source="orchestrationStatusValidationResult" target="orchestrationStatusValidationResult" />
         <camunda:out source="orchestrationStatusValidationResult" target="orchestrationStatusValidationResult" />
         <camunda:out source="RetryDuration" target="RetryDuration" />
+        <camunda:in source="suppressRollback" target="suppressRollback" />
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_0mew9im</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_07h9d4y</bpmn:outgoing>
@@ -43,7 +44,7 @@
     </bpmn:exclusiveGateway>
     <bpmn:sequenceFlow id="SequenceFlow_07h9d4y" sourceRef="Call_ExecuteBB" targetRef="ExclusiveGateway_Finished" />
     <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}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("completed")==true&&execution.getVariable("isRollback")==false&&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>
       <bpmn:incoming>SequenceFlow_0sckerv</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1wb59ic</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:serviceTask id="Task_SetupCompleteMsoProcess" name="Setup Complete MSO Process" camunda:expression="${WorkflowActionBBTasks.setupCompleteMsoProcess(execution)}">
+    <bpmn:serviceTask id="Task_UpdateRequestComplete" name="Update Request To Complete" camunda:expression="${WorkflowActionBBTasks.updateRequestStatusToComplete(execution)}">
       <bpmn:incoming>SequenceFlow_0kf5sen</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1pz6edz</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:callActivity id="Call_CompleteMsoProcess" name="Call CompleteMsoProcess" calledElement="CompleteMsoProcess">
-      <bpmn:extensionElements>
-        <camunda:in source="CompleteMsoProcessRequest" target="CompleteMsoProcessRequest" />
-        <camunda:in source="mso-request-id" target="mso-request-id" />
-        <camunda:in source="mso-service-instance-id" target="mso-service-instance-id" />
-        <camunda:out source="CMSO_ResponseCode" target="CMSO_ResponseCode" />
-        <camunda:out source="CompleteMsoProcessResponse" target="CompleteMsoProcessResponse" />
-        <camunda:out source="CMSO_ErrorResponse" target="CMSO_ErrorResponse" />
-      </bpmn:extensionElements>
-      <bpmn:incoming>SequenceFlow_1pz6edz</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1rscv7d</bpmn:outgoing>
-    </bpmn:callActivity>
-    <bpmn:sequenceFlow id="SequenceFlow_1pz6edz" sourceRef="Task_SetupCompleteMsoProcess" targetRef="Call_CompleteMsoProcess" />
-    <bpmn:sequenceFlow id="SequenceFlow_1rscv7d" sourceRef="Call_CompleteMsoProcess" targetRef="End_WorkflowActionBB" />
+    <bpmn:sequenceFlow id="SequenceFlow_1pz6edz" sourceRef="Task_UpdateRequestComplete" targetRef="End_WorkflowActionBB" />
     <bpmn:subProcess id="SubProcess_18226x4" name="Error Handling" triggeredByEvent="true">
       <bpmn:startEvent id="ErrorStart" name="error">
         <bpmn:outgoing>SequenceFlow_1edjl5x</bpmn:outgoing>
@@ -79,7 +67,7 @@
       <bpmn:endEvent id="ErrorEnd" name="end">
         <bpmn:incoming>SequenceFlow_0wvzfgf</bpmn:incoming>
       </bpmn:endEvent>
-      <bpmn:serviceTask id="Task_UpdateDb" name="Update Request To Failed" camunda:expression="${WorkflowActionBBTasks.updateRequestStatusToFailed(execution)}">
+      <bpmn:serviceTask id="Task_UpdateDb" name="Update Request To Failed" camunda:expression="${WorkflowActionBBFailure.updateRequestStatusToFailed(execution)}">
         <bpmn:incoming>SequenceFlow_024g0d1</bpmn:incoming>
         <bpmn:incoming>SequenceFlow_0eana0l</bpmn:incoming>
         <bpmn:outgoing>SequenceFlow_0wvzfgf</bpmn:outgoing>
     <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:sequenceFlow>
-    <bpmn:serviceTask id="Task_AbortAndCallErrorHandling" name="Update Request To Failed" camunda:expression="${WorkflowActionBBTasks.updateRequestStatusToFailed(execution)}">
+    <bpmn:serviceTask id="Task_AbortAndCallErrorHandling" name="Update Request To Failed" camunda:expression="${WorkflowActionBBFailure.updateRequestStatusToFailed(execution)}">
       <bpmn:incoming>SequenceFlow_02ksbt0</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1p8yxu6</bpmn:outgoing>
     </bpmn:serviceTask>
     <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:sequenceFlow>
-    <bpmn:serviceTask id="Task_UpdateRequestToFailed" name="Update Request To Failed" camunda:expression="${WorkflowActionBBTasks.updateRequestStatusToFailedWithRollback(execution)}">
+    <bpmn:serviceTask id="Task_UpdateRequestToFailed" name="Update Request To Failed" camunda:expression="${WorkflowActionBBFailure.updateRequestStatusToFailedWithRollback(execution)}">
       <bpmn:incoming>SequenceFlow_11dlyzt</bpmn:incoming>
       <bpmn:incoming>SequenceFlow_0l7kaba</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}]]></bpmn:conditionExpression>
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("completed")==true&&execution.getVariable("isRollback")==true&&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">
       <bpmn:outgoing>SequenceFlow_0mew9im</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0mew9im" sourceRef="ServiceTask_0e2p0xs" targetRef="Call_ExecuteBB" />
-    <bpmn:sequenceFlow id="SequenceFlow_0kf5sen" name="yes" sourceRef="ExclusiveGateway_isTopLevelFlowC" targetRef="Task_SetupCompleteMsoProcess" />
+    <bpmn:sequenceFlow id="SequenceFlow_0kf5sen" name="yes" sourceRef="ExclusiveGateway_isTopLevelFlowC" targetRef="Task_UpdateRequestComplete" />
   </bpmn:process>
   <bpmn:error id="Error_0kd2o2a" name="java.lang.Exception" errorCode="java.lang.Exception" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1uv6erv_di" bpmnElement="End_WorkflowActionBB">
-        <dc:Bounds x="1281" y="147" width="36" height="36" />
+        <dc:Bounds x="1085" y="147" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1291" y="186" width="18" height="12" />
+          <dc:Bounds x="1094" y="127" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_15s0okp_di" bpmnElement="SequenceFlow_15s0okp">
       <bpmndi:BPMNShape id="ServiceTask_0654g3m_di" bpmnElement="Task_SendSync">
         <dc:Bounds x="46" y="-7" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ServiceTask_0wzh11j_di" bpmnElement="Task_SetupCompleteMsoProcess">
-        <dc:Bounds x="900" y="210" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="CallActivity_1jxi5jq_di" bpmnElement="Call_CompleteMsoProcess">
-        <dc:Bounds x="1027" y="210" width="100" height="80" />
+      <bpmndi:BPMNShape id="ServiceTask_0wzh11j_di" bpmnElement="Task_UpdateRequestComplete">
+        <dc:Bounds x="942" y="206" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1pz6edz_di" bpmnElement="SequenceFlow_1pz6edz">
-        <di:waypoint xsi:type="dc:Point" x="1000" y="250" />
-        <di:waypoint xsi:type="dc:Point" x="1027" y="250" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="969" y="229" width="90" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1rscv7d_di" bpmnElement="SequenceFlow_1rscv7d">
-        <di:waypoint xsi:type="dc:Point" x="1127" y="250" />
-        <di:waypoint xsi:type="dc:Point" x="1147" y="250" />
-        <di:waypoint xsi:type="dc:Point" x="1147" y="165" />
-        <di:waypoint xsi:type="dc:Point" x="1281" y="165" />
+        <di:waypoint xsi:type="dc:Point" x="1042" y="246" />
+        <di:waypoint xsi:type="dc:Point" x="1103" y="246" />
+        <di:waypoint xsi:type="dc:Point" x="1103" y="183" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1117" y="208" width="90" height="0" />
+          <dc:Bounds x="1027.5" y="231" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_18226x4_di" bpmnElement="SubProcess_18226x4" isExpanded="true">
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0x4urgp_di" bpmnElement="SequenceFlow_0x4urgp">
         <di:waypoint xsi:type="dc:Point" x="891" y="165" />
-        <di:waypoint xsi:type="dc:Point" x="1281" y="165" />
+        <di:waypoint xsi:type="dc:Point" x="1001" y="165" />
+        <di:waypoint xsi:type="dc:Point" x="1001" y="165" />
+        <di:waypoint xsi:type="dc:Point" x="1085" y="165" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1081" y="140" width="12" height="12" />
+          <dc:Bounds x="1037.2153846153847" y="140" width="12" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1q8eh5e_di" bpmnElement="End_RollbackFailed">
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0kf5sen_di" bpmnElement="SequenceFlow_0kf5sen">
         <di:waypoint xsi:type="dc:Point" x="866" y="190" />
-        <di:waypoint xsi:type="dc:Point" x="866" y="250" />
-        <di:waypoint xsi:type="dc:Point" x="900" y="250" />
+        <di:waypoint xsi:type="dc:Point" x="866" y="246" />
+        <di:waypoint xsi:type="dc:Point" x="942" y="246" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="872" y="220" width="18" height="12" />
+          <dc:Bounds x="872" y="217.6" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
index f9ff28a..1e3f175 100644 (file)
@@ -68,6 +68,7 @@ import org.onap.so.bpmn.infrastructure.sdnc.tasks.SDNCUnassignTasks;
 import org.onap.so.bpmn.infrastructure.workflow.tasks.FlowCompletionTasks;
 import org.onap.so.bpmn.infrastructure.workflow.tasks.OrchestrationStatusValidator;
 import org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowAction;
+import org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionBBFailure;
 import org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionBBTasks;
 import org.onap.so.bpmn.sdno.tasks.SDNOHealthCheckTasks;
 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetup;
@@ -219,6 +220,9 @@ public abstract class BaseBPMNTest {
 
        @MockBean
        protected SniroHomingV2 sniroHoming;
+       
+       @MockBean
+       protected WorkflowActionBBFailure workflowActionBBFailure;
 
        @LocalServerPort
        protected int port;
index 5da6d3a..3ab1c76 100644 (file)
@@ -46,11 +46,10 @@ public class WorkflowActionBBTest extends BaseBPMNTest {
                Map<String, String> map = new HashMap<>();
                map.put("handlingCode", "Success");
                mockSubprocess("ExecuteBuildingBlock", "Mocked ExecuteBuildingBlock", "GenericStub", map);
-               mockSubprocess("CompleteMsoProcess", "Mocked CompleteMsoProcess", "GenericStub");
                
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("WorkflowActionBB", variables);
                assertThat(pi).isNotNull().isStarted().hasPassedInOrder("Start_WorkflowActionBB", "Task_RetrieveBBExectuionList", "ExclusiveGateway_isTopLevelFlow", "Task_SendSync",
-                               "Task_SelectBB", "Call_ExecuteBB", "ExclusiveGateway_Finished", "ExclusiveGateway_isTopLevelFlowCompleted", "Task_SetupCompleteMsoProcess", "Call_CompleteMsoProcess",
+                               "Task_SelectBB", "Call_ExecuteBB", "ExclusiveGateway_Finished", "ExclusiveGateway_isTopLevelFlowCompleted", "Task_UpdateRequestComplete",
                                "End_WorkflowActionBB");
        
        }
@@ -92,7 +91,7 @@ public class WorkflowActionBBTest extends BaseBPMNTest {
                Map<String, String> map = new HashMap<>();
                map.put("handlingCode", "Abort");
                
-               doThrow(new BpmnError("7000", "TESTING ERRORS")).when(workflowActionBBTasks).abortCallErrorHandling(any(DelegateExecution.class));
+               doThrow(new BpmnError("7000", "TESTING ERRORS")).when(workflowActionBBFailure).abortCallErrorHandling(any(DelegateExecution.class));
                mockSubprocess("ExecuteBuildingBlock", "Mocked ExecuteBuildingBlock", "GenericStub", map);
                
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("WorkflowActionBB", variables);
index be49e3c..dcf6796 100644 (file)
@@ -33,14 +33,16 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class ActivateNetworkBBTest extends BaseBPMNTest{
     @Test
     public void sunnyDayActivateNetwork_Test() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("ActivateNetworkBB", variables);
         assertThat(pi).isNotNull();
-        assertThat(pi).isStarted().hasPassedInOrder("activateNetwork_startEvent","Activate_Network_SDNC_ServiceTask","Activate_Network_AAI_ServiceTask","activateNetwork_EndEvent");     
+        assertThat(pi).isStarted().hasPassedInOrder("activateNetwork_startEvent","Activate_Network_SDNC_ServiceTask","CallActivity_sdncHandler","Activate_Network_AAI_ServiceTask","activateNetwork_EndEvent");     
         assertThat(pi).isEnded();
     }
 
        @Test   
        public void rainyDayActivateNetwork_Test() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiUpdateTasks).updateOrchestrationStatusActiveNetwork(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("ActivateNetworkBB", variables);
                assertThat(pi).isStarted()
index 14ff2fc..2c27771 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 package org.onap.so.bpmn.infrastructure.bpmn.subprocess;
-import static org.camunda.bpm.engine.test.assertions.ProcessEngineTests.assertThat;
+import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareAssertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doThrow;
 
@@ -27,7 +27,6 @@ import java.io.IOException;
 
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.runtime.ProcessInstance;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.onap.so.bpmn.BaseBPMNTest;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
@@ -35,22 +34,21 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class ActivateVfModuleBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDay() throws InterruptedException, IOException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("ActivateVfModuleBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("ActivateVfModuleBB_Start", "ActivateVfModule",
+               assertThat(pi).isStarted().hasPassedInOrder("ActivateVfModuleBB_Start", "ActivateVfModule", "CallActivity_sdncHandler",
                                "UpdateVfModuleActiveStatus", "ActivateVfModuleBB_End");
                assertThat(pi).isEnded();
        }
        
        @Test
-       
        public void rainyDay() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(BpmnError.class).when(aaiUpdateTasks).updateOrchestrationStatusActivateVfModule(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("ActivateVfModuleBB", variables);
                assertThat(pi).isNotNull().isStarted()
                                .hasPassedInOrder("ActivateVfModuleBB_Start", "ActivateVfModule", "UpdateVfModuleActiveStatus")
                                .hasNotPassed("ActivateVfModuleBB_End");
-
-       
        }
 }
index 7a8838e..d1d95fe 100644 (file)
@@ -30,10 +30,11 @@ import org.onap.so.bpmn.BaseBPMNTest;
 public class ActivateVnfBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDay() throws InterruptedException, IOException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("ActivateVnfBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted().hasPassedInOrder("Start_ActivateVnfBB", "Task_SDNCAdapterVnfTopologyActivate",
-                               "Task_ActivateOrchestrationStatusVnf", "End_ActivateVnfBB");
+                               "CallActivity_sdncHandler", "Task_ActivateOrchestrationStatusVnf", "End_ActivateVnfBB");
                assertThat(pi).isEnded();
        }
 
index ee76eef..c581a16 100644 (file)
@@ -34,16 +34,16 @@ public class AssignNetworkBBTest extends BaseBPMNTest{
     @Test
        @Deployment(resources = { "subprocess/AssignNetworkRollbackBB.bpmn"})
     public void sunnyDayAssignNetwork_Test() throws InterruptedException {
-
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("AssignNetworkBB",variables);
         assertThat(pi).isNotNull();
-        assertThat(pi).isStarted().hasPassedInOrder("AssignNetworkBB_start","networkFoundByName_ExclusiveGateway","ServiceTask_put_network_in_AAI","ServiceTask_connect_to_Tenant","ServiceTask_connect_to_CloudRegion","ServiceTask_connect_to_NCIG","ServiceTask_connect_to_NCSI","ServiceTask_get_cloud_region","ServiceTask_assign_network_sdnc","ServiceTask_assign_network_aai","AssignNetworkBB_end");     
+        assertThat(pi).isStarted().hasPassedInOrder("AssignNetworkBB_start","networkFoundByName_ExclusiveGateway","ServiceTask_put_network_in_AAI","ServiceTask_connect_to_Tenant","ServiceTask_connect_to_CloudRegion","ServiceTask_connect_to_NCIG","ServiceTask_connect_to_NCSI","ServiceTask_get_cloud_region","ServiceTask_assign_network_sdnc","CallActivity_sdncHandlerCall","ServiceTask_assign_network_aai","AssignNetworkBB_end");     
         assertThat(pi).isEnded();
     }
 
        @Test
        public void rainyDayAssignNetwork_Test() throws Exception {
-               
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiUpdateTasks).updateOrchestrationStatusAssignedNetwork(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("AssignNetworkBB", variables);
                assertThat(pi).isNotNull();
index 078f101..2624cc0 100644 (file)
@@ -31,10 +31,11 @@ public class AssignServiceInstanceBBTest extends BaseBPMNTest{
        
        @Test
        public void sunnyDaySDNC() throws InterruptedException, IOException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("AssignServiceInstanceBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted().hasPassedInOrder("Start_AssignServiceInstanceBB", "Task_CreateServiceInstance",
-                               "Task_CreateProject", "Task_CreateOwningEntity", "Task_AssignServiceInstance",
+                               "Task_CreateProject", "Task_CreateOwningEntity", "Task_AssignServiceInstance", "CallActivity_sdncHandler",
                                "Task_UpdateServiceOstatusToAssigned", "End_AssignServiceInstanceBB");
                assertThat(pi).isEnded();
        }
index 567d57c..44d17a3 100644 (file)
@@ -32,12 +32,14 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class AssignVfModuleBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDayAssignVfModule_Test() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("AssignVfModuleBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted().hasPassedInOrder("AssignVfModuleBB_Start", 
                                "CreateVfModule",
                                "ConnectVfModuleToVolumeGroup",
                                "AssignVfModule",
+                               "CallActivity_sdncHandlerCall",
                                "UpdateVfModuleStatus",                            
                                "AssignVfModuleBB_End");
                assertThat(pi).isEnded();
index f675440..f4258f4 100644 (file)
@@ -38,7 +38,7 @@ public class AssignVnfBBTest extends BaseBPMNTest {
                mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("AssignVnfBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("Start_AssignVnfBB", "Task_CreateVnf", "Task_createPlatform", "Task_createLineOfBusiness", "Task_createInstanceGroups",
+               assertThat(pi).isStarted().hasPassedInOrder("Start_AssignVnfBB", "Task_CreateVnf", "ServiceTask_ConnectVnfToCloudRegion", "ServiceTask_ConnectVnfToTenant", "Task_createPlatform", "Task_createLineOfBusiness", "Task_createInstanceGroups",
                                "Task_callHoming", "Task_SDNCAdapterVnfTopologyAssign","CallActivity_sdncAssign", "Task_UpdateVnfOrchestrationStatusAssigned",
                                "End_AssignVnfBB");
                assertThat(pi).isEnded();
index 2e0b813..1772a3a 100644 (file)
@@ -32,9 +32,10 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class ChangeModelServiceInstanceBBTest extends BaseBPMNTest{
        @Test
        public void changeModelVnfBBTest() {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ChangeModelServiceInstanceBB", variables);
                assertThat(processInstance).isNotNull();
-               assertThat(processInstance).isStarted().hasPassedInOrder("ChangeModelServiceInstance_Start" ,"SDNCChangeModelServiceInstance", "AAIUpdateModelServiceInstance", "ChangeModelServiceInstance_End");
+               assertThat(processInstance).isStarted().hasPassedInOrder("ChangeModelServiceInstance_Start" ,"SDNCChangeModelServiceInstance", "CallActivity_sdncHandlerReq", "AAIUpdateModelServiceInstance", "ChangeModelServiceInstance_End");
                assertThat(processInstance).isEnded();
        }
        
index fca6aae..8549b6b 100644 (file)
@@ -32,9 +32,10 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class ChangeModelVfModuleBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDayChangeModelVfModuleTest() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("ChangeModelVfModuleBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("ChangeModelVfModuleBB_Start", "ChangeModelVfModule", "UpdateVfModuleModel", "ChangeModelVfModuleBB_End");
+               assertThat(pi).isStarted().hasPassedInOrder("ChangeModelVfModuleBB_Start", "ChangeModelVfModule", "CallActivity_sdncHandler", "UpdateVfModuleModel", "ChangeModelVfModuleBB_End");
                assertThat(pi).isEnded();
        }
 
index 50dc25d..43ac163 100644 (file)
@@ -32,9 +32,10 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class ChangeModelVnfBBTest extends BaseBPMNTest{
        @Test
        public void changeModelVnfBBTest() {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ChangeModelVnfBB", variables);
                assertThat(processInstance).isNotNull();
-               assertThat(processInstance).isStarted().hasPassedInOrder("ChangeModelVnf_Start" ,"SDNCChangeModel", "AAIUpdateModel", "ChangeModelVnf_End");
+               assertThat(processInstance).isStarted().hasPassedInOrder("ChangeModelVnf_Start" ,"SDNCChangeModel", "CallActivity_sdncHandlerCall", "AAIUpdateModel", "ChangeModelVnf_End");
                assertThat(processInstance).isEnded();
        }
        
index 02903cd..ad93eec 100644 (file)
@@ -32,14 +32,16 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class DeactivateNetworkBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDayDeactivateNetworkBB_Test() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeactivateNetworkBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("DeactivateNetworkBB_Start", "DeactivateNetworkSDNC", "DeactivateNetworkAAI", "DeactivateNetworkBB_End");
+               assertThat(pi).isStarted().hasPassedInOrder("DeactivateNetworkBB_Start", "DeactivateNetworkSDNC", "CallActivity_sdncHandler","DeactivateNetworkAAI", "DeactivateNetworkBB_End");
                assertThat(pi).isEnded();
        }
 
        @Test
        public void rainyDayDeactivateNetworkBB_Test() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(new BpmnError("7000", "TESTING ERRORS")).when(sdncDeactivateTasks).deactivateNetwork(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeactivateNetworkBB", variables);
                assertThat(pi).isNotNull();
index 2bf6377..428713d 100644 (file)
  */
 
 package org.onap.so.bpmn.infrastructure.bpmn.subprocess;
-import static org.camunda.bpm.engine.test.assertions.ProcessEngineTests.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doThrow;
+import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareAssertions.assertThat;
 
-import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.runtime.ProcessInstance;
 import org.junit.Test;
 import org.onap.so.bpmn.BaseBPMNTest;
-import org.onap.so.bpmn.common.BuildingBlockExecution;
 
 /**
  * Unit test cases for DeActivateServiceInstanceTest.bpmn
@@ -35,9 +31,10 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class DeactivateServiceInstanceBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDayDeactivateServiceInstanceSDNC() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeactivateServiceInstanceBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("Start_DeactivateServiceInstanceBB", "Task_DeactivateServiceInstance_SDNC", "Task_DeactivateServiceInstance_AAI", "End_DeactivateServiceInstanceBB");
+               assertThat(pi).isStarted().hasPassedInOrder("Start_DeactivateServiceInstanceBB", "Task_DeactivateServiceInstance_SDNC", "CallActivity_sdncHandler", "Task_DeactivateServiceInstance_AAI", "End_DeactivateServiceInstanceBB");
                assertThat(pi).isEnded();
        }
 }
index ef04d71..c7232e5 100644 (file)
@@ -34,15 +34,17 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class DeactivateVfModuleBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDay() throws InterruptedException, IOException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeactivateVfModuleBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("DeactivateVfModuleBB_Start", "DeactivateVfModule",
+               assertThat(pi).isStarted().hasPassedInOrder("DeactivateVfModuleBB_Start", "DeactivateVfModule", "CallActivity_sdncHandler",
                                "UpdateVfModuleDeactivateStatus", "DeactivateVfModuleBB_End");
                assertThat(pi).isEnded();
        }       
        
        @Test
        public void rainyDay() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(BpmnError.class).when(aaiUpdateTasks).updateOrchestrationStatusDeactivateVfModule(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeactivateVfModuleBB", variables);
                assertThat(pi).isNotNull();
index 22cdfbb..bf5e228 100644 (file)
@@ -34,10 +34,11 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class DeactivateVnfBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDay() throws InterruptedException, IOException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeactivateVnfBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted().hasPassedInOrder("Start_DeactivateVnfBB","Task_SDNCAdapterVnfTopologyDeactivate",
-                               "Task_DeactivateOrchestrationStatusVnf", "End_DeactivateVnfBB");
+                               "CallActivity_sdncHandler", "Task_DeactivateOrchestrationStatusVnf", "End_DeactivateVnfBB");
                assertThat(pi).isEnded();
        }
 
@@ -54,6 +55,7 @@ public class DeactivateVnfBBTest extends BaseBPMNTest{
 
        @Test
        public void rainyDayDeactivateVnfAAIError_Test() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiUpdateTasks).updateOrchestrationStatusAssignedVnf(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeactivateVnfBB", variables);
                assertThat(pi).isNotNull();
index b88bb3a..d9190b5 100644 (file)
@@ -33,11 +33,12 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class DeleteVfModuleBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDay() throws InterruptedException, IOException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                mockSubprocess("VnfAdapter", "Mocked VnfAdapter", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeleteVfModuleBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted().hasPassedInOrder("DeleteVfModuleBB_Start", "DeleteVfModuleVnfAdapter", "VnfAdapter",
-                               "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
+                               "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
                assertThat(pi).isEnded();
        }
 
@@ -48,7 +49,7 @@ public class DeleteVfModuleBBTest extends BaseBPMNTest{
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted()
                                .hasPassedInOrder("DeleteVfModuleBB_Start", "DeleteVfModuleVnfAdapter")
-                               .hasNotPassed("VnfAdapter", "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
+                               .hasNotPassed("VnfAdapter", "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
                assertThat(pi).isEnded();
        }
 }
index cd6c266..2336bb5 100644 (file)
@@ -35,7 +35,7 @@ public class DeleteVolumeGroupBBTest extends BaseBPMNTest {
                mockSubprocess("VnfAdapter", "Mocked VnfAdapter", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeleteVolumeGroupBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("DeleteVolumeGroupBB_Start", "DeleteVolumeGroupVnfAdapter", "VnfAdapter", "UpdateVolumeGroupAAI", "DeleteVolumeGroupBB_End");
+               assertThat(pi).isStarted().hasPassedInOrder("DeleteVolumeGroupBB_Start", "DeleteVolumeGroupVnfAdapter", "VnfAdapter", "UpdateVolumeGroupHeatStackId", "UpdateVolumeGroupAAI", "DeleteVolumeGroupBB_End");
                assertThat(pi).isEnded();
        }
 
@@ -46,7 +46,7 @@ public class DeleteVolumeGroupBBTest extends BaseBPMNTest {
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeleteVolumeGroupBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted()
-                               .hasPassedInOrder("DeleteVolumeGroupBB_Start", "DeleteVolumeGroupVnfAdapter", "VnfAdapter", "UpdateVolumeGroupAAI")
+                               .hasPassedInOrder("DeleteVolumeGroupBB_Start", "DeleteVolumeGroupVnfAdapter", "VnfAdapter", "UpdateVolumeGroupHeatStackId", "UpdateVolumeGroupAAI")
                                .hasNotPassed("DeleteVolumeGroupBB_End");
                assertThat(pi).isEnded();
        }
index b065ba0..442d7b7 100644 (file)
@@ -33,14 +33,16 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class UnassignNetworkBBTest  extends BaseBPMNTest {
     @Test
     public void sunnyDayAssignNetwork_Test() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignNetworkBB",variables);
         assertThat(pi).isNotNull();
-        assertThat(pi).isStarted().hasPassedInOrder("Start_UnassignNetworkBB","Task_VfModuleRelatioship","Task_GetCloudRegionVersion","Task_SNDCUnAssign","Task_DeleteNetwork","End_UnassignNetworkBB");     
+        assertThat(pi).isStarted().hasPassedInOrder("Start_UnassignNetworkBB","Task_VfModuleRelatioship","Task_GetCloudRegionVersion","Task_SNDCUnAssign","CallActivity_sdncHandlerCall","Task_DeleteNetwork","End_UnassignNetworkBB");     
         assertThat(pi).isEnded();
     }
 
        @Test
        public void rainyDayAssignNetwork_Test() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(new BpmnError("7000", "TESTING ERRORS")).when(unassignNetworkBB).checkRelationshipRelatedTo(any(BuildingBlockExecution.class), eq("vf-module"));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignNetworkBB", variables);
                assertThat(pi).isNotNull();
index f8eddab..854c4f9 100644 (file)
@@ -31,13 +31,12 @@ import org.onap.so.bpmn.common.DelegateExecutionImpl;
 public class UnassignServiceInstanceBBTest extends BaseBPMNTest{ 
        @Test
        public void sunnyDayUnassignServiceInstanceSDNC() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                BuildingBlockExecution bbe = new DelegateExecutionImpl(new ExecutionImpl());
-               
                variables.put("gBuildingBlockExecution", bbe);
-
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignServiceInstanceBB", variables);
                assertThat(pi).isNotNull();
-               assertThat(pi).isStarted().hasPassedInOrder("Start_UnassignServiceInstanceBB", "Task_SdncUnassignServiceInstance", "Task_AAIDeleteServiceInstance", "End_UnassignServiceInstanceBB");
+               assertThat(pi).isStarted().hasPassedInOrder("Start_UnassignServiceInstanceBB", "Task_SdncUnassignServiceInstance", "CallActivity_sdncHandlerCall", "Task_AAIDeleteServiceInstance", "End_UnassignServiceInstanceBB");
                assertThat(pi).isEnded();
        }
 }
index 90955e3..8908977 100644 (file)
@@ -32,10 +32,12 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class UnassignVfModuleBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDayUnassignVfModule_Test() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignVfModuleBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted().hasPassedInOrder("UnassignVfModuleBB_Start", 
                                "UnassignVfModule",
+                               "CallActivity_sdncHandler",
                                "DeleteVfModule",                               
                                "UnassignVfModuleBB_End");
                assertThat(pi).isEnded();
@@ -43,6 +45,7 @@ public class UnassignVfModuleBBTest extends BaseBPMNTest{
 
        @Test
        public void rainyDayUnassignVfModuleAAIDeleteFailed_Test() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiDeleteTasks).deleteVfModule(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignVfModuleBB", variables);
                assertThat(pi).isNotNull();
index 57d2ac5..d508f4f 100644 (file)
@@ -33,10 +33,12 @@ import org.onap.so.bpmn.common.BuildingBlockExecution;
 public class UnassignVnfBBTest extends BaseBPMNTest{
        @Test
        public void sunnyDayUnassignVnf_Test() throws InterruptedException {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignVnfBB", variables);
                assertThat(pi).isNotNull();
                assertThat(pi).isStarted().hasPassedInOrder("UnassignVnfBB_Start", 
                                "UnassignVnf",
+                               "CallActivity_sdncHandlerCall",
                                "DeleteVnfInstanceGroups",
                                "DeleteVnf",                            
                                "UnassignVnfBB_End");
@@ -56,6 +58,7 @@ public class UnassignVnfBBTest extends BaseBPMNTest{
        
        @Test
        public void rainyDayUnassignVnfAAIDeleteFailed_Test() throws Exception {
+               mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
                doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiDeleteTasks).deleteVnf(any(BuildingBlockExecution.class));
                ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignVnfBB", variables);
                assertThat(pi).isNotNull().isStarted().hasPassedInOrder("UnassignVnfBB_Start", "UnassignVnf", "DeleteVnfInstanceGroups","DeleteVnf")
index b29017e..9ba278a 100644 (file)
             <version>${camunda.springboot.version}</version>
             <scope>test</scope>
         </dependency>
+               <dependency>
+                       <groupId>org.assertj</groupId>
+                       <artifactId>assertj-core</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.camunda.bpm.extension.mockito</groupId>
+                       <artifactId>camunda-bpm-mockito</artifactId>
+               </dependency>
        </dependencies>
 </project>
index 2ae7686..05fd517 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.bpmn.infrastructure.scripts
 import org.json.JSONArray
 import org.json.JSONObject
 import org.json.XML
+import org.onap.so.bpmn.common.scripts.ExternalAPIUtilFactory
 
 import static org.apache.commons.lang3.StringUtils.*
 import groovy.xml.XmlUtil
@@ -381,7 +382,7 @@ public class Create3rdONAPE2EServiceInstance extends AbstractServiceTaskProcesso
                valueMap.put("serviceName", '"' + serviceName + '"')
                valueMap.put("serviceUuId", '"' + serviceUuId + '"')
 
-               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil()
+               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtilFactory().create()
 
                // insert CallSource='ExternalAPI' to uuiRequest
                Map<String, String> requestInputsMap = new HashMap<>()
@@ -426,7 +427,7 @@ public class Create3rdONAPE2EServiceInstance extends AbstractServiceTaskProcesso
                msoLogger.debug("doCreateE2ESIin3rdONAP externalAPIURL is: " + extAPIPath)
                msoLogger.debug("doCreateE2ESIin3rdONAP payload is: " + payload)
 
-               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil()
+               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtilFactory().create()
                execution.setVariable("ServiceOrderId", "")
 
                Response response = externalAPIUtil.executeExternalAPIPostCall(execution, extAPIPath, payload)
@@ -471,7 +472,7 @@ public class Create3rdONAPE2EServiceInstance extends AbstractServiceTaskProcesso
                extAPIPath += "/" + execution.getVariable("ServiceOrderId")
                msoLogger.debug("getE2ESIProgressin3rdONAP create externalAPIURL is: " + extAPIPath)
 
-               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil()
+               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtilFactory().create()
 
                Response response = externalAPIUtil.executeExternalAPIGetCall(execution, extAPIPath)
 
index a505f3f..b2c278b 100644 (file)
@@ -538,8 +538,8 @@ public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
     }
 
     private def getInstnaceId(DelegateExecution execution) {
-        def responce  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
-        def data = responce.toString()
+        def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
+        def data = response.toString()
         data = data.substring(data.indexOf("<"))
 
         def resp = new XmlSlurper().parseText(data)
@@ -548,11 +548,6 @@ public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
         def val = ""
 
         switch (modelName) {
-            case  ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/ :
-            case ~/[\w\s\W]*SDWANConnectivity[\w\s\W]*/ :
-                val = resp."network-response-information"."instance-id"
-                break
-
             case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
             case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
             case ~/[\w\s\W]*Site[\w\s\W]*/:
@@ -563,6 +558,11 @@ public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/:
                 val = resp."connection-attachment-response-information"."instance-id"
                 break
+
+            // for SDWANConnectivity and SOTNConnectivity and default:
+            default:
+                val = resp."network-response-information"."instance-id"
+                break
         }
 
         return val.toString()
index e3702f1..6222214 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.so.client.HttpClientFactory
 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;
@@ -29,10 +30,9 @@ import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
-import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
+import org.onap.so.bpmn.core.UrnPropertiesReader
 
-import groovy.json.*
 import javax.ws.rs.core.Response
 import org.onap.so.utils.TargetEntity
 
@@ -43,11 +43,6 @@ import org.onap.so.utils.TargetEntity
 public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, CreateVFCNSResource.class);
 
-
-    String vfcUrl = "/vfc/rest/v1/vfcadapter"
-
-    String host = "http://mso.mso.testlab.openecomp.org:8080"
-
     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
     JsonUtils jsonUtil = new JsonUtils()
@@ -116,6 +111,18 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
            execution.setVariable("nsParameters", nsParameters)
            execution.setVariable("nsServiceModelUUID", nsServiceModelUUID);
 
+           String vfcAdapterUrl = UrnPropertiesReader.getVariable("mso.adapters.vfc.rest.endpoint", execution)
+                  
+           if (vfcAdapterUrl == null || vfcAdapterUrl.isEmpty()) {
+                  msg = getProcessKey(execution) + ': mso:adapters:vfcc:rest:endpoint URN mapping is not defined'
+                  msoLogger.debug(msg)
+           }
+
+           while (vfcAdapterUrl.endsWith('/')) {
+                  vfcAdapterUrl = vfcAdapterUrl.substring(0, vfcAdapterUrl.length()-1)
+           }              
+                  
+           execution.setVariable("vfcAdapterUrl", vfcAdapterUrl)
 
        } catch (BpmnError e) {
            throw e;
@@ -132,6 +139,7 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
      */
     public void createNetworkService(DelegateExecution execution) {
         msoLogger.trace("createNetworkService ")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String nsOperationKey = execution.getVariable("nsOperationKey");
         String nsServiceModelUUID = execution.getVariable("nsServiceModelUUID");
         String nsParameters = execution.getVariable("nsParameters");
@@ -149,8 +157,8 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
                      "additionalParamForNs":${requestInputs}
                 }
                }"""
-        Response apiResponse = postRequest(execution, host + vfcUrl + "/ns", reqBody)
-        String returnCode = apiResponse.getStatus()
+        Response apiResponse = postRequest(execution, vfcAdapterUrl + "/ns", reqBody)
+        String returnCode = apiResponse.getStatus ()
         String aaiResponseAsString = apiResponse.readEntity(String.class)
         String nsInstanceId = "";
         if(returnCode== "200" || returnCode == "201"){
@@ -165,6 +173,7 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
      */
     public void instantiateNetworkService(DelegateExecution execution) {
         msoLogger.trace("instantiateNetworkService ")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String nsOperationKey = execution.getVariable("nsOperationKey");
         String nsParameters = execution.getVariable("nsParameters");
         String nsServiceName = execution.getVariable("nsServiceName")
@@ -176,7 +185,7 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
         "nsParameters":${nsParameters}
        }"""
         String nsInstanceId = execution.getVariable("nsInstanceId")
-        String url = host + vfcUrl + "/ns/" +nsInstanceId + "/instantiate"
+        String url = vfcAdapterUrl + "/ns/" +nsInstanceId + "/instantiate"
         Response apiResponse = postRequest(execution, url, reqBody)
         String returnCode = apiResponse.getStatus()
         String aaiResponseAsString = apiResponse.readEntity(String.class)
@@ -193,9 +202,10 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
      */
     public void queryNSProgress(DelegateExecution execution) {
         msoLogger.trace("queryNSProgress ")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String jobId = execution.getVariable("jobId")
         String nsOperationKey = execution.getVariable("nsOperationKey");
-        String url = host + vfcUrl + "/jobs/" + jobId
+        String url = vfcAdapterUrl + "/jobs/" + jobId
         Response apiResponse = postRequest(execution, url, nsOperationKey)
         String returnCode = apiResponse.getStatus()
         String aaiResponseAsString = apiResponse.readEntity(String.class)
@@ -214,7 +224,7 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
         try {
             Thread.sleep(5000);
         } catch(InterruptedException e) {
-            msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Time Delay exception" + e , "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "");
+            msoLogger.error( "Time Delay exception" + e.getMessage());
         }
     }
 
@@ -239,7 +249,7 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
             getAAIClient().connect(nsUri,relatedServiceUri)
             msoLogger.info("NS relationship to Service added successfully")
         }catch(Exception e){
-            msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception occured while Creating NS relationship.", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.getMessage(),e);
+            msoLogger.error("Exception occured while Creating NS relationship."+ e.getMessage());
             throw new BpmnError("MSOWorkflowException")
         }
     }
@@ -251,24 +261,30 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
      */
     private Response postRequest(DelegateExecution execution, String urlString, String requestBody){
         msoLogger.trace("Started Execute VFC adapter Post Process ")
-        msoLogger.info("url:"+url +"\nrequestBody:"+ requestBody)
+        msoLogger.info("url:" + urlString +"\nrequestBody:"+ requestBody)
         Response apiResponse = null
         try{
 
-                       URL url = new URL(urlString);
-
-                       HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.VNF_ADAPTER)
-                       httpClient.addAdditionalHeader("Accept", "application/json")
-                       httpClient.addAdditionalHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk")
+            URL url = new URL(urlString);
+            
+            // Get the Basic Auth credentials for the VFCAdapter, username is 'bpel', auth is '07a7159d3bf51a0e53be7a8f89699be7'
+            // user 'bepl' authHeader is the same with mso.db.auth
+            String basicAuthValuedb =  UrnPropertiesReader.getVariable("mso.db.auth", execution)
+            HttpClient httpClient = new HttpClientFactory().newJsonClient(url, TargetEntity.VNF_ADAPTER)
+            httpClient.addAdditionalHeader("Accept", "application/json")
+            httpClient.addAdditionalHeader("Authorization", basicAuthValuedb)
 
-                       apiResponse = httpClient.post(requestBody)
+            apiResponse = httpClient.post(requestBody)
+            
+            msoLogger.debug("response code:"+ apiResponse.getStatus() +"\nresponse body:"+ apiResponse.readEntity(String.class))
 
-            msoLogger.info("response code:"+ apiResponse.getStatus() +"\nresponse body:"+ apiResponse.readEntity(String.class))
-            msoLogger.trace("Completed Execute VF-C adapter Post Process ")
         }catch(Exception e){
-            msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception occured while executing AAI Post Call.", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e);
-            throw new BpmnError("MSOWorkflowException")
-        }
+            msoLogger.error("VFC Aatpter Post Call Exception:" + e.getMessage());
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "VFC Aatpter Post Call Exception")
+        }              
+               
+        msoLogger.trace("Completed Execute VF-C adapter Post Process ")
+        
         return apiResponse
     }
 
index 9c25a57..af46bf6 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
+
 import static org.apache.commons.lang3.StringUtils.*;
 
 import org.camunda.bpm.engine.delegate.BpmnError
@@ -55,8 +57,7 @@ class CreateVnfInfra extends AbstractServiceTaskProcessor {
        ExceptionUtil exceptionUtil = new ExceptionUtil()
        JsonUtils jsonUtil = new JsonUtils()
        VidUtils vidUtils = new VidUtils(this)
-       CatalogDbUtils cutils = new CatalogDbUtils()
-       AAICreateResources aaiCR = new AAICreateResources()
+       CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
 
        /**
         * This method gets and validates the incoming
@@ -448,7 +449,7 @@ class CreateVnfInfra extends AbstractServiceTaskProcessor {
                        String vnfModelCustomizationUuid = jsonUtil.getJsonValueForKey(vnfModelInfo, "modelCustomizationUuid")
                        msoLogger.debug("querying Catalog DB by vnfModelCustomizationUuid: " + vnfModelCustomizationUuid)
                                                
-                       JSONArray vnfs = cutils.getAllVnfsByVnfModelCustomizationUuid(execution,
+                       JSONArray vnfs = catalogDbUtils.getAllVnfsByVnfModelCustomizationUuid(execution,
                                                        vnfModelCustomizationUuid, "v2")
                        msoLogger.debug("obtained VNF list: " + vnfs)
                        
index 078d68b..b718e4a 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.so.bpmn.common.scripts.ExternalAPIUtilFactory
+
 import javax.ws.rs.NotFoundException
 import javax.ws.rs.core.Response
 
@@ -249,7 +251,7 @@ public class Delete3rdONAPE2EServiceInstance extends AbstractServiceTaskProcesso
                valueMap.put("serviceName", "null")
                valueMap.put("serviceUuId", '"' + serviceSpecificationId + '"')
 
-               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil()
+               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtilFactory().create()
 
                valueMap.put("_requestInputs_",  "")
 
@@ -271,7 +273,7 @@ public class Delete3rdONAPE2EServiceInstance extends AbstractServiceTaskProcesso
                String extAPIPath = sppartnerUrl + "/service?relatedParty.id=" + globalSubscriberId
                msoLogger.debug("queryServicefrom3rdONAP externalAPIURL is: " + extAPIPath)
 
-               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil()
+               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtilFactory().create()
 
                Response response = externalAPIUtil.executeExternalAPIGetCall(execution, extAPIPath)
 
@@ -317,7 +319,7 @@ public class Delete3rdONAPE2EServiceInstance extends AbstractServiceTaskProcesso
                msoLogger.debug("doDeleteE2ESIin3rdONAP externalAPIURL is: " + extAPIPath)
                msoLogger.debug("doDeleteE2ESIin3rdONAP payload is: " + payload)
 
-               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil()
+               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtilFactory().create()
                execution.setVariable("ServiceOrderId", "")
 
                Response response = externalAPIUtil.executeExternalAPIPostCall(execution, extAPIPath, payload)
@@ -361,7 +363,7 @@ public class Delete3rdONAPE2EServiceInstance extends AbstractServiceTaskProcesso
                extAPIPath += "/" + execution.getVariable("ServiceOrderId")
                msoLogger.debug("getE2ESIProgressin3rdONAP delete externalAPIURL is: " + extAPIPath)
 
-               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtil()
+               ExternalAPIUtil externalAPIUtil = new ExternalAPIUtilFactory().create()
 
                Response response = externalAPIUtil.executeExternalAPIGetCall(execution, extAPIPath)
 
index 519f064..5bb8c83 100644 (file)
@@ -52,7 +52,6 @@ public class DeleteCustomE2EServiceInstance extends AbstractServiceTaskProcessor
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DeleteCustomE2EServiceInstance.class);
        
        public void preProcessRequest (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
                execution.setVariable("prefix",Prefix)
                String msg = ""
                
@@ -111,7 +110,7 @@ public class DeleteCustomE2EServiceInstance extends AbstractServiceTaskProcessor
                        
                        execution.setVariable("operationType", "DELETE") 
                } catch (BpmnError e) {
-                       throw e;
+                       throw e
                } catch (Exception ex){
                        msg = "Exception in preProcessRequest " + ex.getMessage()
                        msoLogger.info(msg)
@@ -121,7 +120,6 @@ public class DeleteCustomE2EServiceInstance extends AbstractServiceTaskProcessor
        }
 
        public void sendSyncResponse (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
                msoLogger.trace("Staring sendSyncResponse")
 
                try {
@@ -166,7 +164,6 @@ public class DeleteCustomE2EServiceInstance extends AbstractServiceTaskProcessor
        }
        
        public void prepareCompletionRequest (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
                msoLogger.trace("Starting prepareCompletion")
 
                try {
@@ -339,8 +336,7 @@ public class DeleteCustomE2EServiceInstance extends AbstractServiceTaskProcessor
         * Init the service Operation Status
         */
        public void prepareInitServiceOperationStatus(DelegateExecution execution){
-               def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-               utils.log("DEBUG", " ======== STARTED prepareInitServiceOperationStatus Process ======== ", isDebugEnabled)
+               msoLogger.debug("======== STARTED prepareInitServiceOperationStatus Process ======== ")
                try{
                        String serviceId = execution.getVariable("serviceInstanceId")
                        String operationId = execution.getVariable("operationId")
@@ -349,12 +345,12 @@ public class DeleteCustomE2EServiceInstance extends AbstractServiceTaskProcessor
                        String progress = "0"
                        String reason = ""
                        String operationContent = "Prepare service creation"
-                       utils.log("DEBUG", "Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId, isDebugEnabled)
+                       msoLogger.debug("Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId)
                        serviceId = UriUtils.encode(serviceId,"UTF-8")
 
                        def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
                        execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
-                       utils.log("DEBUG", "DB Adapter Endpoint is: " + dbAdapterEndpoint, isDebugEnabled)
+                       msoLogger.debug("DB Adapter Endpoint is: " + dbAdapterEndpoint)
 
                        String payload =
                                        """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
@@ -376,12 +372,12 @@ public class DeleteCustomE2EServiceInstance extends AbstractServiceTaskProcessor
 
                        payload = utils.formatXml(payload)
                        execution.setVariable("CVFMI_updateServiceOperStatusRequest", payload)
-                       utils.log("DEBUG", "Outgoing updateServiceOperStatusRequest: \n" + payload, isDebugEnabled)
+                       msoLogger.debug("Outgoing updateServiceOperStatusRequest: \n" + payload)
 
                }catch(Exception e){
-                       utils.log("ERROR", "Exception Occured Processing prepareInitServiceOperationStatus. Exception is:\n" + e, isDebugEnabled)
+                       msoLogger.error("Exception Occured Processing prepareInitServiceOperationStatus. Exception is:\n" + e)
                        execution.setVariable("CVFMI_ErrorResponse", "Error Occurred during prepareInitServiceOperationStatus Method:\n" + e.getMessage())
                }
-               utils.log("DEBUG", "======== COMPLETED prepareInitServiceOperationStatus Process ======== ", isDebugEnabled)
+               msoLogger.debug("======== COMPLETED prepareInitServiceOperationStatus Process ======== ")
        }
 }
index 9c9ed93..24071d3 100644 (file)
 package org.onap.so.bpmn.infrastructure.scripts;
 
 import static org.apache.commons.lang3.StringUtils.*;
-import groovy.xml.XmlUtil
-import groovy.json.*
 
 import org.onap.so.bpmn.core.domain.ServiceDecomposition
-import org.onap.so.bpmn.core.domain.ServiceInstance
-import org.onap.so.bpmn.core.domain.ModelInfo
 import org.onap.so.bpmn.core.domain.Resource
-import org.onap.so.bpmn.core.domain.AllottedResource
-import org.onap.so.bpmn.core.domain.NetworkResource
-import org.onap.so.bpmn.core.domain.VnfResource
-import org.onap.so.bpmn.common.recipe.ResourceInput
-import org.onap.so.bpmn.common.recipe.BpmnRestClient
 import org.onap.so.bpmn.core.json.JsonUtils
-import org.onap.so.bpmn.common.scripts.AaiUtil
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
-import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
-import org.onap.so.bpmn.common.scripts.CatalogDbUtils;
-import org.onap.so.bpmn.core.RollbackData
-import org.onap.so.bpmn.core.WorkflowException
 
-import java.util.List;
-import java.util.UUID;
-
-import org.camunda.bpm.engine.delegate.BpmnError
-import org.camunda.bpm.engine.runtime.Execution
 import org.camunda.bpm.engine.delegate.DelegateExecution
-import org.json.JSONObject;
-import org.json.JSONArray;
-import org.apache.commons.lang3.*
-import org.apache.commons.codec.binary.Base64;
-import org.springframework.web.util.UriUtils;
-import org.onap.so.logger.MessageEnum
-import org.onap.so.logger.MsoLogger
-
-
 
 /**
  * This groovy class supports the <class>DoCompareModelVersions.bpmn</class> process.
@@ -76,7 +48,6 @@ public class DoCompareModelVersions extends AbstractServiceTaskProcessor {
        String Prefix="DCMPMDV_"
        ExceptionUtil exceptionUtil = new ExceptionUtil()
        JsonUtils jsonUtil = new JsonUtils()
-       CatalogDbUtils cutils = new CatalogDbUtils()
 
        public void preProcessRequest (DelegateExecution execution) {
                def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
index 194e7ff..2168dab 100644 (file)
@@ -24,12 +24,10 @@ import static org.apache.commons.lang3.StringUtils.*;
 
 import javax.ws.rs.NotFoundException
 
-import org.apache.commons.lang3.*
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.onap.aai.domain.yang.ServiceInstance
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
-import org.onap.so.bpmn.common.scripts.CatalogDbUtils;
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.MsoUtils
 import org.onap.so.bpmn.core.RollbackData
@@ -37,7 +35,6 @@ import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.bpmn.core.domain.Resource
 import org.onap.so.bpmn.core.domain.ServiceDecomposition
 import org.onap.so.bpmn.core.json.JsonUtils
-import org.onap.so.bpmn.infrastructure.workflow.service.ServicePluginFactory
 import org.onap.so.client.aai.AAIObjectType
 import org.onap.so.client.aai.AAIResourcesClient
 import org.onap.so.client.aai.entities.AAIResultWrapper
@@ -50,10 +47,6 @@ import org.onap.so.logger.MsoLogger
 import org.springframework.web.util.UriUtils
 import org.onap.so.bpmn.core.UrnPropertiesReader
 
-import groovy.json.*
-
-
-
 /**
  * This groovy class supports the <class>DoCreateServiceInstance.bpmn</class> process.
  *
@@ -86,7 +79,6 @@ public class DoCreateE2EServiceInstance extends AbstractServiceTaskProcessor {
        String Prefix="DCRESI_"
        ExceptionUtil exceptionUtil = new ExceptionUtil()
        JsonUtils jsonUtil = new JsonUtils()
-       CatalogDbUtils cutils = new CatalogDbUtils()
 
        public void preProcessRequest (DelegateExecution execution) {
                String msg = ""
index c949716..1b64671 100644 (file)
@@ -527,6 +527,7 @@ public class DoCreateNetworkInstance extends AbstractServiceTaskProcessor {
                        L3Network network = client.get(uri, NotFoundException.class).asBean(L3Network.class).get()
 
                        execution.setVariable(Prefix + "aaiRequeryIdReturnCode", "200")
+                       execution.setVariable(Prefix + "requeryIdAAIResponse", network)
 
                        String netName = network.getNetworkName()
                        String networkOutputs =
@@ -764,29 +765,26 @@ public class DoCreateNetworkInstance extends AbstractServiceTaskProcessor {
 
                execution.setVariable("prefix",Prefix)
 
-               msoLogger.debug(" ***** Inside callRESTUpdateContrailAAINetwork() of DoCreateNetworkInstance ***** " )
+               msoLogger.trace(" ***** Inside callRESTUpdateContrailAAINetwork() of DoCreateNetworkInstance ***** " )
 
                try {
                        // get variables
                        String networkId   = execution.getVariable(Prefix + "networkId")
-                       String requeryIdAAIResponse   = execution.getVariable(Prefix + "requeryIdAAIResponse")
+                       L3Network requeryIdAAIResponse   = execution.getVariable(Prefix + "requeryIdAAIResponse")
                        String createNetworkResponse   = execution.getVariable(Prefix + "createNetworkResponse")
 
                        L3Network l3Network = new L3Network()
-                       if (utils.nodeExists(requeryIdAAIResponse, 'heat-stack-id')) {
-                       } else {
+                       if (StringUtils.isBlank(requeryIdAAIResponse.getHeatStackId())) {
                                if (utils.nodeExists(createNetworkResponse, 'networkStackId')) {
                                        l3Network.setHeatStackId(utils.getNodeText(createNetworkResponse, 'networkStackId'))
                                }
                        }
-                       if (utils.nodeExists(requeryIdAAIResponse, 'neutron-network-id')) {
-                       } else {
+                       if (StringUtils.isBlank(requeryIdAAIResponse.getNeutronNetworkId())) {
                                if (utils.nodeExists(createNetworkResponse, 'neutronNetworkId')) {
                                        l3Network.setNeutronNetworkId(utils.getNodeText(createNetworkResponse, 'neutronNetworkId'))
                                }
                        }
-                       if (utils.nodeExists(requeryIdAAIResponse, 'contrail-network-fqdn')) {
-                       } else {
+                       if (StringUtils.isBlank(requeryIdAAIResponse.getContrailNetworkFqdn())) {
                                if (utils.nodeExists(createNetworkResponse, 'networkFqdn')) {
                                        l3Network.setContrailNetworkFqdn(utils.getNodeText(createNetworkResponse, 'networkFqdn'))
                                }
@@ -794,39 +792,33 @@ public class DoCreateNetworkInstance extends AbstractServiceTaskProcessor {
 
                        String status = utils.getNodeText(createNetworkResponse, 'orchestration-status')
                        if(status.equals("pending-create") || status.equals("PendingCreate")){
-                               l3Network.setOperationalStatus("Created")
+                               l3Network.setOrchestrationStatus("Created")
                        }else{
-                               l3Network.setOperationalStatus("Active")
+                               l3Network.setOrchestrationStatus("Active")
                        }
 
+                       msoLogger.debug("Updating l3-network in AAI" )
+
                        AAIResourcesClient client = new AAIResourcesClient()
                        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId)
                        client.update(uri, l3Network)
 
-                       String subnetsXml = utils.getNodeXml(requeryIdAAIResponse, "subnets")
-                       InputSource source = new InputSource(new StringReader(subnetsXml));
-                       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
-                       docFactory.setNamespaceAware(true)
-                       DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
-                       Document xml = docBuilder.parse(source)
-                       NodeList nodeList = xml.getElementsByTagNameNS("*", "subnet")
-                       for (int x = 0; x < nodeList.getLength(); x++) {
-                               Node node = nodeList.item(x)
-                               if (node.getNodeType() == Node.ELEMENT_NODE) {
-                                       Element eElement = (Element) node
-                                       String subnetOrchStatus = eElement.getElementsByTagNameNS("*", "orchestration-status").item(0).getTextContent()
-                                       String subnetId = eElement.getElementsByTagNameNS("*", "subnet-id").item(0).getTextContent()
+                       if(requeryIdAAIResponse.getSubnets() != null){
+                               for(Subnet s:requeryIdAAIResponse.getSubnets().getSubnet()){
+                                       String subnetOrchStatus = s.getOrchestrationStatus()
+                                       String subnetId = s.getSubnetId()
                                        Subnet subnet = new Subnet()
-                                       String neutronSubnetId = networkUtils.extractNeutSubId(createNetworkResponse, subnetId)
-                                       subnet.setNeutronSubnetId(neutronSubnetId)
+                                       subnet.setNeutronSubnetId(networkUtils.extractNeutSubId(createNetworkResponse, subnetId))
                                        if(subnetOrchStatus.equals("pending-create") || subnetOrchStatus.equals("PendingCreate") ){
                                                subnet.setOrchestrationStatus("Created")
                                        }else{
                                                subnet.setOrchestrationStatus("Active")
                                        }
 
+                                       msoLogger.debug("Updating subnet in AAI" )
                                        AAIResourceUri subUri = AAIUriFactory.createResourceUri(AAIObjectType.SUBNET, networkId, subnetId)
                                        client.update(subUri, subnet)
+
                                }
                        }
 
@@ -868,7 +860,7 @@ public class DoCreateNetworkInstance extends AbstractServiceTaskProcessor {
                        String source    = execution.getVariable(Prefix + "source")
 
                        String requestInput = execution.getVariable(Prefix + "networkRequest")
-                       String queryIdResponse = execution.getVariable(Prefix + "queryIdAAIResponse")
+                       L3Network queryIdResponse = execution.getVariable(Prefix + "queryIdAAIResponse")
                        String cloudRegionId = execution.getVariable(Prefix + "cloudRegionPo")
                        String backoutOnFailure = execution.getVariable(Prefix + "rollbackEnabled")
 
index 1d75d39..fd6a4a1 100644 (file)
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.bpmn.infrastructure.scripts;
+package org.onap.so.bpmn.infrastructure.scripts
 
-import groovy.xml.XmlUtil
 
-import groovy.json.*
 import org.onap.so.bpmn.core.UrnPropertiesReader
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
 import org.onap.so.logger.MsoLogger
-import org.onap.so.logger.MessageEnum
-
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.NetworkUtils
@@ -37,13 +34,9 @@ import org.onap.so.bpmn.common.scripts.VidUtils
 import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.utils.TargetEntity
 
-import java.util.UUID;
 import javax.ws.rs.core.Response
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
-import org.apache.commons.lang3.*
-import org.apache.commons.codec.binary.Base64;
-import org.springframework.web.util.UriUtils
 
 /**
  * This groovy class supports the <class>DoCreateNetworkInstance.bpmn</class> process.
@@ -203,7 +196,7 @@ public class DoCreateNetworkInstanceRollback extends AbstractServiceTaskProcesso
                        execution.setVariable(Prefix + "urlRollbackPoNetwork", urlRollbackPoNetwork)
 
                        URL url = new URL(urlRollbackPoNetwork)
-                       HttpClient httpClient = new HttpClient(url, "application/xml", TargetEntity.OPENSTACK_ADAPTER)
+                       HttpClient httpClient = new HttpClientFactory().newXmlClient(url, TargetEntity.OPENSTACK_ADAPTER)
                        httpClient.addAdditionalHeader("Authorization", execution.getVariable("BasicAuthHeaderValuePO"))
                        Response response = httpClient.delete(rollbackNetworkRequest)
 
index 7707903..aa1eed9 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
 import org.onap.so.bpmn.infrastructure.properties.BPMNProperties
-
-import java.util.ArrayList
-import java.util.Iterator
-import java.util.List
 import org.apache.commons.lang3.StringUtils
 import org.apache.http.HttpResponse
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
-import org.codehaus.groovy.runtime.ArrayUtil
-import org.codehaus.groovy.runtime.ScriptBytecodeAdapter
-import org.codehaus.groovy.runtime.callsite.CallSite
-import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation
-import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling
-import org.json.JSONArray
 import org.json.JSONObject
 import org.onap.so.bpmn.common.recipe.BpmnRestClient
 import org.onap.so.bpmn.common.recipe.ResourceInput
@@ -48,7 +39,6 @@ import org.onap.so.bpmn.core.domain.ServiceDecomposition
 import org.onap.so.bpmn.core.domain.VnfResource
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
-import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 
 
@@ -75,7 +65,7 @@ public class DoCreateResources extends AbstractServiceTaskProcessor{
 
     ExceptionUtil exceptionUtil = new ExceptionUtil()
     JsonUtils jsonUtil = new JsonUtils()
-    CatalogDbUtils cutils = new CatalogDbUtils()
+    CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
 
     public void preProcessRequest(DelegateExecution execution) {
         msoLogger.trace("preProcessRequest ")
@@ -260,18 +250,17 @@ public class DoCreateResources extends AbstractServiceTaskProcessor{
             // requestAction is action, not opertiontype
             //String requestAction = resourceInput.getOperationType()
             String requestAction = "createInstance"
-            JSONObject resourceRecipe = cutils.getResourceRecipe(execution, resourceModelUUID, requestAction)
+            JSONObject resourceRecipe = catalogDbUtils.getResourceRecipe(execution, resourceModelUUID, requestAction)
 
             if (resourceRecipe != null) {
-                String recipeURL = BPMNProperties.getProperty("bpelURL", "http://mso:8080") + resourceRecipe.getString("orchestrationUri")
+                String recipeURL = BPMNProperties.getProperty("bpelURL", "http://so-bpmn-infra.onap:8081") + resourceRecipe.getString("orchestrationUri")
                 int recipeTimeOut = resourceRecipe.getInt("recipeTimeout")
                 String recipeParamXsd = resourceRecipe.get("paramXSD")
 
                 BpmnRestClient bpmnRestClient = new BpmnRestClient()
                 HttpResponse resp = bpmnRestClient.post(recipeURL, requestId, recipeTimeOut, requestAction, serviceInstanceId, serviceType, resourceInput, recipeParamXsd)
             } else {
-                String exceptionMessage = "Resource receipe is not found for resource modeluuid: " +
-                        resourceInput.getResourceModelInfo().getModelUuid()
+                String exceptionMessage = "Resource receipe is not found for resource modeluuid: " + resourceModelUUID
                 msoLogger.trace(exceptionMessage)
                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, exceptionMessage)
             }
index 4bda803..c04bbd4 100644 (file)
@@ -22,13 +22,12 @@ package org.onap.so.bpmn.infrastructure.scripts;
 
 import static org.apache.commons.lang3.StringUtils.*;
 
-import org.apache.commons.lang3.*
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.onap.aai.domain.yang.OwningEntity
-import org.onap.so.bpmn.common.scripts.AaiUtil
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
+import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.MsoUtils
 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
@@ -42,16 +41,11 @@ import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.bpmn.infrastructure.aai.groovyflows.AAICreateResources
 import org.onap.so.client.aai.AAIObjectType
 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.AAIUri
 import org.onap.so.client.aai.entities.uri.AAIUriFactory
-import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 
-
-import groovy.json.*
-
 /**
  * This groovy class supports the <class>DoCreateServiceInstance.bpmn</class> process.
  *
@@ -84,7 +78,7 @@ public class DoCreateServiceInstance extends AbstractServiceTaskProcessor {
        String Prefix="DCRESI_"
        ExceptionUtil exceptionUtil = new ExceptionUtil()
        JsonUtils jsonUtil = new JsonUtils()
-       CatalogDbUtils cutils = new CatalogDbUtils()
+       CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
 
        public void preProcessRequest (DelegateExecution execution) {
                def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
@@ -330,7 +324,7 @@ public class DoCreateServiceInstance extends AbstractServiceTaskProcessor {
                        String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
 
                        try{
-                                String json = cutils.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
+                                String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
 
                                 msoLogger.debug("JSON IS: "+json)
 
index a3c30dc..33d0e25 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.so.client.HttpClientFactory
 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;
@@ -31,10 +32,10 @@ import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
 import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
+import org.onap.so.bpmn.core.UrnPropertiesReader
 
 import org.onap.so.utils.TargetEntity
 
-import groovy.json.*
 import javax.ws.rs.core.Response
 
 /**
@@ -44,9 +45,6 @@ import javax.ws.rs.core.Response
 public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProcessor {
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoCreateVFCNetworkServiceInstance.class);
 
-    String vfcUrl = "/vfc/rest/v1/vfcadapter"
-
-    String host = "http://mso.mso.testlab.openecomp.org:8080"
 
     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
@@ -100,6 +98,19 @@ public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProces
            execution.setVariable("nsOperationKey", nsOperationKey);
            execution.setVariable("nsParameters", nsParameters)
 
+           String vfcAdapterUrl = UrnPropertiesReader.getVariable("mso.adapters.vfc.rest.endpoint", execution)
+                  
+           if (vfcAdapterUrl == null || vfcAdapterUrl.isEmpty()) {
+               msg = getProcessKey(execution) + ': mso:adapters:vfcc:rest:endpoint URN mapping is not defined'
+               msoLogger.debug(msg)
+           }
+
+           while (vfcAdapterUrl.endsWith('/')) {
+               vfcAdapterUrl = vfcAdapterUrl.substring(0, vfcAdapterUrl.length()-1)
+           }
+                  
+           execution.setVariable("vfcAdapterUrl", vfcAdapterUrl)
+
 
        } catch (BpmnError e) {
            throw e;
@@ -116,6 +127,7 @@ public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProces
      */
     public void createNetworkService(DelegateExecution execution) {
         msoLogger.trace("createNetworkService")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String nsOperationKey = execution.getVariable("nsOperationKey");
         String nsParameters = execution.getVariable("nsParameters");
         String nsServiceName = execution.getVariable("nsServiceName")
@@ -126,7 +138,7 @@ public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProces
                 "nsOperationKey":${nsOperationKey},
                 "nsParameters":${nsParameters}
                }"""
-        Response apiResponse = postRequest(execution, host + vfcUrl + "/ns", reqBody)
+        Response apiResponse = postRequest(execution, vfcAdapterUrl + "/ns", reqBody)
         String returnCode = apiResponse.getStatus()
         String aaiResponseAsString = apiResponse.readEntity(String.class)
         String nsInstanceId = "";
@@ -142,6 +154,7 @@ public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProces
      */
     public void instantiateNetworkService(DelegateExecution execution) {
         msoLogger.trace("instantiateNetworkService")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String nsOperationKey = execution.getVariable("nsOperationKey");
         String nsParameters = execution.getVariable("nsParameters");
         String nsServiceName = execution.getVariable("nsServiceName")
@@ -153,7 +166,7 @@ public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProces
         "nsParameters":${nsParameters}
        }"""
         String nsInstanceId = execution.getVariable("nsInstanceId")
-        String url = host + vfcUrl + "/ns/" +nsInstanceId + "/instantiate"
+        String url = vfcAdapterUrl + "/ns/" +nsInstanceId + "/instantiate"
         Response apiResponse = postRequest(execution, url, reqBody)
         String returnCode = apiResponse.getStatus()
         String aaiResponseAsString = apiResponse.readEntity(String.class)
@@ -170,9 +183,10 @@ public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProces
      */
     public void queryNSProgress(DelegateExecution execution) {
         msoLogger.trace("queryNSProgress")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String jobId = execution.getVariable("jobId")
         String nsOperationKey = execution.getVariable("nsOperationKey");
-        String url = host + vfcUrl + "/jobs/" + jobId
+        String url = vfcAdapterUrl + "/jobs/" + jobId
         Response apiResponse = postRequest(execution, url, nsOperationKey)
         String returnCode = apiResponse.getStatus()
         String aaiResponseAsString = apiResponse.readEntity(String.class)
@@ -233,17 +247,20 @@ public class DoCreateVFCNetworkServiceInstance extends AbstractServiceTaskProces
         try{
 
                        URL url = new URL(urlString);
+            
+            // Get the Basic Auth credentials for the VFCAdapter, username is 'bpel', auth is '07a7159d3bf51a0e53be7a8f89699be7'
+            // user 'bepl' authHeader is the same with mso.db.auth
+            String basicAuthValuedb =  UrnPropertiesReader.getVariable("mso.db.auth", execution)
+            HttpClient httpClient = new HttpClientFactory().newJsonClient(url, TargetEntity.VNF_ADAPTER)
+            httpClient.addAdditionalHeader("Accept", "application/json")
+            httpClient.addAdditionalHeader("Authorization", basicAuthValuedb)
 
-                       HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.VNF_ADAPTER)
-                       httpClient.addAdditionalHeader("Accept", "application/json")
-                       httpClient.addAdditionalHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk")
-
-                       apiResponse = httpClient.post(requestBody)
+            apiResponse = httpClient.post(requestBody)
 
             msoLogger.debug("response code:"+ apiResponse.getStatus() +"\nresponse body:"+ apiResponse.readEntity(String.class))
             msoLogger.trace("Completed Execute VF-C adapter Post Process")
         }catch(Exception e){
-                       msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception occured while executing AAI Post Call", "BPMN", MsoLogger.getServiceName(),MsoLogger.ErrorCode.UnknownError, "Exception is:\n" + e);
+                       msoLogger.error("Exception occured while executing VFC Adapter Post Call"  + e.getMessage ());
             throw new BpmnError("MSOWorkflowException")
         }
         return apiResponse
index 50fe75e..089239f 100644 (file)
@@ -20,6 +20,9 @@
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
+import org.onap.so.client.HttpClientFactory
+
 import javax.ws.rs.core.MediaType
 import javax.ws.rs.core.Response
 import javax.xml.parsers.DocumentBuilder
@@ -42,9 +45,7 @@ import org.onap.so.bpmn.core.RollbackData
 import org.onap.so.bpmn.core.UrnPropertiesReader
 import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.bpmn.core.domain.VnfResource
-import org.onap.so.bpmn.core.json.DecomposeJsonUtil
 import org.onap.so.bpmn.core.json.JsonUtils
-import org.onap.so.client.graphinventory.entities.uri.Depth
 import org.onap.so.client.HttpClient
 import org.onap.so.client.aai.AAIObjectPlurals
 import org.onap.so.client.aai.AAIObjectType;
@@ -59,7 +60,6 @@ import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 
 import org.onap.so.utils.TargetEntity
-import org.springframework.web.util.UriUtils
 import org.w3c.dom.Document
 import org.w3c.dom.Element
 import org.w3c.dom.NamedNodeMap
@@ -78,8 +78,8 @@ public class DoCreateVfModule extends VfModuleBase {
        ExceptionUtil exceptionUtil = new ExceptionUtil()
        JsonUtils jsonUtil = new JsonUtils()
        SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
-       CatalogDbUtils catalog = new CatalogDbUtils()
-       DecomposeJsonUtil decomposeJsonUtils = new DecomposeJsonUtil()
+       CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
+       private final HttpClientFactory httpClientFactory = new HttpClientFactory()
 
        /**
         * Validates the request message and sets up the workflow.
@@ -261,7 +261,7 @@ public class DoCreateVfModule extends VfModuleBase {
                                String serviceType =""
 
                                try{
-                                       String json = catalog.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
+                                       String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
                                        serviceType = jsonUtil.getJsonValue(json, "serviceResources.serviceType")
                                }catch(BpmnError e){
                                        throw e
@@ -642,7 +642,7 @@ public class DoCreateVfModule extends VfModuleBase {
                        String endPoint = aaiUriUtil.createAaiUri(uri)
 
                        try {
-                               HttpClient client = new HttpClient(new URL(endPoint), MediaType.APPLICATION_XML, TargetEntity.AAI)
+                               HttpClient client = httpClientFactory.newXmlClient(new URL(endPoint), TargetEntity.AAI)
                                client.addAdditionalHeader('X-TransactionId', UUID.randomUUID().toString())
                                client.addAdditionalHeader('X-FromAppId', 'MSO')
                                client.addAdditionalHeader('Content-Type', MediaType.APPLICATION_XML)
@@ -724,7 +724,7 @@ public class DoCreateVfModule extends VfModuleBase {
                        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, vnfId).queryParam("vf-module-name",vfModuleName)
                        String endPoint = aaiUriUtil.createAaiUri(uri)
 
-                       HttpClient client = new HttpClient(new URL(endPoint), MediaType.APPLICATION_XML, TargetEntity.AAI)
+                       HttpClient client = httpClientFactory.newXmlClient(new URL(endPoint), TargetEntity.AAI)
                        client.addAdditionalHeader('X-TransactionId', UUID.randomUUID().toString())
                        client.addAdditionalHeader('X-FromAppId', 'MSO')
                        client.addAdditionalHeader('Content-Type', MediaType.APPLICATION_XML)
@@ -2004,7 +2004,7 @@ public class DoCreateVfModule extends VfModuleBase {
 
                   msoLogger.debug("vnfModelCustomizationUuid: " + vnfModelCustomizationUuid)
 
-                  JSONArray vnfs = catalog.getAllVnfsByVnfModelCustomizationUuid(execution, vnfModelCustomizationUuid, "v2")
+                  JSONArray vnfs = catalogDbUtils.getAllVnfsByVnfModelCustomizationUuid(execution, vnfModelCustomizationUuid, "v2")
 
                   msoLogger.debug("Incoming Query Catalog DB for Vnf Response is: " + vnfModelCustomizationUuid)
                   // Only one match here
index 93379c7..b42962a 100644 (file)
@@ -24,6 +24,7 @@ import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.onap.aai.domain.yang.GenericVnf
 import org.onap.aai.domain.yang.VolumeGroup
+import org.onap.aai.domain.yang.VolumeGroups
 import org.onap.so.bpmn.common.scripts.AaiUtil
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.MsoUtils
@@ -216,10 +217,11 @@ class DoCreateVfModuleVolumeV2 extends VfModuleBase {
 
                try {
                        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VOLUME_GROUP, Defaults.CLOUD_OWNER.toString(), cloudRegion).queryParam("volume-group-name", volumeGroupName)
-                       Optional<VolumeGroup> volumeGroup = getAAIClient().get(VolumeGroup.class,uri)
-                       if(volumeGroup.isPresent()){
+                       Optional<VolumeGroups> volumeGroups = getAAIClient().get(VolumeGroups.class,uri)
+                       if(volumeGroups.isPresent()){
+                               VolumeGroup volumeGroup = volumeGroups.get().getVolumeGroup().get(0);
                                execution.setVariable(prefix+'AaiReturnCode', 200)
-                               execution.setVariable("queriedVolumeGroupId",volumeGroup.get().getVolumeGroupId())
+                               execution.setVariable("queriedVolumeGroupId",volumeGroup.getVolumeGroupId())
                                msoLogger.debug("Volume Group Name $volumeGroupName exists in AAI.")
                        }else{
                                execution.setVariable(prefix+'AaiReturnCode', 404)
@@ -298,6 +300,7 @@ class DoCreateVfModuleVolumeV2 extends VfModuleBase {
                        getAAIClient().create(volumeGroupUri, volumeGroup)
                        getAAIClient().connect(volumeGroupUri, vnfUri)
                        getAAIClient().connect(volumeGroupUri, tenantUri)
+                       execution.setVariable("queriedVolumeGroupId", volumeGroupId)
                        RollbackData rollbackData = execution.getVariable("rollbackData")
                        rollbackData.put("DCVFMODULEVOL", "isAAIRollbackNeeded", "true")
                } catch (NotFoundException ignored) {
index d3dbd91..232336b 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.scripts
 
-import java.util.UUID;
-
-import java.util.List
-
 import org.json.JSONObject;
 import org.json.JSONArray;
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
+import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.VidUtils
 import org.onap.so.bpmn.core.RollbackData
@@ -59,7 +56,7 @@ class DoCreateVnfAndModules extends AbstractServiceTaskProcessor {
    ExceptionUtil exceptionUtil = new ExceptionUtil()
    JsonUtils jsonUtil = new JsonUtils()
    VidUtils vidUtils = new VidUtils(this)
-   CatalogDbUtils cutils = new CatalogDbUtils()
+   CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
 
    /**
        * This method gets and validates the incoming
@@ -189,8 +186,8 @@ class DoCreateVnfAndModules extends AbstractServiceTaskProcessor {
                           }
                           msoLogger.debug("querying Catalog DB by vnfModelCustomizationUuid: " + vnfModelCustomizationUuid)
                          
-                          JSONArray vnfs = cutils.getAllVnfsByVnfModelCustomizationUuid(execution,
-                                                          vnfModelCustomizationUuid)
+                          JSONArray vnfs = catalogDbUtils.getAllVnfsByVnfModelCustomizationUuid(execution,
+                                                          vnfModelCustomizationUuid, "v1")
                           msoLogger.debug("obtained VNF list")
                           // Only one match here
                           JSONObject vnfObject = vnfs[0]
index a981abf..48f255b 100644 (file)
  */
 package org.onap.so.bpmn.infrastructure.scripts
 
-import static org.apache.commons.lang3.StringUtils.*;
-
-import javax.ws.rs.core.Response
-import javax.xml.parsers.DocumentBuilder
-import javax.xml.parsers.DocumentBuilderFactory
-
-import org.apache.commons.lang3.*
+import groovy.json.JsonOutput
+import groovy.json.JsonSlurper
+import org.apache.commons.lang3.StringUtils
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.json.JSONArray
 import org.json.JSONObject
-
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.MsoUtils
+import org.onap.so.bpmn.core.UrnPropertiesReader
 import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.bpmn.core.domain.Resource
 import org.onap.so.bpmn.core.domain.ServiceDecomposition
-import org.onap.so.bpmn.core.UrnPropertiesReader
-
-import org.onap.so.utils.TargetEntity
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
+import org.onap.so.logger.MsoLogger
+import org.onap.so.utils.TargetEntity
 import org.springframework.web.util.UriUtils
 import org.w3c.dom.Document
-import org.w3c.dom.Element
 import org.w3c.dom.Node
-import org.w3c.dom.NodeList
 import org.xml.sax.InputSource
 
-import groovy.json.*
+import javax.ws.rs.core.Response
+import javax.xml.parsers.DocumentBuilder
+import javax.xml.parsers.DocumentBuilderFactory
+
+import static org.apache.commons.lang3.StringUtils.isBlank
 
 /**
  * This groovy class supports the <class>DoDeleteE2EServiceInstance.bpmn</class> process.
@@ -78,10 +76,11 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
        String Prefix="DDEESI_"
     ExceptionUtil exceptionUtil = new ExceptionUtil()
     JsonUtils jsonUtil = new JsonUtils()
+    private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoDeleteE2EServiceInstance.class);
+
 
     public void preProcessRequest (DelegateExecution execution) {
-        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-        utils.log("INFO"," ***** preProcessRequest *****",  isDebugEnabled)
+        msoLogger.debug(" ***** preProcessRequest *****")
         String msg = ""
 
         try {
@@ -107,23 +106,23 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
             String serviceInstanceId = execution.getVariable("serviceInstanceId")
             if (isBlank(serviceInstanceId)){
                 msg = "Input serviceInstanceId is null"
-                utils.log("INFO", msg, isDebugEnabled)
+                msoLogger.info(msg)
                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
             }
 
-            String sdncCallbackUrl = execution.getVariable('URN_mso_workflow_sdncadapter_callback')
+            String sdncCallbackUrl = UrnPropertiesReader.getVariable('URN_mso_workflow_sdncadapter_callback', execution)
             if (isBlank(sdncCallbackUrl)) {
                 msg = "URN_mso_workflow_sdncadapter_callback is null"
-                utils.log("INFO", msg, isDebugEnabled)
+                msoLogger.info(msg)
                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
             }
             execution.setVariable("sdncCallbackUrl", sdncCallbackUrl)
-            utils.log("INFO","SDNC Callback URL: " + sdncCallbackUrl, isDebugEnabled)
+            msoLogger.info("SDNC Callback URL: " + sdncCallbackUrl)
 
             StringBuilder sbParams = new StringBuilder()
             Map<String, String> paramsMap = execution.getVariable("serviceInputParams")
-            if (paramsMap != null)
-            {
+
+            if (paramsMap != null) {
                 sbParams.append("<service-input-parameters>")
                 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
                     String paramsXml
@@ -148,15 +147,14 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
             throw e;
         } catch (Exception ex){
             msg = "Exception in preProcessRequest " + ex.getMessage()
-            utils.log("INFO", msg, isDebugEnabled)
+            msoLogger.error(msg)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
         }
-        utils.log("INFO"," ***** Exit preProcessRequest *****",  isDebugEnabled)
+        msoLogger.debug("***** Exit preProcessRequest *****")
     }
 
     public void postProcessAAIGET(DelegateExecution execution) {
-        def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
-        utils.log("INFO"," ***** postProcessAAIGET ***** ", isDebugEnabled)
+        msoLogger.debug(" ***** postProcessAAIGET ***** ")
         String msg = ""
 
         try {
@@ -165,14 +163,14 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
             String serviceType = ""
 
             if(foundInAAI){
-                utils.log("INFO","Found Service-instance in AAI", isDebugEnabled)
+                msoLogger.debug("Found Service-instance in AAI")
 
                 String siData = execution.getVariable("GENGS_service")
-                utils.log("INFO", "SI Data", isDebugEnabled)
+                msoLogger.debug("SI Data")
                 if (isBlank(siData))
                 {
                     msg = "Could not retrive ServiceInstance data from AAI to delete id:" + serviceInstanceId
-                    utils.log("INFO", msg, isDebugEnabled)
+                    msoLogger.error(msg)
                     exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
                 }
                 else
@@ -185,7 +183,7 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
                     // get model invariant id
                     // Get Template uuid and version
                     if (utils.nodeExists(siData, "model-invariant-id") && utils.nodeExists(siData, "model-version-id") ) {
-                        utils.log("INFO", "SI Data model-invariant-id and model-version-id exist:", isDebugEnabled)
+                        msoLogger.debug("SI Data model-invariant-id and model-version-id exist")
                         def modelInvariantId  = serviceXml.getElementsByTagName("model-invariant-id").item(0).getTextContent()
                         def modelVersionId  = serviceXml.getElementsByTagName("model-version-id").item(0).getTextContent()
 
@@ -194,10 +192,10 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
                         execution.setVariable("model-version-id-original", modelVersionId)
                     }
 
-                    utils.log("INFO", "SI Data" + siData, isDebugEnabled)
+                    msoLogger.debug("SI Data" + siData)
                     //Confirm there are no related service instances (vnf/network or volume)
                     if (utils.nodeExists(siData, "relationship-list")) {
-                        utils.log("INFO", "SI Data relationship-list exists:", isDebugEnabled)
+                        msoLogger.debug("SI Data relationship-list exists")
                         JSONArray jArray = new JSONArray()
 
                         XmlParser xmlParser = new XmlParser()
@@ -211,109 +209,35 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
                         }
 
                         execution.setVariable("serviceRelationShip", jArray.toString())
-
-//                        //test(siData)
-//                        NodeList nodeList = serviceXml.getElementsByTagName("relationship")
-//                        JSONArray jArray = new JSONArray()
-//                        for (int x = 0; x < nodeList.getLength(); x++) {
-//                            Node node = nodeList.item(x)
-//                            if (node.getNodeType() == Node.ELEMENT_NODE) {
-//                                Element eElement = (Element) node
-//                                def e = eElement.getElementsByTagName("related-to").item(0).getTextContent()                                                                 //for ns
-//                                if(e.equals("service-instance")){
-//                                    def relatedObject = eElement.getElementsByTagName("related-link").item(0).getTextContent()
-//                                    utils.log("INFO", "ServiceInstance Related NS :" + relatedObject, isDebugEnabled)
-//                                    NodeList dataList = node.getChildNodes()
-//                                    if(null != dataList) {
-//                                        JSONObject jObj = new JSONObject()
-//                                        for (int i = 0; i < dataList.getLength(); i++) {
-//                                            Node dNode = dataList.item(i)
-//                                            if(dNode.getNodeName() == "relationship-data") {
-//                                                Element rDataEle = (Element)dNode
-//                                                def eKey =  rDataEle.getElementsByTagName("relationship-key").item(0).getTextContent()
-//                                                def eValue = rDataEle.getElementsByTagName("relationship-value").item(0).getTextContent()
-//                                                if(eKey.equals("service-instance.service-instance-id")){
-//                                                    jObj.put("resourceInstanceId", eValue)
-//                                                }
-//
-//                                            }
-//                                            else if(dNode.getNodeName() == "related-to-property"){
-//                                                Element rDataEle = (Element)dNode
-//                                                def eKey =  rDataEle.getElementsByTagName("property-key").item(0).getTextContent()
-//                                                def eValue = rDataEle.getElementsByTagName("property-value").item(0).getTextContent()
-//                                                if(eKey.equals("service-instance.service-instance-name")){
-//                                                    jObj.put("resourceType", eValue)
-//                                                }
-//                                            }
-//                                        }
-//                                        utils.log("INFO", "Relationship related to Resource:" + jObj.toString(), isDebugEnabled)
-//                                        jArray.put(jObj)
-//                                    }
-//                                    //for overlay/underlay
-//                                }else if (e.equals("configuration")){
-//                                    def relatedObject = eElement.getElementsByTagName("related-link").item(0).getTextContent()
-//                                    utils.log("INFO", "ServiceInstance Related Configuration :" + relatedObject, isDebugEnabled)
-//                                    NodeList dataList = node.getChildNodes()
-//                                    if(null != dataList) {
-//                                        JSONObject jObj = new JSONObject()
-//                                        for (int i = 0; i < dataList.getLength(); i++) {
-//                                            Node dNode = dataList.item(i)
-//                                            if(dNode.getNodeName() == "relationship-data") {
-//                                                Element rDataEle = (Element)dNode
-//                                                def eKey =  rDataEle.getElementsByTagName("relationship-key").item(0).getTextContent()
-//                                                def eValue = rDataEle.getElementsByTagName("relationship-value").item(0).getTextContent()
-//                                                if(eKey.equals("configuration.configuration-id")){
-//                                                    jObj.put("resourceInstanceId", eValue)
-//                                                }
-//                                            }
-//                                            else if(dNode.getNodeName() == "related-to-property"){
-//                                                Element rDataEle = (Element)dNode
-//                                                def eKey =  rDataEle.getElementsByTagName("property-key").item(0).getTextContent()
-//                                                def eValue = rDataEle.getElementsByTagName("property-value").item(0).getTextContent()
-//                                                if(eKey.equals("configuration.configuration-type")){
-//                                                    jObj.put("resourceType", eValue)
-//                                                }
-//                                            }
-//                                        }
-//                                        utils.log("INFO", "Relationship related to Resource:" + jObj.toString(), isDebugEnabled)
-//                                        jArray.put(jObj)
-//                                    }
-//                                // for SP-Partner
-//                                }else if (e.equals("sp-partner")){
-//
-//                                                             }
-//                            }
-//                        }
-//                        execution.setVariable("serviceRelationShip", jArray.toString())
+                        execution.setVariable("serviceRelationShip", jArray.toString())
                     }
                 }
             }else{
                 boolean succInAAI = execution.getVariable("GENGS_SuccessIndicator")
                 if(!succInAAI){
-                    utils.log("INFO","Error getting Service-instance from AAI", + serviceInstanceId, isDebugEnabled)
+                    msoLogger.debug("Error getting Service-instance from AAI :" + serviceInstanceId)
                     WorkflowException workflowException = execution.getVariable("WorkflowException")
-                    utils.logAudit("workflowException: " + workflowException)
                     if(workflowException != null){
+                        msoLogger.error("workflowException: " + workflowException)
                         exceptionUtil.buildAndThrowWorkflowException(execution, workflowException.getErrorCode(), workflowException.getErrorMessage())
                     }
-                    else
-                    {
+                    else {
                         msg = "Failure in postProcessAAIGET GENGS_SuccessIndicator:" + succInAAI
-                        utils.log("INFO", msg, isDebugEnabled)
+                        msoLogger.error(msg)
                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg)
                     }
                 }
 
-                utils.log("INFO","Service-instance NOT found in AAI. Silent Success", isDebugEnabled)
+                msoLogger.debug("Service-instance NOT found in AAI. Silent Success")
             }
         }catch (BpmnError e) {
-            throw e;
+            throw e
         } catch (Exception ex) {
             msg = "Exception in DoDeleteE2EServiceInstance.postProcessAAIGET. " + ex.getMessage()
-            utils.log("INFO", msg, isDebugEnabled)
+            msoLogger.debug(msg)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
         }
-        utils.log("INFO"," *** Exit postProcessAAIGET *** ", isDebugEnabled)
+        msoLogger.debug(" *** Exit postProcessAAIGET *** ")
     }
 
        private JSONObject getRelationShipData(node, isDebugEnabled){
@@ -323,7 +247,7 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
                def rt  = utils.getNodeText(relation, "related-to")
 
                def rl  = utils.getNodeText(relation, "related-link")
-               utils.log("INFO", "ServiceInstance Related NS/Configuration :" + rl, isDebugEnabled)
+               msoLogger.debug("ServiceInstance Related NS/Configuration :" + rl)
 
                def rl_datas = utils.getIdenticalChildren(node, "relationship-data")
                for(def rl_data : rl_datas) {
@@ -357,13 +281,11 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
                        }
                }
 
-               utils.log("INFO", "Relationship related to Resource:" + jObj.toString(), isDebugEnabled)
-
+               msoLogger.debug("Relationship related to Resource:" + jObj.toString())
                return jObj
        }
 
    public void getCurrentNS(DelegateExecution execution){
-       def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
        utils.log("INFO", "======== Start getCurrentNS Process ======== ", isDebugEnabled)
 
        def currentIndex = execution.getVariable("currentNSIndex")
@@ -375,14 +297,12 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
        execution.setVariable("GENGS_serviceInstanceId", "")
        execution.setVariable("GENGS_serviceInstanceName", nsResourceType)
 
-       utils.log("INFO", "======== COMPLETED getCurrentNS Process ======== ", isDebugEnabled)
+       msoLogger.debug("======== COMPLETED getCurrentNS Process ======== ")
    }
 
     public void prepareDecomposeService(DelegateExecution execution) {
-        def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
-
         try {
-            utils.log("DEBUG", " ***** Inside prepareDecomposeService of create generic e2e service ***** ", isDebugEnabled)
+            msoLogger.debug(" ***** Inside prepareDecomposeService of create generic e2e service ***** ")
             String modelInvariantUuid = execution.getVariable("model-invariant-id-original")
             String modelVersionId = execution.getVariable("model-version-id-original")
 
@@ -393,10 +313,11 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
              }"""
             execution.setVariable("serviceModelInfo", serviceModelInfo)
 
-            utils.log("DEBUG", " ***** Completed prepareDecomposeService of  create generic e2e service ***** ", isDebugEnabled)
+            msoLogger.debug(" ***** Completed prepareDecomposeService of  create generic e2e service ***** ")
         } catch (Exception ex) {
             // try error in method block
             String exceptionMessage = "Bpmn error encountered in  create generic e2e service flow. Unexpected Error from method prepareDecomposeService() - " + ex.getMessage()
+            msoLogger.error(exceptionMessage)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
         }
     }
@@ -415,23 +336,20 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
 
        private JSONObject getRelatedResourceInAAI (DelegateExecution execution, JSONObject jObj)
        {
-               def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-               utils.log("INFO"," ***** Started getRelatedResourceInAAI *****",  isDebugEnabled)
+               msoLogger.debug(" ***** Started getRelatedResourceInAAI *****")
 
-//             AaiUtil aaiUriUtil = new AaiUtil()
-//             String aai_endpoint = execution.getVariable("URN_aai_endpoint")
         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
                String urlLink = jObj.get("resourceLinkUrl")
                String serviceAaiPath = "${aai_endpoint}${urlLink}"
 
                URL url = new URL(serviceAaiPath)
-               HttpClient client = new HttpClient(url, "application/xml", TargetEntity.AAI)
+               HttpClient client = new HttpClientFactory().newXmlClient(url, TargetEntity.AAI)
 
 
                Response response = client.get()
                int responseCode = response.getStatus()
                execution.setVariable(Prefix + "GeRelatedResourceResponseCode", responseCode)
-               utils.log("DEBUG", "  Get RelatedResource code is: " + responseCode, isDebugEnabled)
+               msoLogger.debug("  Get RelatedResource code is: " + responseCode)
 
                String aaiResponse = response.readEntity(String.class)
                execution.setVariable(Prefix + "GetRelatedResourceResponse", aaiResponse)
@@ -440,7 +358,7 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
                if(responseCode == 200 || responseCode == 201 || responseCode == 202 )
                        //200 OK 201 CREATED 202 ACCEPTED
                {
-                       utils.log("DEBUG", "GET RelatedResource Received a Good Response", isDebugEnabled)
+                       msoLogger.debug("GET RelatedResource Received a Good Response")
                        execution.setVariable(Prefix + "SuccessIndicator", true)
                        execution.setVariable(Prefix + "FoundIndicator", true)
 
@@ -460,20 +378,18 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
                        jObj.put("modelVersionId", modelUuid)
                        jObj.put("modelCustomizationId", modelCustomizationId)
                }
-               else
-               {
-                       utils.log("ERROR", "Get RelatedResource Received a Bad Response Code. Response Code is: " + responseCode, isDebugEnabled)
-               }
-
-               utils.log("INFO", " ***** Exit getRelatedResourceInAAI *****", isDebugEnabled)
-               return jObj;
+               else {
+            String exceptionMessage = "Get RelatedResource Received a Bad Response Code. Response Code is: " + responseCode
+                       msoLogger.error(exceptionMessage)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
 
+               msoLogger.debug(" ***** Exit getRelatedResourceInAAI *****")
+               return jObj
        }
 
     public void postDecomposeService(DelegateExecution execution) {
-        def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
-
-        utils.log("DEBUG", " ***** Inside processDecomposition() of  delete generic e2e service flow ***** ", isDebugEnabled)
+        msoLogger.debug(" ***** Inside processDecomposition() of  delete generic e2e service flow ***** ")
         try {
             ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
 
@@ -527,19 +443,17 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
             }
             execution.setVariable("isDeleteResourceListValid", isDeleteResourceListValid)
 
-            utils.log("DEBUG", "delete resource list : " + deleteRealResourceList, isDebugEnabled)
+            msoLogger.debug("delete resource list : " + deleteRealResourceList)
         } catch (Exception ex) {
             String exceptionMessage = "Bpmn error encountered in  create generic e2e service flow. processDecomposition() - " + ex.getMessage()
-            utils.log("DEBUG", exceptionMessage, isDebugEnabled)
+            msoLogger.error(exceptionMessage)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
         }
         utils.log("DEBUG", " ***** exit processDecomposition() of  delete generic e2e service flow ***** ", isDebugEnabled)
     }
 
     public void preInitResourcesOperStatus(DelegateExecution execution){
-        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-
-        utils.log("INFO", " ======== STARTED preInitResourcesOperStatus Process ======== ", isDebugEnabled)
+        msoLogger.debug(" ======== STARTED preInitResourcesOperStatus Process ======== ")
         try{
             String serviceId = execution.getVariable("serviceInstanceId")
             String operationId = execution.getVariable("operationId")
@@ -549,7 +463,7 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
             String progress = "0"
             String reason = ""
             String operationContent = "Prepare service creation"
-            utils.log("INFO", "Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId + " operationType:" + operationType, isDebugEnabled)
+            msoLogger.debug("Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId + " operationType:" + operationType)
             serviceId = UriUtils.encode(serviceId,"UTF-8")
             execution.setVariable("serviceInstanceId", serviceId)
             execution.setVariable("operationId", operationId)
@@ -580,19 +494,18 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
 
             payload = utils.formatXml(payload)
             execution.setVariable("CVFMI_initResOperStatusRequest", payload)
-            utils.log("INFO", "Outgoing initResourceOperationStatus: \n" + payload, isDebugEnabled)
-            utils.logAudit("CreateVfModuleInfra Outgoing initResourceOperationStatus Request: " + payload)
+            msoLogger.debug("Outgoing initResourceOperationStatus: \n" + payload)
+            msoLogger.debug("CreateVfModuleInfra Outgoing initResourceOperationStatus Request: " + payload)
 
         }catch(Exception e){
-            utils.log("ERROR", "Exception Occured Processing preInitResourcesOperStatus. Exception is:\n" + e, isDebugEnabled)
+            msoLogger.debug("Exception Occured Processing preInitResourcesOperStatus. Exception is:\n" + e)
             execution.setVariable("CVFMI_ErrorResponse", "Error Occurred during preInitResourcesOperStatus Method:\n" + e.getMessage())
         }
-        utils.log("INFO", "======== COMPLETED preInitResourcesOperStatus Process ======== ", isDebugEnabled)
+        msoLogger.debug("======== COMPLETED preInitResourcesOperStatus Process ======== ")
     }
     
     public void prepareUpdateServiceOperationStatus(DelegateExecution execution){
-        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-        utils.log("DEBUG", " ======== STARTED prepareUpdateServiceOperationStatus Process ======== ", isDebugEnabled)
+        msoLogger.debug(" ======== STARTED prepareUpdateServiceOperationStatus Process ======== ")
         try{
             String serviceId = execution.getVariable("serviceInstanceId")
             String operationId = execution.getVariable("operationId")
@@ -606,7 +519,7 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
 
             def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
             execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
-            utils.log("DEBUG", "DB Adapter Endpoint is: " + dbAdapterEndpoint, isDebugEnabled)
+            msoLogger.debug("DB Adapter Endpoint is: " + dbAdapterEndpoint)
 
             String payload =
                     """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
@@ -628,13 +541,13 @@ public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
 
             payload = utils.formatXml(payload)
             execution.setVariable("CVFMI_updateServiceOperStatusRequest", payload)
-            utils.log("DEBUG", "Outgoing updateServiceOperStatusRequest: \n" + payload, isDebugEnabled)
+            msoLogger.debug("Outgoing updateServiceOperStatusRequest: \n" + payload)
 
         }catch(Exception e){
-            utils.log("ERROR", "Exception Occured Processing prepareUpdateServiceOperationStatus. Exception is:\n" + e, isDebugEnabled)
+            msoLogger.error("Exception Occured Processing prepareUpdateServiceOperationStatus. Exception is:\n" + e)
             execution.setVariable("CVFMI_ErrorResponse", "Error Occurred during prepareUpdateServiceOperationStatus Method:\n" + e.getMessage())
         }
-        utils.log("DEBUG", "======== COMPLETED prepareUpdateServiceOperationStatus Process ======== ", isDebugEnabled)
+        msoLogger.debug("======== COMPLETED prepareUpdateServiceOperationStatus Process ======== ")
     }
 
      /**
index ca4643d..c95704e 100644 (file)
@@ -34,6 +34,7 @@ import org.onap.so.bpmn.core.UrnPropertiesReader
 import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
 import org.onap.so.client.aai.AAIObjectType
 import org.onap.so.client.aai.entities.AAIResultWrapper
 import org.onap.so.client.aai.entities.Relationships
@@ -449,7 +450,7 @@ public class DoDeleteNetworkInstance extends AbstractServiceTaskProcessor {
                        String vnfAdapterRequest = execution.getVariable(Prefix + "deleteNetworkRequest")
 
                        URL url = new URL(vnfAdapterUrl)
-                       HttpClient httpClient = new HttpClient(url, "application/xml", TargetEntity.OPENSTACK_ADAPTER)
+                       HttpClient httpClient = new HttpClientFactory().newXmlClient(url, TargetEntity.OPENSTACK_ADAPTER)
                        httpClient.addAdditionalHeader("Authorization", execution.getVariable("BasicAuthHeaderValuePO"))
                        Response response = httpClient.delete(vnfAdapterRequest)
 
index 122cc08..6a31095 100644 (file)
@@ -20,6 +20,8 @@
  */
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
+
 import static org.apache.commons.lang3.StringUtils.isBlank
 
 import org.apache.commons.lang3.StringUtils
@@ -65,11 +67,10 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
     String Prefix="DDR_"
     ExceptionUtil exceptionUtil = new ExceptionUtil()
     JsonUtils jsonUtil = new JsonUtils()
-    CatalogDbUtils cutils = new CatalogDbUtils()
+    CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
 
     public void preProcessRequest (DelegateExecution execution) {
-        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-        utils.log("INFO"," ***** preProcessRequest *****",  isDebugEnabled)
+        msoLogger.debug(" ***** preProcessRequest *****")
         String msg = ""
 
         try {
@@ -79,8 +80,7 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
             //Inputs
             //requestDetails.subscriberInfo. for AAI GET & PUT & SDNC assignToplology
             String globalSubscriberId = execution.getVariable("globalSubscriberId") //globalCustomerId
-            if (globalSubscriberId == null)
-            {
+            if (globalSubscriberId == null) {
                 execution.setVariable("globalSubscriberId", "")
             }
 
@@ -95,18 +95,18 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
             String serviceInstanceId = execution.getVariable("serviceInstanceId")
             if (isBlank(serviceInstanceId)){
                 msg = "Input serviceInstanceId is null"
-                utils.log("INFO", msg, isDebugEnabled)
+                msoLogger.error(msg)
                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
             }
 
-            String sdncCallbackUrl = execution.getVariable('URN_mso_workflow_sdncadapter_callback')
+            String sdncCallbackUrl = UrnPropertiesReader.getVariable('URN_mso_workflow_sdncadapter_callback', execution)
             if (isBlank(sdncCallbackUrl)) {
                 msg = "URN_mso_workflow_sdncadapter_callback is null"
-                utils.log("INFO", msg, isDebugEnabled)
+                msoLogger.error(msg)
                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
             }
             execution.setVariable("sdncCallbackUrl", sdncCallbackUrl)
-            utils.log("INFO","SDNC Callback URL: " + sdncCallbackUrl, isDebugEnabled)
+            msoLogger.debug("SDNC Callback URL: " + sdncCallbackUrl)
 
             StringBuilder sbParams = new StringBuilder()
             Map<String, String> paramsMap = execution.getVariable("serviceInputParams")
@@ -136,16 +136,14 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
             throw e;
         } catch (Exception ex){
             msg = "Exception in preProcessRequest " + ex.getMessage()
-            utils.log("INFO", msg, isDebugEnabled)
+            msoLogger.error(msg)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
         }
-        utils.log("INFO"," ***** Exit preProcessRequest *****",  isDebugEnabled)
+        msoLogger.debug(" ***** Exit preProcessRequest *****",)
     }
 
     public void sequenceResource(DelegateExecution execution){
-        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-
-        utils.log("INFO", " ======== STARTED sequenceResource Process ======== ", isDebugEnabled)
+        msoLogger.debug(" ======== STARTED sequenceResource Process ======== ")
         List<Resource> sequencedResourceList = new ArrayList<Resource>()
         List<Resource> wanResources = new ArrayList<Resource>()
 
@@ -198,18 +196,15 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
         execution.setVariable("isContainsWanResource", isContainsWanResource)
         execution.setVariable("currentResourceIndex", 0)
         execution.setVariable("sequencedResourceList", sequencedResourceList)
-        utils.log("INFO", "resourceSequence: " + resourceSequence, isDebugEnabled)
-        utils.log("INFO", " ======== END sequenceResource Process ======== ", isDebugEnabled)
+        msoLogger.debug("resourceSequence: " + resourceSequence)
+        msoLogger.debug(" ======== END sequenceResource Process ======== ")
     }
 
     /**
      * prepare delete parameters
      */
     public void preResourceDelete(DelegateExecution execution){
-
-        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-
-        utils.log("INFO", " ======== STARTED preResourceDelete Process ======== ", isDebugEnabled)
+        msoLogger.debug(" ======== STARTED preResourceDelete Process ======== ")
 
         List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
 
@@ -221,14 +216,14 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
             String resourceTemplateUUID = curResource.getModelInfo().getModelUuid()
             execution.setVariable("resourceInstanceId", resourceInstanceUUID)
             execution.setVariable("currentResource", curResource)
-            utils.log("INFO", "Delete Resource Info resourceTemplate Id :" + resourceTemplateUUID + "  resourceInstanceId: "
-                    + resourceInstanceUUID + " resourceModelName: " + curResource.getModelInfo().getModelName(), isDebugEnabled)
+            msoLogger.debug("Delete Resource Info resourceTemplate Id :" + resourceTemplateUUID + "  resourceInstanceId: "
+                    + resourceInstanceUUID + " resourceModelName: " + curResource.getModelInfo().getModelName())
         }
         else {
             execution.setVariable("resourceInstanceId", "")
         }
 
-        utils.log("INFO", " ======== END preResourceDelete Process ======== ", isDebugEnabled)
+        msoLogger.debug(" ======== END preResourceDelete Process ======== ")
     }
 
 
@@ -236,8 +231,7 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
      * Execute delete workflow for resource
      */
     public void executeResourceDelete(DelegateExecution execution) {
-        def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
-        utils.log("INFO", "======== Start executeResourceDelete Process ======== ", isDebugEnabled)
+        msoLogger.debug("======== Start executeResourceDelete Process ======== ")
                try {
                String requestId = execution.getVariable("msoRequestId")
                String serviceInstanceId = execution.getVariable("serviceInstanceId")
@@ -247,7 +241,7 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
        
                Resource currentResource = execution.getVariable("currentResource")
                String action = "deleteInstance"
-               JSONObject resourceRecipe = cutils.getResourceRecipe(execution, currentResource.getModelInfo().getModelUuid(), action)
+               JSONObject resourceRecipe = catalogDbUtils.getResourceRecipe(execution, currentResource.getModelInfo().getModelUuid(), action)
                String recipeUri = resourceRecipe.getString("orchestrationUri")
                int recipeTimeout = resourceRecipe.getInt("recipeTimeout")
                String recipeParamXsd = resourceRecipe.get("paramXSD")
@@ -269,20 +263,19 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
                String recipeURL = BPMNProperties.getProperty("bpelURL", "http://mso:8080") + recipeUri
        
                HttpResponse resp = BpmnRestClient.post(recipeURL, requestId, recipeTimeout, action, serviceInstanceId, serviceType, resourceInput.toString(), recipeParamXsd)
-               utils.log("INFO", " ======== END executeResourceDelete Process ======== ", isDebugEnabled)
+               msoLogger.debug(" ======== END executeResourceDelete Process ======== ")
                }catch(BpmnError b){
-                        msoLogger.debug("Rethrowing MSOWorkflowException")
+                        msoLogger.error("Rethrowing MSOWorkflowException")
                         throw b
                 }catch(Exception e){
-                        msoLogger.debug("Error occured within DoDeleteResourcesV1 executeResourceDelete method: " + e)
+                        msoLogger.error("Error occured within DoDeleteResourcesV1 executeResourceDelete method: " + e)
                         exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured during DoDeleteResourcesV1 executeResourceDelete Catalog")
                 }
     }
 
 
     public void parseNextResource(DelegateExecution execution){
-        def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
-        utils.log("INFO", "======== Start parseNextResource Process ======== ", isDebugEnabled)
+        msoLogger.debug("======== Start parseNextResource Process ======== ")
         def currentIndex = execution.getVariable("currentResourceIndex")
         def nextIndex =  currentIndex + 1
         execution.setVariable("currentResourceIndex", nextIndex)
@@ -292,7 +285,7 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
         }else{
             execution.setVariable("allResourceFinished", "false")
         }
-        utils.log("INFO", "======== COMPLETED parseNextResource Process ======== ", isDebugEnabled)
+        msoLogger.debug("======== COMPLETED parseNextResource Process ======== ")
     }
     
     public void prepareFinishedProgressForResource(DelegateExecution execution) {
@@ -340,8 +333,7 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
     }
     
     public void prepareSDNCServiceRequest (DelegateExecution execution, String svcAction) {
-        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
-        utils.log("INFO"," ***** Started prepareSDNCServiceRequest for " + svcAction +  "*****",  isDebugEnabled)
+        msoLogger.debug(" ***** Started prepareSDNCServiceRequest for " + svcAction +  "*****")
 
         try {
             // get variables
@@ -399,16 +391,16 @@ public class DoDeleteResourcesV1 extends AbstractServiceTaskProcessor {
                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
             
             String sndcTopologyDeleteRequesAsString = utils.formatXml(sndcTopologyDeleteRequest)
-            utils.logAudit(sndcTopologyDeleteRequesAsString)
+            msoLogger.debug(sndcTopologyDeleteRequesAsString)
             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyDeleteRequesAsString)
-            utils.log("INFO","sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyDeleteRequesAsString, isDebugEnabled)
+            msoLogger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyDeleteRequesAsString)
 
         } catch (Exception ex) {
             String exceptionMessage = " Bpmn error encountered in DoDeleteResourcesV1 flow. prepareSDNCServiceRequest() - " + ex.getMessage()
-            utils.log("DEBUG", exceptionMessage, isDebugEnabled)
+            msoLogger.debug(exceptionMessage)
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
 
         }
-       utils.log("INFO","***** Exit prepareSDNCServiceRequest for " + svcAction +  "*****",  isDebugEnabled)
+       msoLogger.debug("***** Exit prepareSDNCServiceRequest for " + svcAction +  "*****")
        }
 }
index d855479..6109d86 100644 (file)
@@ -26,12 +26,13 @@ import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
 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.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 import org.onap.so.utils.TargetEntity
+import org.onap.so.bpmn.core.UrnPropertiesReader
 
 import javax.ws.rs.core.Response
 /**
@@ -41,14 +42,10 @@ import javax.ws.rs.core.Response
 public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProcessor {
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoDeleteVFCNetworkServiceInstance.class);
 
-
-    String vfcUrl = "/vfc/rest/v1/vfcadapter"
-
-    String host = "http://mso.mso.testlab.openecomp.org:8080"
-
     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
     JsonUtils jsonUtil = new JsonUtils()
+    private final HttpClientFactory httpClientFactory = new HttpClientFactory()
 
     /**
      * Pre Process the BPMN Flow Request
@@ -83,6 +80,20 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
              }"""
             execution.setVariable("nsOperationKey", nsOperationKey);
             msoLogger.info("nsOperationKey:" + nsOperationKey)
+
+            String vfcAdapterUrl = UrnPropertiesReader.getVariable("mso.adapters.vfc.rest.endpoint", execution)
+                       
+            if (vfcAdapterUrl == null || vfcAdapterUrl.isEmpty()) {
+                msg = getProcessKey(execution) + ': mso:adapters:vfcc:rest:endpoint URN mapping is not defined'
+                msoLogger.debug(msg)
+            }
+            while (vfcAdapterUrl.endsWith('/')) {
+                vfcAdapterUrl = vfcAdapterUrl.substring(0, vfcAdapterUrl.length()-1)
+            }
+                       
+            execution.setVariable("vfcAdapterUrl", vfcAdapterUrl)
+
         } catch (BpmnError e) {
             throw e;
         } catch (Exception ex){
@@ -123,8 +134,9 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
     public void deleteNetworkService(DelegateExecution execution) {
 
         msoLogger.trace("deleteNetworkService  start ")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String nsOperationKey = execution.getVariable("nsOperationKey");
-        String url = host + vfcUrl + "/ns/" + execution.getVariable("nsInstanceId")
+        String url = vfcAdapterUrl + "/ns/" + execution.getVariable("nsInstanceId")
         Response apiResponse = deleteRequest(execution, url, nsOperationKey)
         String returnCode = apiResponse.getStatus()
         String operationStatus = "error";
@@ -142,8 +154,9 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
     public void terminateNetworkService(DelegateExecution execution) {
 
         msoLogger.trace("terminateNetworkService  start ")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String nsOperationKey = execution.getVariable("nsOperationKey")
-        String url =  host + vfcUrl + "/ns/" + execution.getVariable("nsInstanceId") + "/terminate"
+        String url =  vfcAdapterUrl + "/ns/" + execution.getVariable("nsInstanceId") + "/terminate"
         Response apiResponse = postRequest(execution, url, nsOperationKey)
         String returnCode = apiResponse.getStatus()
         String aaiResponseAsString = apiResponse.readEntity(String.class)
@@ -161,9 +174,10 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
     public void queryNSProgress(DelegateExecution execution) {
 
         msoLogger.trace("queryNSProgress  start ")
+        String vfcAdapterUrl = execution.getVariable("vfcAdapterUrl")
         String jobId = execution.getVariable("jobId")
         String nsOperationKey = execution.getVariable("nsOperationKey");
-        String url =  host + vfcUrl + "/jobs/" +  execution.getVariable("jobId")
+        String url =  vfcAdapterUrl + "/jobs/" +  execution.getVariable("jobId")
         Response apiResponse = postRequest(execution, url, nsOperationKey)
         String returnCode = apiResponse.getStatus()
         String apiResponseAsString = apiResponse.readEntity(String.class)
@@ -206,9 +220,12 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
                try{
                        URL url = new URL(urlString);
 
-                       HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.VNF_ADAPTER)
-                       httpClient.addAdditionalHeader("Accept", "application/json")
-                       httpClient.addAdditionalHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk")
+                       // Get the Basic Auth credentials for the VFCAdapter, username is 'bpel', auth is '07a7159d3bf51a0e53be7a8f89699be7'
+            // user 'bepl' authHeader is the same with mso.db.auth
+            String basicAuthValuedb =  UrnPropertiesReader.getVariable("mso.db.auth", execution)
+            HttpClient httpClient = httpClientFactory.newJsonClient(url, TargetEntity.VNF_ADAPTER)
+            httpClient.addAdditionalHeader("Accept", "application/json")
+            httpClient.addAdditionalHeader("Authorization", basicAuthValuedb)
 
                        apiResponse = httpClient.post(requestBody)
 
@@ -216,7 +233,7 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
 
                        msoLogger.trace("Completed Execute VF-C adapter Post Process ")
                }catch(Exception e){
-            msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception occured while executing VF-C Post Call. Exception is: \n" + e, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "Exception is:\n" + e);
+            msoLogger.error("Exception occured while executing VF-C Post Call. Exception is: \n" + e.getMessage());
             throw new BpmnError("MSOWorkflowException")
         }
         return apiResponse
@@ -234,14 +251,18 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
         try{
 
                        URL Url = new URL(url)
-                       HttpClient httpClient = new HttpClient(Url, "application/json", TargetEntity.VNF_ADAPTER)
-                       httpClient.addAdditionalHeader("Accept", "application/json")
-                       httpClient.addAdditionalHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk")
+            // Get the Basic Auth credentials for the VFCAdapter, username is 'bpel', auth is '07a7159d3bf51a0e53be7a8f89699be7'
+            // user 'bepl' authHeader is the same with mso.db.auth
+            String basicAuthValuedb =  UrnPropertiesReader.getVariable("mso.db.auth", execution)
+            HttpClient httpClient = httpClientFactory.newJsonClient(url, TargetEntity.VNF_ADAPTER)
+            httpClient.addAdditionalHeader("Accept", "application/json")
+            httpClient.addAdditionalHeader("Authorization", basicAuthValuedb)
+
                        r = httpClient.delete(requestBody)
 
             msoLogger.trace("Completed Execute VF-C adapter Delete Process ")
         }catch(Exception e){
-            msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception occured while executing VF-C Post Call. Exception is: \n" + e, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "Exception is:\n" + e);
+            msoLogger.error("Exception occured while executing VF-C Post Call. Exception is: \n" + e.getMessage());
             throw new BpmnError("MSOWorkflowException")
         }
         return r
index a99f6e9..19d30bb 100644 (file)
@@ -29,8 +29,9 @@ import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.core.json.JsonUtils
 
 import org.camunda.bpm.engine.delegate.BpmnError
-import org.camunda.bpm.engine.runtime.Execution
 import com.fasterxml.jackson.databind.ObjectMapper
+import org.onap.so.client.HttpClientFactory
+
 import javax.ws.rs.core.Response
 
 import org.onap.so.bpmn.infrastructure.vfcmodel.ScaleResource
@@ -201,7 +202,7 @@ public class DoScaleVFCNetworkServiceInstance extends AbstractServiceTaskProcess
         try{
                        URL url = new URL(urlString);
 
-                       HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.VNF_ADAPTER)
+            HttpClient httpClient = new HttpClientFactory().newJsonClient(url, TargetEntity.VNF_ADAPTER)
                        httpClient.addAdditionalHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk")
 
                        apiResponse = httpClient.post(requestBody)
index cc301db..6dd8085 100644 (file)
@@ -721,9 +721,9 @@ public class DoUpdateNetworkInstance extends AbstractServiceTaskProcessor {
 
                        String status = utils.getNodeText(updateNetworkResponse, 'orchestration-status')
                        if(status.equals("pending-create") || status.equals("PendingCreate")){
-                               l3Network.setOperationalStatus("Created")
+                               l3Network.setOrchestrationStatus("Created")
                        }else{
-                               l3Network.setOperationalStatus("Active")
+                               l3Network.setOrchestrationStatus("Active")
                        }
 
                        AAIResourcesClient client = new AAIResourcesClient()
index f6a8a15..06c7002 100644 (file)
@@ -25,11 +25,11 @@ import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.onap.aai.domain.yang.GenericVnf
 import org.onap.so.bpmn.common.scripts.AaiUtil
 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
+import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.MsoUtils
 import org.onap.so.bpmn.common.scripts.NetworkUtils
 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
-import org.onap.so.bpmn.common.scripts.VfModule
 import org.onap.so.bpmn.common.scripts.VfModuleBase
 import org.onap.so.bpmn.core.UrnPropertiesReader
 import org.onap.so.bpmn.core.WorkflowException
@@ -38,7 +38,6 @@ import org.onap.so.client.graphinventory.entities.uri.Depth
 import org.onap.so.client.aai.AAIObjectType;
 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.AAIUri
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri
@@ -46,14 +45,12 @@ import org.onap.so.constants.Defaults
 import org.onap.so.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 
-import org.springframework.web.util.UriUtils
-
 public class DoUpdateVfModule extends VfModuleBase {
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoUpdateVfModule.class);
 
        ExceptionUtil exceptionUtil = new ExceptionUtil()
        JsonUtils jsonUtil = new JsonUtils()
-       CatalogDbUtils catalog = new CatalogDbUtils()
+       CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
 
        /**
         * Initialize the flow's variables.
@@ -255,7 +252,7 @@ public class DoUpdateVfModule extends VfModuleBase {
                                String serviceType =""
 
                                try{
-                                       String json = catalog.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
+                                       String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
                                        serviceType = jsonUtil.getJsonValue(json, "serviceResources.serviceType")
                                }catch(BpmnError e){
                                        throw e
index 7fdbb5c..9eb05cf 100644 (file)
@@ -20,9 +20,8 @@
 
 package org.onap.so.bpmn.infrastructure.scripts
 
-import static org.apache.commons.lang3.StringUtils.*;
+import org.onap.so.client.HttpClientFactory
 
-import javax.ws.rs.core.MediaType
 import javax.ws.rs.core.Response
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution;
@@ -30,21 +29,18 @@ import org.onap.so.bpmn.common.scripts.AaiUtil
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.MsoUtils
-import org.onap.so.bpmn.core.UrnPropertiesReader
 import org.onap.so.bpmn.core.domain.ModelInfo
 import org.onap.so.bpmn.core.domain.ModuleResource
 import org.onap.so.bpmn.core.domain.VnfResource
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.client.graphinventory.entities.uri.Depth
 import org.onap.so.client.HttpClient
-import org.onap.so.client.aai.AAIObjectType;
-import org.onap.so.client.aai.AAIResourcesClient
+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.logger.MessageEnum
 import org.onap.so.logger.MsoLogger
 import org.onap.so.utils.TargetEntity
-import org.springframework.web.util.UriUtils;
 
 /**
  * This class supports the VID Flow
@@ -163,7 +159,7 @@ class DoUpdateVnfAndModules extends AbstractServiceTaskProcessor {
                        msoLogger.debug("AAI endPoint: " + endPoint)
 
                        try {
-                               HttpClient client = new HttpClient(new URL(endPoint), MediaType.APPLICATION_XML, TargetEntity.AAI)
+                               HttpClient client = new HttpClientFactory().newXmlClient(new URL(endPoint), TargetEntity.AAI)
                                client.addAdditionalHeader('X-TransactionId', UUID.randomUUID().toString())
                                client.addAdditionalHeader('X-FromAppId', 'MSO')
                                client.addAdditionalHeader('Content-Type', 'application/xml')
index 1a47ef8..a8e3b20 100644 (file)
@@ -24,7 +24,6 @@ import static org.apache.commons.lang3.StringUtils.*
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
-import org.onap.so.bpmn.common.scripts.CatalogDbUtils
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.MsoUtils
 import org.onap.so.bpmn.common.scripts.VidUtils
@@ -55,7 +54,6 @@ public class CreateVcpeResCustService extends AbstractServiceTaskProcessor {
     ExceptionUtil exceptionUtil = new ExceptionUtil()
     JsonUtils jsonUtil = new JsonUtils()
     VidUtils vidUtils = new VidUtils()
-    CatalogDbUtils catalogDbUtils = new CatalogDbUtils()
 
     /**
      * This method is executed during the preProcessRequest task of the <class>CreateServiceInstance.bpmn</class> process.
index 7a6fd72..7a40ef9 100644 (file)
@@ -21,13 +21,10 @@ package org.onap.so.bpmn.vcpe.scripts
 
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.delegate.DelegateExecution
-import org.onap.so.bpmn.common.scripts.AaiUtil
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
-import org.onap.so.bpmn.common.scripts.CatalogDbUtils
 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 import org.onap.so.bpmn.common.scripts.NetworkUtils
 import org.onap.so.bpmn.common.scripts.VidUtils
-import org.onap.so.bpmn.core.UrnPropertiesReader
 import org.onap.so.bpmn.core.WorkflowException
 import org.onap.so.bpmn.core.json.JsonUtils
 import org.onap.so.logger.MessageEnum
@@ -40,10 +37,6 @@ import org.onap.so.client.aai.entities.Relationships
 import org.onap.so.client.aai.entities.uri.AAIResourceUri
 import org.onap.so.client.aai.entities.uri.AAIUriFactory
 import javax.ws.rs.NotFoundException
-import org.json.JSONObject
-
-import static org.apache.commons.lang3.StringUtils.isBlank
-
 
 /**
  * This groovy class supports the <class>DeleteVcpeResCustService.bpmn</class> process.
@@ -60,7 +53,6 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor {
        ExceptionUtil exceptionUtil = new ExceptionUtil()
        JsonUtils jsonUtil = new JsonUtils()
        VidUtils vidUtils = new VidUtils()
-       CatalogDbUtils catalogDbUtils = new CatalogDbUtils()
        NetworkUtils networkUtils = new NetworkUtils()
 
        /**
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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
@@ -21,6 +23,7 @@
 package org.onap.so.bpmn.infrastructure.pnf.delegate;
 
 import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.CORRELATION_ID;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
 
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.camunda.bpm.engine.delegate.JavaDelegate;
@@ -32,15 +35,16 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
- * Implementation of "Create AAI entry with pnf-id = correlation_id" task in CreateAndActivatePnfResource.bpmn
+ * Implementation of "Create Pnf entry in AAI" task in CreateAndActivatePnfResource.bpmn
  *
  * Inputs:
  *  - correlationId - String
+ *  - pnfUuid - String
  */
 @Component
-public class CreateAaiEntryWithPnfIdDelegate implements JavaDelegate {
+public class CreatePnfEntryInAaiDelegate implements JavaDelegate {
 
-    private static final Logger logger = LoggerFactory.getLogger(CreateAaiEntryWithPnfIdDelegate.class);
+    private static final Logger logger = LoggerFactory.getLogger(CreatePnfEntryInAaiDelegate.class);
     private AaiConnection aaiConnection;
 
     @Autowired
@@ -51,11 +55,11 @@ public class CreateAaiEntryWithPnfIdDelegate implements JavaDelegate {
     @Override
     public void execute(DelegateExecution execution) throws Exception {
         String correlationId = (String) execution.getVariable(CORRELATION_ID);
+        String pnfUuid = (String) execution.getVariable(PNF_UUID);
         Pnf pnf = new Pnf();
-        pnf.setInMaint(true);
-        pnf.setPnfId(correlationId);
+        pnf.setPnfId(pnfUuid);
         pnf.setPnfName(correlationId);
         aaiConnection.createEntry(correlationId, pnf);
-        logger.debug("AAI entry is created for pnf correlation id: {}", correlationId);
+        logger.debug("AAI entry is created for pnf correlation id: {}, pnf uuid: {}", correlationId, pnfUuid);
     }
 }
index b3f2f72..1407cb9 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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
@@ -30,4 +32,5 @@ public class ExecutionVariableNames {
     public final static String AAI_CONTAINS_INFO_ABOUT_IP = "aaiContainsInfoAboutIp";
     public final static String DMAAP_MESSAGE = "dmaapMessage";
     public final static String TIMEOUT_FOR_NOTIFICATION = "timeoutForPnfEntryNotification";
+    public final static String PNF_UUID = "pnfUuid";
 }
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/GeneratePnfUuidDelegate.java b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/GeneratePnfUuidDelegate.java
new file mode 100644 (file)
index 0000000..f5483e4
--- /dev/null
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 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.so.bpmn.infrastructure.pnf.delegate;
+
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
+
+import java.util.UUID;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class GeneratePnfUuidDelegate implements JavaDelegate {
+
+    private static final Logger logger = LoggerFactory.getLogger(GeneratePnfUuidDelegate.class);
+
+    @Override
+    public void execute(DelegateExecution delegateExecution){
+        UUID uuid = UUID.randomUUID();
+        logger.debug("Generated UUID for pnf: {}, version: {}, variant: {}", uuid, uuid.version(), uuid.variant());
+        delegateExecution.setVariable(PNF_UUID, uuid.toString());
+    }
+}
index 94fb6a8..e9b0bc7 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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
 package org.onap.so.bpmn.infrastructure.pnf.delegate;
 
 import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.CORRELATION_ID;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
 import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.TIMEOUT_FOR_NOTIFICATION;
 
 import com.google.common.base.Strings;
+import java.util.regex.Pattern;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.camunda.bpm.engine.delegate.JavaDelegate;
 import org.onap.so.bpmn.common.scripts.ExceptionUtil;
@@ -35,6 +39,8 @@ import org.springframework.stereotype.Component;
 @Component
 public class PnfCheckInputs implements JavaDelegate {
 
+    private static final Pattern UUID_PATTERN = Pattern
+        .compile("(?i)^[0-9a-f]{8}-[0-9a-f]{4}-[1-5]{1}[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}$");
     private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL, PnfCheckInputs.class);
 
     private String defaultTimeout;
@@ -46,19 +52,37 @@ public class PnfCheckInputs implements JavaDelegate {
 
     @Override
     public void execute(DelegateExecution execution) {
+        validateCorrelationId(execution);
+        validatePnfUuid(execution);
+        validateTimeout(execution);
+    }
+
+    private void validateCorrelationId(DelegateExecution execution) {
         String correlationId = (String) execution.getVariable(CORRELATION_ID);
         if (Strings.isNullOrEmpty(correlationId)) {
             new ExceptionUtil().buildAndThrowWorkflowException(execution, 9999, "correlationId variable not defined");
         }
+    }
+
+    private void validatePnfUuid(DelegateExecution execution) {
+        String pnfUuid = (String) execution.getVariable(PNF_UUID);
+        if (Strings.isNullOrEmpty(pnfUuid)) {
+            new ExceptionUtil().buildAndThrowWorkflowException(execution, 9999, "pnfUuid variable not defined");
+        }
+        if (!UUID_PATTERN.matcher(pnfUuid).matches()) {
+            new ExceptionUtil().buildAndThrowWorkflowException(execution, 9999, "pnfUuid is not a valid UUID");
+        }
+    }
+
+    private void validateTimeout(DelegateExecution execution) {
         String timeout = (String) execution.getVariable(TIMEOUT_FOR_NOTIFICATION);
         if (Strings.isNullOrEmpty(timeout)) {
             LOGGER.debug("timeoutForPnfEntryNotification variable not found, setting default");
             if (defaultTimeout == null) {
                 new ExceptionUtil().buildAndThrowWorkflowException(execution, 9999,
-                        "default timeoutForPnfEntryNotification value not defined");
+                    "default timeoutForPnfEntryNotification value not defined");
             }
             execution.setVariable(TIMEOUT_FOR_NOTIFICATION, defaultTimeout);
         }
     }
-
 }
index f290444..52f879b 100644 (file)
@@ -117,6 +117,9 @@ public class PnfEventReadyDmaapClient implements DmaapClient {
             } catch (IOException e) {
                 logger.error("Exception caught during sending rest request to dmaap for listening event topic", e);
             }
+            finally {
+                getRequest.reset();
+            }
         }
 
         private List<String> getCorrelationIdListFromResponse(HttpResponse response) throws IOException {
index 7f1c2fd..ac34188 100644 (file)
@@ -622,7 +622,9 @@ public class ServicePluginFactory {
                // in demo we have only one VPN. no cross VPNs, so get first item.
                Map<String, Object> returnRoute = getReturnRoute(returnList);
                Map<String, Object> vpnRequestInputs = getVPNResourceRequestInputs(resources);
-               vpnRequestInputs.putAll(returnRoute);
+               if(null!=vpnRequestInputs) {
+                       vpnRequestInputs.putAll(returnRoute);
+               }
                String newRequest = getJsonString(uuiObject);
                return newRequest;
        }
diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResourceTest.groovy b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResourceTest.groovy
new file mode 100644 (file)
index 0000000..9ee995e
--- /dev/null
@@ -0,0 +1,118 @@
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.github.tomakehurst.wiremock.junit.WireMockRule
+import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.MockitoAnnotations
+import org.onap.so.bpmn.common.recipe.ResourceInput
+import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
+
+import static org.mockito.Mockito.*
+/**
+ * Copyright 2018 ZTE Corporation.
+ *
+ * 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.
+ */
+class CreateSDNCNetworkResourceTest extends GroovyTestCase {
+
+    @Rule
+    public WireMockRule wireMockRule = new WireMockRule(8090)
+
+    String Prefix = "CRESDNCRES_"
+    String sdncAdapterWorkflowResponse
+
+    void init() {
+        MockitoAnnotations.initMocks(this)
+        sdncAdapterWorkflowResponse = """
+                                               <sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
+                                               <sdncadapterworkflow:response-data>
+                            <CallbackHeader>
+                                <RequestId>726420e0-3962-4bf2-9655-aac82fc7055e</RequestId>
+                                <ResponseCode>200</ResponseCode>
+                                <ResponseMessage>OK</ResponseMessage>
+                            </CallbackHeader>
+                            <RequestData xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">&lt;output xmlns="org:onap:sdnc:northbound:generic-resource"&gt;&lt;response-message&gt;&lt;/response-message&gt;&lt;ack-final-indicator&gt;Y&lt;/ack-final-indicator&gt;&lt;svc-request-id&gt;726420e0-3962-4bf2-9655-aac82fc7055e&lt;/svc-request-id&gt;&lt;network-response-information&gt;&lt;instance-id&gt;9fa732b8-2c54-4eba-926d-464d18c07474&lt;/instance-id&gt;&lt;object-path&gt;restconf/config/GENERIC-RESOURCE-API:services/service/a99deffb-12e2-4656-8cf2-2d2a996d0f52/service-data/networks/network/9fa732b8-2c54-4eba-926d-464d18c07474/network-data/&lt;/object-path&gt;&lt;/network-response-information&gt;&lt;response-code&gt;200&lt;/response-code&gt;&lt;service-response-information&gt;&lt;instance-id&gt;a99deffb-12e2-4656-8cf2-2d2a996d0f52&lt;/instance-id&gt;&lt;/service-response-information&gt;&lt;/output&gt;</RequestData>
+                        </sdncadapterworkflow:response-data>
+                                               </sdncadapterworkflow:SDNCAdapterWorkflowResponse>"""
+
+    }
+
+    private ResourceInput getResInputObj(String modelName) {
+        String resourceInput = "{\n" +
+                "\t\"resourceInstanceName\": \"SotnFc-wan-connection_wanconnection-37\",\n" +
+                "\t\"resourceInstanceDes\": null,\n" +
+                "\t\"globalSubscriberId\": \"sdwandemo\",\n" +
+                "\t\"serviceType\": \"CCVPN\",\n" +
+                "\t\"operationId\": \"df3387b5-4fbf-41bd-82a0-13a955ac178a\",\n" +
+                "\t\"serviceModelInfo\": {\n" +
+                "\t\t\"modelName\": \"WanConnectionSvc03\",\n" +
+                "\t\t\"modelUuid\": \"198b066c-0771-4157-9594-1824adfdda7e\",\n" +
+                "\t\t\"modelInvariantUuid\": \"43fb5165-7d03-4009-8951-a8f45d3f0148\",\n" +
+                "\t\t\"modelVersion\": \"1.0\",\n" +
+                "\t\t\"modelCustomizationUuid\": \"\",\n" +
+                "\t\t\"modelCustomizationName\": \"\",\n" +
+                "\t\t\"modelInstanceName\": \"\",\n" +
+                "\t\t\"modelType\": \"\"\n" +
+                "\t},\n" +
+                "\t\"resourceModelInfo\": {\n" +
+                "\t\t\"modelName\": \"" +
+                modelName +
+                "\",\n" +
+                "\t\t\"modelUuid\": \"6a0bf88b-343c-415b-88c1-6f73702452c4\",\n" +
+                "\t\t\"modelInvariantUuid\": \"50bc3415-2e01-4e50-a9e1-ec9584599bb3\",\n" +
+                "\t\t\"modelCustomizationUuid\": \"b205d620-84bd-4058-afa0-e3aeee8bb712\",\n" +
+                "\t\t\"modelCustomizationName\": \"\",\n" +
+                "\t\t\"modelInstanceName\": \"SotnFc-wan-connection 0\",\n" +
+                "\t\t\"modelType\": \"\"\n" +
+                "\t},\n" +
+                "\t\"resourceInstancenUuid\": null,\n" +
+                "\t\"resourceParameters\": \"{\\n\\\"locationConstraints\\\":[],\\n\\\"requestInputs\\\":{\\\"sotnfcspecwanconnection0_route-objective-function\\\":null,\\\"sotnfcspecwanconnection0_colorAware\\\":null,\\\"3rdctlspecwanconnection0_thirdPartyAdaptorRpc\\\":null,\\\"sotnfcspecwanconnection0_couplingFlag\\\":null,\\\"sotnfcspecwanconnection0_pbs\\\":null,\\\"3rdctlspecwanconnection0_thirdPartySdncId\\\":null,\\\"sotnfcspecwanconnection0_cbs\\\":null,\\\"3rdctlspecwanconnection0_thirdpartySdncName\\\":null,\\\"sotnfcspecwanconnection0_total-size\\\":null,\\\"3rdctlspecwanconnection0_templateFileName\\\":\\\"sotn_create_zte_template.json\\\",\\\"fcwanconnection0_type\\\":null,\\\"sotnfcspecwanconnection0_cir\\\":null,\\\"fcwanconnection0_uuid\\\":null,\\\"sotnfcspecwanconnection0_diversity-policy\\\":null,\\\"nf_naming\\\":true,\\\"multi_stage_design\\\":false,\\\"availability_zone_max_count\\\":1,\\\"3rdctlspecwanconnection0_restapiUrl\\\":\\\"http://10.80.80.21:8443/restconf/operations/ZTE-API-ConnectivityService:create-connectivity-service\\\",\\\"max_instances\\\":null,\\\"sotnfcspecwanconnection0_reroute\\\":null,\\\"fcwanconnection0_name\\\":null,\\\"sotnfcspecwanconnection0_dualLink\\\":null,\\\"min_instances\\\":null,\\\"sotnfcspecwanconnection0_pir\\\":null,\\\"sotnfcspecwanconnection0_service-type\\\":null}\\n}\",\n" +
+                "\t\"operationType\": \"createInstance\",\n" +
+                "\t\"serviceInstanceId\": \"ffa07ae4-f820-45af-9439-1416b3bc1d39\",\n" +
+                "\t\"requestsInputs\": \"{\\r\\n\\t\\\"service\\\": {\\r\\n\\t\\t\\\"name\\\": \\\"wanconnection-37\\\",\\r\\n\\t\\t\\\"description\\\": \\\"deafe\\\",\\r\\n\\t\\t\\\"serviceInvariantUuid\\\": \\\"43fb5165-7d03-4009-8951-a8f45d3f0148\\\",\\r\\n\\t\\t\\\"serviceUuid\\\": \\\"198b066c-0771-4157-9594-1824adfdda7e\\\",\\r\\n\\t\\t\\\"globalSubscriberId\\\": \\\"sdwandemo\\\",\\r\\n\\t\\t\\\"serviceType\\\": \\\"CCVPN\\\",\\r\\n\\t\\t\\\"parameters\\\": {\\r\\n\\t\\t\\t\\\"resources\\\": [\\r\\n\\t\\t\\t],\\r\\n\\t\\t\\t\\\"requestInputs\\\": {\\r\\n\\t\\t\\t\\t\\\"sotnfcwanconnection0_3rdctlspecwanconnection0_restapiUrl\\\": \\\"http://10.80.80.21:8443/restconf/operations/ZTE-API-ConnectivityService:create-connectivity-service\\\",\\r\\n\\t\\t\\t\\t\\\"sotnfcwanconnection0_3rdctlspecwanconnection0_templateFileName\\\": \\\"sotn_create_zte_template.json\\\",\\r\\n\\t\\t\\t\\t\\\"sdwanfcwanconnection0_3rdctlspecwanconnection0_restapiUrl\\\": \\\"http://10.80.80.21:8443/restconf/operations/ZTE-API-ConnectivityService:create-connectivity-service\\\",\\r\\n\\t\\t\\t\\t\\\"sdwanfcwanconnection0_3rdctlspecwanconnection0_templateFileName\\\": \\\"sdwan_create_zte_template.json\\\"\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\"\n" +
+                "}"
+        ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
+        return resourceInputObj
+    }
+
+    @Test
+    void testAfterCreateSDNCCall() {
+        init()
+        checkGetInstanceId(getResInputObj("SotnFc-wan-connection"))
+        checkGetInstanceId(getResInputObj("SOTNConnectivity"))
+        checkGetInstanceId(getResInputObj("SDWANConnectivity"))
+    }
+
+    private void checkGetInstanceId(ResourceInput input) {
+        ExecutionEntity mockExecution = mock(ExecutionEntity.class)
+        when(mockExecution.getVariable(Prefix + "sdncCreateReturnCode")).thenReturn("200")
+        when(mockExecution.getVariable(Prefix + "SuccessIndicator")).thenReturn("false")
+        when(mockExecution.getVariable("isActivateRequired")).thenReturn("true")
+        when(mockExecution.getVariable("CRENWKI_createSDNCResponse")).thenReturn(sdncAdapterWorkflowResponse)
+        when(mockExecution.getVariable(Prefix + "resourceInput")).thenReturn(input.toString())
+        CreateSDNCNetworkResource createSDNCNetworkResource = new CreateSDNCNetworkResource()
+        createSDNCNetworkResource.afterCreateSDNCCall(mockExecution)
+        def instanceId = getInstanceId()
+        verify(mockExecution).setVariable("networkInstanceId", instanceId)
+    }
+
+    private getInstanceId() {
+        def response = new XmlSlurper().parseText(sdncAdapterWorkflowResponse)
+        def data = response.toString()
+        data = data.substring(data.indexOf("<"))
+        def resp = new XmlSlurper().parseText(data)
+        def instanceId = resp."network-response-information"."instance-id"
+        return instanceId
+    }
+}
index 11dbf7d..7523427 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.
@@ -43,9 +43,11 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.MockitoAnnotations
 import org.mockito.runners.MockitoJUnitRunner
+import org.onap.aai.domain.yang.L3Network
 import org.onap.so.bpmn.common.scripts.MsoUtils
 import org.onap.so.bpmn.core.WorkflowException
-
+import org.onap.so.client.aai.AAIResourcesClient
+import org.onap.so.client.aai.entities.uri.AAIResourceUri
 import com.github.tomakehurst.wiremock.client.WireMock
 import com.github.tomakehurst.wiremock.junit.WireMockRule
 import org.apache.commons.lang3.*
@@ -480,7 +482,7 @@ class DoCreateNetworkInstanceTest  {
                    <host-route-id>string</host-route-id>
                    <route-prefix>192.10.16.0/24</route-prefix>
                    <next-hop>192.10.16.100/24</next-hop>
-                   <next-hop-type>ip-address</next-hop-type> 
+                   <next-hop-type>ip-address</next-hop-type>
                                   <resource-version>1505857301954</resource-version>
                  </host-route>
                  <host-route>
@@ -508,7 +510,7 @@ class DoCreateNetworkInstanceTest  {
                    <host-route-id>string</host-route-id>
                    <route-prefix>192.10.16.0/24</route-prefix>
                    <next-hop>192.10.16.100/24</next-hop>
-                   <next-hop-type>ip-address</next-hop-type> 
+                   <next-hop-type>ip-address</next-hop-type>
                                  <resource-version>1505857301954</resource-version>
                  </host-route>
                </host-routes>
@@ -1669,7 +1671,7 @@ String createNetworkRequest_Ipv4 =
    <notificationUrl/>
 </createNetworkRequest>"""
 
-String createNetworkRequestAlaCarte = 
+String createNetworkRequestAlaCarte =
 """<createNetworkRequest>
    <cloudSiteId>RDM2WAGPLCP</cloudSiteId>
    <tenantId>7dd5365547234ee8937416c65507d266</tenantId>
@@ -1874,8 +1876,8 @@ String createNetworkRequest_SRIOV =
          <serviceInstanceId/>
       </msoRequest>
    </networkRollback>
-</rollbackNetworkRequest>"""   
-         
+</rollbackNetworkRequest>"""
+
          String createNetworkResponse =
          """<ns2:createNetworkResponse xmlns:ns2="http://org.onap.so/network"
                                     xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
@@ -3053,7 +3055,7 @@ String sdncAdapterWorkflowAssignResponse =
                        when(mockExecution.getVariable("bpmnRequest")).thenReturn(jsonIncomingRequest)                      // JSON format
                        when(mockExecution.getVariable("sdncVersion")).thenReturn("1610")                      // 1610 default
                        when(mockExecution.getVariable("disableRollback")).thenReturn(true)
-                       
+
                        when(mockExecution.getVariable("mso.adapters.po.auth")).thenReturn("3141634BF7E070AA289CF2892C986C0B")
                        when(mockExecution.getVariable("mso.msoKey")).thenReturn("07a7159d3bf51a0e53be7a8f89699be7")
 
@@ -3182,8 +3184,8 @@ String sdncAdapterWorkflowAssignResponse =
                        verify(mockExecution).setVariable(Prefix + "createNetworkRequest", createNetworkRequest)
 
                }
-               
-               
+
+
                @Test
                //@Ignore
                public void prepareCreateNetworkRequest_Ipv4() {
@@ -3220,7 +3222,7 @@ String sdncAdapterWorkflowAssignResponse =
                        verify(mockExecution).setVariable(Prefix + "createNetworkRequest", createNetworkRequest_Ipv4)
 
                }
-               
+
                @Test
                //@Ignore
                public void prepareCreateNetworkRequest_AlaCarte() {
@@ -3712,7 +3714,7 @@ String sdncAdapterWorkflowAssignResponse =
                        //MockitoDebuggerImpl preDebugger = new MockitoDebuggerImpl()
                        //preDebugger.printInvocations(mockExecution)
 
-                       verify(mockExecution, atLeast(1)).setVariable("prefix", Prefix)         
+                       verify(mockExecution, atLeast(1)).setVariable("prefix", Prefix)
                        verify(mockExecution, atLeast(1)).setVariable(Prefix + "queryCloudRegionReturnCode", "404")
                        verify(mockExecution).setVariable(Prefix + "cloudRegionPo", "MDTWNJ21")
                        verify(mockExecution).setVariable(Prefix + "cloudRegionSdnc", "AAIAIC25")
@@ -3791,7 +3793,7 @@ String sdncAdapterWorkflowAssignResponse =
                        verify(mockExecution, atLeast(2)).setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", "200")
 
                }
-               
+
                @Test
                //@Ignore
                public void callRESTQueryAAINetworkVpnBinding_TestScenario01_200() {
@@ -4025,26 +4027,25 @@ String sdncAdapterWorkflowAssignResponse =
                @Test
                //@Ignore
                public void callRESTUpdateContrailAAINetworkREST_200() {
-
-                       println "************ callRESTUpdateContrailAAINetwork ************* "
-
+                       AAIResourcesClient mockClient = mock(AAIResourcesClient.class)
                        WireMock.reset();
-                       MockPutNetworkIdWithDepth("CreateNetworkV2/createNetwork_updateContrail_AAIResponse_Success.xml", "49c86598-f766-46f8-84f8-8d1c1b10f9b4", "all");
+                       L3Network network = new L3Network()
 
+                       //TODO need to inject mock
                        ExecutionEntity mockExecution = setupMock()
                        when(mockExecution.getVariable(Prefix + "networkId")).thenReturn("49c86598-f766-46f8-84f8-8d1c1b10f9b4")
-                       when(mockExecution.getVariable(Prefix + "requeryIdAAIResponse")).thenReturn(queryIdAIIResponse)
+                       when(mockExecution.getVariable(Prefix + "requeryIdAAIResponse")).thenReturn(network)
                        when(mockExecution.getVariable(Prefix + "createNetworkResponse")).thenReturn(createNetworkResponseREST)
                        when(mockExecution.getVariable(Prefix + "messageId")).thenReturn("e8ebf6a0-f8ea-4dc0-8b99-fe98a87722d6")
-                       when(mockExecution.getVariable("aai.endpoint")).thenReturn("http://localhost:8090")
+
                        // old: when(mockExecution.getVariable("mso.workflow.DoCreateNetworkInstance.aai.network.l3-network.uri")).thenReturn("/aai/v8/network/l3-networks/l3-network")
                        when(mockExecution.getVariable("mso.workflow.DoCreateNetworkInstance.aai.l3-network.uri")).thenReturn("/aai/v9/network/l3-networks/l3-network")
-                       when(mockExecution.getVariable("isDebugLogEnabled")).thenReturn("true")
                        when(mockExecution.getVariable(Prefix + "rollbackEnabled")).thenReturn("false")
                        when(mockExecution.getVariable("mso.workflow.global.default.aai.namespace")).thenReturn('http://org.openecomp.aai.inventory/')
                        when(mockExecution.getVariable("mso.msoKey")).thenReturn("07a7159d3bf51a0e53be7a8f89699be7")
                        when(mockExecution.getVariable("aai.auth")).thenReturn("757A94191D685FD2092AC1490730A4FC")
 
+                       doNothing().when(mockClient).update(isA(AAIResourceUri.class), isA(L3Network.class))
                        // preProcessRequest(DelegateExecution execution)
                        DoCreateNetworkInstance DoCreateNetworkInstance = new DoCreateNetworkInstance()
                        DoCreateNetworkInstance.callRESTUpdateContrailAAINetwork(mockExecution)
@@ -4102,7 +4103,7 @@ String sdncAdapterWorkflowAssignResponse =
 
                }
 
-               
+
 
                @Test
                //@Ignore
index 26d3ab8..53c164a 100644 (file)
@@ -35,6 +35,7 @@ import org.mockito.runners.MockitoJUnitRunner
 import org.onap.aai.domain.yang.GenericVnf
 import org.onap.aai.domain.yang.Volume
 import org.onap.aai.domain.yang.VolumeGroup
+import org.onap.aai.domain.yang.VolumeGroups
 import org.onap.so.bpmn.common.scripts.MsoGroovyTest
 import org.onap.so.bpmn.core.RollbackData
 import org.onap.so.client.aai.AAIObjectPlurals
@@ -160,9 +161,11 @@ class DoCreateVfModuleVolumeV2Test extends MsoGroovyTest {
                when(mockExecution.getVariable(volumeGroupName)).thenReturn(volumeGroupName)
                when(mockExecution.getVariable(lcpCloudRegionId)).thenReturn(lcpCloudRegionId)
                AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VOLUME_GROUP, Defaults.CLOUD_OWNER.toString(), lcpCloudRegionId).queryParam("volume-group-name", volumeGroupName)
+               VolumeGroups volumeGroups = new VolumeGroups();
                VolumeGroup volumeGroup = new  VolumeGroup()
                volumeGroup.setVolumeGroupId("volumeGroupId")
-               when(client.get(VolumeGroup.class,uri)).thenReturn(Optional.of(volumeGroup))
+               volumeGroups.getVolumeGroup().add(volumeGroup);
+               when(client.get(VolumeGroups.class,uri)).thenReturn(Optional.of(volumeGroups))
                doCreateVfModuleVolumeV2.callRESTQueryAAIVolGrpName(mockExecution,null)
                verify(mockExecution).setVariable("DCVFMODVOLV2_AaiReturnCode",200)
        }
@@ -250,6 +253,7 @@ class DoCreateVfModuleVolumeV2Test extends MsoGroovyTest {
                when(mockExecution.getVariable(cloudOwner)).thenReturn(cloudOwner)
                when(mockExecution.getVariable("rollbackData")).thenReturn(new RollbackData())
                doCreateVfModuleVolumeV2.callRESTCreateAAIVolGrpName(mockExecution,null)
+               verify(mockExecution).setVariable("queriedVolumeGroupId", "volumeGroupId")
        }
 
        @Test
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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
 package org.onap.so.bpmn.infrastructure.pnf.delegate;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.BDDMockito.given;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.CORRELATION_ID;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
 
+import java.util.UUID;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.junit.Test;
 import org.onap.aai.domain.yang.Pnf;
 
-public class CreateAaiEntryWithPnfIdDelegateTest {
+public class CreatePnfEntryInAaiDelegateTest {
 
     @Test
     public void shouldSetPnfIdAndPnfName() throws Exception {
         // given
-        CreateAaiEntryWithPnfIdDelegate delegate = new CreateAaiEntryWithPnfIdDelegate();
+        String pnfUuid = UUID.nameUUIDFromBytes("testUuid".getBytes()).toString();
+        CreatePnfEntryInAaiDelegate delegate = new CreatePnfEntryInAaiDelegate();
         AaiConnectionTestImpl aaiConnection = new AaiConnectionTestImpl();
         delegate.setAaiConnection(aaiConnection);
         DelegateExecution execution = mock(DelegateExecution.class);
-        when(execution.getVariable(eq(CORRELATION_ID))).thenReturn("testCorrelationId");
+        given(execution.getVariable(eq(CORRELATION_ID))).willReturn("testCorrelationId");
+        given(execution.getVariable(eq(PNF_UUID))).willReturn(pnfUuid);
         // when
         delegate.execute(execution);
         // then
         Pnf createdEntry = aaiConnection.getCreated().get("testCorrelationId");
-        assertThat(createdEntry.getPnfId()).isEqualTo("testCorrelationId");
+        assertThat(createdEntry.getPnfId()).isEqualTo(pnfUuid);
         assertThat(createdEntry.getPnfName()).isEqualTo("testCorrelationId");
-        assertThat(createdEntry.isInMaint()).isTrue();
+        assertThat(createdEntry.isInMaint()).isNull();
     }
 }
\ No newline at end of file
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP - SO
  * ================================================================================
- * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 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.
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.restproperties;
+package org.onap.so.bpmn.infrastructure.pnf.delegate;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
+
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
 import org.junit.Test;
 
-import com.openpojo.reflection.PojoClass;
-import com.openpojo.reflection.impl.PojoClassFactory;
-import com.openpojo.validation.Validator;
-import com.openpojo.validation.ValidatorBuilder;
-import com.openpojo.validation.rule.impl.NoPrimitivesRule;
-import com.openpojo.validation.rule.impl.NoPublicFieldsRule;
-import com.openpojo.validation.test.impl.GetterTester;
+public class GeneratePnfUuidDelegateTest {
+    private static final String UUID_REGEX = "(?i)^[0-9a-f]{8}-[0-9a-f]{4}-[1-5]{1}[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}$";
 
-public class RestPropertiesPojoTest {
-       @Test
-       public void pojoStructure() {
-               test(PojoClassFactory.getPojoClass(AaiPropertiesConfiguration.class));
-       }
-       
-       private void test(PojoClass pojoClass) {
-               Validator validator = ValidatorBuilder.create()
-                               .with(new NoPrimitivesRule())
-                               .with(new NoPublicFieldsRule())
-                               .with(new GetterTester())
-                               .build();
-               validator.validate(pojoClass);
-       }
-}
+    @Test
+    public void execute_shouldSetValidUuidAsPnfUuid() {
+        // given
+        GeneratePnfUuidDelegate delegate = new GeneratePnfUuidDelegate();
+        DelegateExecution execution = new DelegateExecutionFake();
+        // when
+        delegate.execute(execution);
+        // then
+        assertThat((String) execution.getVariable(PNF_UUID)).matches(UUID_REGEX);
+    }
+}
\ No newline at end of file
index ab8d206..d670305 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright 2018 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
 
 package org.onap.so.bpmn.infrastructure.pnf.delegate;
 
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
 import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.CORRELATION_ID;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
 import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.TIMEOUT_FOR_NOTIFICATION;
 
+import java.util.UUID;
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.junit.Rule;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class PnfCheckInputsTest {
 
     private static final String DEFAULT_TIMEOUT = "P1D";
+    private static final String VALID_UUID = UUID.nameUUIDFromBytes("testUuid".getBytes()).toString();
+    private static final String RESERVED_UUID = new UUID(0, 0).toString();
+
+    private DelegateExecution delegateExecution;
 
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-    
-    private DelegateExecution mockDelegateExecution() {
-        new PnfCheckInputs(DEFAULT_TIMEOUT);
-        DelegateExecution delegateExecution = mock(DelegateExecution.class);
-        when(delegateExecution.getVariable("testProcessKey")).thenReturn("testProcessKeyValue");
-        return delegateExecution;
+    @Before
+    public void setUp() {
+        delegateExecution = new DelegateExecutionFake();
+        delegateExecution.setVariable("testProcessKey", "testProcessKeyValue");
     }
 
     @Test
-    public void shouldThrowException_whenPnfIdNotSet() {
-        // given
-        PnfCheckInputs testedObject = new PnfCheckInputs(DEFAULT_TIMEOUT);
-        DelegateExecution delegateExecution = mockDelegateExecution();
-        // when, then
-        expectedException.expect(BpmnError.class);
-        testedObject.execute(delegateExecution);
+    public void shouldThrowException_whenCorrelationIdNotSet() {
+        PnfCheckInputs testedObject = prepareExecutionForCorrelationId(null);
+        assertThatThrownBy(() -> testedObject.execute(delegateExecution)).isInstanceOf(BpmnError.class);
     }
 
     @Test
-    public void shouldThrowException_whenPnfIdIsEmptyString() throws Exception {
-        // given
-        PnfCheckInputs testedObject = new PnfCheckInputs(DEFAULT_TIMEOUT);
-        DelegateExecution delegateExecution = mockDelegateExecution();
-        when(delegateExecution.getVariable(CORRELATION_ID)).thenReturn("");
-        // when, then
-        expectedException.expect(BpmnError.class);
-        testedObject.execute(delegateExecution);
+    public void shouldThrowException_whenCorrelationIdIsEmptyString() {
+        PnfCheckInputs testedObject = prepareExecutionForCorrelationId("");
+        assertThatThrownBy(() -> testedObject.execute(delegateExecution)).isInstanceOf(BpmnError.class);
     }
 
-    private DelegateExecution mockDelegateExecutionWithCorrelationId() {
-        new PnfCheckInputs(DEFAULT_TIMEOUT);
-        DelegateExecution delegateExecution = mockDelegateExecution();
-        when(delegateExecution.getVariable(CORRELATION_ID)).thenReturn("testCorrelationId");
-        return delegateExecution;
+    @Test
+    public void shouldThrowException_whenTimeoutIsNotSetAndDefaultIsNotDefined() {
+        PnfCheckInputs testedObject = prepareExecutionForTimeout(null, null);
+        assertThatThrownBy(() -> testedObject.execute(delegateExecution)).isInstanceOf(BpmnError.class);
     }
 
     @Test
-    public void shouldThrowException_whenTimeoutIsNotSetAndDefaultIsNotDefined() {
-        // given
-        PnfCheckInputs testedObject = new PnfCheckInputs(null);
-        DelegateExecution delegateExecution = mockDelegateExecutionWithCorrelationId();
-        // when, then
-        expectedException.expect(BpmnError.class);
-        testedObject.execute(delegateExecution);
+    public void shouldThrowException_whenTimeoutIsEmptyStringAndDefaultIsNotDefined() {
+        PnfCheckInputs testedObject = prepareExecutionForTimeout(null, "");
+        assertThatThrownBy(() -> testedObject.execute(delegateExecution)).isInstanceOf(BpmnError.class);
     }
 
     @Test
-    public void shouldThrowException_whenTimeoutIsEmptyStringAndDefaultIsNotDefined() throws Exception {
-        // given
-        PnfCheckInputs testedObject = new PnfCheckInputs(null);
-        DelegateExecution delegateExecution = mockDelegateExecutionWithCorrelationId();
-        when(delegateExecution.getVariable(TIMEOUT_FOR_NOTIFICATION)).thenReturn("");
-        // when, then
-        expectedException.expect(BpmnError.class);
+    public void shouldSetDefaultTimeout_whenTimeoutIsNotSet() {
+        PnfCheckInputs testedObject = prepareExecutionForTimeout(DEFAULT_TIMEOUT, null);
         testedObject.execute(delegateExecution);
+        assertThat(delegateExecution.getVariable(TIMEOUT_FOR_NOTIFICATION)).isEqualTo(DEFAULT_TIMEOUT);
     }
 
     @Test
-    public void shouldSetDefaultTimeout_whenTimeoutIsNotSet() {
-        // given
+    public void shouldThrowException_whenPnfUuidIsNotSet() {
+        PnfCheckInputs testedObject = prepareExecutionForUuid(null);
+        assertThatThrownBy(() -> testedObject.execute(delegateExecution)).isInstanceOf(BpmnError.class);
+    }
+
+    @Test
+    public void shouldThrowException_whenPnfUuidIsEmptyString() {
+        PnfCheckInputs testedObject = prepareExecutionForUuid("");
+        assertThatThrownBy(() -> testedObject.execute(delegateExecution)).isInstanceOf(BpmnError.class);
+    }
+
+    @Test
+    public void shouldThrowException_whenPnfUuidIsReservedUuid() {
+        PnfCheckInputs testedObject = prepareExecutionForUuid(RESERVED_UUID);
+        assertThatThrownBy(() -> testedObject.execute(delegateExecution)).isInstanceOf(BpmnError.class);
+    }
+
+    private PnfCheckInputs prepareExecutionForCorrelationId(String correlationId) {
         PnfCheckInputs testedObject = new PnfCheckInputs(DEFAULT_TIMEOUT);
-        DelegateExecution delegateExecution = mockDelegateExecutionWithCorrelationId();
-        // when
-        testedObject.execute(delegateExecution);
-        // then
-        verify(delegateExecution).setVariable(eq(TIMEOUT_FOR_NOTIFICATION), eq(DEFAULT_TIMEOUT));
+        delegateExecution.setVariable(CORRELATION_ID, correlationId);
+        delegateExecution.setVariable(PNF_UUID, VALID_UUID);
+        return testedObject;
+    }
+
+    private PnfCheckInputs prepareExecutionForTimeout(String defaultTimeout, String timeout) {
+        PnfCheckInputs testedObject = new PnfCheckInputs(defaultTimeout);
+        delegateExecution.setVariable(CORRELATION_ID, "testCorrelationId");
+        delegateExecution.setVariable(PNF_UUID, VALID_UUID);
+        delegateExecution.setVariable(TIMEOUT_FOR_NOTIFICATION, timeout);
+        return testedObject;
+    }
+
+    private PnfCheckInputs prepareExecutionForUuid(String uuid) {
+        PnfCheckInputs testedObject = new PnfCheckInputs(DEFAULT_TIMEOUT);
+        delegateExecution.setVariable(CORRELATION_ID, "testCorrelationId");
+        delegateExecution.setVariable(PNF_UUID, uuid);
+        return testedObject;
     }
 }
index e0b14ab..d807917 100644 (file)
@@ -1,10 +1,10 @@
 <?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.16.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:collaboration id="Collaboration_1d0w8lf">
     <bpmn:participant id="Participant_1egg397" name="SO&#10;Create and Activate Pnf Resource" processRef="CreateAndActivatePnfResource" />
     <bpmn:participant id="Participant_0atuyq0" name="AAI" />
     <bpmn:participant id="Participant_19w87ws" name="Workflow Message Service&#10;(communication with DMAAP)&#10;" />
-    <bpmn:messageFlow id="MessageFlow_1h3xu88" sourceRef="CreateAndActivatePnf_CreateAaiEntry" targetRef="Participant_0atuyq0" />
+    <bpmn:messageFlow id="MessageFlow_1h3xu88" sourceRef="CreatePnfEntryInAai" targetRef="Participant_0atuyq0" />
     <bpmn:messageFlow id="MessageFlow_09ibv5a" sourceRef="CheckAiiForCorrelationId" targetRef="Participant_0atuyq0" />
     <bpmn:messageFlow id="MessageFlow_0vjul4t" sourceRef="Participant_0atuyq0" targetRef="CheckAiiForCorrelationId" />
     <bpmn:messageFlow id="MessageFlow_1vrcp2d" sourceRef="Participant_19w87ws" targetRef="WaitForDmaapPnfReadyNotification" />
   <bpmn:process id="CreateAndActivatePnfResource" name="CreateAndActivatePnfResource" isExecutable="true">
     <bpmn:sequenceFlow id="SequenceFlow_1kc34bc" sourceRef="WaitForDmaapTimeout" targetRef="CancelDmaapClientSubscription" />
     <bpmn:sequenceFlow id="SequenceFlow_1o8od8e" sourceRef="InformDmaapClient" targetRef="WaitForDmaapPnfReadyNotification" />
-    <bpmn:sequenceFlow id="SequenceFlow_0v5ffpe" name="No" sourceRef="DoesAaiContainInfoAboutPnf" targetRef="CreateAndActivatePnf_CreateAaiEntry">
+    <bpmn:sequenceFlow id="SequenceFlow_0v5ffpe" name="No" sourceRef="DoesAaiContainInfoAboutPnf" targetRef="CreatePnfEntryInAai">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{!aaiContainsInfoAboutPnf}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:sequenceFlow id="SequenceFlow_0p09qgm" sourceRef="WaitForDmaapPnfReadyNotification" targetRef="AaiEntryUpdated" />
     <bpmn:sequenceFlow id="SequenceFlow_17s9025" sourceRef="AaiEntryExists" targetRef="InformDmaapClient" />
-    <bpmn:sequenceFlow id="SequenceFlow_1qr6cmf" sourceRef="CreateAndActivatePnf_CreateAaiEntry" targetRef="AaiEntryExists" />
+    <bpmn:sequenceFlow id="SequenceFlow_1qr6cmf" sourceRef="CreatePnfEntryInAai" targetRef="AaiEntryExists" />
     <bpmn:sequenceFlow id="SequenceFlow_1j4r3zt" sourceRef="CheckAiiForCorrelationId" targetRef="DoesAaiContainInfoAboutPnf" />
     <bpmn:sequenceFlow id="SequenceFlow_0j5ksz1" sourceRef="CreateAndActivatePnf_StartEvent" targetRef="CheckInputs" />
     <bpmn:sequenceFlow id="SequenceFlow_1miyzfe" sourceRef="CancelDmaapClientSubscription" targetRef="ThrowTimeoutException" />
       <bpmn:incoming>SequenceFlow_1kc34bc</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1miyzfe</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:serviceTask id="InformDmaapClient" name="Inform DmaapClient about business key and corresponding pnf-id" camunda:delegateExpression="${InformDmaapClient}">
+    <bpmn:serviceTask id="InformDmaapClient" name="Register in Dmaap" camunda:delegateExpression="${InformDmaapClient}">
       <bpmn:incoming>SequenceFlow_17s9025</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1o8od8e</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:intermediateThrowEvent id="AaiEntryExists" name="AAI entry exists">
-      <bpmn:incoming>SequenceFlow_1qr6cmf</bpmn:incoming>
-      <bpmn:incoming>SequenceFlow_1l1t6ak</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_17s9025</bpmn:outgoing>
-    </bpmn:intermediateThrowEvent>
-    <bpmn:serviceTask id="CreateAndActivatePnf_CreateAaiEntry" name="Create AAI entry with pnf-id = correlation_id" camunda:delegateExpression="${CreateAaiEntryWithPnfIdDelegate}">
+    <bpmn:serviceTask id="CreatePnfEntryInAai" name="Create Pnf entry in AAI" camunda:delegateExpression="${CreatePnfEntryInAaiDelegate}">
       <bpmn:incoming>SequenceFlow_0v5ffpe</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1qr6cmf</bpmn:outgoing>
     </bpmn:serviceTask>
         <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">#{timeoutForPnfEntryNotification}</bpmn:timeDuration>
       </bpmn:timerEventDefinition>
     </bpmn:boundaryEvent>
+    <bpmn:exclusiveGateway id="AaiEntryExists" name="AAI entry exists">
+      <bpmn:incoming>SequenceFlow_1l1t6ak</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1qr6cmf</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_17s9025</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
     <bpmn:association id="Association_0d7oxnz" sourceRef="CreateAndActivatePnf_StartEvent" targetRef="TextAnnotation_1eyzes8" />
     <bpmn:textAnnotation id="TextAnnotation_1eyzes8">
       <bpmn:text>Inputs:
  - timeoutForPnfEntryNotification - String
  - correlationId - String
+ - uuid - String
 </bpmn:text>
     </bpmn:textAnnotation>
   </bpmn:process>
       <bpmndi:BPMNShape id="ServiceTask_0a5uk9o_di" bpmnElement="CheckAiiForCorrelationId">
         <dc:Bounds x="219" y="167" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ServiceTask_0iimk5v_di" bpmnElement="CreateAndActivatePnf_CreateAaiEntry">
+      <bpmndi:BPMNShape id="ServiceTask_0iimk5v_di" bpmnElement="CreatePnfEntryInAai">
         <dc:Bounds x="511" y="167" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1j4r3zt_di" bpmnElement="SequenceFlow_1j4r3zt">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1l1t6ak_di" bpmnElement="SequenceFlow_1l1t6ak">
-        <di:waypoint x="415" y="207" />
+        <di:waypoint x="415" y="182" />
         <di:waypoint x="415" y="66" />
-        <di:waypoint x="707" y="66" />
-        <di:waypoint x="707" y="189" />
+        <di:waypoint x="711" y="66" />
+        <di:waypoint x="711" y="182" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="430" y="180" width="19" height="14" />
+          <dc:Bounds x="430" y="159" width="19" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0v5ffpe_di" bpmnElement="SequenceFlow_0v5ffpe">
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1qr6cmf_di" bpmnElement="SequenceFlow_1qr6cmf">
         <di:waypoint x="611" y="207" />
-        <di:waypoint x="689" y="207" />
+        <di:waypoint x="686" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="605" y="187" width="90" height="10" />
         </bpmndi:BPMNLabel>
           <dc:Bounds x="1305" y="382" width="70" height="27" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="IntermediateThrowEvent_0fjcdy4_di" bpmnElement="AaiEntryExists">
-        <dc:Bounds x="689" y="189" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="672" y="235" width="77" height="14" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="TextAnnotation_1eyzes8_di" bpmnElement="TextAnnotation_1eyzes8">
-        <dc:Bounds x="-37" y="70" width="243" height="54" />
+        <dc:Bounds x="-37" y="70" width="243" height="82" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="Association_0d7oxnz_di" bpmnElement="Association_0d7oxnz">
         <di:waypoint x="-36" y="189" />
-        <di:waypoint x="-36" y="124" />
+        <di:waypoint x="-36" y="152" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="MessageFlow_1vrcp2d_di" bpmnElement="MessageFlow_1vrcp2d">
         <di:waypoint x="1060" y="523" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_17s9025_di" bpmnElement="SequenceFlow_17s9025">
-        <di:waypoint x="725" y="207" />
+        <di:waypoint x="736" y="207" />
         <di:waypoint x="803" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="719" y="187" width="90" height="10" />
       <bpmndi:BPMNShape id="ServiceTask_0lx02qn_di" bpmnElement="CheckInputs">
         <dc:Bounds x="48" y="167" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_0qwrtuy_di" bpmnElement="AaiEntryExists" isMarkerVisible="true">
+        <dc:Bounds x="686" y="182" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="672" y="242" width="77" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index 02b564e..3940dec 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.11.3" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="2.0.3" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="CreateVcpeResCustService_simplified" name="CreateVcpeResCustService_simplified" isExecutable="true">
     <bpmn2:scriptTask id="sendSyncAckResponse_ScriptTask" name="Send Sync Ack Response" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_7</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.sendSyncResponse(execution)]]></bpmn2:script>
+CreateVcpeResCustService.sendSyncResponse(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_3" name="" sourceRef="sendSyncAckResponse_ScriptTask" targetRef="IntermediateThrowEvent_2" />
     <bpmn2:startEvent id="createVCPE_startEvent" name="Start Flow">
@@ -16,10 +16,9 @@ CreateVcpeResCustService.sendSyncResponse(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="preProcessRequest_ScriptTask" name="PreProcess Incoming Request" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_7</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.preProcessRequest(execution)
-]]></bpmn2:script>
+CreateVcpeResCustService.preProcessRequest(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_7" name="" sourceRef="preProcessRequest_ScriptTask" targetRef="sendSyncAckResponse_ScriptTask" />
     <bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_3" name="vCPE-RESCUST">
@@ -29,9 +28,9 @@ CreateVcpeResCustService.preProcessRequest(execution)
     <bpmn2:scriptTask id="postProcessAndCompletionRequest_ScriptTask" name="Post Process &#38; Completion Request" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_0afe2pg</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_29</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.postProcessResponse(execution)]]></bpmn2:script>
+CreateVcpeResCustService.postProcessResponse(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_29" name="" sourceRef="postProcessAndCompletionRequest_ScriptTask" targetRef="callCompleteMsoProcess_CallActivity" />
     <bpmn2:callActivity id="callCompleteMsoProcess_CallActivity" name="Call CompleteMsoProcess" calledElement="CompleteMsoProcess">
@@ -52,8 +51,8 @@ CreateVcpeResCustService.postProcessResponse(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="ScriptTask_2" name="Set Success Indicator" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_8</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[// The following variable is checked by the unit test
-execution.setVariable("CreateVcpeResCustServiceSuccessIndicator", true)]]></bpmn2:script>
+      <bpmn2:script>// The following variable is checked by the unit test
+execution.setVariable("CreateVcpeResCustServiceSuccessIndicator", true)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_6" name="" sourceRef="ScriptTask_2" targetRef="CreateVCPE_EndEvent" />
     <bpmn2:endEvent id="CreateVCPE_EndEvent" name="End">
@@ -72,9 +71,9 @@ execution.setVariable("CreateVcpeResCustServiceSuccessIndicator", true)]]></bpmn
       <bpmn2:scriptTask id="ScriptTask_1" name="Log / Print Unexpected Error" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.common.scripts.*
 ExceptionUtil ex = new ExceptionUtil()
-ex.processJavaException(execution)]]></bpmn2:script>
+ex.processJavaException(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_5" name="" sourceRef="ScriptTask_1" targetRef="EndEvent_1" />
     </bpmn2:subProcess>
@@ -124,16 +123,16 @@ ex.processJavaException(execution)]]></bpmn2:script>
       <bpmn2:scriptTask id="ScriptTask_0yk02h3" name="Prepare FalloutHandler" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_0jg47xm</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_0807ukc</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.prepareFalloutRequest(execution)]]></bpmn2:script>
+CreateVcpeResCustService.prepareFalloutRequest(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_0zpbskl" name="Yes" sourceRef="ExclusiveGateway_1vwgs6p" targetRef="ExclusiveGateway_0ydrtdx">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("disableRollback") != true}]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("disableRollback") != true}</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_0dhf2js" name="No" sourceRef="ExclusiveGateway_1vwgs6p" targetRef="InclusiveGateway_0foywso" />
       <bpmn2:sequenceFlow id="SequenceFlow_1sx5llu" name="Yes" sourceRef="ExclusiveGateway_0ydrtdx" targetRef="InclusiveGateway_0foywso">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("PONR") == true}]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("PONR") == true}</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_02o4yqx" name="No" sourceRef="ExclusiveGateway_0ydrtdx" targetRef="ScriptTask_17doerz" />
       <bpmn2:sequenceFlow id="SequenceFlow_19mxskt" name="No" sourceRef="ExclusiveGateway_1kvn1pz" targetRef="ExclusiveGateway_05indeh" />
@@ -176,16 +175,16 @@ CreateVcpeResCustService.prepareFalloutRequest(execution)]]></bpmn2:script>
       <bpmn2:scriptTask id="ScriptTask_17doerz" name="Pre Process Rollback" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_02o4yqx</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_0ftzjjm</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService= new CreateVcpeResCustService()
-CreateVcpeResCustService.preProcessRollback(execution)]]></bpmn2:script>
+CreateVcpeResCustService.preProcessRollback(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:scriptTask id="ScriptTask_0wyub4x" name="Post Process Rollback" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_0dvsqpp</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_1rabks0</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService= new CreateVcpeResCustService()
-CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
+CreateVcpeResCustService.postProcessRollback(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_1rabks0" sourceRef="ScriptTask_0wyub4x" targetRef="InclusiveGateway_0foywso" />
       <bpmn2:exclusiveGateway id="ExclusiveGateway_06gq6em" name="is AR_BRG Ok?" default="SequenceFlow_0ya1cr3">
@@ -210,7 +209,7 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
         <bpmn2:outgoing>SequenceFlow_027lz43</bpmn2:outgoing>
       </bpmn2:inclusiveGateway>
       <bpmn2:sequenceFlow id="SequenceFlow_0orpdrl" name="Yes" sourceRef="ExclusiveGateway_06gq6em" targetRef="CallActivity_1bpuf2p">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("DCARBRG_rollbackData") != null }]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("DCARBRG_rollbackData") != null }</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_1t3cnnx" sourceRef="CallActivity_1bpuf2p" targetRef="ExclusiveGateway_1mjdcct" />
       <bpmn2:sequenceFlow id="SequenceFlow_0ya1cr3" name="No" sourceRef="ExclusiveGateway_06gq6em" targetRef="InclusiveGateway_131ozdf" />
@@ -231,7 +230,7 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
         <bpmn2:outgoing>SequenceFlow_0dr2fem</bpmn2:outgoing>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="SequenceFlow_1sim44y" name="Yes" sourceRef="ExclusiveGateway_1mjdcct" targetRef="InclusiveGateway_131ozdf">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{ execution.getVariable("DCARBRG_rolledBack") == true }]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{ execution.getVariable("DCARBRG_rolledBack") == true }</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_0dr2fem" name="No" sourceRef="ExclusiveGateway_1mjdcct" targetRef="InclusiveGateway_1xenadu" />
       <bpmn2:exclusiveGateway id="ExclusiveGateway_05dg1m1" name="Rollback success?" default="SequenceFlow_1mbymcu">
@@ -240,7 +239,7 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
         <bpmn2:outgoing>SequenceFlow_1mbymcu</bpmn2:outgoing>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="SequenceFlow_1quvahv" name="Yes" sourceRef="ExclusiveGateway_05dg1m1" targetRef="InclusiveGateway_142br6v">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{ execution.getVariable("DCVAM_rolledBack") ==true }]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{ execution.getVariable("DCVAM_rolledBack") ==true }</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_1mbymcu" name="No" sourceRef="ExclusiveGateway_05dg1m1" targetRef="InclusiveGateway_0m9f5ka" />
       <bpmn2:exclusiveGateway id="ExclusiveGateway_0y7gtd9" name="rollback failed?" default="SequenceFlow_12dakwh">
@@ -259,7 +258,7 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
       <bpmn2:sequenceFlow id="SequenceFlow_1lv5ld6" sourceRef="InclusiveGateway_0m9f5ka" targetRef="InclusiveGateway_1xenadu" />
       <bpmn2:sequenceFlow id="SequenceFlow_0dvsqpp" sourceRef="InclusiveGateway_1xenadu" targetRef="ScriptTask_0wyub4x" />
       <bpmn2:sequenceFlow id="SequenceFlow_09nn9a9" name="Yes" sourceRef="ExclusiveGateway_0y7gtd9" targetRef="InclusiveGateway_1xenadu">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("rolledBack") != null && execution.getVariable("rolledBack") == false}]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("rolledBack") != null &amp;&amp; execution.getVariable("rolledBack") == false}</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_027lz43" sourceRef="InclusiveGateway_131ozdf" targetRef="ExclusiveGateway_14tl857" />
       <bpmn2:sequenceFlow id="SequenceFlow_0t3mtod" sourceRef="InclusiveGateway_142br6v" targetRef="ExclusiveGateway_1kvn1pz" />
@@ -275,7 +274,7 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
         <bpmn2:outgoing>SequenceFlow_0ne9n0g</bpmn2:outgoing>
       </bpmn2:callActivity>
       <bpmn2:sequenceFlow id="SequenceFlow_1sl79hn" name="Yes" sourceRef="ExclusiveGateway_1kvn1pz" targetRef="CallActivity_071yaf8">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("DCARTXC_rollbackData") != null }]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("DCARTXC_rollbackData") != null }</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:exclusiveGateway id="ExclusiveGateway_0y158bb" name="Rollback success?" default="SequenceFlow_00by7l7">
         <bpmn2:incoming>SequenceFlow_0ne9n0g</bpmn2:incoming>
@@ -284,11 +283,11 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="SequenceFlow_0ne9n0g" sourceRef="CallActivity_071yaf8" targetRef="ExclusiveGateway_0y158bb" />
       <bpmn2:sequenceFlow id="SequenceFlow_1a7e8l1" name="Yes" sourceRef="ExclusiveGateway_05indeh" targetRef="DoRollbackService_CallActivity">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{ execution.getVariable("DCRESI_rollbackData") != null }]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{ execution.getVariable("DCRESI_rollbackData") != null }</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_00by7l7" name="No" sourceRef="ExclusiveGateway_0y158bb" targetRef="InclusiveGateway_0m9f5ka" />
       <bpmn2:sequenceFlow id="SequenceFlow_17cz98f" name="Yes" sourceRef="ExclusiveGateway_0y158bb" targetRef="ExclusiveGateway_05indeh">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{ execution.getVariable("DCARTXC_rolledBack") == true }]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{ execution.getVariable("DCARTXC_rolledBack") == true }</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:callActivity id="CallActivity_1cl4iu4" name="DoRollback&#10;VNF and Modules&#10;" calledElement="DoCreateVnfAndModulesRollback">
         <bpmn2:extensionElements>
@@ -303,13 +302,13 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
       </bpmn2:callActivity>
       <bpmn2:sequenceFlow id="SequenceFlow_1mpsdaj" sourceRef="CallActivity_1cl4iu4" targetRef="ExclusiveGateway_05dg1m1" />
       <bpmn2:sequenceFlow id="SequenceFlow_007p8k3" name="Yes" sourceRef="ExclusiveGateway_14tl857" targetRef="CallActivity_1cl4iu4">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("DCVAM_rollbackData") != null }]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("DCVAM_rollbackData") != null }</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
     </bpmn2:subProcess>
     <bpmn2:scriptTask id="setPONR_ScriptTask" name="set PONR">
       <bpmn2:incoming>SequenceFlow_12ilko1</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0afe2pg</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[#{execution.setVariable("PONR", true)}]]></bpmn2:script>
+      <bpmn2:script>#{execution.setVariable("PONR", true)}</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_12ilko1" sourceRef="IntermediateCatchEvent_4" targetRef="setPONR_ScriptTask" />
     <bpmn2:sequenceFlow id="SequenceFlow_0afe2pg" sourceRef="setPONR_ScriptTask" targetRef="postProcessAndCompletionRequest_ScriptTask" />
@@ -332,9 +331,9 @@ CreateVcpeResCustService.postProcessRollback(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="ScriptTask_0cdtchu" name="Prepare&#10;Decompose&#10;Service&#10;" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_1eu60rt</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_00h6hmd</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.prepareDecomposeService(execution)]]></bpmn2:script>
+CreateVcpeResCustService.prepareDecomposeService(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_1eu60rt" sourceRef="IntermediateCatchEvent_3" targetRef="ScriptTask_0cdtchu" />
     <bpmn2:sequenceFlow id="SequenceFlow_00h6hmd" sourceRef="ScriptTask_0cdtchu" targetRef="DecomposeService" />
@@ -350,20 +349,21 @@ CreateVcpeResCustService.prepareDecomposeService(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="ScriptTask_0lpv2da" name="PostProcess&#10;Decompose&#10;Service&#10;" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_17g05fd</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_11efpvh</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.processDecomposition(execution)]]></bpmn2:script>
+CreateVcpeResCustService.processDecomposition(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_11efpvh" sourceRef="ScriptTask_0lpv2da" targetRef="IntermediateThrowEvent_0prlju0" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0gj4vud" sourceRef="IntermediateCatchEvent_17pzn7m" targetRef="Task_14l19kv" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0gj4vud" sourceRef="IntermediateCatchEvent_17pzn7m" targetRef="GeneratePnfUuid" />
     <bpmn2:sequenceFlow id="SequenceFlow_0clhseq" sourceRef="Task_14l19kv" targetRef="IntermediateThrowEvent_0lt5ltv" />
     <bpmn2:callActivity id="Task_14l19kv" name="Create And Activate Pnf Resource" calledElement="CreateAndActivatePnfResource">
       <bpmn2:extensionElements>
         <camunda:in source="timeoutForPnfEntryNotification" target="timeoutForPnfEntryNotification" />
         <camunda:in source="correlationId" target="correlationId" />
         <camunda:in businessKey="#{execution.processBusinessKey}" />
+        <camunda:in source="pnfUuid" target="pnfUuid" />
       </bpmn2:extensionElements>
-      <bpmn2:incoming>SequenceFlow_0gj4vud</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_1yojilk</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0clhseq</bpmn2:outgoing>
     </bpmn2:callActivity>
     <bpmn2:callActivity id="CallActivity_1vc4jeh" name="Call Create &#10;ServiceInstance&#10;" calledElement="DoCreateServiceInstance">
@@ -393,16 +393,16 @@ CreateVcpeResCustService.processDecomposition(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="ScriptTask_1y241p8" name="Prepare&#10;Create&#10;Service&#10;" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_1429lyc</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0bt420h</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.prepareCreateServiceInstance(execution)]]></bpmn2:script>
+CreateVcpeResCustService.prepareCreateServiceInstance(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:scriptTask id="ScriptTask_1y5lvl7" name="Post Process&#10;Create&#10;Service&#10;" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_0ocy2qp</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_11gw54u</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.vcpe.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.vcpe.scripts.*
 def CreateVcpeResCustService = new CreateVcpeResCustService()
-CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:script>
+CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_0m5yuay" name="StartService">
       <bpmn2:outgoing>SequenceFlow_1429lyc</bpmn2:outgoing>
@@ -416,6 +416,11 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
     <bpmn2:sequenceFlow id="SequenceFlow_0ocy2qp" sourceRef="CallActivity_1vc4jeh" targetRef="ScriptTask_1y5lvl7" />
     <bpmn2:sequenceFlow id="SequenceFlow_1429lyc" sourceRef="IntermediateCatchEvent_0m5yuay" targetRef="ScriptTask_1y241p8" />
     <bpmn2:sequenceFlow id="SequenceFlow_11gw54u" sourceRef="ScriptTask_1y5lvl7" targetRef="IntermediateThrowEvent_13xv36r" />
+    <bpmn2:sequenceFlow id="SequenceFlow_1yojilk" sourceRef="GeneratePnfUuid" targetRef="Task_14l19kv" />
+    <bpmn2:serviceTask id="GeneratePnfUuid" name="Generate Pnf UUID" camunda:delegateExpression="${GeneratePnfUuidDelegate}">
+      <bpmn2:incoming>SequenceFlow_0gj4vud</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_1yojilk</bpmn2:outgoing>
+    </bpmn2:serviceTask>
   </bpmn2:process>
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmn2:error id="Error_1" name="java.lang.Exception" errorCode="java.lang.Exception" />
@@ -431,8 +436,8 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="256" y="789" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_1" bpmnElement="SequenceFlow_1" sourceElement="_BPMNShape_StartEvent_47" targetElement="_BPMNShape_ScriptTask_61">
-        <di:waypoint xsi:type="dc:Point" x="103" y="829" />
-        <di:waypoint xsi:type="dc:Point" x="256" y="829" />
+        <di:waypoint x="103" y="829" />
+        <di:waypoint x="256" y="829" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="100" y="829" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -444,8 +449,8 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="490" y="1432" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_12" bpmnElement="SequenceFlow_7" sourceElement="_BPMNShape_ScriptTask_61" targetElement="_BPMNShape_ScriptTask_127">
-        <di:waypoint xsi:type="dc:Point" x="356" y="829" />
-        <di:waypoint xsi:type="dc:Point" x="447" y="829" />
+        <di:waypoint x="356" y="829" />
+        <di:waypoint x="447" y="829" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="200" y="790" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -454,8 +459,8 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="447" y="789" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_42" bpmnElement="SequenceFlow_29" sourceElement="_BPMNShape_ScriptTask_80" targetElement="_BPMNShape_CallActivity_4">
-        <di:waypoint xsi:type="dc:Point" x="590" y="1472" />
-        <di:waypoint xsi:type="dc:Point" x="763" y="1472" />
+        <di:waypoint x="590" y="1472" />
+        <di:waypoint x="763" y="1472" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="632" y="1457" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -467,8 +472,8 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_8" bpmnElement="SequenceFlow_8" sourceElement="_BPMNShape_CallActivity_4" targetElement="_BPMNShape_ScriptTask_337">
-        <di:waypoint xsi:type="dc:Point" x="863" y="1472" />
-        <di:waypoint xsi:type="dc:Point" x="1071" y="1471" />
+        <di:waypoint x="863" y="1472" />
+        <di:waypoint x="1071" y="1471" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="922" y="1457" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -492,24 +497,24 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_4" bpmnElement="SequenceFlow_2" sourceElement="_BPMNShape_StartEvent_70" targetElement="_BPMNShape_ScriptTask_269">
-        <di:waypoint xsi:type="dc:Point" x="1361" y="1825" />
-        <di:waypoint xsi:type="dc:Point" x="1400" y="1825" />
+        <di:waypoint x="1361" y="1825" />
+        <di:waypoint x="1400" y="1825" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1344" y="1825" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_5" bpmnElement="SequenceFlow_5" sourceElement="_BPMNShape_ScriptTask_269" targetElement="_BPMNShape_EndEvent_219">
-        <di:waypoint xsi:type="dc:Point" x="1500" y="1825" />
-        <di:waypoint xsi:type="dc:Point" x="1533" y="1825" />
-        <di:waypoint xsi:type="dc:Point" x="1533" y="1825" />
-        <di:waypoint xsi:type="dc:Point" x="1553" y="1825" />
+        <di:waypoint x="1500" y="1825" />
+        <di:waypoint x="1533" y="1825" />
+        <di:waypoint x="1533" y="1825" />
+        <di:waypoint x="1553" y="1825" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1503" y="1825" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_2" bpmnElement="SequenceFlow_3" sourceElement="_BPMNShape_ScriptTask_127">
-        <di:waypoint xsi:type="dc:Point" x="547" y="829" />
-        <di:waypoint xsi:type="dc:Point" x="699" y="829" />
+        <di:waypoint x="547" y="829" />
+        <di:waypoint x="699" y="829" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="578" y="814" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -518,8 +523,8 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="1071" y="1431" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_3" bpmnElement="SequenceFlow_6" sourceElement="_BPMNShape_ScriptTask_337" targetElement="_BPMNShape_EndEvent_177">
-        <di:waypoint xsi:type="dc:Point" x="1171" y="1470" />
-        <di:waypoint xsi:type="dc:Point" x="1262" y="1470" />
+        <di:waypoint x="1171" y="1470" />
+        <di:waypoint x="1262" y="1470" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1172" y="1455" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -582,41 +587,41 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="891" y="2945" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0zpbskl_di" bpmnElement="SequenceFlow_0zpbskl">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2971" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2938" />
+        <di:waypoint x="75" y="2971" />
+        <di:waypoint x="75" y="2938" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="81" y="2958" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0dhf2js_di" bpmnElement="SequenceFlow_0dhf2js">
-        <di:waypoint xsi:type="dc:Point" x="100" y="2996" />
-        <di:waypoint xsi:type="dc:Point" x="734" y="2996" />
-        <di:waypoint xsi:type="dc:Point" x="734" y="2938" />
+        <di:waypoint x="100" y="2996" />
+        <di:waypoint x="734" y="2996" />
+        <di:waypoint x="734" y="2938" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="140" y="3001" width="15" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1sx5llu_di" bpmnElement="SequenceFlow_1sx5llu">
-        <di:waypoint xsi:type="dc:Point" x="100" y="2913" />
-        <di:waypoint xsi:type="dc:Point" x="405" y="2913" />
-        <di:waypoint xsi:type="dc:Point" x="405" y="2913" />
-        <di:waypoint xsi:type="dc:Point" x="709" y="2913" />
+        <di:waypoint x="100" y="2913" />
+        <di:waypoint x="405" y="2913" />
+        <di:waypoint x="405" y="2913" />
+        <di:waypoint x="709" y="2913" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="419" y="2917" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_02o4yqx_di" bpmnElement="SequenceFlow_02o4yqx">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2888" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2866" />
+        <di:waypoint x="75" y="2888" />
+        <di:waypoint x="75" y="2866" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="86" y="2871" width="15" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_19mxskt_di" bpmnElement="SequenceFlow_19mxskt">
-        <di:waypoint xsi:type="dc:Point" x="202" y="1821" />
-        <di:waypoint xsi:type="dc:Point" x="202" y="1725" />
-        <di:waypoint xsi:type="dc:Point" x="681" y="1725" />
-        <di:waypoint xsi:type="dc:Point" x="681" y="1941" />
+        <di:waypoint x="202" y="1821" />
+        <di:waypoint x="202" y="1725" />
+        <di:waypoint x="681" y="1725" />
+        <di:waypoint x="681" y="1941" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="392" y="1704" width="15" height="12" />
         </bpmndi:BPMNLabel>
@@ -625,16 +630,16 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="204" y="1432" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_12ilko1_di" bpmnElement="SequenceFlow_12ilko1">
-        <di:waypoint xsi:type="dc:Point" x="96" y="1472" />
-        <di:waypoint xsi:type="dc:Point" x="204" y="1472" />
+        <di:waypoint x="96" y="1472" />
+        <di:waypoint x="204" y="1472" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="105" y="1447" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0afe2pg_di" bpmnElement="SequenceFlow_0afe2pg">
-        <di:waypoint xsi:type="dc:Point" x="304" y="1472" />
-        <di:waypoint xsi:type="dc:Point" x="447" y="1472" />
-        <di:waypoint xsi:type="dc:Point" x="490" y="1472" />
+        <di:waypoint x="304" y="1472" />
+        <di:waypoint x="447" y="1472" />
+        <di:waypoint x="490" y="1472" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="331" y="1457" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -649,30 +654,30 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1f1hd3l_di" bpmnElement="SequenceFlow_1f1hd3l">
-        <di:waypoint xsi:type="dc:Point" x="1026" y="2006" />
-        <di:waypoint xsi:type="dc:Point" x="1026" y="2103" />
+        <di:waypoint x="1026" y="2006" />
+        <di:waypoint x="1026" y="2103" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="996" y="2055" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0jg47xm_di" bpmnElement="SequenceFlow_0jg47xm">
-        <di:waypoint xsi:type="dc:Point" x="759" y="2913" />
-        <di:waypoint xsi:type="dc:Point" x="941" y="2913" />
-        <di:waypoint xsi:type="dc:Point" x="941" y="2945" />
+        <di:waypoint x="759" y="2913" />
+        <di:waypoint x="941" y="2913" />
+        <di:waypoint x="941" y="2945" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="805" y="2898" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0807ukc_di" bpmnElement="SequenceFlow_0807ukc">
-        <di:waypoint xsi:type="dc:Point" x="991" y="2985" />
-        <di:waypoint xsi:type="dc:Point" x="1023" y="2985" />
+        <di:waypoint x="991" y="2985" />
+        <di:waypoint x="1023" y="2985" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="962" y="2970" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_19yywk8_di" bpmnElement="SequenceFlow_19yywk8">
-        <di:waypoint xsi:type="dc:Point" x="1123" y="2985" />
-        <di:waypoint xsi:type="dc:Point" x="1160" y="2985" />
+        <di:waypoint x="1123" y="2985" />
+        <di:waypoint x="1160" y="2985" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1097" y="2970" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -690,9 +695,9 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0sezboq_di" bpmnElement="SequenceFlow_0sezboq">
-        <di:waypoint xsi:type="dc:Point" x="681" y="1991" />
-        <di:waypoint xsi:type="dc:Point" x="681" y="2128" />
-        <di:waypoint xsi:type="dc:Point" x="1001" y="2128" />
+        <di:waypoint x="681" y="1991" />
+        <di:waypoint x="681" y="2128" />
+        <di:waypoint x="1001" y="2128" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="689" y="2045" width="15" height="12" />
         </bpmndi:BPMNLabel>
@@ -701,10 +706,10 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="25" y="2786" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0zq7i3q_di" bpmnElement="SequenceFlow_0zq7i3q">
-        <di:waypoint xsi:type="dc:Point" x="-27" y="2997" />
-        <di:waypoint xsi:type="dc:Point" x="20" y="2997" />
-        <di:waypoint xsi:type="dc:Point" x="20" y="2996" />
-        <di:waypoint xsi:type="dc:Point" x="50" y="2996" />
+        <di:waypoint x="-27" y="2997" />
+        <di:waypoint x="20" y="2997" />
+        <di:waypoint x="20" y="2996" />
+        <di:waypoint x="50" y="2996" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="-56" y="2998" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -719,8 +724,8 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="684" y="2786" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1rabks0_di" bpmnElement="SequenceFlow_1rabks0">
-        <di:waypoint xsi:type="dc:Point" x="734" y="2866" />
-        <di:waypoint xsi:type="dc:Point" x="734" y="2888" />
+        <di:waypoint x="734" y="2866" />
+        <di:waypoint x="734" y="2888" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="704" y="2877" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -732,15 +737,15 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="256" y="944" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1eu60rt_di" bpmnElement="SequenceFlow_1eu60rt">
-        <di:waypoint xsi:type="dc:Point" x="103" y="984" />
-        <di:waypoint xsi:type="dc:Point" x="256" y="984" />
+        <di:waypoint x="103" y="984" />
+        <di:waypoint x="256" y="984" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="135" y="969" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_00h6hmd_di" bpmnElement="SequenceFlow_00h6hmd">
-        <di:waypoint xsi:type="dc:Point" x="356" y="984" />
-        <di:waypoint xsi:type="dc:Point" x="447" y="984" />
+        <di:waypoint x="356" y="984" />
+        <di:waypoint x="447" y="984" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="357" y="969" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -761,25 +766,25 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0orpdrl_di" bpmnElement="SequenceFlow_0orpdrl">
-        <di:waypoint xsi:type="dc:Point" x="100" y="2628" />
-        <di:waypoint xsi:type="dc:Point" x="202" y="2628" />
-        <di:waypoint xsi:type="dc:Point" x="202" y="2598" />
+        <di:waypoint x="100" y="2628" />
+        <di:waypoint x="202" y="2628" />
+        <di:waypoint x="202" y="2598" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="141" y="2613" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1t3cnnx_di" bpmnElement="SequenceFlow_1t3cnnx">
-        <di:waypoint xsi:type="dc:Point" x="202" y="2518" />
-        <di:waypoint xsi:type="dc:Point" x="202" y="2481" />
+        <di:waypoint x="202" y="2518" />
+        <di:waypoint x="202" y="2481" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="172" y="2500" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0ya1cr3_di" bpmnElement="SequenceFlow_0ya1cr3">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2603" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2542" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2542" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2481" />
+        <di:waypoint x="75" y="2603" />
+        <di:waypoint x="75" y="2542" />
+        <di:waypoint x="75" y="2542" />
+        <di:waypoint x="75" y="2481" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="88" y="2508" width="15" height="12" />
         </bpmndi:BPMNLabel>
@@ -797,8 +802,8 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1kpdu1j_di" bpmnElement="SequenceFlow_1kpdu1j">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2282" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2153" />
+        <di:waypoint x="75" y="2282" />
+        <di:waypoint x="75" y="2153" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="83" y="2218" width="15" height="12" />
         </bpmndi:BPMNLabel>
@@ -810,16 +815,16 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1sim44y_di" bpmnElement="SequenceFlow_1sim44y">
-        <di:waypoint xsi:type="dc:Point" x="177" y="2456" />
-        <di:waypoint xsi:type="dc:Point" x="100" y="2456" />
+        <di:waypoint x="177" y="2456" />
+        <di:waypoint x="100" y="2456" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="107" y="2431" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0dr2fem_di" bpmnElement="SequenceFlow_0dr2fem">
-        <di:waypoint xsi:type="dc:Point" x="226" y="2457" />
-        <di:waypoint xsi:type="dc:Point" x="734" y="2457" />
-        <di:waypoint xsi:type="dc:Point" x="734" y="2695" />
+        <di:waypoint x="226" y="2457" />
+        <di:waypoint x="734" y="2457" />
+        <di:waypoint x="734" y="2695" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="316" y="2436" width="15" height="12" />
         </bpmndi:BPMNLabel>
@@ -831,22 +836,22 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1quvahv_di" bpmnElement="SequenceFlow_1quvahv">
-        <di:waypoint xsi:type="dc:Point" x="177" y="2128" />
-        <di:waypoint xsi:type="dc:Point" x="100" y="2128" />
+        <di:waypoint x="177" y="2128" />
+        <di:waypoint x="100" y="2128" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="129" y="2103" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1mbymcu_di" bpmnElement="SequenceFlow_1mbymcu">
-        <di:waypoint xsi:type="dc:Point" x="227" y="2128" />
-        <di:waypoint xsi:type="dc:Point" x="1001" y="2128" />
+        <di:waypoint x="227" y="2128" />
+        <di:waypoint x="1001" y="2128" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="290" y="2097" width="15" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_17g05fd_di" bpmnElement="SequenceFlow_17g05fd">
-        <di:waypoint xsi:type="dc:Point" x="547" y="984" />
-        <di:waypoint xsi:type="dc:Point" x="638" y="984" />
+        <di:waypoint x="547" y="984" />
+        <di:waypoint x="638" y="984" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="548" y="969" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -858,15 +863,15 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ftzjjm_di" bpmnElement="SequenceFlow_0ftzjjm">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2786" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2745" />
+        <di:waypoint x="75" y="2786" />
+        <di:waypoint x="75" y="2745" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="45" y="2766" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_12dakwh_di" bpmnElement="SequenceFlow_12dakwh">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2695" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2653" />
+        <di:waypoint x="75" y="2695" />
+        <di:waypoint x="75" y="2653" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="83" y="2666" width="15" height="12" />
         </bpmndi:BPMNLabel>
@@ -878,40 +883,40 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1lv5ld6_di" bpmnElement="SequenceFlow_1lv5ld6">
-        <di:waypoint xsi:type="dc:Point" x="1026" y="2153" />
-        <di:waypoint xsi:type="dc:Point" x="1026" y="2720" />
-        <di:waypoint xsi:type="dc:Point" x="759" y="2720" />
+        <di:waypoint x="1026" y="2153" />
+        <di:waypoint x="1026" y="2720" />
+        <di:waypoint x="759" y="2720" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="996" y="2437" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0dvsqpp_di" bpmnElement="SequenceFlow_0dvsqpp">
-        <di:waypoint xsi:type="dc:Point" x="734" y="2745" />
-        <di:waypoint xsi:type="dc:Point" x="734" y="2786" />
+        <di:waypoint x="734" y="2745" />
+        <di:waypoint x="734" y="2786" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="704" y="2766" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_09nn9a9_di" bpmnElement="SequenceFlow_09nn9a9">
-        <di:waypoint xsi:type="dc:Point" x="100" y="2720" />
-        <di:waypoint xsi:type="dc:Point" x="423" y="2720" />
-        <di:waypoint xsi:type="dc:Point" x="423" y="2720" />
-        <di:waypoint xsi:type="dc:Point" x="709" y="2720" />
+        <di:waypoint x="100" y="2720" />
+        <di:waypoint x="423" y="2720" />
+        <di:waypoint x="423" y="2720" />
+        <di:waypoint x="709" y="2720" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="144" y="2693" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_027lz43_di" bpmnElement="SequenceFlow_027lz43">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2431" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="2332" />
+        <di:waypoint x="75" y="2431" />
+        <di:waypoint x="75" y="2332" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="45" y="2372" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0t3mtod_di" bpmnElement="SequenceFlow_0t3mtod">
-        <di:waypoint xsi:type="dc:Point" x="75" y="2103" />
-        <di:waypoint xsi:type="dc:Point" x="75" y="1846" />
-        <di:waypoint xsi:type="dc:Point" x="177" y="1846" />
+        <di:waypoint x="75" y="2103" />
+        <di:waypoint x="75" y="1846" />
+        <di:waypoint x="177" y="1846" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="45" y="1965" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -923,19 +928,19 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="IntermediateThrowEvent_0lt5ltv_di" bpmnElement="IntermediateThrowEvent_0lt5ltv">
-        <dc:Bounds x="466" y="1259" width="36" height="36" />
+        <dc:Bounds x="725" y="1259" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="441" y="1306" width="85" height="24" />
+          <dc:Bounds x="700" y="1306" width="85" height="27" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="CallActivity_071yaf8_di" bpmnElement="CallActivity_071yaf8">
         <dc:Bounds x="321" y="1806" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1sl79hn_di" bpmnElement="SequenceFlow_1sl79hn">
-        <di:waypoint xsi:type="dc:Point" x="227" y="1846" />
-        <di:waypoint xsi:type="dc:Point" x="256" y="1846" />
-        <di:waypoint xsi:type="dc:Point" x="256" y="1846" />
-        <di:waypoint xsi:type="dc:Point" x="321" y="1846" />
+        <di:waypoint x="227" y="1846" />
+        <di:waypoint x="256" y="1846" />
+        <di:waypoint x="256" y="1846" />
+        <di:waypoint x="321" y="1846" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="271" y="1826" width="19" height="12" />
         </bpmndi:BPMNLabel>
@@ -947,30 +952,30 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ne9n0g_di" bpmnElement="SequenceFlow_0ne9n0g">
-        <di:waypoint xsi:type="dc:Point" x="421" y="1846" />
-        <di:waypoint xsi:type="dc:Point" x="521" y="1846" />
+        <di:waypoint x="421" y="1846" />
+        <di:waypoint x="521" y="1846" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="426" y="1825" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1a7e8l1_di" bpmnElement="SequenceFlow_1a7e8l1">
-        <di:waypoint xsi:type="dc:Point" x="706" y="1966" />
-        <di:waypoint xsi:type="dc:Point" x="976" y="1966" />
+        <di:waypoint x="706" y="1966" />
+        <di:waypoint x="976" y="1966" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="832" y="1945" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_00by7l7_di" bpmnElement="SequenceFlow_00by7l7">
-        <di:waypoint xsi:type="dc:Point" x="546" y="1871" />
-        <di:waypoint xsi:type="dc:Point" x="546" y="2128" />
-        <di:waypoint xsi:type="dc:Point" x="1001" y="2128" />
+        <di:waypoint x="546" y="1871" />
+        <di:waypoint x="546" y="2128" />
+        <di:waypoint x="1001" y="2128" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="554" y="1994" width="15" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_17cz98f_di" bpmnElement="SequenceFlow_17cz98f">
-        <di:waypoint xsi:type="dc:Point" x="559" y="1858" />
-        <di:waypoint xsi:type="dc:Point" x="668" y="1954" />
+        <di:waypoint x="559" y="1858" />
+        <di:waypoint x="668" y="1954" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="615" y="1889" width="19" height="12" />
         </bpmndi:BPMNLabel>
@@ -979,16 +984,16 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="152" y="2193" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1mpsdaj_di" bpmnElement="SequenceFlow_1mpsdaj">
-        <di:waypoint xsi:type="dc:Point" x="202" y="2193" />
-        <di:waypoint xsi:type="dc:Point" x="202" y="2153" />
+        <di:waypoint x="202" y="2193" />
+        <di:waypoint x="202" y="2153" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="172" y="2167" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_007p8k3_di" bpmnElement="SequenceFlow_007p8k3">
-        <di:waypoint xsi:type="dc:Point" x="100" y="2307" />
-        <di:waypoint xsi:type="dc:Point" x="202" y="2307" />
-        <di:waypoint xsi:type="dc:Point" x="202" y="2273" />
+        <di:waypoint x="100" y="2307" />
+        <di:waypoint x="202" y="2307" />
+        <di:waypoint x="202" y="2273" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="142" y="2286" width="19" height="12" />
         </bpmndi:BPMNLabel>
@@ -997,28 +1002,28 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         <dc:Bounds x="638" y="944" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_11efpvh_di" bpmnElement="SequenceFlow_11efpvh">
-        <di:waypoint xsi:type="dc:Point" x="738" y="984" />
-        <di:waypoint xsi:type="dc:Point" x="902" y="984" />
+        <di:waypoint x="738" y="984" />
+        <di:waypoint x="902" y="984" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="775" y="963" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0gj4vud_di" bpmnElement="SequenceFlow_0gj4vud">
-        <di:waypoint xsi:type="dc:Point" x="103" y="1277" />
-        <di:waypoint xsi:type="dc:Point" x="256" y="1277" />
+        <di:waypoint x="103" y="1277" />
+        <di:waypoint x="256" y="1277" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="134.5" y="1257" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0clhseq_di" bpmnElement="SequenceFlow_0clhseq">
-        <di:waypoint xsi:type="dc:Point" x="356" y="1277" />
-        <di:waypoint xsi:type="dc:Point" x="466" y="1277" />
+        <di:waypoint x="547" y="1277" />
+        <di:waypoint x="725" y="1277" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="366" y="1257" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_1totpg4_di" bpmnElement="Task_14l19kv">
-        <dc:Bounds x="256" y="1237" width="100" height="80" />
+        <dc:Bounds x="447" y="1237" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="CallActivity_1vc4jeh_di" bpmnElement="CallActivity_1vc4jeh">
         <dc:Bounds x="447" y="1072" width="100" height="80" />
@@ -1042,33 +1047,40 @@ CreateVcpeResCustService.postProcessServiceInstanceCreate(execution)]]></bpmn2:s
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0bt420h_di" bpmnElement="SequenceFlow_0bt420h">
-        <di:waypoint xsi:type="dc:Point" x="356" y="1112" />
-        <di:waypoint xsi:type="dc:Point" x="447" y="1112" />
+        <di:waypoint x="356" y="1112" />
+        <di:waypoint x="447" y="1112" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="356.5" y="1091" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0ocy2qp_di" bpmnElement="SequenceFlow_0ocy2qp">
-        <di:waypoint xsi:type="dc:Point" x="547" y="1112" />
-        <di:waypoint xsi:type="dc:Point" x="638" y="1112" />
+        <di:waypoint x="547" y="1112" />
+        <di:waypoint x="638" y="1112" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="547.5" y="1091" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1429lyc_di" bpmnElement="SequenceFlow_1429lyc">
-        <di:waypoint xsi:type="dc:Point" x="101" y="1112" />
-        <di:waypoint xsi:type="dc:Point" x="256" y="1112" />
+        <di:waypoint x="101" y="1112" />
+        <di:waypoint x="256" y="1112" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="133.5" y="1091" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_11gw54u_di" bpmnElement="SequenceFlow_11gw54u">
-        <di:waypoint xsi:type="dc:Point" x="738" y="1112" />
-        <di:waypoint xsi:type="dc:Point" x="902" y="1112" />
+        <di:waypoint x="738" y="1112" />
+        <di:waypoint x="902" y="1112" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="775" y="1091" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1yojilk_di" bpmnElement="SequenceFlow_1yojilk">
+        <di:waypoint x="356" y="1277" />
+        <di:waypoint x="447" y="1277" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_1j71wic_di" bpmnElement="GeneratePnfUuid">
+        <dc:Bounds x="256" y="1237" width="100" height="80" />
+      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn2:definitions>
index 2f5fa39..c049eaa 100644 (file)
@@ -1,16 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="2.0.3" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="DoCreateNetworkInstance" name="DoCreateNetworkInstance" isExecutable="true">
     <bpmn2:startEvent id="createNetwork_startEvent" name="Start Flow">
       <bpmn2:outgoing>SequenceFlow_1n61wit</bpmn2:outgoing>
     </bpmn2:startEvent>
-    <bpmn2:endEvent id="aai_Error_EndEvent" name="AAI Name Error">
-      <bpmn2:incoming>isReturnCode404_No_SequenceFlow</bpmn2:incoming>
-      <bpmn2:errorEventDefinition id="_ErrorEventDefinition_53" errorRef="Error_2" />
-    </bpmn2:endEvent>
     <bpmn2:inclusiveGateway id="InclusiveGateway">
       <bpmn2:incoming>isNetworkActiveNo_SequenceFlow</bpmn2:incoming>
-      <bpmn2:incoming>isReturnCode404_Yes_SequenceFlow</bpmn2:incoming>
+      <bpmn2:incoming>isAAIQueryNameNo_SequenceFlow</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_21</bpmn2:outgoing>
     </bpmn2:inclusiveGateway>
     <bpmn2:sequenceFlow id="SequenceFlow_21" sourceRef="InclusiveGateway" targetRef="callRESTQueryCloudRegion_ScriptTask" />
       <bpmn2:incoming>SequenceFlow_21</bpmn2:incoming>
       <bpmn2:incoming>isNameSentNo_SequenceFlow</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_32</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTQueryAAICloudRegion(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTQueryAAICloudRegion(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_32" name="" sourceRef="callRESTQueryCloudRegion_ScriptTask" targetRef="isSdncRpc1_ExclusiveGateway1" />
     <bpmn2:scriptTask id="prepareSDNCTopoRequest_ScriptTask" name="Prepare Assign SDNC Request" scriptFormat="groovy">
       <bpmn2:incoming>isSdncRpc1No_SequenceFlow1</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_11</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
 DoCreateNetworkInstance.prepareSDNCRequest(execution)
-]]></bpmn2:script>
+</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_11" name="" sourceRef="prepareSDNCTopoRequest_ScriptTask" targetRef="callAssignSDNCAdapter_CallActivity" />
     <bpmn2:scriptTask id="validateSDNCResponse_ScriptTask" name="Validate SDNC Assign Response" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_12</bpmn2:incoming>
       <bpmn2:incoming>SequenceFlow_0d93bqw</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.validateSDNCResponse(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.validateSDNCResponse(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:exclusiveGateway id="isSdncTopoOk_ExclusiveGateway" name="Is SDNC Ok?" default="sdncTopoNo_SequenceFlow">
       <bpmn2:incoming>SequenceFlow_5</bpmn2:incoming>
@@ -47,7 +43,7 @@ DoCreateNetworkInstance.validateSDNCResponse(execution)]]></bpmn2:script>
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="sdncTopoNo_SequenceFlow" name="No" sourceRef="isSdncTopoOk_ExclusiveGateway" targetRef="sndcError_EndEvent" />
     <bpmn2:sequenceFlow id="sdncTopoYes_SequenceFlow" name="Yes" sourceRef="isSdncTopoOk_ExclusiveGateway" targetRef="callRESTQueryNetworkId_ScriptTask">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_sdncResponseSuccess" ) == true}]]></bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_sdncResponseSuccess" ) == true}</bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="SequenceFlow_5" name="" sourceRef="validateSDNCResponse_ScriptTask" targetRef="isSdncTopoOk_ExclusiveGateway" />
     <bpmn2:boundaryEvent id="BoundaryEvent_4" name="" attachedToRef="validateSDNCResponse_ScriptTask">
@@ -63,9 +59,9 @@ DoCreateNetworkInstance.validateSDNCResponse(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="callRESTQueryNetworkId_ScriptTask" name="Call REST Query Network Id In AAI" scriptFormat="groovy">
       <bpmn2:incoming>sdncTopoYes_SequenceFlow</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_16</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTQueryAAINetworkId(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTQueryAAINetworkId(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_16" name="" sourceRef="callRESTQueryNetworkId_ScriptTask" targetRef="callRESTQueryVpnBinding_ScriptTask" />
     <bpmn2:callActivity id="callAssignSDNCAdapter_CallActivity" name="Call SDNC Assign Adapter V1 " calledElement="sdncAdapter">
@@ -85,9 +81,9 @@ DoCreateNetworkInstance.callRESTQueryAAINetworkId(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="validateCreatePONetwork_ScriptTask" name="Validate Create PO Network" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_59</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_13</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.validateCreateNetworkResponse(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.validateCreateNetworkResponse(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:exclusiveGateway id="isNetworkActive_ExclusiveGateway" name="Is Network Active?" default="isNetworkActiveNo_SequenceFlow">
       <bpmn2:incoming>isAAIQueryNameYes_SequenceFlow</bpmn2:incoming>
@@ -95,7 +91,7 @@ DoCreateNetworkInstance.validateCreateNetworkResponse(execution)]]></bpmn2:scrip
       <bpmn2:outgoing>isNetworkActiveNo_SequenceFlow</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="isNetworkActiveYes_SequenceFlow" name="Yes" sourceRef="isNetworkActive_ExclusiveGateway" targetRef="ScriptTask_0p3v749">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_orchestrationStatus") == "ACTIVE"}]]></bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_orchestrationStatus") == "ACTIVE"}</bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="isNetworkActiveNo_SequenceFlow" name="No" sourceRef="isNetworkActive_ExclusiveGateway" targetRef="InclusiveGateway" />
     <bpmn2:exclusiveGateway id="isAAIQueryNameOk_ExclusiveGateway" name="Is Query Name&#10; Ok?&#10;" default="isAAIQueryNameNo_SequenceFlow">
@@ -103,20 +99,9 @@ DoCreateNetworkInstance.validateCreateNetworkResponse(execution)]]></bpmn2:scrip
       <bpmn2:outgoing>isAAIQueryNameNo_SequenceFlow</bpmn2:outgoing>
       <bpmn2:outgoing>isAAIQueryNameYes_SequenceFlow</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
-    <bpmn2:sequenceFlow id="isAAIQueryNameNo_SequenceFlow" name="No" sourceRef="isAAIQueryNameOk_ExclusiveGateway" targetRef="isReturnCode404_ExclusiveGateway" />
+    <bpmn2:sequenceFlow id="isAAIQueryNameNo_SequenceFlow" name="No" sourceRef="isAAIQueryNameOk_ExclusiveGateway" targetRef="InclusiveGateway" />
     <bpmn2:sequenceFlow id="isAAIQueryNameYes_SequenceFlow" name="Yes" sourceRef="isAAIQueryNameOk_ExclusiveGateway" targetRef="isNetworkActive_ExclusiveGateway">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_isAAIqueryNameGood") == true}]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:exclusiveGateway id="isReturnCode404_ExclusiveGateway" name="Is Code 404?" default="isReturnCode404_No_SequenceFlow">
-      <bpmn2:incoming>isAAIQueryNameNo_SequenceFlow</bpmn2:incoming>
-      <bpmn2:outgoing>isReturnCode404_No_SequenceFlow</bpmn2:outgoing>
-      <bpmn2:outgoing>isReturnCode404_Yes_SequenceFlow</bpmn2:outgoing>
-    </bpmn2:exclusiveGateway>
-    <bpmn2:sequenceFlow id="isReturnCode404_No_SequenceFlow" name="No" sourceRef="isReturnCode404_ExclusiveGateway" targetRef="aai_Error_EndEvent" />
-    <bpmn2:sequenceFlow id="isReturnCode404_Yes_SequenceFlow" name="Yes" sourceRef="isReturnCode404_ExclusiveGateway" targetRef="InclusiveGateway">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_aaiNameReturnCode" ) == "404"}
-
-]]></bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_isAAIqueryNameGood") == true}</bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:subProcess id="subProcessException_SubProcess" name="Subprocess For Prepare Rollback Data" triggeredByEvent="true">
       <bpmn2:startEvent id="subProcessStart_StartEvent" name="Fault Start">
@@ -130,7 +115,7 @@ DoCreateNetworkInstance.validateCreateNetworkResponse(execution)]]></bpmn2:scrip
         <bpmn2:outgoing>isPONR_No_SequenceFlow</bpmn2:outgoing>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="isPONR_Yes_SequenceFlow" name="Yes" sourceRef="isPONR_ExclusiveGateway" targetRef="ExclusiveGateway_1umhuft">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_isPONR") == true}]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_isPONR") == true}</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="isPONR_No_SequenceFlow" name="No" sourceRef="isPONR_ExclusiveGateway" targetRef="isSDNCActivate_ExclusiveGateway" />
       <bpmn2:exclusiveGateway id="sdncOk_ExclusiveGateway" name="is SDNC Topo Ok?" default="sdncOk_No_ExclusiveGateway">
@@ -139,15 +124,15 @@ DoCreateNetworkInstance.validateCreateNetworkResponse(execution)]]></bpmn2:scrip
         <bpmn2:outgoing>sdncOk_No_ExclusiveGateway</bpmn2:outgoing>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="sdncOk_Yeso_ExclusiveGateway" name="Yes" sourceRef="sdncOk_ExclusiveGateway" targetRef="isSdncRpc4_ExclusiveGateway4">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_isSdncRollbackNeeded" ) == true}]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_isSdncRollbackNeeded" ) == true}</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="sdncOk_No_ExclusiveGateway" name="No" sourceRef="sdncOk_ExclusiveGateway" targetRef="ExclusiveGateway_1qb2vwe" />
       <bpmn2:scriptTask id="prepareSDNCRollbackRequest_ScriptTask" name="Prepare SDNCRollback Request" scriptFormat="groovy">
         <bpmn2:incoming>isSdncRpc4No_SequenceFlow4</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_0lndbvr</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.prepareSDNCRollbackRequest(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.prepareSDNCRollbackRequest(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:exclusiveGateway id="isSDNCActivate_ExclusiveGateway" name="is SDNC Activate Ok?" default="SequenceFlow_12tlymf">
         <bpmn2:incoming>isPONR_No_SequenceFlow</bpmn2:incoming>
@@ -155,7 +140,7 @@ DoCreateNetworkInstance.prepareSDNCRollbackRequest(execution)]]></bpmn2:script>
         <bpmn2:outgoing>SequenceFlow_12tlymf</bpmn2:outgoing>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="SequenceFlow_0cly7z2" name="Yes" sourceRef="isSDNCActivate_ExclusiveGateway" targetRef="Task_1imzwi3">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_isSdncActivateRollbackNeeded" ) == true}]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_isSdncActivateRollbackNeeded" ) == true}</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="SequenceFlow_12tlymf" name="No" sourceRef="isSDNCActivate_ExclusiveGateway" targetRef="ExclusiveGateway_1bk0tqd" />
       <bpmn2:exclusiveGateway id="isSdncRpc4_ExclusiveGateway4" name="is not &#39;1610&#39; SNDC Call?" default="isSdncRpc4No_SequenceFlow4">
@@ -164,15 +149,15 @@ DoCreateNetworkInstance.prepareSDNCRollbackRequest(execution)]]></bpmn2:script>
         <bpmn2:outgoing>isSdncRpc4No_SequenceFlow4</bpmn2:outgoing>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="isSdncRpc4Yes_SequenceFlow4" name="Yes" sourceRef="isSdncRpc4_ExclusiveGateway4" targetRef="Task_0q6pzpn">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("sdncVersion") != '1610'} ]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("sdncVersion") != '1610'} </bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="isSdncRpc4No_SequenceFlow4" name="No" sourceRef="isSdncRpc4_ExclusiveGateway4" targetRef="prepareSDNCRollbackRequest_ScriptTask" />
       <bpmn2:scriptTask id="Task_0q6pzpn" name="Prepare RSRC SDNCRollback Request" scriptFormat="groovy">
         <bpmn2:incoming>isSdncRpc4Yes_SequenceFlow4</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_0bwpkkb</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.prepareRpcSDNCRollbackRequest(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.prepareRpcSDNCRollbackRequest(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:endEvent id="EndEvent_1kpt4kc">
         <bpmn2:incoming>SequenceFlow_1qwubew</bpmn2:incoming>
@@ -180,17 +165,17 @@ DoCreateNetworkInstance.prepareRpcSDNCRollbackRequest(execution)]]></bpmn2:scrip
       <bpmn2:scriptTask id="ScriptTask_0myjg9k" name="Prepare RollbackData" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_15sffxc</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_096tad6</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.prepareRollbackData(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.prepareRollbackData(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_0b8j5rw" sourceRef="Task_1imzwi3" targetRef="ExclusiveGateway_1bk0tqd" />
       <bpmn2:scriptTask id="Task_1imzwi3" name="Prepare RSRC SDNC Activate Rollback Request" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_0cly7z2</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_0b8j5rw</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.prepareRpcSDNCActivateRollback(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.prepareRpcSDNCActivateRollback(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:callActivity id="CallActivity_1u07hp7" name="DoCreate&#10;NetworkInstanceRollback&#10;" calledElement="DoCreateNetworkInstanceRollback">
         <bpmn2:extensionElements>
@@ -218,9 +203,9 @@ DoCreateNetworkInstance.prepareRpcSDNCActivateRollback(execution)]]></bpmn2:scri
         <bpmn2:incoming>SequenceFlow_0vzsyrd</bpmn2:incoming>
         <bpmn2:incoming>SequenceFlow_17nx822</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_1qwubew</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.postProcessResponse(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.postProcessResponse(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_1qwubew" sourceRef="ScriptTask_0w2ekuz" targetRef="EndEvent_1kpt4kc" />
       <bpmn2:exclusiveGateway id="isRollbackOn_ExclusiveGateway" name="Is Rollback On?" default="isRollbackOn_SequenceFlow_No">
@@ -229,7 +214,7 @@ DoCreateNetworkInstance.postProcessResponse(execution)]]></bpmn2:script>
         <bpmn2:outgoing>isRollbackOn_SequenceFlow_No</bpmn2:outgoing>
       </bpmn2:exclusiveGateway>
       <bpmn2:sequenceFlow id="isRollbackOn_SequenceFlow_Yes" name="Yes" sourceRef="isRollbackOn_ExclusiveGateway" targetRef="isPONR_ExclusiveGateway">
-        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_rollbackEnabled") == true && execution.getVariable("CRENWKI_isSdncRollbackNeeded") == true}]]></bpmn2:conditionExpression>
+        <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_rollbackEnabled") == true &amp;&amp; execution.getVariable("CRENWKI_isSdncRollbackNeeded") == true}</bpmn2:conditionExpression>
       </bpmn2:sequenceFlow>
       <bpmn2:sequenceFlow id="isRollbackOn_SequenceFlow_No" name="No" sourceRef="isRollbackOn_ExclusiveGateway" targetRef="ExclusiveGateway_1umhuft" />
       <bpmn2:inclusiveGateway id="ExclusiveGateway_1qb2vwe">
@@ -254,24 +239,26 @@ DoCreateNetworkInstance.postProcessResponse(execution)]]></bpmn2:script>
       <bpmn2:scriptTask id="ScriptTask_0j3058g" name="Set Exception Flag" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_23</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_10ttvwn</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
 DoCreateNetworkInstance.setExceptionFlag(execution)
-]]></bpmn2:script>
+</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_10ttvwn" sourceRef="ScriptTask_0j3058g" targetRef="isRollbackOn_ExclusiveGateway" />
-      <bpmn2:textAnnotation id="TextAnnotation_1py1p84">      <bpmn2:text><![CDATA[  
+      <bpmn2:textAnnotation id="TextAnnotation_1py1p84">
+        <bpmn2:text>  
 Include ONLY inputs/varrables:  
 rollbackData, as Map
 -rollbackSDNCRequest
 -rollbackActivateSDNCRequest
 -rollbackNetworkRequest
 WorkflowException
]]></bpmn2:text>
-</bpmn2:textAnnotation>
+ </bpmn2:text>
+      </bpmn2:textAnnotation>
       <bpmn2:association id="Association_0nketgd" sourceRef="CallActivity_1u07hp7" targetRef="TextAnnotation_1py1p84" />
-      <bpmn2:textAnnotation id="TextAnnotation_0wjpv6r">      <bpmn2:text>PO Network Rollback is created in validation.</bpmn2:text>
-</bpmn2:textAnnotation>
+      <bpmn2:textAnnotation id="TextAnnotation_0wjpv6r">
+        <bpmn2:text>PO Network Rollback is created in validation.</bpmn2:text>
+      </bpmn2:textAnnotation>
       <bpmn2:association id="Association_0eolbkz" sourceRef="ExclusiveGateway_1bk0tqd" targetRef="TextAnnotation_0wjpv6r" />
     </bpmn2:subProcess>
     <bpmn2:serviceTask id="callCreateNetwork_ServiceTask" name="Call Create Network">
@@ -279,8 +266,8 @@ WorkflowException
         <camunda:connector>
           <camunda:inputOutput>
             <camunda:inputParameter name="payload">${CRENWKI_createNetworkRequest}</camunda:inputParameter>
-            <camunda:inputParameter name="url"><![CDATA[${UrnPropertiesReader.getVariable("mso.adapters.network.rest.endpoint", execution)}
-]]></camunda:inputParameter>
+            <camunda:inputParameter name="url">${UrnPropertiesReader.getVariable("mso.adapters.network.rest.endpoint", execution)}
+</camunda:inputParameter>
             <camunda:inputParameter name="headers">
               <camunda:map>
                 <camunda:entry key="Authorization">#{BasicAuthHeaderValuePO}</camunda:entry>
@@ -302,25 +289,25 @@ WorkflowException
     <bpmn2:scriptTask id="callRESTReQueryNetworkID_ScriptTask" name="Call REST ReQuery Network Id in AAI" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_13</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_35</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTReQueryAAINetworkId(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTReQueryAAINetworkId(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_35" name="" sourceRef="callRESTReQueryNetworkID_ScriptTask" targetRef="callRESTUpdateContrailNetwork_ScriptTask" />
     <bpmn2:scriptTask id="callRESTUpdateContrailNetwork_ScriptTask" name="Call REST Update Contrail Network in AAI" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_35</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1ipz2ze</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTUpdateContrailAAINetwork(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTUpdateContrailAAINetwork(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:subProcess id="unexpectedErrors_SubProcess" name="Sub-process for UnexpectedErrors" triggeredByEvent="true">
       <bpmn2:scriptTask id="ScriptTask_1" name="Log / Print Unexpected Error" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_10</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_14</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+        <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.processJavaException(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.processJavaException(execution)</bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_14" name="" sourceRef="ScriptTask_1" targetRef="EndEvent_1" />
       <bpmn2:startEvent id="StartEvent_1">
@@ -335,52 +322,52 @@ DoCreateNetworkInstance.processJavaException(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="callAAIQuery_scriptTask" name="Call REST Query Network Name In AAI" scriptFormat="groovy">
       <bpmn2:incoming>isNameSentYes_SequenceFlow</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTQueryAAINetworkName(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTQueryAAINetworkName(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_6" name="" sourceRef="callAAIQuery_scriptTask" targetRef="isAAIQueryNameOk_ExclusiveGateway" />
     <bpmn2:sequenceFlow id="SequenceFlow_3" name="" sourceRef="callGetServiceInstance" targetRef="isNameSent_ExclusiveGateway" />
     <bpmn2:scriptTask id="callRESTQueryVpnBinding_ScriptTask" name="Call REST Query Vpn Binding in AAI" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_16</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_15</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTQueryAAINetworkVpnBinding(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTQueryAAINetworkVpnBinding(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_15" name="" sourceRef="callRESTQueryVpnBinding_ScriptTask" targetRef="callRESTQueryNetworkPolicy_ScriptTask" />
     <bpmn2:scriptTask id="callRESTQueryNetworkPolicy_ScriptTask" name="Call REST Query Network Policy in AAI" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_15</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_38</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTQueryAAINetworkPolicy(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTQueryAAINetworkPolicy(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_38" name="" sourceRef="callRESTQueryNetworkPolicy_ScriptTask" targetRef="callRESTQueryNetworkTableRef_ScriptTask" />
     <bpmn2:scriptTask id="prepareNetworkRequest_ScriptTask" name="Prepare Create Network Request" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_20</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_61</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
 DoCreateNetworkInstance.prepareCreateNetworkRequest(execution)
-]]></bpmn2:script>
+</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_61" name="" sourceRef="prepareNetworkRequest_ScriptTask" targetRef="callCreateNetwork_ServiceTask" />
     <bpmn2:scriptTask id="callRESTQueryNetworkTableRef_ScriptTask" name="Call REST Query Network TableRef in AAI" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_38</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_20</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.callRESTQueryAAINetworkTableRef(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.callRESTQueryAAINetworkTableRef(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_20" name="" sourceRef="callRESTQueryNetworkTableRef_ScriptTask" targetRef="prepareNetworkRequest_ScriptTask" />
     <bpmn2:sequenceFlow id="SequenceFlow_1n61wit" sourceRef="createNetwork_startEvent" targetRef="ScriptTask_preprocess" />
     <bpmn2:scriptTask id="ScriptTask_preprocess" name="PreProcess Incoming Request" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_1n61wit</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0ftylq3</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.preProcessRequest(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.preProcessRequest(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_0ftylq3" sourceRef="ScriptTask_preprocess" targetRef="callGetServiceInstance" />
     <bpmn2:exclusiveGateway id="isNameSent_ExclusiveGateway" name="is Network Name &#10;Sent?&#10;" default="isNameSentNo_SequenceFlow">
@@ -389,7 +376,7 @@ DoCreateNetworkInstance.preProcessRequest(execution)]]></bpmn2:script>
       <bpmn2:outgoing>isNameSentNo_SequenceFlow</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="isNameSentYes_SequenceFlow" name="Yes" sourceRef="isNameSent_ExclusiveGateway" targetRef="callAAIQuery_scriptTask">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_networkName") != ""}]]></bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_networkName") != ""}</bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="isNameSentNo_SequenceFlow" name="No" sourceRef="isNameSent_ExclusiveGateway" targetRef="callRESTQueryCloudRegion_ScriptTask" />
     <bpmn2:callActivity id="Task_1ipbwbj" name="Call SDNC RSRC Activate&#10; Adapter V1&#10;" calledElement="sdncAdapter">
@@ -408,9 +395,9 @@ DoCreateNetworkInstance.preProcessRequest(execution)]]></bpmn2:script>
     <bpmn2:scriptTask id="Task_1rd6dg6" name="Prepare SDNC RSRC Activate Request" scriptFormat="groovy">
       <bpmn2:incoming>isSdncRpc2Yes_SequenceFlow2</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_13deudk</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.prepareRpcSDNCActivateRequest(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.prepareRpcSDNCActivateRequest(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:exclusiveGateway id="ExclusiveGateway_0n0ptg6" name="is SDNC PRC&#10;Activate Ok?&#10;" default="SequenceFlow_18ybfu5">
       <bpmn2:incoming>SequenceFlow_1t03rs2</bpmn2:incoming>
@@ -421,15 +408,15 @@ DoCreateNetworkInstance.prepareRpcSDNCActivateRequest(execution)]]></bpmn2:scrip
     <bpmn2:sequenceFlow id="SequenceFlow_08qibb9" sourceRef="Task_1ipbwbj" targetRef="validateSDNCActivate_Task" />
     <bpmn2:sequenceFlow id="SequenceFlow_1t03rs2" sourceRef="validateSDNCActivate_Task" targetRef="ExclusiveGateway_0n0ptg6" />
     <bpmn2:sequenceFlow id="SequenceFlow_1jia57e" name="Yes" sourceRef="ExclusiveGateway_0n0ptg6" targetRef="Task_0zzobg6">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("CRENWKI_sdncResponseSuccess" ) == true}]]></bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("CRENWKI_sdncResponseSuccess" ) == true}</bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="SequenceFlow_18ybfu5" name="No" sourceRef="ExclusiveGateway_0n0ptg6" targetRef="EndEvent_13v46cq" />
     <bpmn2:scriptTask id="validateSDNCActivate_Task" name="Validate SDNCRSRC Activate&#10;Response&#10;" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_08qibb9</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1t03rs2</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.validateRpcSDNCActivateResponse(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.validateRpcSDNCActivateResponse(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:boundaryEvent id="BoundaryEvent_0vb26bm" attachedToRef="validateSDNCActivate_Task">
       <bpmn2:outgoing>SequenceFlow_0s51ns0</bpmn2:outgoing>
@@ -448,7 +435,7 @@ DoCreateNetworkInstance.validateRpcSDNCActivateResponse(execution)]]></bpmn2:scr
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="isSdncRpc1No_SequenceFlow1" name="No" sourceRef="isSdncRpc1_ExclusiveGateway1" targetRef="prepareSDNCTopoRequest_ScriptTask" />
     <bpmn2:sequenceFlow id="isSdncRpc1Yes_SequenceFlow1" name="Yes" sourceRef="isSdncRpc1_ExclusiveGateway1" targetRef="Task_10lubzj">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("sdncVersion") != '1610'} ]]></bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("sdncVersion") != '1610'} </bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:callActivity id="Task_0pbtywn" name="Call SDNC RSRC Assign Adapter V1 " calledElement="sdncAdapter">
       <bpmn2:extensionElements>
@@ -471,16 +458,16 @@ DoCreateNetworkInstance.validateRpcSDNCActivateResponse(execution)]]></bpmn2:scr
       <bpmn2:outgoing>isSdncRpc2No_SequenceFlow2</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
     <bpmn2:sequenceFlow id="isSdncRpc2Yes_SequenceFlow2" name="Yes" sourceRef="isSdncRpc2_ExclusiveGateway2" targetRef="Task_1rd6dg6">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("sdncVersion") != '1610'} ]]></bpmn2:conditionExpression>
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{execution.getVariable("sdncVersion") != '1610'} </bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="isSdncRpc2No_SequenceFlow2" name="No" sourceRef="isSdncRpc2_ExclusiveGateway2" targetRef="Task_0zzobg6" />
     <bpmn2:scriptTask id="Task_10lubzj" name="Prepare Assign SDNC RPC Request" scriptFormat="groovy">
       <bpmn2:incoming>isSdncRpc1Yes_SequenceFlow1</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0j8bxnb</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
 DoCreateNetworkInstance.prepareRpcSDNCRequest(execution)
-]]></bpmn2:script>
+</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:endEvent id="EndEvent_1te02c4">
       <bpmn2:incoming>SequenceFlow_1s8b1m1</bpmn2:incoming>
@@ -493,28 +480,29 @@ DoCreateNetworkInstance.prepareRpcSDNCRequest(execution)
       <bpmn2:incoming>SequenceFlow_1jia57e</bpmn2:incoming>
       <bpmn2:incoming>isSdncRpc2No_SequenceFlow2</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1s8b1m1</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.postProcessResponse(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.postProcessResponse(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_1ipz2ze" sourceRef="callRESTUpdateContrailNetwork_ScriptTask" targetRef="isSdncRpc2_ExclusiveGateway2" />
     <bpmn2:scriptTask id="ScriptTask_0p3v749" name="Post Process Response" scriptFormat="groovy">
       <bpmn2:incoming>isNetworkActiveYes_SequenceFlow</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_18ylufb</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.postProcessResponse(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.postProcessResponse(execution)</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_18ylufb" sourceRef="ScriptTask_0p3v749" targetRef="EndEvent_0ti2ctu" />
     <bpmn2:scriptTask id="callGetServiceInstance" name="&#10;AAI&#10;Query&#10;(svc instance)&#10;" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_0ftylq3</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn2:script>import org.onap.so.bpmn.infrastructure.scripts.*
 def DoCreateNetworkInstance = new DoCreateNetworkInstance()
-DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
+DoCreateNetworkInstance.getServiceInstance(execution)</bpmn2:script>
     </bpmn2:scriptTask>
-    <bpmn2:textAnnotation id="TextAnnotation_1orb6o6">    <bpmn2:text><![CDATA[if '200', Prepare PO Network Rollback]]></bpmn2:text>
-</bpmn2:textAnnotation>
+    <bpmn2:textAnnotation id="TextAnnotation_1orb6o6">
+      <bpmn2:text>if '200', Prepare PO Network Rollback</bpmn2:text>
+    </bpmn2:textAnnotation>
     <bpmn2:association id="Association_0c315jr" sourceRef="validateCreatePONetwork_ScriptTask" targetRef="TextAnnotation_1orb6o6" />
   </bpmn2:process>
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
@@ -537,8 +525,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_6" bpmnElement="SequenceFlow_6" sourceElement="_BPMNShape_ScriptTask_62" targetElement="_BPMNShape_ExclusiveGateway_62">
-        <di:waypoint xsi:type="dc:Point" x="1026" y="8" />
-        <di:waypoint xsi:type="dc:Point" x="1098" y="9" />
+        <di:waypoint x="1026" y="8" />
+        <di:waypoint x="1098" y="9" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1062" y="-6.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -546,50 +534,23 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
       <bpmndi:BPMNShape id="_BPMNShape_ScriptTask_63" bpmnElement="validateCreatePONetwork_ScriptTask">
         <dc:Bounds x="1457" y="1258" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_7" bpmnElement="isAAIQueryNameNo_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_62" targetElement="_BPMNShape_ExclusiveGateway_64">
-        <di:waypoint xsi:type="dc:Point" x="1123" y="34" />
-        <di:waypoint xsi:type="dc:Point" x="1123" y="91" />
+      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_7" bpmnElement="isAAIQueryNameNo_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_62" targetElement="_BPMNShape_InclusiveGateway_4">
+        <di:waypoint x="1123" y="34" />
+        <di:waypoint x="1123" y="116" />
+        <di:waypoint x="1224" y="116" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1131" y="39.0514827586207" width="14" height="12" />
+          <dc:Bounds x="1131" y="44" width="15" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_8" bpmnElement="isAAIQueryNameYes_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_62" targetElement="_BPMNShape_ExclusiveGateway_73">
-        <di:waypoint xsi:type="dc:Point" x="1148" y="9" />
-        <di:waypoint xsi:type="dc:Point" x="1186" y="9" />
-        <di:waypoint xsi:type="dc:Point" x="1186" y="9" />
-        <di:waypoint xsi:type="dc:Point" x="1224" y="9" />
+        <di:waypoint x="1148" y="9" />
+        <di:waypoint x="1186" y="9" />
+        <di:waypoint x="1186" y="9" />
+        <di:waypoint x="1224" y="9" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1151" y="14.164179104477611" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="_BPMNShape_ExclusiveGateway_64" bpmnElement="isReturnCode404_ExclusiveGateway" isMarkerVisible="true">
-        <dc:Bounds x="1098" y="91" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1026" y="110" width="65" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_2" bpmnElement="isReturnCode404_No_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_64" targetElement="_BPMNShape_EndEvent_118">
-        <di:waypoint xsi:type="dc:Point" x="1123" y="141" />
-        <di:waypoint xsi:type="dc:Point" x="1123" y="187" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1132" y="138.4109225063519" width="14" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_9" bpmnElement="isReturnCode404_Yes_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_64" targetElement="_BPMNShape_InclusiveGateway_4">
-        <di:waypoint xsi:type="dc:Point" x="1148" y="116" />
-        <di:waypoint xsi:type="dc:Point" x="1186" y="116" />
-        <di:waypoint xsi:type="dc:Point" x="1186" y="116" />
-        <di:waypoint xsi:type="dc:Point" x="1224" y="116" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1151" y="118.55844155844156" width="18" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="_BPMNShape_EndEvent_118" bpmnElement="aai_Error_EndEvent">
-        <dc:Bounds x="1105" y="187" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1085" y="228" width="77" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="_BPMNShape_ServiceTask_83" bpmnElement="callCreateNetwork_ServiceTask">
         <dc:Bounds x="1454" y="1135" width="100" height="80" />
       </bpmndi:BPMNShape>
@@ -612,15 +573,15 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_26" bpmnElement="sdncTopoNo_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_67" targetElement="_BPMNShape_EndEvent_124">
-        <di:waypoint xsi:type="dc:Point" x="1665" y="545" />
-        <di:waypoint xsi:type="dc:Point" x="1739" y="545" />
+        <di:waypoint x="1665" y="545" />
+        <di:waypoint x="1739" y="545" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1670" y="545.8651480742376" width="14" height="13" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_28" bpmnElement="sdncTopoYes_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_67" targetElement="_BPMNShape_ScriptTask_133">
-        <di:waypoint xsi:type="dc:Point" x="1615" y="545" />
-        <di:waypoint xsi:type="dc:Point" x="1554" y="546" />
+        <di:waypoint x="1615" y="545" />
+        <di:waypoint x="1554" y="546" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1587" y="549.9992641545633" width="18" height="12" />
         </bpmndi:BPMNLabel>
@@ -635,22 +596,22 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1590" y="276" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_24" bpmnElement="SequenceFlow_11" sourceElement="_BPMNShape_ScriptTask_67" targetElement="_BPMNShape_CallActivity_19">
-        <di:waypoint xsi:type="dc:Point" x="1640" y="235" />
-        <di:waypoint xsi:type="dc:Point" x="1640" y="276" />
+        <di:waypoint x="1640" y="235" />
+        <di:waypoint x="1640" y="276" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1655" y="255.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_29" bpmnElement="SequenceFlow_12" sourceElement="_BPMNShape_CallActivity_19" targetElement="_BPMNShape_ScriptTask_131">
-        <di:waypoint xsi:type="dc:Point" x="1640" y="356" />
-        <di:waypoint xsi:type="dc:Point" x="1640" y="395" />
+        <di:waypoint x="1640" y="356" />
+        <di:waypoint x="1640" y="395" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1655" y="375.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_35" bpmnElement="SequenceFlow_23" sourceElement="_BPMNShape_StartEvent_50">
-        <di:waypoint xsi:type="dc:Point" x="143" y="1184" />
-        <di:waypoint xsi:type="dc:Point" x="170" y="1184" />
+        <di:waypoint x="143" y="1184" />
+        <di:waypoint x="170" y="1184" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="157" y="1169" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -659,10 +620,10 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1590" y="395" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_11" bpmnElement="SequenceFlow_5" sourceElement="_BPMNShape_ScriptTask_131" targetElement="_BPMNShape_ExclusiveGateway_67">
-        <di:waypoint xsi:type="dc:Point" x="1640" y="475" />
-        <di:waypoint xsi:type="dc:Point" x="1640" y="498" />
-        <di:waypoint xsi:type="dc:Point" x="1640" y="498" />
-        <di:waypoint xsi:type="dc:Point" x="1640" y="520" />
+        <di:waypoint x="1640" y="475" />
+        <di:waypoint x="1640" y="498" />
+        <di:waypoint x="1640" y="498" />
+        <di:waypoint x="1640" y="520" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1655" y="498" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -674,22 +635,22 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_39" bpmnElement="isNetworkActiveYes_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_73">
-        <di:waypoint xsi:type="dc:Point" x="1274" y="9" />
-        <di:waypoint xsi:type="dc:Point" x="1335" y="9" />
+        <di:waypoint x="1274" y="9" />
+        <di:waypoint x="1335" y="9" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1275" y="14.380425096632202" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_44" bpmnElement="isNetworkActiveNo_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_73" targetElement="_BPMNShape_InclusiveGateway_4">
-        <di:waypoint xsi:type="dc:Point" x="1249" y="34" />
-        <di:waypoint xsi:type="dc:Point" x="1249" y="91" />
+        <di:waypoint x="1249" y="34" />
+        <di:waypoint x="1249" y="91" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1258" y="37.520779498373976" width="14" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_45" bpmnElement="SequenceFlow_21" sourceElement="_BPMNShape_InclusiveGateway_4" targetElement="_BPMNShape_ScriptTask_245">
-        <di:waypoint xsi:type="dc:Point" x="1249" y="141" />
-        <di:waypoint xsi:type="dc:Point" x="1249" y="276" />
+        <di:waypoint x="1249" y="141" />
+        <di:waypoint x="1249" y="276" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1264" y="208.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -710,8 +671,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1454" y="1538" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_54" bpmnElement="SequenceFlow_35" sourceElement="_BPMNShape_ScriptTask_134" targetElement="_BPMNShape_ScriptTask_135">
-        <di:waypoint xsi:type="dc:Point" x="1504" y="1472" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="1538" />
+        <di:waypoint x="1504" y="1472" />
+        <di:waypoint x="1504" y="1538" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1519" y="1505" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -720,28 +681,28 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1454" y="627" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_18" bpmnElement="SequenceFlow_15" sourceElement="_BPMNShape_ScriptTask_156" targetElement="_BPMNShape_ScriptTask_215">
-        <di:waypoint xsi:type="dc:Point" x="1504" y="707" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="727" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="727" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="750" />
+        <di:waypoint x="1504" y="707" />
+        <di:waypoint x="1504" y="727" />
+        <di:waypoint x="1504" y="727" />
+        <di:waypoint x="1504" y="750" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1519" y="727" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_49" bpmnElement="SequenceFlow_16" sourceElement="_BPMNShape_ScriptTask_133" targetElement="_BPMNShape_ScriptTask_156">
-        <di:waypoint xsi:type="dc:Point" x="1504" y="585" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="606" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="606" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="627" />
+        <di:waypoint x="1504" y="585" />
+        <di:waypoint x="1504" y="606" />
+        <di:waypoint x="1504" y="606" />
+        <di:waypoint x="1504" y="627" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1519" y="606" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_87" bpmnElement="SequenceFlow_59" sourceElement="_BPMNShape_ServiceTask_83" targetElement="_BPMNShape_ScriptTask_63">
-        <di:waypoint xsi:type="dc:Point" x="1505" y="1215" />
-        <di:waypoint xsi:type="dc:Point" x="1505" y="1237" />
-        <di:waypoint xsi:type="dc:Point" x="1505" y="1237" />
-        <di:waypoint xsi:type="dc:Point" x="1505" y="1258" />
+        <di:waypoint x="1505" y="1215" />
+        <di:waypoint x="1505" y="1237" />
+        <di:waypoint x="1505" y="1237" />
+        <di:waypoint x="1505" y="1258" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1520" y="1237" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -750,10 +711,10 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1454" y="1009" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_89" bpmnElement="SequenceFlow_61" sourceElement="_BPMNShape_ScriptTask_157" targetElement="_BPMNShape_ServiceTask_83">
-        <di:waypoint xsi:type="dc:Point" x="1504" y="1089" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="1111" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="1111" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="1135" />
+        <di:waypoint x="1504" y="1089" />
+        <di:waypoint x="1504" y="1111" />
+        <di:waypoint x="1504" y="1111" />
+        <di:waypoint x="1504" y="1135" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1519" y="1111" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -762,8 +723,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1454" y="750" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_60" bpmnElement="SequenceFlow_38" sourceElement="_BPMNShape_ScriptTask_215" targetElement="_BPMNShape_ScriptTask_333">
-        <di:waypoint xsi:type="dc:Point" x="1504" y="830" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="879" />
+        <di:waypoint x="1504" y="830" />
+        <di:waypoint x="1504" y="879" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1519" y="854.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -775,16 +736,16 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_77" bpmnElement="isPONR_Yes_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_215">
-        <di:waypoint xsi:type="dc:Point" x="354" y="1085" />
-        <di:waypoint xsi:type="dc:Point" x="457" y="1085" />
-        <di:waypoint xsi:type="dc:Point" x="457" y="1159" />
+        <di:waypoint x="354" y="1085" />
+        <di:waypoint x="457" y="1085" />
+        <di:waypoint x="457" y="1159" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="351" y="1088" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_85" bpmnElement="isPONR_No_SequenceFlow" sourceElement="_BPMNShape_ExclusiveGateway_215">
-        <di:waypoint xsi:type="dc:Point" x="329" y="1060" />
-        <di:waypoint xsi:type="dc:Point" x="329" y="1003" />
+        <di:waypoint x="329" y="1060" />
+        <di:waypoint x="329" y="1003" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="339" y="1051" width="14" height="12" />
         </bpmndi:BPMNLabel>
@@ -796,17 +757,17 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_92" bpmnElement="sdncOk_Yeso_ExclusiveGateway" sourceElement="_BPMNShape_ExclusiveGateway_217" targetElement="_BPMNShape_ScriptTask_261">
-        <di:waypoint xsi:type="dc:Point" x="552" y="845" />
-        <di:waypoint xsi:type="dc:Point" x="552" y="776" />
-        <di:waypoint xsi:type="dc:Point" x="713" y="776" />
+        <di:waypoint x="552" y="845" />
+        <di:waypoint x="552" y="776" />
+        <di:waypoint x="713" y="776" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="559" y="829" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_93" bpmnElement="sdncOk_No_ExclusiveGateway" sourceElement="_BPMNShape_ExclusiveGateway_217">
-        <di:waypoint xsi:type="dc:Point" x="551" y="894" />
-        <di:waypoint xsi:type="dc:Point" x="551" y="978" />
-        <di:waypoint xsi:type="dc:Point" x="713" y="978" />
+        <di:waypoint x="551" y="894" />
+        <di:waypoint x="551" y="978" />
+        <di:waypoint x="713" y="978" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="559" y="895" width="14" height="12" />
         </bpmndi:BPMNLabel>
@@ -815,8 +776,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1199" y="276" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_53" bpmnElement="SequenceFlow_32" sourceElement="_BPMNShape_ScriptTask_245" targetElement="_BPMNShape_ScriptTask_67">
-        <di:waypoint xsi:type="dc:Point" x="1299" y="316" />
-        <di:waypoint xsi:type="dc:Point" x="1337" y="316" />
+        <di:waypoint x="1299" y="316" />
+        <di:waypoint x="1337" y="316" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1318" y="301" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -828,8 +789,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_69" bpmnElement="SequenceFlow_34" sourceElement="_BPMNShape_BoundaryEvent_38" targetElement="_BPMNShape_EndEvent_124">
-        <di:waypoint xsi:type="dc:Point" x="1702" y="488" />
-        <di:waypoint xsi:type="dc:Point" x="1745" y="533" />
+        <di:waypoint x="1702" y="488" />
+        <di:waypoint x="1745" y="533" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1724" y="495.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -838,8 +799,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="886" y="830" width="100" height="79" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_19" bpmnElement="SequenceFlow_13" sourceElement="_BPMNShape_ScriptTask_63" targetElement="_BPMNShape_ScriptTask_134">
-        <di:waypoint xsi:type="dc:Point" x="1507" y="1338" />
-        <di:waypoint xsi:type="dc:Point" x="1505" y="1392" />
+        <di:waypoint x="1507" y="1338" />
+        <di:waypoint x="1505" y="1392" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1506" y="1350" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -863,23 +824,23 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_5" bpmnElement="SequenceFlow_10" sourceElement="_BPMNShape_StartEvent_71" targetElement="_BPMNShape_ScriptTask_270">
-        <di:waypoint xsi:type="dc:Point" x="90" y="476" />
-        <di:waypoint xsi:type="dc:Point" x="169" y="476" />
+        <di:waypoint x="90" y="476" />
+        <di:waypoint x="169" y="476" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="129" y="476" width="6" height="6" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_13" bpmnElement="SequenceFlow_14" sourceElement="_BPMNShape_ScriptTask_270" targetElement="_BPMNShape_EndEvent_220">
-        <di:waypoint xsi:type="dc:Point" x="269" y="476" />
-        <di:waypoint xsi:type="dc:Point" x="330" y="476" />
+        <di:waypoint x="269" y="476" />
+        <di:waypoint x="330" y="476" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="301" y="476" width="6" height="6" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_3" bpmnElement="SequenceFlow_3" sourceElement="ScriptTask_0z2n0hl_di" targetElement="ExclusiveGateway_0lw40k5_di">
-        <di:waypoint xsi:type="dc:Point" x="809" y="235" />
-        <di:waypoint xsi:type="dc:Point" x="809" y="316" />
-        <di:waypoint xsi:type="dc:Point" x="951" y="316" />
+        <di:waypoint x="809" y="235" />
+        <di:waypoint x="809" y="316" />
+        <di:waypoint x="951" y="316" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="779" y="275.5" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -888,19 +849,19 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1454" y="879" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_14" bpmnElement="SequenceFlow_20" sourceElement="_BPMNShape_ScriptTask_333" targetElement="_BPMNShape_ScriptTask_157">
-        <di:waypoint xsi:type="dc:Point" x="1504" y="959" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="981" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="981" />
-        <di:waypoint xsi:type="dc:Point" x="1504" y="1009" />
+        <di:waypoint x="1504" y="959" />
+        <di:waypoint x="1504" y="981" />
+        <di:waypoint x="1504" y="981" />
+        <di:waypoint x="1504" y="1009" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1519" y="981" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1n61wit_di" bpmnElement="SequenceFlow_1n61wit">
-        <di:waypoint xsi:type="dc:Point" x="433" y="195" />
-        <di:waypoint xsi:type="dc:Point" x="492" y="195" />
-        <di:waypoint xsi:type="dc:Point" x="492" y="195" />
-        <di:waypoint xsi:type="dc:Point" x="546" y="195" />
+        <di:waypoint x="433" y="195" />
+        <di:waypoint x="492" y="195" />
+        <di:waypoint x="492" y="195" />
+        <di:waypoint x="546" y="195" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="507" y="195" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -909,10 +870,10 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="546" y="155" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ftylq3_di" bpmnElement="SequenceFlow_0ftylq3">
-        <di:waypoint xsi:type="dc:Point" x="646" y="195" />
-        <di:waypoint xsi:type="dc:Point" x="706" y="195" />
-        <di:waypoint xsi:type="dc:Point" x="706" y="195" />
-        <di:waypoint xsi:type="dc:Point" x="759" y="195" />
+        <di:waypoint x="646" y="195" />
+        <di:waypoint x="706" y="195" />
+        <di:waypoint x="706" y="195" />
+        <di:waypoint x="759" y="195" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="676" y="195" width="90" height="0" />
         </bpmndi:BPMNLabel>
@@ -924,17 +885,17 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0635hhm_di" bpmnElement="isNameSentYes_SequenceFlow">
-        <di:waypoint xsi:type="dc:Point" x="976" y="291" />
-        <di:waypoint xsi:type="dc:Point" x="976" y="170" />
-        <di:waypoint xsi:type="dc:Point" x="976" y="170" />
-        <di:waypoint xsi:type="dc:Point" x="976" y="49" />
+        <di:waypoint x="976" y="291" />
+        <di:waypoint x="976" y="170" />
+        <di:waypoint x="976" y="170" />
+        <di:waypoint x="976" y="49" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="988" y="275" width="18" height="13" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1sirjgc_di" bpmnElement="isNameSentNo_SequenceFlow">
-        <di:waypoint xsi:type="dc:Point" x="1001" y="316" />
-        <di:waypoint xsi:type="dc:Point" x="1199" y="316" />
+        <di:waypoint x="1001" y="316" />
+        <di:waypoint x="1199" y="316" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1005" y="328" width="14" height="13" />
         </bpmndi:BPMNLabel>
@@ -952,36 +913,36 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_13deudk_di" bpmnElement="SequenceFlow_13deudk">
-        <di:waypoint xsi:type="dc:Point" x="1183" y="1578" />
-        <di:waypoint xsi:type="dc:Point" x="1114" y="1578" />
+        <di:waypoint x="1183" y="1578" />
+        <di:waypoint x="1114" y="1578" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1149" y="1563" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_08qibb9_di" bpmnElement="SequenceFlow_08qibb9">
-        <di:waypoint xsi:type="dc:Point" x="1014" y="1578" />
-        <di:waypoint xsi:type="dc:Point" x="953" y="1578" />
+        <di:waypoint x="1014" y="1578" />
+        <di:waypoint x="953" y="1578" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="984" y="1563" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1t03rs2_di" bpmnElement="SequenceFlow_1t03rs2">
-        <di:waypoint xsi:type="dc:Point" x="853" y="1578" />
-        <di:waypoint xsi:type="dc:Point" x="774" y="1578" />
+        <di:waypoint x="853" y="1578" />
+        <di:waypoint x="774" y="1578" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="814" y="1563" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1jia57e_di" bpmnElement="SequenceFlow_1jia57e">
-        <di:waypoint xsi:type="dc:Point" x="749" y="1553" />
-        <di:waypoint xsi:type="dc:Point" x="749" y="1484" />
+        <di:waypoint x="749" y="1553" />
+        <di:waypoint x="749" y="1484" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="757" y="1537.7047949008065" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_18ybfu5_di" bpmnElement="SequenceFlow_18ybfu5">
-        <di:waypoint xsi:type="dc:Point" x="749" y="1603" />
-        <di:waypoint xsi:type="dc:Point" x="749" y="1669" />
+        <di:waypoint x="749" y="1603" />
+        <di:waypoint x="749" y="1669" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="758" y="1603.7606668519034" width="14" height="12" />
         </bpmndi:BPMNLabel>
@@ -996,9 +957,9 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0s51ns0_di" bpmnElement="SequenceFlow_0s51ns0">
-        <di:waypoint xsi:type="dc:Point" x="877" y="1636" />
-        <di:waypoint xsi:type="dc:Point" x="877" y="1687" />
-        <di:waypoint xsi:type="dc:Point" x="767" y="1687" />
+        <di:waypoint x="877" y="1636" />
+        <di:waypoint x="877" y="1687" />
+        <di:waypoint x="767" y="1687" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="892" y="1661.5" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1016,16 +977,16 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0cly7z2_di" bpmnElement="SequenceFlow_0cly7z2">
-        <di:waypoint xsi:type="dc:Point" x="329" y="953" />
-        <di:waypoint xsi:type="dc:Point" x="329" y="910" />
+        <di:waypoint x="329" y="953" />
+        <di:waypoint x="329" y="910" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="335" y="937" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_12tlymf_di" bpmnElement="SequenceFlow_12tlymf">
-        <di:waypoint xsi:type="dc:Point" x="354" y="978" />
-        <di:waypoint xsi:type="dc:Point" x="457" y="978" />
-        <di:waypoint xsi:type="dc:Point" x="457" y="895" />
+        <di:waypoint x="354" y="978" />
+        <di:waypoint x="457" y="978" />
+        <di:waypoint x="457" y="895" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="350" y="988" width="14" height="12" />
         </bpmndi:BPMNLabel>
@@ -1037,16 +998,16 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1r5sja0_di" bpmnElement="isSdncRpc1No_SequenceFlow1">
-        <di:waypoint xsi:type="dc:Point" x="1362" y="291" />
-        <di:waypoint xsi:type="dc:Point" x="1362" y="195" />
-        <di:waypoint xsi:type="dc:Point" x="1590" y="195" />
+        <di:waypoint x="1362" y="291" />
+        <di:waypoint x="1362" y="195" />
+        <di:waypoint x="1590" y="195" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1371" y="273" width="14" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1ow57qy_di" bpmnElement="isSdncRpc1Yes_SequenceFlow1">
-        <di:waypoint xsi:type="dc:Point" x="1362" y="341" />
-        <di:waypoint xsi:type="dc:Point" x="1362" y="395" />
+        <di:waypoint x="1362" y="341" />
+        <di:waypoint x="1362" y="395" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1373" y="341" width="18" height="12" />
         </bpmndi:BPMNLabel>
@@ -1055,15 +1016,15 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1454" y="395" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0j8bxnb_di" bpmnElement="SequenceFlow_0j8bxnb">
-        <di:waypoint xsi:type="dc:Point" x="1412" y="435" />
-        <di:waypoint xsi:type="dc:Point" x="1454" y="435" />
+        <di:waypoint x="1412" y="435" />
+        <di:waypoint x="1454" y="435" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1433" y="420" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0d93bqw_di" bpmnElement="SequenceFlow_0d93bqw">
-        <di:waypoint xsi:type="dc:Point" x="1554" y="435" />
-        <di:waypoint xsi:type="dc:Point" x="1590" y="435" />
+        <di:waypoint x="1554" y="435" />
+        <di:waypoint x="1590" y="435" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1572" y="420" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1075,16 +1036,16 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0suu90e_di" bpmnElement="isSdncRpc4Yes_SequenceFlow4">
-        <di:waypoint xsi:type="dc:Point" x="738" y="801" />
-        <di:waypoint xsi:type="dc:Point" x="738" y="830" />
+        <di:waypoint x="738" y="801" />
+        <di:waypoint x="738" y="830" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="743" y="800" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0xnyl6e_di" bpmnElement="isSdncRpc4No_SequenceFlow4">
-        <di:waypoint xsi:type="dc:Point" x="763" y="776" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="776" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="830" />
+        <di:waypoint x="763" y="776" />
+        <di:waypoint x="936" y="776" />
+        <di:waypoint x="936" y="830" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="772" y="755" width="14" height="12" />
         </bpmndi:BPMNLabel>
@@ -1096,16 +1057,16 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1lphs99_di" bpmnElement="isSdncRpc2Yes_SequenceFlow2">
-        <di:waypoint xsi:type="dc:Point" x="1360" y="1578" />
-        <di:waypoint xsi:type="dc:Point" x="1283" y="1578" />
+        <di:waypoint x="1360" y="1578" />
+        <di:waypoint x="1283" y="1578" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1337" y="1580.0388981849903" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0lk1uut_di" bpmnElement="isSdncRpc2No_SequenceFlow2">
-        <di:waypoint xsi:type="dc:Point" x="1385" y="1553" />
-        <di:waypoint xsi:type="dc:Point" x="1385" y="1444" />
-        <di:waypoint xsi:type="dc:Point" x="799" y="1444" />
+        <di:waypoint x="1385" y="1553" />
+        <di:waypoint x="1385" y="1444" />
+        <di:waypoint x="799" y="1444" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1362" y="1543.660178848007" width="14" height="12" />
         </bpmndi:BPMNLabel>
@@ -1135,10 +1096,10 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1s8b1m1_di" bpmnElement="SequenceFlow_1s8b1m1">
-        <di:waypoint xsi:type="dc:Point" x="699" y="1444" />
-        <di:waypoint xsi:type="dc:Point" x="597" y="1444" />
-        <di:waypoint xsi:type="dc:Point" x="597" y="1444" />
-        <di:waypoint xsi:type="dc:Point" x="503" y="1444" />
+        <di:waypoint x="699" y="1444" />
+        <di:waypoint x="597" y="1444" />
+        <di:waypoint x="597" y="1444" />
+        <di:waypoint x="503" y="1444" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="612" y="1444" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1150,8 +1111,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="688" y="1053" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0b8j5rw_di" bpmnElement="SequenceFlow_0b8j5rw">
-        <di:waypoint xsi:type="dc:Point" x="379" y="870" />
-        <di:waypoint xsi:type="dc:Point" x="432" y="870" />
+        <di:waypoint x="379" y="870" />
+        <di:waypoint x="432" y="870" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="406" y="855" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1160,10 +1121,10 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="279" y="830" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1ipz2ze_di" bpmnElement="SequenceFlow_1ipz2ze">
-        <di:waypoint xsi:type="dc:Point" x="1454" y="1578" />
-        <di:waypoint xsi:type="dc:Point" x="1432" y="1578" />
-        <di:waypoint xsi:type="dc:Point" x="1432" y="1578" />
-        <di:waypoint xsi:type="dc:Point" x="1410" y="1578" />
+        <di:waypoint x="1454" y="1578" />
+        <di:waypoint x="1432" y="1578" />
+        <di:waypoint x="1432" y="1578" />
+        <di:waypoint x="1410" y="1578" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1447" y="1578" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1172,30 +1133,30 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="841" y="1053" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0vzsyrd_di" bpmnElement="SequenceFlow_0vzsyrd">
-        <di:waypoint xsi:type="dc:Point" x="941" y="1093" />
-        <di:waypoint xsi:type="dc:Point" x="1007" y="1093" />
+        <di:waypoint x="941" y="1093" />
+        <di:waypoint x="1007" y="1093" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="974" y="1078" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0bwpkkb_di" bpmnElement="SequenceFlow_0bwpkkb">
-        <di:waypoint xsi:type="dc:Point" x="738" y="910" />
-        <di:waypoint xsi:type="dc:Point" x="738" y="953" />
+        <di:waypoint x="738" y="910" />
+        <di:waypoint x="738" y="953" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="753" y="922" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0lndbvr_di" bpmnElement="SequenceFlow_0lndbvr">
-        <di:waypoint xsi:type="dc:Point" x="936" y="909" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="978" />
-        <di:waypoint xsi:type="dc:Point" x="763" y="978" />
+        <di:waypoint x="936" y="909" />
+        <di:waypoint x="936" y="978" />
+        <di:waypoint x="763" y="978" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="951" y="944" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_096tad6_di" bpmnElement="SequenceFlow_096tad6">
-        <di:waypoint xsi:type="dc:Point" x="788" y="1093" />
-        <di:waypoint xsi:type="dc:Point" x="841" y="1093" />
+        <di:waypoint x="788" y="1093" />
+        <di:waypoint x="841" y="1093" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="815" y="1078" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1204,15 +1165,15 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1036" y="901" width="252" height="119" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="Association_0nketgd_di" bpmnElement="Association_0nketgd">
-        <di:waypoint xsi:type="dc:Point" x="941" y="1069" />
-        <di:waypoint xsi:type="dc:Point" x="1041" y="1020" />
+        <di:waypoint x="941" y="1069" />
+        <di:waypoint x="1041" y="1020" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ScriptTask_0w2ekuz_di" bpmnElement="ScriptTask_0w2ekuz">
         <dc:Bounds x="1007" y="1053" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1qwubew_di" bpmnElement="SequenceFlow_1qwubew">
-        <di:waypoint xsi:type="dc:Point" x="1107" y="1093" />
-        <di:waypoint xsi:type="dc:Point" x="1160" y="1093" />
+        <di:waypoint x="1107" y="1093" />
+        <di:waypoint x="1160" y="1093" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1134" y="1068" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1224,15 +1185,15 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_19kcbiw_di" bpmnElement="isRollbackOn_SequenceFlow_Yes">
-        <di:waypoint xsi:type="dc:Point" x="329" y="1159" />
-        <di:waypoint xsi:type="dc:Point" x="329" y="1110" />
+        <di:waypoint x="329" y="1159" />
+        <di:waypoint x="329" y="1110" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="337" y="1142" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0pl3e54_di" bpmnElement="isRollbackOn_SequenceFlow_No">
-        <di:waypoint xsi:type="dc:Point" x="354" y="1184" />
-        <di:waypoint xsi:type="dc:Point" x="432" y="1184" />
+        <di:waypoint x="354" y="1184" />
+        <di:waypoint x="432" y="1184" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="355" y="1190" width="14" height="12" />
         </bpmndi:BPMNLabel>
@@ -1244,8 +1205,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_15sffxc_di" bpmnElement="SequenceFlow_15sffxc">
-        <di:waypoint xsi:type="dc:Point" x="738" y="1003" />
-        <di:waypoint xsi:type="dc:Point" x="738" y="1053" />
+        <di:waypoint x="738" y="1003" />
+        <di:waypoint x="738" y="1053" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="753" y="1028" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1257,8 +1218,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0k7y7b5_di" bpmnElement="SequenceFlow_0k7y7b5">
-        <di:waypoint xsi:type="dc:Point" x="482" y="870" />
-        <di:waypoint xsi:type="dc:Point" x="527" y="870" />
+        <di:waypoint x="482" y="870" />
+        <di:waypoint x="527" y="870" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="505" y="845" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1267,8 +1228,8 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1335" y="-31" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_18ylufb_di" bpmnElement="SequenceFlow_18ylufb">
-        <di:waypoint xsi:type="dc:Point" x="1435" y="9" />
-        <di:waypoint xsi:type="dc:Point" x="1486" y="9" />
+        <di:waypoint x="1435" y="9" />
+        <di:waypoint x="1486" y="9" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1461" y="-6" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1280,9 +1241,9 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_17nx822_di" bpmnElement="SequenceFlow_17nx822">
-        <di:waypoint xsi:type="dc:Point" x="482" y="1184" />
-        <di:waypoint xsi:type="dc:Point" x="1057" y="1184" />
-        <di:waypoint xsi:type="dc:Point" x="1057" y="1133" />
+        <di:waypoint x="482" y="1184" />
+        <di:waypoint x="1057" y="1184" />
+        <di:waypoint x="1057" y="1133" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="770" y="1169" width="0" height="0" />
         </bpmndi:BPMNLabel>
@@ -1291,22 +1252,22 @@ DoCreateNetworkInstance.getServiceInstance(execution)]]></bpmn2:script>
         <dc:Bounds x="1606" y="1241" width="233" height="37" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="Association_0c315jr_di" bpmnElement="Association_0c315jr">
-        <di:waypoint xsi:type="dc:Point" x="1557" y="1289" />
-        <di:waypoint xsi:type="dc:Point" x="1621" y="1278" />
+        <di:waypoint x="1557" y="1289" />
+        <di:waypoint x="1621" y="1278" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="TextAnnotation_0wjpv6r_di" bpmnElement="TextAnnotation_0wjpv6r">
         <dc:Bounds x="341" y="735" width="180" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="Association_0eolbkz_di" bpmnElement="Association_0eolbkz">
-        <di:waypoint xsi:type="dc:Point" x="452" y="850" />
-        <di:waypoint xsi:type="dc:Point" x="435" y="771" />
+        <di:waypoint x="452" y="850" />
+        <di:waypoint x="435" y="771" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ScriptTask_0j3058g_di" bpmnElement="ScriptTask_0j3058g">
         <dc:Bounds x="170" y="1144" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_10ttvwn_di" bpmnElement="SequenceFlow_10ttvwn">
-        <di:waypoint xsi:type="dc:Point" x="270" y="1184" />
-        <di:waypoint xsi:type="dc:Point" x="304" y="1184" />
+        <di:waypoint x="270" y="1184" />
+        <di:waypoint x="304" y="1184" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="287" y="1159" width="0" height="0" />
         </bpmndi:BPMNLabel>
index 17f6c66..6084f57 100644 (file)
@@ -189,7 +189,7 @@ dcsi.postDecomposeService(execution)]]></bpmn:script>
             <camunda:inputParameter name="headers">
               <camunda:map>
                 <camunda:entry key="content-type">application/soap+xml</camunda:entry>
-                <camunda:entry key="Authorization">Basic QlBFTENsaWVudDpwYXNzd29yZDEk</camunda:entry>
+                <camunda:entry key="Authorization">${UrnPropertiesReader.getVariable("mso.adapters.requestDb.auth", execution)}</camunda:entry>
               </camunda:map>
             </camunda:inputParameter>
             <camunda:inputParameter name="payload">${CVFMI_updateServiceOperStatusRequest}</camunda:inputParameter>
@@ -206,12 +206,12 @@ dcsi.postDecomposeService(execution)]]></bpmn:script>
     <bpmn:scriptTask id="ScriptTask_0f3tjbn" name="prepare update service operation status" scriptFormat="groovy">
       <bpmn:incoming>SequenceFlow_0h5c1bd</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1ab3vex</bpmn:outgoing>
-      <bpmn:script><![CDATA[import org.onap.so.bpmn.infrastructure.scripts.*
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
 execution.setVariable("progress", "100")
 execution.setVariable("result", "finished")
 execution.setVariable("operationContent", "No actual resoure in service instance")
 def csi= new DoDeleteE2EServiceInstance()
-csi.prepareUpdateServiceOperationStatus(execution)]]></bpmn:script>
+csi.prepareUpdateServiceOperationStatus(execution)</bpmn:script>
     </bpmn:scriptTask>
     <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_0hrkmxb" name="End Delete Process">
       <bpmn:outgoing>SequenceFlow_0h5c1bd</bpmn:outgoing>
index a1905f8..daf7279 100644 (file)
@@ -131,6 +131,10 @@ mso:
   service-plugin:
     third-sp-endpoint:
     oof-calc-endpoint:
+org:
+  onap:
+    so:
+      cloud-owner: CloudOwner
 policy:
   auth: Basic dGVzdHBkcDphbHBoYTEyMw==
   client:
index e5cb7e0..b1a8c4b 100644 (file)
@@ -215,6 +215,10 @@ mso:
         callback: http://localhost:30253/mso/vnfAdapterNotify
       rollback:
         callback: http://localhost:30253/mso/vnfAdapterNotify
+org:
+  onap:
+    so:
+      cloud-owner: CloudOwner
 policy:
   auth: Basic dGVzdHBkcDphbHBoYTEyMw==
   client:
index 63a65cd..becb66a 100644 (file)
                                        </execution>
                                </executions>
                        </plugin>
+                       <plugin>
+                               <groupId>io.swagger</groupId>
+                               <artifactId>swagger-codegen-maven-plugin</artifactId>
+                               <version>2.3.1</version>
+                               <executions>
+                                       <execution>
+                                               <goals>
+                                                       <goal>generate</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <inputSpec>${project.basedir}/src/main/resources/naming-service/swagger.json</inputSpec>
+                                                       <apiPackage>org.onap.namingservice.api</apiPackage>
+                                                       <modelPackage>org.onap.namingservice.model</modelPackage>
+                                                       <invokerPackage>org.onap.namingservice.invoker</invokerPackage>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                               <configuration>
+                                       <inputSpec>${project.basedir}/src/main/resources/swagger.json</inputSpec>
+                                       <language>java</language>
+                                       <configOptions>
+                                               <sourceFolder>src/gen/java/main</sourceFolder>
+                                               <serializableModel>true</serializableModel>
+                                       </configOptions>
+                                       <output>${project.build.directory}/generated-sources</output>
+                                       <generateApis>false</generateApis>
+                                       <library>jersey2</library>
+                                       <generateSupportingFiles>false</generateSupportingFiles>
+                               </configuration>
+                       </plugin>
                </plugins>
        </build>
        <dependencyManagement>
                <dependency>
                        <groupId>org.camunda.bpm.extension.mockito</groupId>
                        <artifactId>camunda-bpm-mockito</artifactId>
-                       <version>3.2.1</version>
-                       <scope>test</scope>
                </dependency>
                <dependency>
                        <groupId>org.onap.so</groupId>
                <dependency>
                        <groupId>org.onap.sdnc.northbound</groupId>
                        <artifactId>generic-resource-api-client</artifactId>
-                       <version>1.4.1</version>
+                       <version>1.5.0-SNAPSHOT</version>
                        <exclusions>
                                <exclusion>
                                        <groupId>javax.ws.rs</groupId>
index 887c51e..4a3cb01 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.aai.tasks;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.core.UrnPropertiesReader;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
@@ -52,6 +57,7 @@ import org.onap.so.db.catalog.beans.OrchestrationStatus;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -78,6 +84,8 @@ public class AAICreateTasks {
        private AAIVpnBindingResources aaiVpnBindingResources;
        @Autowired
        private AAIConfigurationResources aaiConfigurationResources;
+       @Autowired
+       private Environment env;
 
        public void createServiceInstance(BuildingBlockExecution execution) {
                try {
@@ -349,6 +357,41 @@ public class AAICreateTasks {
                }       
        }
        
+       /**
+        * BPMN access method to establish relationships in AAI
+        * @param execution
+        * @throws Exception
+        */
+       public void connectVnfToCloudRegion(BuildingBlockExecution execution) {
+               try {
+                       boolean cloudRegionsToSkip = false;
+                       String[] cloudRegions = env.getProperty("mso.bpmn.cloudRegionIdsToSkipAddingVnfEdgesTo", String[].class);
+                       if (cloudRegions != null){
+                               cloudRegionsToSkip = Arrays.stream(cloudRegions).anyMatch(execution.getGeneralBuildingBlock().getCloudRegion().getLcpCloudRegionId()::equals);
+                       }
+                       if(!cloudRegionsToSkip) {
+                               GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
+                               aaiVnfResources.connectVnfToCloudRegion(vnf, execution.getGeneralBuildingBlock().getCloudRegion());
+                       }
+               } catch (Exception ex) {
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+               }       
+       }
+       
+       /**
+        * BPMN access method to establish relationships in AAI
+        * @param execution
+        * @throws Exception
+        */
+       public void connectVnfToTenant(BuildingBlockExecution execution) {
+               try {
+                       GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
+                       aaiVnfResources.connectVnfToTenant(vnf, execution.getGeneralBuildingBlock().getCloudRegion());
+               } catch (Exception ex) {
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+               }       
+       }
+       
        /**
         * BPMN access method to establish relationships in AAI
         * @param execution
index 38261c0..ed6379a 100644 (file)
@@ -156,7 +156,9 @@ public class AAIUpdateTasks {
                try {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        String heatStackId = execution.getVariable("heatStackId");
-                       
+                       if (heatStackId == null) {
+                               heatStackId = "";
+                       }                       
                        VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID));
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
                        volumeGroup.setHeatStackId(heatStackId);
@@ -320,6 +322,9 @@ public class AAIUpdateTasks {
        public void updateHeatStackIdVfModule(BuildingBlockExecution execution) {               
                try {
                        String heatStackId = execution.getVariable("heatStackId");
+                       if (heatStackId == null) {
+                               heatStackId = "";
+                       }
                        VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID));
                        GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
                        vfModule.setHeatStackId(heatStackId);
index 534e936..ee80ba4 100644 (file)
@@ -58,7 +58,7 @@ public class AssignVnf {
                                        aaiInstanceGroupResources.createInstanceGroup(instanceGroup);
                                        aaiInstanceGroupResources.connectInstanceGroupToVnf(instanceGroup, vnf, AAIEdgeLabel.BELONGS_TO);
                                }
-                               else if(ModelInfoInstanceGroup.TYPE_NETWORK_INSTANCE_GROUP.equalsIgnoreCase(instanceGroup.getModelInfoInstanceGroup().getType())) {
+                               else if(ModelInfoInstanceGroup.TYPE_L3_NETWORK.equalsIgnoreCase(instanceGroup.getModelInfoInstanceGroup().getType())) {
                                        aaiInstanceGroupResources.connectInstanceGroupToVnf(instanceGroup, vnf, AAIEdgeLabel.USES);
                                }
                        }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasks.java
new file mode 100644 (file)
index 0000000..cb4ac5c
--- /dev/null
@@ -0,0 +1,56 @@
+/*-
+ * ============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.bpmn.infrastructure.namingservice.tasks;
+
+
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.client.orchestration.NamingServiceResources;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NamingServiceCreateTasks {
+       
+       @Autowired
+       private ExceptionBuilder exceptionUtil;
+       @Autowired
+       private ExtractPojosForBB extractPojosForBB;
+       
+       @Autowired
+       private NamingServiceResources namingServiceResources;
+       
+       public void createInstanceGroupName(BuildingBlockExecution execution) throws Exception {                
+               InstanceGroup instanceGroup = extractPojosForBB.extractByKey(execution, ResourceKey.INSTANCE_GROUP_ID, execution.getLookupMap().get(ResourceKey.INSTANCE_GROUP_ID));
+               String policyInstanceName = execution.getVariable("policyInstanceName");
+               String nfNamingCode = execution.getVariable("nfNamingCode");
+               String generatedInstanceGroupName = "";
+               try {
+                       generatedInstanceGroupName = namingServiceResources.generateInstanceGroupName(instanceGroup, policyInstanceName, nfNamingCode);                 
+               } catch (Exception ex) {                        
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+               }
+               instanceGroup.setInstanceGroupName(generatedInstanceGroupName);
+       }       
+}
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceDeleteTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceDeleteTasks.java
new file mode 100644 (file)
index 0000000..ddea272
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * ============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.bpmn.infrastructure.namingservice.tasks;
+
+
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.client.orchestration.NamingServiceResources;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NamingServiceDeleteTasks {
+       
+       @Autowired
+       private ExceptionBuilder exceptionUtil;
+       @Autowired
+       private ExtractPojosForBB extractPojosForBB;
+       
+       @Autowired
+       private NamingServiceResources namingServiceResources;
+       
+       public void deleteInstanceGroupName(BuildingBlockExecution execution) throws Exception {                
+               InstanceGroup instanceGroup = extractPojosForBB.extractByKey(execution, ResourceKey.INSTANCE_GROUP_ID, execution.getLookupMap().get(ResourceKey.INSTANCE_GROUP_ID));
+               
+               try {
+                       namingServiceResources.deleteInstanceGroupName(instanceGroup);                  
+               } catch (Exception ex) {                        
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+               }       
+       }       
+}
index e587e80..43ee71e 100644 (file)
@@ -20,6 +20,9 @@
 
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
@@ -36,6 +39,8 @@ import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.orchestration.SDNCNetworkResources;
 import org.onap.so.client.orchestration.SDNCVfModuleResources;
 import org.onap.so.client.orchestration.SDNCVnfResources;
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -63,8 +68,11 @@ public class SDNCActivateTasks {
                        GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
                        Customer customer = gBBInput.getCustomer();
-                       String response = sdncVnfResources.activateVnf(vnf, serviceInstance, customer, cloudRegion, requestContext);
-                       execution.setVariable("SDNCResponse", response);
+                       GenericResourceApiVnfOperationInformation req = sdncVnfResources.activateVnf(vnf, serviceInstance, customer, cloudRegion, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VNF);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -76,18 +84,18 @@ public class SDNCActivateTasks {
         * @throws BBObjectNotFoundException 
         */
        public void activateNetwork(BuildingBlockExecution execution) throws BBObjectNotFoundException {
-               execution.setVariable("sdncNetworkActivateRollback", false);
-               GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
-               
-               L3Network l3network =  extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID));
-               ServiceInstance serviceInstance =  extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-
-               Customer customer = gBBInput.getCustomer();
-               RequestContext requestContext = gBBInput.getRequestContext();
-               CloudRegion cloudRegion = gBBInput.getCloudRegion();
-               try {
-                       sdncNetworkResources.activateNetwork(l3network, serviceInstance, customer, requestContext, cloudRegion);
-                       execution.setVariable("sdncNetworkActivateRollback", true);
+               try{
+                       GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
+                       L3Network l3network =  extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID));
+                       ServiceInstance serviceInstance =  extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
+                       Customer customer = gBBInput.getCustomer();
+                       RequestContext requestContext = gBBInput.getRequestContext();
+                       CloudRegion cloudRegion = gBBInput.getCloudRegion();
+                       GenericResourceApiNetworkOperationInformation req = sdncNetworkResources.activateNetwork(l3network, serviceInstance, customer, requestContext, cloudRegion);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.NETWORK);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -108,12 +116,12 @@ public class SDNCActivateTasks {
                                        execution.getLookupMap().get(ResourceKey.VF_MODULE_ID));
                        Customer customer = gBBInput.getCustomer();
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
-                       execution.setVariable("sdncActivateVfModuleRollback", false);
-
-                       String response = sdncVfModuleResources.activateVfModule(vfModule, vnf, serviceInstance, customer,
+                       GenericResourceApiVfModuleOperationInformation req = sdncVfModuleResources.activateVfModule(vfModule, vnf, serviceInstance, customer,
                                        cloudRegion, requestContext);
-                       execution.setVariable("SDNCActivateVfModuleResponse", response);
-                       execution.setVariable("sdncActivateVfModuleRollback", true);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VFMODULE);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
index 30f38fc..2695a17 100644 (file)
@@ -20,6 +20,9 @@
 
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
@@ -67,8 +70,11 @@ public class SDNCAssignTasks {
                        RequestContext requestContext = gBBInput.getRequestContext();
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
                        Customer customer = gBBInput.getCustomer();
-                       String response = sdncSIResources.assignServiceInstance(serviceInstance, customer, requestContext);
-                       execution.setVariable("SDNCResponse", response);
+                       GenericResourceApiServiceOperationInformation req = sdncSIResources.assignServiceInstance(serviceInstance, customer, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.SERVICE);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -107,9 +113,11 @@ public class SDNCAssignTasks {
                        }
                        Customer customer = gBBInput.getCustomer();
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
-
-                       String response = sdncVfModuleResources.assignVfModule(vfModule, volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext);
-                       execution.setVariable("SDNCAssignResponse_"+ vfModule.getVfModuleId(), response);
+                       GenericResourceApiVfModuleOperationInformation req = sdncVfModuleResources.assignVfModule(vfModule, volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VFMODULE);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -123,15 +131,16 @@ public class SDNCAssignTasks {
        public void assignNetwork(BuildingBlockExecution execution) {
                try {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
-
                        L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID));
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-
                        Customer customer = gBBInput.getCustomer();
                        RequestContext requestContext = gBBInput.getRequestContext();
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
-
-                       sdncNetworkResources.assignNetwork(l3network, serviceInstance, customer, requestContext, cloudRegion);
+                       GenericResourceApiNetworkOperationInformation req = sdncNetworkResources.assignNetwork(l3network, serviceInstance, customer, requestContext, cloudRegion);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.NETWORK);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
index cae4dc2..592b831 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
@@ -36,6 +40,8 @@ import org.onap.so.client.orchestration.SDNCNetworkResources;
 import org.onap.so.client.orchestration.SDNCServiceInstanceResources;
 import org.onap.so.client.orchestration.SDNCVfModuleResources;
 import org.onap.so.client.orchestration.SDNCVnfResources;
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -58,9 +64,11 @@ public class SDNCChangeAssignTasks {
                try {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-                       
-                       String response = sdncServiceInstanceResources.changeModelServiceInstance(serviceInstance, gBBInput.getCustomer(), gBBInput.getRequestContext());
-                       execution.setVariable("SDNCChangeAssignTasks.changeModelServiceInstance.response", response);
+                       GenericResourceApiServiceOperationInformation req = sdncServiceInstanceResources.changeModelServiceInstance(serviceInstance, gBBInput.getCustomer(), gBBInput.getRequestContext());
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.SERVICE);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch(Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -71,9 +79,11 @@ public class SDNCChangeAssignTasks {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-                       
-                       String response = sdncVnfResources.changeModelVnf(genericVnf, serviceInstance, gBBInput.getCustomer(), gBBInput.getCloudRegion(), gBBInput.getRequestContext());
-                       execution.setVariable("SDNCChangeModelVnfResponse", response);
+                       GenericResourceApiVnfOperationInformation req = sdncVnfResources.changeModelVnf(genericVnf, serviceInstance, gBBInput.getCustomer(), gBBInput.getCloudRegion(), gBBInput.getRequestContext());
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VNF);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch(Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -84,9 +94,11 @@ public class SDNCChangeAssignTasks {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        L3Network network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID));
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-                       
-                       String sdncResponse = sdncNetworkResources.changeAssignNetwork(network, serviceInstance, gBBInput.getCustomer(), gBBInput.getRequestContext(), gBBInput.getCloudRegion());
-                       execution.setVariable("SDNCChangeAssignNetworkResponse", sdncResponse);
+                       GenericResourceApiNetworkOperationInformation req = sdncNetworkResources.changeAssignNetwork(network, serviceInstance, gBBInput.getCustomer(), gBBInput.getRequestContext(), gBBInput.getCloudRegion());
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.NETWORK);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch(Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -101,8 +113,11 @@ public class SDNCChangeAssignTasks {
                        GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
                        VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID));
                        Customer customer = gBBInput.getCustomer();
-                       String response = sdncVfModuleResources.changeAssignVfModule(vfModule, vnf, serviceInstance, customer, cloudRegion, requestContext);
-                       execution.setVariable("SDNCChangeAssignVfModuleResponse", response);
+                       GenericResourceApiVfModuleOperationInformation req = sdncVfModuleResources.changeAssignVfModule(vfModule, vnf, serviceInstance, customer, cloudRegion, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VFMODULE);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
index 1f6ec72..eb078e0 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
@@ -36,6 +40,8 @@ import org.onap.so.client.orchestration.SDNCNetworkResources;
 import org.onap.so.client.orchestration.SDNCServiceInstanceResources;
 import org.onap.so.client.orchestration.SDNCVfModuleResources;
 import org.onap.so.client.orchestration.SDNCVnfResources;
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -61,23 +67,17 @@ public class SDNCDeactivateTasks {
                try {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        RequestContext requestContext = gBBInput.getRequestContext();
-
-                       ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID,
-                                       execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-                       GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID,
-                                       execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
-                       VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID,
-                                       execution.getLookupMap().get(ResourceKey.VF_MODULE_ID));
-
+                       ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
+                       GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
+                       VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID));
                        Customer customer = gBBInput.getCustomer();
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
-                       execution.setVariable("sdncDeactivateVfModuleRollback", false);
-
-                       String response = sdncVfModuleResources.deactivateVfModule(vfModule, vnf, serviceInstance, customer,
+                       GenericResourceApiVfModuleOperationInformation req = sdncVfModuleResources.deactivateVfModule(vfModule, vnf, serviceInstance, customer,
                                        cloudRegion, requestContext);
-                       execution.setVariable("SDNCDeactivateVfModuleResponse", response);
-                       execution.setVariable("sdncDeactivateVfModuleRollback", true);
-               } catch (Exception ex) {
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VFMODULE);
+                       execution.setVariable("SDNCRequest", sdncRequest);              } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
        }
@@ -93,15 +93,15 @@ public class SDNCDeactivateTasks {
                        RequestContext requestContext = gBBInput.getRequestContext();
                        ServiceInstance serviceInstance = null;
                        GenericVnf vnf = null;
-                                       
-                       serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID,
-                                       execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-                       vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID,
-                                       execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
+                       serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
+                       vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
                        Customer customer = gBBInput.getCustomer();
-                       String response = sdncVnfResources.deactivateVnf(vnf, serviceInstance, customer, cloudRegion, requestContext);
-                       execution.setVariable("SDNCDeactivateVnfResponse", response);
+                       GenericResourceApiVnfOperationInformation req = sdncVnfResources.deactivateVnf(vnf, serviceInstance, customer, cloudRegion, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VNF);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -119,10 +119,11 @@ public class SDNCDeactivateTasks {
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID,
                                        execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
                        Customer customer = gBBInput.getCustomer();
-                       execution.setVariable("sdncServiceInstanceRollback", false);
-                       String response = sdncSIResources.deactivateServiceInstance(serviceInstance, customer, requestContext);
-                       execution.setVariable("deactivateServiceInstanceSDNCResponse", response);
-                       execution.setVariable("sdncServiceInstanceRollback", true);
+                       GenericResourceApiServiceOperationInformation req = sdncSIResources.deactivateServiceInstance(serviceInstance, customer, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.SERVICE);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -134,7 +135,6 @@ public class SDNCDeactivateTasks {
         * @param execution
         */
        public void deactivateNetwork(BuildingBlockExecution execution) {
-               execution.setVariable("SDNCDeactivateTasks.deactivateNetwork.rollback", false);
                try {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID));
@@ -142,11 +142,12 @@ public class SDNCDeactivateTasks {
                        Customer customer = gBBInput.getCustomer();
                        RequestContext requestContext = gBBInput.getRequestContext();
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
-
-                       String response = sdncNetworkResources.deactivateNetwork(l3Network, serviceInstance, customer,
+                       GenericResourceApiNetworkOperationInformation req = sdncNetworkResources.deactivateNetwork(l3Network, serviceInstance, customer,
                                        requestContext, cloudRegion);
-                       execution.setVariable("SDNCDeactivateTasks.deactivateNetwork.response", response);
-                       execution.setVariable("SDNCDeactivateTasks.deactivateNetwork.rollback", true);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.NETWORK);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
index 4506699..81ebfb1 100644 (file)
@@ -75,7 +75,9 @@ public class SDNCQueryTasks {
                                + genericVnf.getVnfId() + "/vnf-data/vf-modules/vf-module/"
                                + vfModule.getVfModuleId() + "/vf-module-data/vf-module-topology/";
                try {
-                       vfModule.setSelflink(selfLink);
+                       if(vfModule.getSelflink() == null || (vfModule.getSelflink() != null && vfModule.getSelflink().isEmpty())) {
+                               vfModule.setSelflink(selfLink);
+                       }
                        if(vfModule.getSelflink() != null && !vfModule.getSelflink().isEmpty()) {       
                                String response = sdncVfModuleResources.queryVfModule(vfModule);                
                                execution.setVariable("SDNCQueryResponse_" + vfModule.getVfModuleId(), response);                       
index fedec4f..173d5f7 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
 import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.onap.so.bpmn.core.WorkflowException;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.exception.MapperException;
@@ -32,6 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.jayway.jsonpath.JsonPath;
+import com.jayway.jsonpath.PathNotFoundException;
  
 @Component
 public class SDNCRequestTasks {
@@ -61,6 +63,9 @@ public class SDNCRequestTasks {
                        String response = sdncClient.post(request.getSDNCPayload(),request.getTopology());
                        String finalMessageIndicator = JsonPath.read(response, "$.output.ack-final-indicator");         
                        execution.setVariable("isSDNCCompleted", convertIndicatorToBoolean(finalMessageIndicator));
+               } catch(PathNotFoundException e) {
+                       logger.error("Error Parsing SDNC Response", e);
+                       exceptionBuilder.buildAndThrowWorkflowException(execution, 7000,"Error Parsing SDNC Response");
                } catch (MapperException e) {
                        logger.error("Error Parsing SDNC Response", e);
                        exceptionBuilder.buildAndThrowWorkflowException(execution, 7000,"Error Parsing SDNC Response");
@@ -86,11 +91,6 @@ public class SDNCRequestTasks {
        public void handleTimeOutException (DelegateExecution execution) {              
                exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, "Error timed out waiting on SDNC Async-Response");
        }
-       
-       public void handleSyncError (DelegateExecution execution) {
-               String msg = (String) execution.getVariable("SDNCSyncError");           
-               exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, msg);
-       }
 
        protected boolean convertIndicatorToBoolean(String finalMessageIndicator) {
                return "Y".equals(finalMessageIndicator);
index 13639da..960fb99 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
@@ -31,17 +36,16 @@ import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.client.orchestration.SDNCNetworkResources;
 import org.onap.so.client.orchestration.SDNCServiceInstanceResources;
 import org.onap.so.client.orchestration.SDNCVfModuleResources;
 import org.onap.so.client.orchestration.SDNCVnfResources;
-import org.onap.so.db.catalog.beans.OrchestrationStatus;
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
-import org.onap.so.client.orchestration.SDNCNetworkResources;
-
 @Component
 public class SDNCUnassignTasks {
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCUnassignTasks.class);
@@ -62,15 +66,13 @@ public class SDNCUnassignTasks {
                try {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); 
-                       
-                       if (serviceInstance.getOrchestrationStatus() == OrchestrationStatus.INVENTORIED) {
-                               return;  // If INVENTORIED then SDNC unassign is not necessary
-                       }
-                       
                        RequestContext requestContext = gBBInput.getRequestContext();
                        Customer customer = gBBInput.getCustomer();
-                       String sdncUnassignResponse = sdncSIResources.unassignServiceInstance(serviceInstance, customer, requestContext);
-                       execution.setVariable("sdncUnassignResponse", sdncUnassignResponse);
+                       GenericResourceApiServiceOperationInformation req = sdncSIResources.unassignServiceInstance(serviceInstance, customer, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.SERVICE);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
@@ -81,17 +83,11 @@ public class SDNCUnassignTasks {
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); 
                        GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); 
                        VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID));
-                       
-                       if (OrchestrationStatus.INVENTORIED == vfModule.getOrchestrationStatus() || OrchestrationStatus.PENDING_CREATE == vfModule.getOrchestrationStatus()) {
-                               return;  // If INVENTORIED or PENDING_CREATE then SDNC unassign is not necessary
-                       }
-                       
-                       execution.setVariable("sdncVfModuleRollback", false);
-               
-                       String response = sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance);               
-                       execution.setVariable("SDNCResponse", response);
-                       execution.setVariable("sdncVfModuleRollback", true);
-               } catch (Exception ex) {                        
+                       GenericResourceApiVfModuleOperationInformation req = sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance);            
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VFMODULE);
+                       execution.setVariable("SDNCRequest", sdncRequest);              } catch (Exception ex) {                        
                    exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
        }
@@ -101,41 +97,34 @@ public class SDNCUnassignTasks {
                        GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
                        ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
                        GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID));
-                       
-                       if (OrchestrationStatus.INVENTORIED == vnf.getOrchestrationStatus() || OrchestrationStatus.CREATED == vnf.getOrchestrationStatus()) {
-                               return; // If INVENTORIED or CREATED then SDNC unassign is not necessary
-                       }
-                       
                        RequestContext requestContext = gBBInput.getRequestContext();
                        Customer customer = gBBInput.getCustomer();
                        CloudRegion cloudRegion = gBBInput.getCloudRegion();
-                       execution.setVariable("sdncVnfRollback", false);
-                       String response = sdncVnfResources.unassignVnf(vnf, serviceInstance, customer, cloudRegion, requestContext);
-                       execution.setVariable("sdncUnassignVnfResponse", response);
-                       execution.setVariable("sdncVnfRollback", true);
+                       GenericResourceApiVnfOperationInformation req = sdncVnfResources.unassignVnf(vnf, serviceInstance, customer, cloudRegion, requestContext);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.VNF);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
        }
 
        public void unassignNetwork(BuildingBlockExecution execution) throws Exception {
-               GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
-               L3Network network =  extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID));
-               
-               if (OrchestrationStatus.INVENTORIED == network.getOrchestrationStatus()) {
-                       return; // If INVENTORIED then SDNC unassign is not necessary
-               }
-               
-               ServiceInstance serviceInstance =  extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
-               Customer customer = gBBInput.getCustomer();
-               RequestContext requestContext = gBBInput.getRequestContext();           
-               CloudRegion cloudRegion = gBBInput.getCloudRegion();
-               String cloudRegionSdnc = execution.getVariable("cloudRegionSdnc");
-               cloudRegion.setLcpCloudRegionId(cloudRegionSdnc);
                try {
-                       String response = sdncNetworkResources.unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-                       execution.setVariable("SDNCUnAssignNetworkResponse", response);
-                       execution.setVariable("isRollbackNeeded", true);
+                       GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
+                       L3Network network =  extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID));
+                       ServiceInstance serviceInstance =  extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID));
+                       Customer customer = gBBInput.getCustomer();
+                       RequestContext requestContext = gBBInput.getRequestContext();           
+                       CloudRegion cloudRegion = gBBInput.getCloudRegion();
+                       String cloudRegionSdnc = execution.getVariable("cloudRegionSdnc");
+                       cloudRegion.setLcpCloudRegionId(cloudRegionSdnc);
+                       GenericResourceApiNetworkOperationInformation req = sdncNetworkResources.unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
+                       SDNCRequest sdncRequest = new SDNCRequest();
+                       sdncRequest.setSDNCPayload(req);
+                       sdncRequest.setTopology(SDNCTopology.NETWORK);
+                       execution.setVariable("SDNCRequest", sdncRequest);
                } catch (Exception ex) {
                        exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
                }
index e9dcdad..10ee13e 100644 (file)
@@ -27,7 +27,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
 import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -50,6 +49,9 @@ import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetup;
 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetupUtils;
 import org.onap.so.bpmn.infrastructure.workflow.tasks.Resource;
+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.ExceptionBuilder;
 import org.onap.so.client.orchestration.AAIConfigurationResources;
 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
@@ -62,6 +64,7 @@ import org.onap.so.db.catalog.beans.VnfVfmoduleCvnfcConfigurationCustomization;
 import org.onap.so.db.catalog.beans.macro.NorthBoundRequest;
 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
 import org.onap.so.db.catalog.client.CatalogDbClient;
+import org.onap.so.logger.MsoLogger;
 import org.onap.so.serviceinstancebeans.ModelInfo;
 import org.onap.so.serviceinstancebeans.ModelType;
 import org.onap.so.serviceinstancebeans.Networks;
@@ -72,6 +75,7 @@ import org.onap.so.serviceinstancebeans.VfModules;
 import org.onap.so.serviceinstancebeans.Vnfs;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -118,6 +122,12 @@ public class WorkflowAction {
        private CatalogDbClient catalogDbClient;
        @Autowired
        private AAIConfigurationResources aaiConfigurationResources;
+       @Autowired
+       private WorkflowActionExtractResourcesAAI workflowActionUtils;
+
+       @Autowired
+        private Environment environment;
+       private String defaultCloudOwner = "org.onap.so.cloud-owner";
 
        public void setBbInputSetupUtils(BBInputSetupUtils bbInputSetupUtils) {
                this.bbInputSetupUtils = bbInputSetupUtils;
@@ -135,6 +145,7 @@ public class WorkflowAction {
                final String apiVersion = (String) execution.getVariable(G_APIVERSION);
                final String uri = (String) execution.getVariable(G_URI);
                final String vnfType = (String) execution.getVariable(VNF_TYPE);
+               String serviceInstanceId = (String) execution.getVariable("serviceInstanceId");
                List<OrchestrationFlow> orchFlows = (List<OrchestrationFlow>) execution.getVariable(G_ORCHESTRATION_FLOW);
                List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>();
                WorkflowResourceIds workflowResourceIds = populateResourceIdsFromApiHandler(execution);
@@ -149,6 +160,19 @@ public class WorkflowAction {
                        execution.setVariable(G_ISTOPLEVELFLOW, true);
                        ServiceInstancesRequest sIRequest = mapper.readValue(bpmnRequest, ServiceInstancesRequest.class);
                        RequestDetails requestDetails = sIRequest.getRequestDetails();
+                       String cloudOwner = "";
+                       try{
+                               cloudOwner = requestDetails.getCloudConfiguration().getCloudOwner();
+                       } catch (Exception ex) {
+                               cloudOwner = environment.getProperty(defaultCloudOwner);
+                       }
+                       boolean suppressRollback = false;
+                       try{
+                               suppressRollback = requestDetails.getRequestInfo().getSuppressRollback();
+                       } catch (Exception ex) {
+                               suppressRollback = false;
+                       }
+                       execution.setVariable("suppressRollback", suppressRollback);
                        Resource resource = extractResourceIdAndTypeFromUri(uri);
                        WorkflowType resourceType = resource.getResourceType();
                        execution.setVariable("resourceName", resourceType.toString());
@@ -160,12 +184,15 @@ public class WorkflowAction {
                        } else {
                                resourceId = resource.getResourceId();
                        }
+                       if((serviceInstanceId == null || serviceInstanceId.equals("")) && resourceType == WorkflowType.SERVICE){
+                               serviceInstanceId = resourceId;
+                       }
                        execution.setVariable("resourceId", resourceId);
                        execution.setVariable("resourceType", resourceType);
 
                        if (aLaCarte) {
                                if (orchFlows == null || orchFlows.isEmpty()) {
-                                       orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte);
+                                       orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte, cloudOwner);
                                }
                                orchFlows = filterOrchFlows(orchFlows, resourceType, execution);
                                String key = "";
@@ -238,10 +265,11 @@ public class WorkflowAction {
                                } 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() + "    ";
@@ -249,7 +277,7 @@ public class WorkflowAction {
                                logger.info("Found {}", foundObjects);
 
                                if (orchFlows == null || orchFlows.isEmpty()) {
-                                       orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte);
+                                       orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte, cloudOwner);
                                }
                                flowsToExecute = buildExecuteBuildingBlockList(orchFlows, resourceCounter, requestId, apiVersion, resourceId,
                                                resourceType, requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails);
@@ -265,9 +293,9 @@ public class WorkflowAction {
                                        execution.setVariable("calledHoming", false);
                                }
                                if (resourceType == WorkflowType.SERVICE && (requestAction.equalsIgnoreCase(ASSIGNINSTANCE) || requestAction.equalsIgnoreCase(CREATEINSTANCE))){
-                                       generateResourceIds(flowsToExecute, resourceCounter);
+                                       generateResourceIds(flowsToExecute, resourceCounter, serviceInstanceId);
                                }else{
-                                       updateResourceIdsFromAAITraversal(flowsToExecute, resourceCounter, aaiResourceIds);
+                                       updateResourceIdsFromAAITraversal(flowsToExecute, resourceCounter, aaiResourceIds, serviceInstanceId);
                                }
                        }
 
@@ -318,7 +346,7 @@ public class WorkflowAction {
        }
 
        private void updateResourceIdsFromAAITraversal(List<ExecuteBuildingBlock> flowsToExecute,
-                       List<Resource> resourceCounter, List<Pair<WorkflowType, String>> aaiResourceIds) {
+                       List<Resource> resourceCounter, List<Pair<WorkflowType, String>> aaiResourceIds, String serviceInstanceId) {
                for(Pair<WorkflowType,String> pair : aaiResourceIds){
                        logger.debug(pair.getValue0() + ", " + pair.getValue1());
                }
@@ -326,7 +354,7 @@ public class WorkflowAction {
                Arrays.stream(WorkflowType.values()).filter(type -> !type.equals(WorkflowType.SERVICE)).forEach(type -> {
                        List<Resource> resources = resourceCounter.stream().filter(x -> type.equals(x.getResourceType())).collect(Collectors.toList());
                        for(int i = 0; i < resources.size(); i++){
-                               updateWorkflowResourceIds(flowsToExecute, type, resources.get(i).getResourceId(), retrieveAAIResourceId(aaiResourceIds,type), null);
+                               updateWorkflowResourceIds(flowsToExecute, type, resources.get(i).getResourceId(), retrieveAAIResourceId(aaiResourceIds,type), null, serviceInstanceId);
                }
                });
        }
@@ -342,17 +370,18 @@ public class WorkflowAction {
                }
                return id;
        }
-       private void generateResourceIds(List<ExecuteBuildingBlock> flowsToExecute, List<Resource> resourceCounter) {
+       private void generateResourceIds(List<ExecuteBuildingBlock> flowsToExecute, List<Resource> resourceCounter, String serviceInstanceId) {
                Arrays.stream(WorkflowType.values()).filter(type -> !type.equals(WorkflowType.SERVICE)).forEach(type -> {
                        List<Resource> resources = resourceCounter.stream().filter(x -> type.equals(x.getResourceType())).collect(Collectors.toList());
                        for(int i = 0; i < resources.size(); i++){
                                Resource resource = resourceCounter.stream().filter(x -> type.equals(x.getResourceType()))
                                                .collect(Collectors.toList()).get(i);
-                               updateWorkflowResourceIds(flowsToExecute, type, resource.getResourceId(), null, resource.getVirtualLinkKey());                  }
+                               updateWorkflowResourceIds(flowsToExecute, type, resource.getResourceId(), null, resource.getVirtualLinkKey(),serviceInstanceId);
+                       }
                });
        }       
        
-       protected void updateWorkflowResourceIds(List<ExecuteBuildingBlock> flowsToExecute, WorkflowType resource, String key, String id, String virtualLinkKey){
+       protected void updateWorkflowResourceIds(List<ExecuteBuildingBlock> flowsToExecute, WorkflowType resource, String key, String id, String virtualLinkKey, String serviceInstanceId){
                String resourceId = id;
                if(resourceId==null){
                        resourceId = UUID.randomUUID().toString();
@@ -360,6 +389,7 @@ public class WorkflowAction {
                for(ExecuteBuildingBlock ebb : flowsToExecute){
                        if(key != null && key.equalsIgnoreCase(ebb.getBuildingBlock().getKey()) && ebb.getBuildingBlock().getBpmnFlowName().contains(resource.toString())){
                                WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+                               workflowResourceIds.setServiceInstanceId(serviceInstanceId);
                                if(resource == WorkflowType.VNF){
                                        workflowResourceIds.setVnfId(resourceId);
                                }else if(resource == WorkflowType.VFMODULE){
@@ -378,6 +408,7 @@ public class WorkflowAction {
                        if(virtualLinkKey != null && ebb.getBuildingBlock().getIsVirtualLink() 
                                        && virtualLinkKey.equalsIgnoreCase(ebb.getBuildingBlock().getVirtualLinkKey())) {
                                WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+                               workflowResourceIds.setServiceInstanceId(serviceInstanceId);
                                workflowResourceIds.setNetworkId(resourceId);
                                ebb.setWorkflowResourceIds(workflowResourceIds);
                        }
@@ -539,6 +570,67 @@ public class WorkflowAction {
                }
        }
 
+       private void traverseAAIVnf(DelegateExecution execution, List<Resource> resourceCounter, String serviceId, String vnfId,
+                       List<Pair<WorkflowType, String>> aaiResourceIds) {
+               try{
+                       ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceId);
+                       org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO = bbInputSetup
+                                       .getExistingServiceInstance(serviceInstanceAAI);
+                       resourceCounter.add(new Resource(WorkflowType.SERVICE,serviceInstanceMSO.getServiceInstanceId(),false));
+                       if (serviceInstanceMSO.getVnfs() != null) {
+                               for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO
+                                               .getVnfs()) {
+                                       if(vnf.getVnfId().equals(vnfId)){
+                                               aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VNF, vnf.getVnfId()));
+                                               resourceCounter.add(new Resource(WorkflowType.VNF,vnf.getVnfId(),false));
+                                               if (vnf.getVfModules() != null) {
+                                                       for (VfModule vfModule : vnf.getVfModules()) {
+                                                               aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
+                                                               resourceCounter.add(new Resource(WorkflowType.VFMODULE,vfModule.getVfModuleId(),false));        
+                                                               findConfigurationsInsideVfModule(execution, vnf.getVnfId(), vfModule.getVfModuleId(), resourceCounter, aaiResourceIds);
+                                                       }
+                                               }
+                                               if (vnf.getVolumeGroups() != null) {
+                                                       for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf
+                                                                       .getVolumeGroups()) {
+                                                               aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
+                                                               resourceCounter.add(new Resource(WorkflowType.VOLUMEGROUP,volumeGroup.getVolumeGroupId(),false));
+                                                       }
+                                               }
+                                               break;
+                                       }
+                               }
+                       }
+               } catch (Exception ex) {
+                       buildAndThrowException(execution,
+                                       "Could not find existing Vnf or related Instances to execute the request on.");
+               }
+       }
+
+       private void findConfigurationsInsideVfModule(DelegateExecution execution, String vnfId, String vfModuleId, List<Resource> resourceCounter, 
+                       List<Pair<WorkflowType, String>> aaiResourceIds) {
+               try{
+                       org.onap.aai.domain.yang.VfModule aaiVfModule = bbInputSetupUtils.getAAIVfModule(vnfId, vfModuleId);
+                       AAIResultWrapper vfModuleWrapper = new AAIResultWrapper(
+                                       new AAICommonObjectMapperProvider().getMapper().writeValueAsString(aaiVfModule));
+                       Optional<Relationships> relationshipsOp;
+                       relationshipsOp = vfModuleWrapper.getRelationships();
+                       if(relationshipsOp.isPresent()) {
+                               relationshipsOp = workflowActionUtils.extractRelationshipsVnfc(relationshipsOp.get());
+                               if(relationshipsOp.isPresent()){
+                                       Optional<Configuration> config = workflowActionUtils.extractRelationshipsConfiguration(relationshipsOp.get());
+                                       if(config.isPresent()){
+                                               aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.CONFIGURATION, config.get().getConfigurationId()));
+                                               resourceCounter.add(new Resource(WorkflowType.CONFIGURATION, config.get().getConfigurationId(), false));
+                                       }
+                               }
+                       }
+               }catch (Exception ex){
+                       buildAndThrowException(execution,
+                                       "Failed to find Configuration object from the vfModule.");
+               }
+       }
+       
        protected boolean traverseUserParamsService(DelegateExecution execution, List<Resource> resourceCounter,
                        ServiceInstancesRequest sIRequest, String requestAction)
                        throws IOException {
@@ -943,10 +1035,10 @@ public class WorkflowAction {
        }
 
        protected List<OrchestrationFlow> queryNorthBoundRequestCatalogDb(DelegateExecution execution, String requestAction,
-                       WorkflowType resourceName, boolean aLaCarte) {
+                       WorkflowType resourceName, boolean aLaCarte, String cloudOwner) {
                List<OrchestrationFlow> listToExecute = new ArrayList<>();
                NorthBoundRequest northBoundRequest = catalogDbClient
-                               .getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(requestAction, resourceName.toString(), aLaCarte);
+                               .getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(requestAction, resourceName.toString(), aLaCarte, cloudOwner);
                if(northBoundRequest == null){
                        if(aLaCarte){
                                buildAndThrowException(execution,"The request: ALaCarte " + resourceName + " " + requestAction + " is not supported by GR_API.");
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailure.java
new file mode 100644 (file)
index 0000000..ac06818
--- /dev/null
@@ -0,0 +1,116 @@
+package org.onap.so.bpmn.infrastructure.workflow.tasks;
+
+import java.util.Optional;
+
+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.db.request.beans.InfraActiveRequests;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WorkflowActionBBFailure {
+
+       private static final Logger logger = LoggerFactory.getLogger(WorkflowActionBBFailure.class);
+       @Autowired
+       private RequestsDbClient requestDbclient;
+       @Autowired
+       private WorkflowAction workflowAction;
+       
+       protected void updateRequestErrorStatusMessage(DelegateExecution execution) {
+               try {
+                       String requestId = (String) execution.getVariable("mso-request-id");
+                       InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
+                       String errorMsg = "";
+                       Optional<String> errorMsgOp = retrieveErrorMessage(execution);
+                       if(errorMsgOp.isPresent()){
+                               errorMsg = errorMsgOp.get();
+                       }else{
+                               errorMsg = "Failed to determine error message";
+                       }
+                       request.setStatusMessage(errorMsg);
+                       requestDbclient.updateInfraActiveRequests(request);
+               } catch (Exception e) {
+                       logger.error("Failed to update Request db with the status message after retry or rollback has been initialized.",e);
+               }
+       }
+       
+       public void updateRequestStatusToFailed(DelegateExecution execution) {
+               try {
+                       String requestId = (String) execution.getVariable("mso-request-id");
+                       InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
+                       String rollbackErrorMsg = "";
+                       String errorMsg = "";
+                       Boolean rollbackCompletedSuccessfully = (Boolean) execution.getVariable("isRollbackComplete");
+                       Boolean isRollbackFailure = (Boolean) execution.getVariable("isRollback");
+                       
+                       if(rollbackCompletedSuccessfully==null)
+                               rollbackCompletedSuccessfully = false;
+                       
+                       if(isRollbackFailure==null)
+                               isRollbackFailure = false;
+                       
+                       if(rollbackCompletedSuccessfully){
+                               rollbackErrorMsg = "Rollback has been completed successfully.";
+                               request.setRollbackStatusMessage(rollbackErrorMsg);
+                               execution.setVariable("RollbackErrorMessage", rollbackErrorMsg);
+                       }else if(isRollbackFailure){
+                               Optional<String> rollbackErrorMsgOp = retrieveErrorMessage(execution);
+                               if(rollbackErrorMsgOp.isPresent()){
+                                       rollbackErrorMsg = rollbackErrorMsgOp.get();
+                               }else{
+                                       rollbackErrorMsg = "Failed to determine rollback error message.";
+                               }
+                               request.setRollbackStatusMessage(rollbackErrorMsg);
+                               execution.setVariable("RollbackErrorMessage", rollbackErrorMsg);
+                       }else{
+                               Optional<String> errorMsgOp = retrieveErrorMessage(execution);
+                               if(errorMsgOp.isPresent()){
+                                       errorMsg = errorMsgOp.get();
+                               }else{
+                                       errorMsg = "Failed to determine error message";
+                               }
+                               request.setStatusMessage(errorMsg);
+                               execution.setVariable("ErrorMessage", errorMsg);
+                       }
+                       request.setProgress(Long.valueOf(100));
+                       request.setRequestStatus("FAILED");
+                       request.setLastModifiedBy("CamundaBPMN");
+                       requestDbclient.updateInfraActiveRequests(request);
+               } catch (Exception e) {
+                       workflowAction.buildAndThrowException(execution, "Error Updating Request Database", e);
+               }
+       }
+       
+       private Optional<String> retrieveErrorMessage (DelegateExecution execution){
+               String errorMsg = "";
+               try {
+                       WorkflowException exception = (WorkflowException) execution.getVariable("WorkflowException");
+                       if(exception != null && (exception.getErrorMessage()!=null || !exception.getErrorMessage().equals(""))){
+                               errorMsg = exception.getErrorMessage();
+                       }
+                       if(errorMsg == null || errorMsg.equals("")){
+                               errorMsg = (String) execution.getVariable("WorkflowExceptionErrorMessage");
+                       }
+                       return Optional.of(errorMsg);
+               } catch (Exception ex) {
+                       logger.error("Failed to extract workflow exception from execution.",ex);
+               }
+               return Optional.empty();
+       }
+       
+       public void updateRequestStatusToFailedWithRollback(DelegateExecution execution) {
+               execution.setVariable("isRollbackComplete", true);
+               updateRequestStatusToFailed(execution);
+       }
+
+       public void abortCallErrorHandling(DelegateExecution execution) {
+               String msg = "Flow has failed. Rainy day handler has decided to abort the process.";
+               logger.error(msg);
+               throw new BpmnError(msg);
+       }
+}
index 66e2694..917039b 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
+import java.sql.Timestamp;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
@@ -57,6 +60,8 @@ public class WorkflowActionBBTasks {
        private RequestsDbClient requestDbclient;
        @Autowired
        private WorkflowAction workflowAction;
+       @Autowired
+       private WorkflowActionBBFailure workflowActionBBFailure;
        
        public void selectBB(DelegateExecution execution) {
                List<ExecuteBuildingBlock> flowsToExecute = (List<ExecuteBuildingBlock>) execution
@@ -178,27 +183,30 @@ public class WorkflowActionBBTasks {
                }
        }
 
-       public void setupCompleteMsoProcess(DelegateExecution execution) {
-               final String requestId = (String) execution.getVariable(G_REQUEST_ID);
-               final String action = (String) execution.getVariable(G_ACTION);
-               final String resourceId = (String) execution.getVariable("resourceId");
-               final boolean aLaCarte = (boolean) execution.getVariable(G_ALACARTE);
-               final String resourceName = (String) execution.getVariable("resourceName");
-               final String source = (String) execution.getVariable("source");
-               String macroAction = "";
-               if (aLaCarte) {
-                       macroAction = "ALaCarte-" + resourceName + "-" + action;
-               } else {
-                       macroAction = "Macro-" + resourceName + "-" + action;
+       public void updateRequestStatusToComplete(DelegateExecution execution) {
+               try{
+                       final String requestId = (String) execution.getVariable(G_REQUEST_ID);
+                       InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
+                       final String action = (String) execution.getVariable(G_ACTION);
+                       final boolean aLaCarte = (boolean) execution.getVariable(G_ALACARTE);
+                       final String resourceName = (String) execution.getVariable("resourceName");
+                       String macroAction = "";
+                       if (aLaCarte) {
+                               macroAction = "ALaCarte-" + resourceName + "-" + action + " request was executed correctly.";
+                       } else {
+                               macroAction = "Macro-" + resourceName + "-" + action + " request was executed correctly.";
+                       }
+                       execution.setVariable("finalStatusMessage", macroAction);
+                       Timestamp endTime = new Timestamp(System.currentTimeMillis());
+                       request.setEndTime(endTime);
+                       request.setStatusMessage(macroAction);
+                       request.setProgress(Long.valueOf(100));
+                       request.setRequestStatus("COMPLETE");
+                       request.setLastModifiedBy("CamundaBPMN");
+                       requestDbclient.updateInfraActiveRequests(request);
+               }catch (Exception ex) {
+                       workflowAction.buildAndThrowException(execution, "Error Updating Request Database", ex);
                }
-               String msoCompletionRequest = "<aetgt:MsoCompletionRequest xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\" xmlns:ns=\"http://org.onap/so/request/types/v1\"><request-info xmlns=\"http://org.onap/so/infra/vnf-request/v1\"><request-id>"
-                               + requestId + "</request-id><action>" + action + "</action><source>" + source
-                               + "</source></request-info><status-message>" + macroAction
-                               + " request was executed correctly.</status-message><serviceInstanceId>" + resourceId
-                               + "</serviceInstanceId><mso-bpel-name>WorkflowActionBB</mso-bpel-name></aetgt:MsoCompletionRequest>";
-               execution.setVariable("CompleteMsoProcessRequest", msoCompletionRequest);
-               execution.setVariable("mso-request-id", requestId);
-               execution.setVariable("mso-service-instance-id", resourceId);
        }
 
        public void checkRetryStatus(DelegateExecution execution) {
@@ -206,11 +214,12 @@ public class WorkflowActionBBTasks {
                String requestId = (String) execution.getVariable(G_REQUEST_ID);
                String retryDuration = (String) execution.getVariable("RetryDuration");
                int retryCount = (int) execution.getVariable(RETRY_COUNT);
+               int nextCount = retryCount +1;
                if (handlingCode.equals("Retry")){
-                       updateRequestErrorStatusMessage(execution);
+                       workflowActionBBFailure.updateRequestErrorStatusMessage(execution);
                        try{
                                InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
-                               request.setRetryStatusMessage("Retry " + retryCount+1 + "/5 will be started in " + retryDuration);
+                               request.setRetryStatusMessage("Retry " + nextCount + "/5 will be started in " + retryDuration);
                                requestDbclient.updateInfraActiveRequests(request); 
                        } catch(Exception ex){
                                logger.warn("Failed to update Request Db Infra Active Requests with Retry Status",ex);
@@ -218,7 +227,7 @@ public class WorkflowActionBBTasks {
                        if(retryCount<5){
                                int currSequence = (int) execution.getVariable("gCurrentSequence");
                                execution.setVariable("gCurrentSequence", currSequence-1);
-                               execution.setVariable(RETRY_COUNT, retryCount + 1);
+                               execution.setVariable(RETRY_COUNT, nextCount);
                        }else{
                                workflowAction.buildAndThrowException(execution, "Exceeded maximum retries. Ending flow with status Abort");
                        }
@@ -267,7 +276,7 @@ public class WorkflowActionBBTasks {
                                }
                        }
                        
-                       updateRequestErrorStatusMessage(execution);
+                       workflowActionBBFailure.updateRequestErrorStatusMessage(execution);
                        
                        if (rollbackFlows.isEmpty())
                                execution.setVariable("isRollbackNeeded", false);
@@ -313,6 +322,7 @@ public class WorkflowActionBBTasks {
                        String rollbackErrorMsg = null;
                        boolean rollbackCompleted = (boolean) execution.getVariable("isRollbackComplete");
                        boolean isRollbackFailure = (boolean) execution.getVariable("isRollback");
+                       ExecuteBuildingBlock ebb = (ExecuteBuildingBlock) execution.getVariable("buildingBlock");
                        
                        if(rollbackCompleted){
                                rollbackErrorMsg = "Rollback has been completed successfully.";
@@ -335,6 +345,12 @@ public class WorkflowActionBBTasks {
                                        logger.debug("Updating RequestDB to failed: errorMsg = " + errorMsg);
                                }
                        }
+                       if(ebb!=null && ebb.getBuildingBlock()!=null){
+                               String flowStatus = ebb.getBuildingBlock().getBpmnFlowName() + " has failed.";
+                               request.setFlowStatus(flowStatus);
+                               execution.setVariable("flowStatus", flowStatus);
+                       }
+
                        request.setProgress(Long.valueOf(100));
                        request.setRequestStatus("FAILED");
                        request.setLastModifiedBy("CamundaBPMN");
@@ -356,7 +372,7 @@ public class WorkflowActionBBTasks {
                        logger.error("Failed to extract workflow exception from execution.",ex);
                }
                
-               if (errorMsg == null){
+               if (errorMsg == null || errorMsg.equals("")){
                        try {
                                errorMsg = (String) execution.getVariable("WorkflowExceptionErrorMessage");
                        } catch (Exception ex) {
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionExtractResourcesAAI.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionExtractResourcesAAI.java
new file mode 100644 (file)
index 0000000..81609d1
--- /dev/null
@@ -0,0 +1,38 @@
+package org.onap.so.bpmn.infrastructure.workflow.tasks;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
+import org.onap.so.client.aai.entities.Relationships;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WorkflowActionExtractResourcesAAI {
+       private static final Logger logger = LoggerFactory.getLogger(WorkflowActionExtractResourcesAAI.class);
+
+       public Optional<Configuration> extractRelationshipsConfiguration(Relationships relationships) {
+               List<AAIResultWrapper> configurations = relationships.getByType(AAIObjectType.CONFIGURATION);
+               for(AAIResultWrapper configWrapper : configurations) {
+                       Optional<Configuration> config = configWrapper.asBean(Configuration.class);
+                       if(config.isPresent()){
+                               return config;
+                       }
+               }
+               return Optional.empty();
+       }
+
+       public Optional<Relationships> extractRelationshipsVnfc(Relationships relationships) {
+               List<AAIResultWrapper> vnfcs = relationships.getByType(AAIObjectType.VNFC);
+               for(AAIResultWrapper vnfcWrapper : vnfcs){
+                       if(vnfcWrapper.getRelationships().isPresent()){
+                               return vnfcWrapper.getRelationships();
+                       }
+               }
+               return Optional.empty();
+       }
+}
index 57c760b..4abb0a1 100644 (file)
@@ -49,9 +49,12 @@ import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoNetwork;
 import org.onap.so.entity.MsoRequest;
+import org.onap.so.logger.MsoLogger;
 import org.onap.so.openstack.beans.NetworkRollback;
 import org.onap.so.openstack.beans.RouteTarget;
 import org.onap.so.openstack.beans.Subnet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.web.util.UriUtils;
 
@@ -59,6 +62,7 @@ import org.springframework.web.util.UriUtils;
 public class NetworkAdapterObjectMapper {
        private static final ModelMapper modelMapper = new ModelMapper();
        private static String FORWARD_SLASH = "/";
+       private static final Logger logger = LoggerFactory.getLogger(NetworkAdapterObjectMapper.class);
 
        public CreateNetworkRequest createNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, Customer customer) throws UnsupportedEncodingException {
                CreateNetworkRequest createNetworkRequest = new CreateNetworkRequest();
@@ -82,8 +86,12 @@ public class NetworkAdapterObjectMapper {
                //build and set provider Vlan Network
                ProviderVlanNetwork providerVlanNetwork = buildProviderVlanNetwork(l3Network);
                createNetworkRequest.setProviderVlanNetwork(providerVlanNetwork);
-               
-               createNetworkRequest.setNetworkTechnology(setNetworkTechnology(l3Network.getModelInfoNetwork().getNetworkTechnology()));
+               String networkTechnology = l3Network.getModelInfoNetwork().getNetworkTechnology();
+               if(networkTechnology == null) {
+                       networkTechnology = l3Network.getNetworkTechnology();
+                       logger.warn("NetworkTechnology was null in CatalogDB. Using field from AAI: " + networkTechnology);
+               }
+               createNetworkRequest.setNetworkTechnology(setNetworkTechnology(networkTechnology));
                
                //build and set Contrail Network
                ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingClient.java
new file mode 100644 (file)
index 0000000..f91ad44
--- /dev/null
@@ -0,0 +1,64 @@
+package org.onap.so.client.namingservice;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.namingservice.model.NameGenDeleteRequest;
+import org.onap.namingservice.model.NameGenDeleteResponse;
+import org.onap.namingservice.model.NameGenRequest;
+import org.onap.namingservice.model.NameGenResponse;
+import org.onap.so.client.exception.BadResponseException;
+import org.onap.so.logger.MsoLogger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+
+
+@Component
+public class NamingClient{
+       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NamingClient.class);
+       private static final String ENDPOINT = "mso.naming.endpoint";
+       private static final String AUTH = "mso.naming.auth";
+       
+       @Autowired
+       private RestTemplate restTemplate;
+       @Autowired
+    private Environment env;
+       @Autowired
+       private NamingClientResponseValidator namingClientResponseValidator;
+       
+       public String postNameGenRequest(NameGenRequest request) throws BadResponseException {
+               String targetUrl = env.getProperty(ENDPOINT);
+               HttpHeaders headers = setHeaders(env.getProperty(AUTH)); 
+               msoLogger.info("Sending postNameGenRequest to url: " + targetUrl);
+               HttpEntity<NameGenRequest> requestEntity = new HttpEntity<>(request, headers);
+               ResponseEntity<NameGenResponse> response = restTemplate.postForEntity(targetUrl, requestEntity, NameGenResponse.class);
+               return namingClientResponseValidator.validateNameGenResponse(response);
+       }
+
+       public String deleteNameGenRequest(NameGenDeleteRequest request) throws BadResponseException {
+               String targetUrl = env.getProperty(ENDPOINT);
+               HttpHeaders headers = setHeaders(env.getProperty(AUTH)); 
+               msoLogger.info("Sending deleteNameGenRequest to url: " + targetUrl);
+               HttpEntity<NameGenDeleteRequest> requestEntity = new HttpEntity<>(request, headers);
+               ResponseEntity<NameGenDeleteResponse> response = restTemplate.exchange(targetUrl, HttpMethod.DELETE, requestEntity, NameGenDeleteResponse.class);
+               return namingClientResponseValidator.validateNameGenDeleteResponse(response);
+       }
+
+       private HttpHeaders setHeaders(String auth) {
+               HttpHeaders headers = new HttpHeaders();
+               headers.setContentType(MediaType.APPLICATION_JSON);
+               List<MediaType> acceptableMediaTypes = new ArrayList<>();
+               acceptableMediaTypes.add(MediaType.APPLICATION_JSON);
+               headers.setAccept(acceptableMediaTypes);
+               headers.add(HttpHeaders.AUTHORIZATION, auth);
+               return headers;
+       }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingClientResponseValidator.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingClientResponseValidator.java
new file mode 100644 (file)
index 0000000..ab06395
--- /dev/null
@@ -0,0 +1,103 @@
+package org.onap.so.client.namingservice;
+
+import java.util.List;
+
+import org.apache.http.HttpStatus;
+import org.onap.namingservice.model.NameGenDeleteResponse;
+import org.onap.namingservice.model.NameGenResponse;
+import org.onap.namingservice.model.NameGenResponseError;
+import org.onap.namingservice.model.Respelement;
+import org.onap.so.client.exception.BadResponseException;
+import org.onap.so.logger.MessageEnum;
+import org.onap.so.logger.MsoLogger;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NamingClientResponseValidator {
+       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NamingClientResponseValidator.class);
+       private static final String INSTANCE_GROUP_NAME = "instance-group-name";
+       private static final String NO_RESPONSE_FROM_NAMING_SERVICE = "Error did not receive a response from Naming Service.";
+       private static final String NULL_RESPONSE_FROM_NAMING_SERVICE = "Error received a null response from Naming Service.";
+       private static final String NAMING_SERVICE_ERROR = "Error from Naming Service: %s";
+       
+       public String validateNameGenResponse(ResponseEntity<NameGenResponse> response) throws BadResponseException {
+               if (response == null) {
+                       msoLogger.error(MessageEnum.RA_GENERAL_EXCEPTION, NO_RESPONSE_FROM_NAMING_SERVICE, "BPMN",
+                                       MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, NO_RESPONSE_FROM_NAMING_SERVICE);
+                       throw new BadResponseException(NO_RESPONSE_FROM_NAMING_SERVICE);
+               }
+                      
+        int responseCode = response.getStatusCodeValue();
+        String generatedName = "";
+        NameGenResponse responseBody = response.getBody();
+        if (responseBody == null) {
+               msoLogger.error(MessageEnum.RA_GENERAL_EXCEPTION, NULL_RESPONSE_FROM_NAMING_SERVICE, "BPMN",
+                                       MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, NULL_RESPONSE_FROM_NAMING_SERVICE);
+                       throw new BadResponseException(NULL_RESPONSE_FROM_NAMING_SERVICE);
+               }             
+               
+               if (isHttpCodeSuccess(responseCode)) {
+                       msoLogger.info("Successful Response from Naming Service");                      
+                       List<Respelement> respList = responseBody.getElements();
+                       
+                       if (respList != null) {
+                               for (int i=0; i < respList.size(); i++) {
+                                       Respelement respElement = respList.get(i);
+                                       if (respElement != null) {
+                                               String resourceName = respElement.getResourceName();
+                                               if (INSTANCE_GROUP_NAME.equals(resourceName)) {
+                                                       generatedName = respElement.getResourceValue();
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }                       
+                       return generatedName;
+               } else {
+                       NameGenResponseError error = responseBody.getError();
+                       String errorMessageString = NAMING_SERVICE_ERROR;
+                       if (error != null) {
+                               errorMessageString = error.getMessage();
+                       }
+                       String errorMessage = String.format(NAMING_SERVICE_ERROR, errorMessageString);
+                       msoLogger.error(MessageEnum.RA_GENERAL_EXCEPTION, errorMessage, "BPMN", MsoLogger.getServiceName(),
+                                       MsoLogger.ErrorCode.DataError, errorMessage);
+                       throw new BadResponseException(errorMessage);
+               }               
+       }
+       
+       public String validateNameGenDeleteResponse(ResponseEntity<NameGenDeleteResponse> response) throws BadResponseException {
+               if (response == null) {
+                       msoLogger.error(MessageEnum.RA_GENERAL_EXCEPTION, NO_RESPONSE_FROM_NAMING_SERVICE, "BPMN",
+                                       MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, NO_RESPONSE_FROM_NAMING_SERVICE);
+                       throw new BadResponseException(NO_RESPONSE_FROM_NAMING_SERVICE);
+               }
+                      
+        int responseCode = response.getStatusCodeValue();
+        String responseMessage = "";
+        NameGenDeleteResponse responseBody = response.getBody();
+        if (responseBody == null) {
+               msoLogger.error(MessageEnum.RA_GENERAL_EXCEPTION, NULL_RESPONSE_FROM_NAMING_SERVICE, "BPMN",
+                                       MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, NULL_RESPONSE_FROM_NAMING_SERVICE);
+                       throw new BadResponseException(NULL_RESPONSE_FROM_NAMING_SERVICE);
+               }             
+               
+               if (isHttpCodeSuccess(responseCode)) {
+                       msoLogger.info("Successful Response from Naming Service");
+                       return responseMessage;
+               } else {
+                       String errorMessageString = NAMING_SERVICE_ERROR;
+                       
+                       String errorMessage = String.format(NAMING_SERVICE_ERROR, errorMessageString);
+                       msoLogger.error(MessageEnum.RA_GENERAL_EXCEPTION, errorMessage, "BPMN", MsoLogger.getServiceName(),
+                                       MsoLogger.ErrorCode.DataError, errorMessage);
+                       throw new BadResponseException(errorMessage);
+               }               
+       }
+       
+       private boolean isHttpCodeSuccess(int code) {
+        return code >= HttpStatus.SC_OK && code < HttpStatus.SC_MULTIPLE_CHOICES || code == 0;
+    }
+
+}
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingRequestObjectBuilder.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingRequestObjectBuilder.java
new file mode 100644 (file)
index 0000000..c3f216e
--- /dev/null
@@ -0,0 +1,38 @@
+package org.onap.so.client.namingservice;
+
+import java.util.List;
+
+import org.onap.namingservice.model.Deleteelement;
+import org.onap.namingservice.model.Element;
+import org.onap.namingservice.model.NameGenDeleteRequest;
+import org.onap.namingservice.model.NameGenRequest;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NamingRequestObjectBuilder{
+       
+       public Element elementMapper(String instanceGroupId, String policyInstanceName, String namingType, String nfNamingCode, String instanceGroupName){
+               Element element = new Element();
+               element.setExternalKey(instanceGroupId);
+               element.setPolicyInstanceName(policyInstanceName);
+               element.setNamingType(namingType);
+               element.setResourceName(instanceGroupName);
+               element.setNamingIngredientsZeroOrMore(nfNamingCode);
+               return element;
+       }
+       public Deleteelement deleteElementMapper(String instanceGroupId){
+               Deleteelement deleteElement = new Deleteelement();
+               deleteElement.setExternalKey(instanceGroupId);
+               return deleteElement;
+       }
+       public NameGenRequest nameGenRequestMapper(List<Element> elements){
+               NameGenRequest nameGenRequest = new NameGenRequest();
+               nameGenRequest.setElements(elements);
+               return nameGenRequest;
+       }
+       public NameGenDeleteRequest nameGenDeleteRequestMapper(List<Deleteelement> deleteElements){
+               NameGenDeleteRequest nameGenDeleteRequest = new NameGenDeleteRequest();
+               nameGenDeleteRequest.setElements(deleteElements);
+               return nameGenDeleteRequest;
+       }
+}
\ No newline at end of file
index e13a765..a96f01c 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.
@@ -38,10 +38,10 @@ import org.springframework.stereotype.Component;
 public class AAIConfigurationResources {
        @Autowired
        private InjectionHelper injectionHelper;
-       
+
        @Autowired
        private AAIObjectMapper aaiObjectMapper;
-       
+
     /**
      * A&AI call to create configuration
      *
@@ -142,24 +142,32 @@ public class AAIConfigurationResources {
      *
      * @param configurationId
      * @param vpnId
+     *
      */
     public void connectConfigurationToVpnBinding(String configurationId, String vpnId) {
         AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId);
         AAIResourceUri vpnBindingURI = AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDING, vpnId);
         injectionHelper.getAaiClient().connect(configurationURI, vpnBindingURI);
     }
-    
+
     public void connectConfigurationToVfModule(String configurationId, String vfModuleId, String vnfId){
         AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId);
         AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId);
         injectionHelper.getAaiClient().connect(configurationURI, vfModuleURI);
     }
-    
+
     public void connectConfigurationToVnfc(String configurationId, String vnfcName){
         AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId);
         AAIResourceUri vnfcURI = AAIUriFactory.createResourceUri(AAIObjectType.VNFC, vnfcName);
         injectionHelper.getAaiClient().connect(configurationURI, vnfcURI);
     }
+
+    public void connectConfigurationToL3Network(String configurationId, String networkId){
+       AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId);
+       AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId);
+       injectionHelper.getAaiClient().connect(configurationURI, networkURI);
+    }
+
     /**
      * method to delete Configuration details in A&AI
      *
@@ -188,7 +196,7 @@ public class AAIConfigurationResources {
         return injectionHelper.getAaiClient()
                        .get(org.onap.aai.domain.yang.Configuration.class, AAIUriFactory.createResourceFromExistingURI(AAIObjectType.CONFIGURATION, UriBuilder.fromPath(relatedLink).build()));
     }
-    
+
     public void updateOrchestrationStatusConfiguration(Configuration configuration, OrchestrationStatus orchestrationStatus) {
                AAIResourceUri aaiResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configuration.getConfigurationId());
                configuration.setOrchestrationStatus(orchestrationStatus);
index a4c705b..16d5e8e 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.
@@ -47,22 +47,22 @@ import org.springframework.stereotype.Component;
 public class AAINetworkResources {
        @Autowired
        private InjectionHelper injectionHelper;
-       
+
        @Autowired
        private AAIObjectMapper aaiObjectMapper;
-       
+
        public void updateNetwork(L3Network network) {
                AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId());
                org.onap.aai.domain.yang.L3Network aaiL3Network = aaiObjectMapper.mapNetwork(network);
                injectionHelper.getAaiClient().update(networkURI, aaiL3Network);
        }
-       
+
        public void updateSubnet(L3Network network, Subnet subnet) {
                AAIResourceUri subnetURI = AAIUriFactory.createResourceUri(AAIObjectType.SUBNET, network.getNetworkId(), subnet.getSubnetId());
                org.onap.aai.domain.yang.Subnet aaiSubnet = aaiObjectMapper.mapSubnet(subnet);
                injectionHelper.getAaiClient().update(subnetURI, aaiSubnet);
        }
-       
+
        public void createNetworkConnectToServiceInstance(L3Network network, ServiceInstance serviceInstance) {
                AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId());
                network.setOrchestrationStatus(OrchestrationStatus.INVENTORIED);
@@ -76,11 +76,11 @@ public class AAINetworkResources {
                AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId());
                injectionHelper.getAaiClient().delete(networkURI);
        }
-       
+
        public Optional<VpnBinding> getVpnBinding(AAIResourceUri netBindingUri) {
-               return injectionHelper.getAaiClient().get(netBindingUri).asBean(VpnBinding.class);
+               return injectionHelper.getAaiClient().get(netBindingUri.depth(Depth.TWO)).asBean(VpnBinding.class);
        }
-       
+
        public Optional<NetworkPolicy> getNetworkPolicy(AAIResourceUri netPolicyUri) {
                return injectionHelper.getAaiClient().get(netPolicyUri).asBean(NetworkPolicy.class);
        }
@@ -88,85 +88,85 @@ public class AAINetworkResources {
        public Optional<RouteTableReference> getRouteTable(AAIResourceUri rTableUri) {
                return injectionHelper.getAaiClient().get(rTableUri).asBean(RouteTableReference.class);
        }
-       
+
        public Optional<org.onap.aai.domain.yang.L3Network> queryNetworkById(L3Network l3network) {
                AAIResourceUri  uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK,l3network.getNetworkId()).depth(Depth.ALL);
                AAIResultWrapper aaiWrapper = injectionHelper.getAaiClient().get(uri);
                return aaiWrapper.asBean(org.onap.aai.domain.yang.L3Network.class);
-       }       
-       
+       }
+
        public AAIResultWrapper queryNetworkWrapperById(L3Network l3network) {
                AAIResourceUri  uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK,l3network.getNetworkId()).depth(Depth.ALL);
                return injectionHelper.getAaiClient().get(uri);
        }
-       
+
        public void createNetworkInstanceGroup(InstanceGroup instanceGroup) {
                AAIResourceUri instanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId());
                org.onap.aai.domain.yang.InstanceGroup aaiInstanceGroup = aaiObjectMapper.mapInstanceGroup(instanceGroup);
                injectionHelper.getAaiClient().create(instanceGroupURI, aaiInstanceGroup);
        }
-       
+
        public void createNetworkCollection(Collection networkCollection) {
                AAIResourceUri networkCollectionURI = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, networkCollection.getId());
                networkCollection.setOrchestrationStatus(OrchestrationStatus.INVENTORIED);
                org.onap.aai.domain.yang.Collection aaiCollection = aaiObjectMapper.mapCollection(networkCollection);
                injectionHelper.getAaiClient().create(networkCollectionURI, aaiCollection);
        }
-       
+
        public void connectNetworkToTenant(L3Network l3network, CloudRegion cloudRegion) {
-               AAIResourceUri tenantURI = AAIUriFactory.createResourceUri(AAIObjectType.TENANT, 
+               AAIResourceUri tenantURI = AAIUriFactory.createResourceUri(AAIObjectType.TENANT,
                                cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), cloudRegion.getTenantId());
                AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId());
                injectionHelper.getAaiClient().connect(tenantURI, networkURI);
        }
-       
+
        public void connectNetworkToCloudRegion(L3Network l3network, CloudRegion cloudRegion) {
-               AAIResourceUri cloudRegionURI = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, 
+               AAIResourceUri cloudRegionURI = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION,
                                cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId());
                AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId());
-               injectionHelper.getAaiClient().connect(cloudRegionURI, networkURI);
+               injectionHelper.getAaiClient().connect(networkURI,cloudRegionURI);
        }
-       
+
        public void connectNetworkToNetworkCollectionInstanceGroup(L3Network l3network, InstanceGroup instanceGroup) {
                AAIResourceUri netwrokCollectionInstanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId());
                AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId());
                injectionHelper.getAaiClient().connect(netwrokCollectionInstanceGroupURI, networkURI);
        }
-       
+
        public void connectNetworkToNetworkCollectionServiceInstance(L3Network l3network, ServiceInstance networkCollectionServiceInstance) {
                AAIResourceUri networkCollectionServiceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, networkCollectionServiceInstance.getServiceInstanceId());
                AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId());
                injectionHelper.getAaiClient().connect(networkCollectionServiceInstanceUri, networkURI);
        }
-       
+
        public void connectNetworkCollectionInstanceGroupToNetworkCollection(InstanceGroup instanceGroup, Collection networkCollection) {
                AAIResourceUri networkCollectionUri = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, networkCollection.getId());
                AAIResourceUri netwrokCollectionInstanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId());
                injectionHelper.getAaiClient().connect(networkCollectionUri, netwrokCollectionInstanceGroupURI);
        }
-       
+
        public void connectInstanceGroupToCloudRegion(InstanceGroup instanceGroup, CloudRegion cloudRegion) {
-               AAIResourceUri cloudRegionURI = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, 
+               AAIResourceUri cloudRegionURI = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION,
                                cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId());
                AAIResourceUri instanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId());
                injectionHelper.getAaiClient().connect(instanceGroupURI, cloudRegionURI, AAIEdgeLabel.USES);
        }
-       
+
        public void connectNetworkCollectionToServiceInstance(Collection networkCollection, ServiceInstance networkCollectionServiceInstance) {
                AAIResourceUri networkCollectionUri = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, networkCollection.getId());
                AAIResourceUri networkCollectionServiceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, networkCollectionServiceInstance.getServiceInstanceId());
                injectionHelper.getAaiClient().connect(networkCollectionUri, networkCollectionServiceInstanceUri);
        }
-       
+
        public void deleteCollection(Collection collection) {
                AAIResourceUri collectionURI = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, collection.getId());
                injectionHelper.getAaiClient().delete(collectionURI);
        }
-       
+
        public void deleteNetworkInstanceGroup(InstanceGroup instanceGroup) {
                AAIResourceUri instanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId());
                injectionHelper.getAaiClient().delete(instanceGroupURI);
        }
-       
+
 
 }
index 19025b4..a9a52bd 100644 (file)
@@ -110,4 +110,18 @@ public class AAIVnfResources {
                                .orElse(new org.onap.aai.domain.yang.GenericVnf());
                return vnf.isInMaint();
        }
+       
+       public void connectVnfToCloudRegion(GenericVnf vnf, CloudRegion cloudRegion) {
+               AAIResourceUri cloudRegionURI = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION,
+                               cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId());
+               AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId());
+               injectionHelper.getAaiClient().connect(vnfURI,cloudRegionURI);
+       }
+       
+       public void connectVnfToTenant(GenericVnf vnf, CloudRegion cloudRegion) {
+               AAIResourceUri tenantURI = AAIUriFactory.createResourceUri(AAIObjectType.TENANT,
+                               cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), cloudRegion.getTenantId());
+               AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId());
+               injectionHelper.getAaiClient().connect(tenantURI, vnfURI);
+       }
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NamingServiceResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NamingServiceResources.java
new file mode 100644 (file)
index 0000000..8b443a1
--- /dev/null
@@ -0,0 +1,60 @@
+/*-
+ * ============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.client.orchestration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.namingservice.model.Element;
+import org.onap.namingservice.model.Deleteelement;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
+import org.onap.so.client.exception.BadResponseException;
+import org.onap.so.client.namingservice.NamingClient;
+import org.onap.so.client.namingservice.NamingRequestObjectBuilder;
+import org.onap.so.logger.MsoLogger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NamingServiceResources {
+       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NamingServiceResources.class);
+       private static final String NAMING_TYPE = "instanceGroup";
+       
+       @Autowired
+       private NamingClient namingClient;
+       
+       @Autowired
+       private NamingRequestObjectBuilder namingRequestObjectBuilder;  
+       
+       public String generateInstanceGroupName(InstanceGroup instanceGroup, String policyInstanceName, String nfNamingCode) throws BadResponseException {
+               Element element = namingRequestObjectBuilder.elementMapper(instanceGroup.getId(), policyInstanceName, NAMING_TYPE, nfNamingCode, instanceGroup.getInstanceGroupName());
+               List<Element> elements = new ArrayList<Element>();
+               elements.add(element);          
+               return(namingClient.postNameGenRequest(namingRequestObjectBuilder.nameGenRequestMapper(elements)));             
+       }
+       
+       public String deleteInstanceGroupName(InstanceGroup instanceGroup) throws BadResponseException {                
+               Deleteelement deleteElement = namingRequestObjectBuilder.deleteElementMapper(instanceGroup.getId());
+               List<Deleteelement> deleteElements = new ArrayList<Deleteelement>();
+               deleteElements.add(deleteElement);              
+               return(namingClient.deleteNameGenRequest(namingRequestObjectBuilder.nameGenDeleteRequestMapper(deleteElements)));               
+       }       
+}
index d3589db..8b53c28 100644 (file)
 
 package org.onap.so.client.orchestration;
 
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
-import org.onap.so.client.exception.BadResponseException;
-import org.onap.so.client.exception.MapperException;
-import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCSvcAction;
 import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.client.sdnc.mapper.NetworkTopologyOperationRequestMapper;
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
-import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
-
 @Component
 public class SDNCNetworkResources {
-       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCNetworkResources.class);
-       
+       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL,
+                       SDNCNetworkResources.class);
+
        @Autowired
        private NetworkTopologyOperationRequestMapper sdncRM;
-       
-       @Autowired
-       private SDNCClient sdncClient;
 
-       public String assignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext, CloudRegion cloudRegion)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.ASSIGN, GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               return sdncClient.post(sdncReq, SDNCTopology.NETWORK);
+       public GenericResourceApiNetworkOperationInformation assignNetwork(L3Network network,
+                       ServiceInstance serviceInstance, Customer customer, RequestContext requestContext,
+                       CloudRegion cloudRegion) {
+               return sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN,
+                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
-       public String rollbackAssignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext, CloudRegion cloudRegion)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.UNASSIGN, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               return sdncClient.post(sdncReq, SDNCTopology.NETWORK);
+
+       public GenericResourceApiNetworkOperationInformation rollbackAssignNetwork(L3Network network,
+                       ServiceInstance serviceInstance, Customer customer, RequestContext requestContext,
+                       CloudRegion cloudRegion) {
+               return sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
 
-       public String activateNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext, CloudRegion cloudRegion)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.ACTIVATE, GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               return sdncClient.post(sdncReq, SDNCTopology.NETWORK);
+       public GenericResourceApiNetworkOperationInformation activateNetwork(L3Network network,
+                       ServiceInstance serviceInstance, Customer customer, RequestContext requestContext,
+                       CloudRegion cloudRegion) {
+               return sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.ACTIVATE,
+                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
-       public String deactivateNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, RequestContext requestContext, CloudRegion cloudRegion) throws MapperException, BadResponseException {
-               GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               return sdncClient.post(sdncReq, SDNCTopology.NETWORK);
+
+       public GenericResourceApiNetworkOperationInformation deactivateNetwork(L3Network network,
+                       ServiceInstance serviceInstance, Customer customer, RequestContext requestContext,
+                       CloudRegion cloudRegion) {
+               return sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
 
-       public String deleteNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext, CloudRegion cloudRegion)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.DELETE, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               return sdncClient.post(sdncReq, SDNCTopology.NETWORK);
+       public GenericResourceApiNetworkOperationInformation deleteNetwork(L3Network network,
+                       ServiceInstance serviceInstance, Customer customer, RequestContext requestContext,
+                       CloudRegion cloudRegion) {
+               return sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
-       public String changeAssignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext, CloudRegion cloudRegion)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               return sdncClient.post(sdncReq, SDNCTopology.NETWORK);
+
+       public GenericResourceApiNetworkOperationInformation changeAssignNetwork(L3Network network,
+                       ServiceInstance serviceInstance, Customer customer, RequestContext requestContext,
+                       CloudRegion cloudRegion) {
+               return sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN,
+                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
 
-       public String unassignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext, CloudRegion cloudRegion)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.UNASSIGN, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               return sdncClient.post(sdncReq, SDNCTopology.NETWORK);
-       }       
-       
+       public GenericResourceApiNetworkOperationInformation unassignNetwork(L3Network network,
+                       ServiceInstance serviceInstance, Customer customer, RequestContext requestContext,
+                       CloudRegion cloudRegion) {
+               return sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
+       }
 }
index ad9e201..a4c9b8f 100644 (file)
 
 package org.onap.so.client.orchestration;
 
+import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.MapperException;
-import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCSvcAction;
 import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.client.sdnc.mapper.ServiceTopologyOperationMapper;
-import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
-import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
-
 @Component
 public class SDNCServiceInstanceResources {
 
-       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL,
-                       SDNCServiceInstanceResources.class);
-
        @Autowired
        private ServiceTopologyOperationMapper sdncRM;
-       
-       @Autowired
-       private SDNCClient sdncClient;
-       
+
        /**
-        * SDNC call to perform Service Topology Assign for ServiceInsatnce 
+        * SDNC call to perform Service Topology Assign for ServiceInsatnce
+        * 
         * @param serviceInstance
         * @param customer
         * @param requestContext
@@ -58,16 +49,16 @@ public class SDNCServiceInstanceResources {
         * @throws BadResponseException
         * @return the response as a String
         */
-       public String assignServiceInstance(ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext) throws MapperException, BadResponseException {
-               GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper(
-                               SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN,GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE, serviceInstance, customer,
+       public GenericResourceApiServiceOperationInformation assignServiceInstance(ServiceInstance serviceInstance,
+                       Customer customer, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN,
+                               GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE, serviceInstance, customer,
                                requestContext);
-               return sdncClient.post(sdncReq, SDNCTopology.SERVICE);
        }
 
        /**
-        * SDNC call to perform Service Topology Delete for ServiceInsatnce 
+        * SDNC call to perform Service Topology Delete for ServiceInsatnce
+        * 
         * @param serviceInstance
         * @param customer
         * @param requestContext
@@ -75,24 +66,23 @@ public class SDNCServiceInstanceResources {
         * @throws BadResponseException
         * @return the response as a String
         */
-       public String deleteServiceInstance(ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext) throws MapperException, BadResponseException {
-               GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper(
-                               SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE, GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer,
+       public GenericResourceApiServiceOperationInformation deleteServiceInstance(ServiceInstance serviceInstance,
+                       Customer customer, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE,
+                               GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer,
                                requestContext);
-               return sdncClient.post(sdncReq, SDNCTopology.SERVICE);
        }
-       
-       public String unassignServiceInstance(ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext) throws MapperException, BadResponseException {
-               GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper(
-                               SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE, GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer,
+
+       public GenericResourceApiServiceOperationInformation unassignServiceInstance(ServiceInstance serviceInstance,
+                       Customer customer, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE,
+                               GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer,
                                requestContext);
-               return sdncClient.post(sdncReq, SDNCTopology.SERVICE);
        }
-       
+
        /**
         * SDNC call to perform Service Topology Deactivate for ServiceInstance
+        * 
         * @param serviceInstance
         * @param customer
         * @param requestContext
@@ -100,16 +90,17 @@ public class SDNCServiceInstanceResources {
         * @throws BadResponseException
         * @return the response as a String
         */
-       public String deactivateServiceInstance(ServiceInstance serviceInstance, Customer customer,
-                       RequestContext requestContext) throws MapperException, BadResponseException {
-               GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper(
-                               SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer,
+       public GenericResourceApiServiceOperationInformation deactivateServiceInstance(ServiceInstance serviceInstance,
+                       Customer customer, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE,
+                               GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer,
                                requestContext);
-               return sdncClient.post(sdncReq, SDNCTopology.SERVICE);
        }
-       
+
        /**
-        * SDNC call to perform Service Topology Change Assign for the ServiceInstance 
+        * SDNC call to perform Service Topology Change Assign for the
+        * ServiceInstance
+        * 
         * @param serviceInstance
         * @param customer
         * @param requestContext
@@ -117,8 +108,10 @@ public class SDNCServiceInstanceResources {
         * @throws BadResponseException
         * @return the response as a String
         */
-       public String changeModelServiceInstance(ServiceInstance serviceInstance, Customer customer, RequestContext requestContext) throws MapperException, BadResponseException {
-               GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE, serviceInstance, customer, requestContext);
-               return sdncClient.post(sdncReq, SDNCTopology.SERVICE);
+       public GenericResourceApiServiceOperationInformation changeModelServiceInstance(ServiceInstance serviceInstance,
+                       Customer customer, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN,
+                               GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE, serviceInstance, customer,
+                               requestContext);
        }
 }
index 3c192e1..e7f0a40 100644 (file)
@@ -33,7 +33,6 @@ import org.onap.so.client.exception.MapperException;
 import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCSvcAction;
 import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.client.sdnc.mapper.VfModuleTopologyOperationRequestMapper;
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,59 +40,51 @@ import org.springframework.stereotype.Component;
 
 @Component
 public class SDNCVfModuleResources {
-       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCVfModuleResources.class);
-       
+       private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL,
+                       SDNCVfModuleResources.class);
+
        @Autowired
        private VfModuleTopologyOperationRequestMapper sdncRM;
-       
+
        @Autowired
        private SDNCClient sdncClient;
-       
-       public String assignVfModule(VfModule vfModule, VolumeGroup volumeGroup,GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
-                       CloudRegion cloudRegion, RequestContext requestContext)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.ASSIGN, vfModule, volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
-               return sdncClient.post(sdncReq, SDNCTopology.VFMODULE);
-       }
 
-       public String unassignVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.UNASSIGN, vfModule, null, vnf, serviceInstance, null, null, null, null);
-               return sdncClient.post(sdncReq, SDNCTopology.VFMODULE);
+       public GenericResourceApiVfModuleOperationInformation assignVfModule(VfModule vfModule, VolumeGroup volumeGroup,
+                       GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, CloudRegion cloudRegion,
+                       RequestContext requestContext) throws MapperException {
+               return sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN, vfModule,
+                               volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
 
-       public String deactivateVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance,
-                       Customer customer, CloudRegion cloudRegion, RequestContext requestContext)
-                       throws MapperException, BadResponseException {
+       public GenericResourceApiVfModuleOperationInformation unassignVfModule(VfModule vfModule, GenericVnf vnf,
+                       ServiceInstance serviceInstance) throws MapperException {
+               return sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN, vfModule, null,
+                               vnf, serviceInstance, null, null, null, null);
+       }
 
-               GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(
-                               SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, vfModule, null, vnf, serviceInstance,
-                               customer, cloudRegion, requestContext, null);
-               return sdncClient.post(sdncReq, SDNCTopology.VFMODULE);
+       public GenericResourceApiVfModuleOperationInformation deactivateVfModule(VfModule vfModule, GenericVnf vnf,
+                       ServiceInstance serviceInstance, Customer customer, CloudRegion cloudRegion, RequestContext requestContext)
+                       throws MapperException {
+               return sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, vfModule, null,
+                               vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
-       
-       public String queryVfModule(VfModule vfModule)
-                       throws MapperException, BadResponseException {
-               
-               String objectPath = vfModule.getSelflink();             
+
+       public String queryVfModule(VfModule vfModule) throws MapperException, BadResponseException {
+               String objectPath = vfModule.getSelflink();
                return sdncClient.get(objectPath);
        }
-       
-       public String activateVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
-                       CloudRegion cloudRegion, RequestContext requestContext)
-                       throws MapperException, BadResponseException {
-               
-               GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION,
-                               SDNCSvcAction.ACTIVATE, vfModule, null, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
-               return sdncClient.post(sdncReq, SDNCTopology.VFMODULE);
+
+       public GenericResourceApiVfModuleOperationInformation activateVfModule(VfModule vfModule, GenericVnf vnf,
+                       ServiceInstance serviceInstance, Customer customer, CloudRegion cloudRegion, RequestContext requestContext)
+                       throws MapperException {
+               return sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.ACTIVATE, vfModule, null,
+                               vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
-       
-       public String changeAssignVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, CloudRegion cloudRegion, RequestContext requestContext) throws MapperException, BadResponseException {
-               GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, vfModule, null, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
-               return sdncClient.post(sdncReq, SDNCTopology.VFMODULE);
+
+       public GenericResourceApiVfModuleOperationInformation changeAssignVfModule(VfModule vfModule, GenericVnf vnf,
+                       ServiceInstance serviceInstance, Customer customer, CloudRegion cloudRegion, RequestContext requestContext)
+                       throws MapperException {
+               return sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, vfModule,
+                               null, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
 }
index b30fc93..e5194e3 100644 (file)
@@ -32,7 +32,6 @@ import org.onap.so.client.exception.MapperException;
 import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCSvcAction;
 import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.client.sdnc.mapper.VnfTopologyOperationRequestMapper;
 import org.onap.so.logger.MsoLogger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,52 +48,41 @@ public class SDNCVnfResources {
        private SDNCClient sdncClient;
        
        public GenericResourceApiVnfOperationInformation assignVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
-                       CloudRegion cloudRegion, RequestContext requestContext, boolean homing)
-                       throws MapperException, BadResponseException {
+                       CloudRegion cloudRegion, RequestContext requestContext, boolean homing) {
                return sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
                                SDNCSvcAction.ASSIGN,GenericResourceApiRequestActionEnumeration.CREATEVNFINSTANCE, vnf, serviceInstance, customer, cloudRegion, requestContext, homing);
        }
 
-       public String activateVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
-                       CloudRegion cloudRegion, RequestContext requestContext)
-                       throws MapperException, BadResponseException {
-               GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
+       public GenericResourceApiVnfOperationInformation activateVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
+                       CloudRegion cloudRegion, RequestContext requestContext) {
+                return sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
                                SDNCSvcAction.ACTIVATE,GenericResourceApiRequestActionEnumeration.CREATEVNFINSTANCE, vnf, serviceInstance, customer,cloudRegion, requestContext, false);
-               return sdncClient.post(sdncReq, SDNCTopology.VNF);
        }
 
        
-       public String deactivateVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
-                       CloudRegion cloudRegion, RequestContext requestContext)
-                       throws MapperException, BadResponseException {
-               GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
+       public GenericResourceApiVnfOperationInformation deactivateVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
+                       CloudRegion cloudRegion, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
                                SDNCSvcAction.DEACTIVATE,GenericResourceApiRequestActionEnumeration.DELETEVNFINSTANCE, vnf, serviceInstance, customer,cloudRegion, requestContext, false);
-               return sdncClient.post(sdncReq, SDNCTopology.VNF);
        }
 
   
-       public String unassignVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
-                       CloudRegion cloudRegion, RequestContext requestContext)
-                       throws MapperException, BadResponseException {
-               GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
+       public GenericResourceApiVnfOperationInformation unassignVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
+                       CloudRegion cloudRegion, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
                                SDNCSvcAction.UNASSIGN,GenericResourceApiRequestActionEnumeration.DELETEVNFINSTANCE, vnf, serviceInstance, customer, cloudRegion, requestContext, false);
-               return sdncClient.post(sdncReq, SDNCTopology.VNF);
        }
        
-       public String deleteVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
-                       CloudRegion cloudRegion, RequestContext requestContext)
-                       throws MapperException, BadResponseException {
-               GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
+       public GenericResourceApiVnfOperationInformation deleteVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer,
+                       CloudRegion cloudRegion, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION,
                                SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETEVNFINSTANCE,vnf, serviceInstance, customer, cloudRegion, requestContext, false);
-               return sdncClient.post(sdncReq, SDNCTopology.VNF);
        }
        
-       public String changeModelVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, 
-                       CloudRegion cloudRegion, RequestContext requestContext) 
-                       throws MapperException, BadResponseException {
-               GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, 
+       public GenericResourceApiVnfOperationInformation changeModelVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, 
+                       CloudRegion cloudRegion, RequestContext requestContext) {
+               return sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, 
                                SDNCSvcAction.CHANGE_ASSIGN,GenericResourceApiRequestActionEnumeration.CREATEVNFINSTANCE, vnf, serviceInstance, customer, cloudRegion, requestContext, false);
-               return sdncClient.post(sdncReq, SDNCTopology.VNF);
        }
        
        public String queryVnf(GenericVnf vnf) throws MapperException, BadResponseException {
index 37e13fb..13ba107 100644 (file)
@@ -105,12 +105,20 @@ public class SdnCommonTasks {
                responseCode = (String) embeddedResponse.get(RESPONSE_CODE);
             responseMessage = (String) embeddedResponse.get(RESPONSE_MESSAGE);
         }
-        
+        ObjectMapper objMapper = new ObjectMapper();
+        String jsonResponse;
+               try {
+                       jsonResponse = objMapper.writeValueAsString(output);
+                       msoLogger.debug(jsonResponse);
+               } catch (JsonProcessingException e) {
+                       msoLogger.warnSimple("Could not convert SDNC Response to String", e);
+                       jsonResponse = "";
+               }
                msoLogger.info("ResponseCode: " + responseCode + " ResponseMessage: " + responseMessage);
                int code = StringUtils.isNotEmpty(responseCode) ? Integer.parseInt(responseCode) : 0;
                if (isHttpCodeSuccess(code)) {
                        msoLogger.info("Successful Response from SDNC");
-                       return responseMessage;
+                       return jsonResponse;
                } else {
                        String errorMessage = String.format(SDNC_CODE_NOT_0_OR_IN_200_299, responseMessage);
                        msoLogger.error(MessageEnum.RA_RESPONSE_FROM_SDNC, errorMessage, "BPMN", MsoLogger.getServiceName(),
index bf128a4..e860d3c 100644 (file)
@@ -123,7 +123,7 @@ public class VnfTopologyOperationRequestMapper {
                List<GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds> networkInstanceGroupIdList = new ArrayList<GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds>();
 
                for (InstanceGroup instanceGroup : instanceGroups) {
-                       if (ModelInfoInstanceGroup.TYPE_NETWORK_INSTANCE_GROUP
+                       if (ModelInfoInstanceGroup.TYPE_L3_NETWORK
                                        .equalsIgnoreCase(instanceGroup.getModelInfoInstanceGroup().getType())) {
                                GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds instanceGroupId = new GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds();
                                instanceGroupId.setVnfNetworkInstanceGroupId(instanceGroup.getId());
diff --git a/bpmn/so-bpmn-tasks/src/main/resources/naming-service/swagger.json b/bpmn/so-bpmn-tasks/src/main/resources/naming-service/swagger.json
new file mode 100644 (file)
index 0000000..b86ffbc
--- /dev/null
@@ -0,0 +1,325 @@
+{
+       "swagger": "2.0",
+       "info": {
+               "version": "2018.08.01",
+               "title": "networkelementnamegenprodtest Service"
+       },
+       "basePath": "/web",
+       "paths": {
+               "/service/v1/addPolicy": {
+                       "post": {
+                               "summary": "Respond Hello <name>!",
+                               "description": "Returns a JSON object with a string to say hello. Uses 'world' if a name is not specified",
+                               "operationId": "addPolicyToDB",
+                               "produces": [
+                                       "application/json"
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful operation",
+                                               "schema": {
+                                                       "type": "object",
+                                                       "additionalProperties": {
+                                                               "type": "object"
+                                                       }
+                                               }
+                                       },
+                                       "404": {
+                                               "description": "Service not available"
+                                       },
+                                       "500": {
+                                               "description": "Unexpected Runtime error"
+                                       }
+                               }
+                       }
+               },
+               "/service/v1/genNetworkElementName": {
+                       "post": {
+                               "summary": "Generates name",
+                               "description": "Generates network element name based on a naming policy1 ",
+                               "operationId": "generateNetworkElementName",
+                               "produces": [
+                                       "application/json"
+                               ],
+                               "parameters": [
+                                       {
+                                               "in": "body",
+                                               "name": "body",
+                                               "required": true,
+                                               "schema": {
+                                                       "$ref": "#/definitions/NameGenRequest"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful operation",
+                                               "schema": {
+                                                       "$ref": "#/definitions/NameGenResponse"
+                                               }
+                                       },
+                                       "404": {
+                                               "description": "Service not available"
+                                       },
+                                       "500": {
+                                               "description": "Unexpected Runtime error"
+                                       }
+                               }
+                       },
+                       "delete": {
+                               "summary": "Release an existing name by external key",
+                               "description": "Release network element name ",
+                               "operationId": "releaseNetworkElementName",
+                               "produces": [
+                                       "application/json"
+                               ],"parameters": [ 
+                                       {
+                                               "in": "body",
+                                               "name": "body",
+                                               "required": true,
+                                               "schema": {
+                                                       "$ref": "#/definitions/NameGenDeleteRequest"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful operation",
+                                               "schema": {
+                                                       "$ref": "#/definitions/NameGenDeleteResponse"
+                                               }
+                                       },
+                                       "404": {
+                                               "description": "Service not available"
+                                       },
+                                       "500": {
+                                               "description": "Unexpected Runtime error"
+                                       }
+                               }
+                       }
+               }, 
+               "/service/v1/getpolicyresponse/{policyName}": {
+                       "get": {
+                               "summary": "Respond Hello <name>!",
+                               "description": "Returns a JSON object with a string to say hello. Uses 'world' if a name is not specified",
+                               "operationId": "getPolicyResponse",
+                               "produces": [
+                                       "application/json"
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful operation",
+                                               "schema": {
+                                                       "type": "object",
+                                                       "additionalProperties": {
+                                                               "type": "object"
+                                                       }
+                                               }
+                                       },
+                                       "404": {
+                                               "description": "Service not available"
+                                       },
+                                       "500": {
+                                               "description": "Unexpected Runtime error"
+                                       }
+                               }
+                       }
+               }
+       },
+       "definitions": {
+               "HelloWorld": {
+                       "type": "object",
+                       "properties": {
+                               "message": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "NameGenRequest": {
+                       "title": "NameGenRequest",
+                       "$schema": "http://json-schema.org/draft-07/schema#",
+                       "type": "object",
+                       "required": [
+                               "elements"
+                       ],
+                       "properties": {
+                               "elements": {
+                                       "type": "array",
+                                       "items": {
+                                               "$ref": "#/definitions/element"
+                                       }
+                               }
+                       },
+                       "additionalProperties": false,
+                       "definitions": {
+                               "element": {
+                                       "type": "object",
+                                       "required": [
+                                               "resource-name",
+                                               "external-key",
+                                               "policy-instance-name",
+                                               "naming-type"
+                                       ],
+                                       "properties": {
+                                               "resource-name": {
+                                                       "type": "string",
+                                                       "description": "Name of the resource"
+                                               },
+                                               "resource-value": {
+                                                       "type": "string",
+                                                       "description": "Optional. If given, request will be considered as update request"
+                                               },
+                                               "external-key": {
+                                                       "type": "string",
+                                                       "description": "Key identifier for generated name. This will be used in release/update request"
+                                               },
+                                               "policy-instance-name": {
+                                                       "type": "string",
+                                                       "description": "Name of the policy to be used for name generation"
+                                               },
+                                               "naming-type": {
+                                                       "type": "string",
+                                                       "description": "Naming type of the resource"
+                                               }
+                                       },
+                                       "additionalProperties": {
+                                               "type": "string"
+                                       }
+                               }
+                       }
+               },
+               "NameGenResponse": {
+                       "type": "object",
+                         "description":"Response with generated names for each naming type. Either elements(one or more) or an error block will be present",
+                         "properties": {
+                               "elements" : {
+                                       "type":"array",
+                                       "items": { "$ref": "#/definitions/respelement" }
+                               },
+                               "error" : {
+                                       "type":"object",
+                               "required": ["errorId", "message"],
+                                       "properties":{
+                                               "errorId":{"type":"string" , "description":"error code"},
+                                               "message": {"type":"string", "description":"error message"}
+                                               }
+                               }
+                         }
+               },
+               "element": {
+                       "type": "object",
+                       "required": [
+                               "resource-name",
+                               "external-key",
+                               "policy-instance-name",
+                               "naming-type"
+                       ],
+                       "properties": {
+                               "resource-name": {
+                                       "type": "string",
+                                       "description": "Name of the resource"
+                               },
+                               "resource-value": {
+                                       "type": "string",
+                                       "description": "Optional. If given, request will be considered as update request"
+                               },
+                               "external-key": {
+                                       "type": "string",
+                                       "description": "Key identifier for generated name. This will be used in release/update request"
+                               },
+                               "policy-instance-name": {
+                                       "type": "string",
+                                       "description": "Name of the policy to be used for name generation"
+                               },
+                               "naming-type": {
+                                       "type": "string",
+                                       "description": "Naming type of the resource"
+                               },
+                               "${naming-ingredients(zero or more)}": {
+                                       "type": "string",
+                                       "description": "values to subsitute in the naming recipe"
+                               }
+                       },
+                       "additionalProperties": {
+                               "type": "string"
+                       }
+               },
+               "respelement": {
+               "type":"object",
+               "required": [ "resource-name","resource-value","external-key"],
+                "properties": {
+           "resource-value": {
+                               "type": "string",
+                               "description": "Optional. If given, request will be considered as update request"
+                       },
+                       "resource-name": {
+                               "type": "string",
+                                "description": "Name of the resource"
+                       },
+                       "external-key": { 
+                               "type": "string",
+                               "description": "Key identifier for generated name. This will be used in release/update request"
+                       }
+                }
+               },
+               "NameGenDeleteRequest": {
+                       "title": "NameGenRequest",
+                       "$schema": "http://json-schema.org/draft-07/schema#",
+                       "type": "object",
+                       "required": [
+                               "elements"
+                       ],
+                       "properties": {
+                               "elements": {
+                                       "type": "array",
+                                       "items": {
+                                               "$ref": "#/definitions/deleteelement"
+                                       }
+                               }
+                       }
+               },
+               "deleteelement": {
+                       "type": "object",
+                       "required": [ "external-key" ],
+                       "properties": {
+                               "external-key": {
+                                       "type": "string",
+                                       "description": "External key of the name that is being released"
+                               }
+                       }
+               },"NameGenDeleteResponse": {
+                       "title": "NameGenRequest",
+                       "$schema": "http://json-schema.org/draft-07/schema#",
+                       "type": "object",
+                       "required": [
+                               "elements"
+                       ],
+                       "properties": {
+                               "elements": {
+                                       "type": "array",
+                                       "items": {
+                                               "$ref": "#/definitions/deleteresponseelement"
+                                       }
+                               }
+                       }
+               },
+               "deleteresponseelement": {
+                       "type": "object",
+                       "required": [ "resource-value","resource_name","external-key" ],
+                       "properties": {
+                               "resource-value": {
+                                       "type": "string",
+                                       "description": "Name that is being release"
+                               },
+                               "resource-name": {
+                                       "type": "string",
+                                       "description": "Resource Name"
+                               },
+                               "external-key": {
+                                       "type": "string",
+                                       "description": "External key of the name that is being released"
+                               }
+                       }
+               }
+       }
+}
\ No newline at end of file
index 95201d5..7715de9 100644 (file)
@@ -21,12 +21,11 @@ package org.onap.so.bpmn;
 
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.Spy;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.onap.so.bpmn.buildingblock.SniroHomingV2;
 import org.onap.so.bpmn.common.InjectionHelper;
 import org.onap.so.bpmn.common.data.TestDataSetup;
 import org.onap.so.bpmn.infrastructure.flowspecific.tasks.AssignNetworkBBUtils;
+import org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionExtractResourcesAAI;
 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetup;
 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetupUtils;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
@@ -44,6 +43,7 @@ import org.onap.so.client.orchestration.AAIVfModuleResources;
 import org.onap.so.client.orchestration.AAIVnfResources;
 import org.onap.so.client.orchestration.AAIVolumeGroupResources;
 import org.onap.so.client.orchestration.AAIVpnBindingResources;
+import org.onap.so.client.orchestration.NamingServiceResources;
 import org.onap.so.client.orchestration.NetworkAdapterResources;
 import org.onap.so.client.orchestration.SDNCNetworkResources;
 import org.onap.so.client.orchestration.SDNCServiceInstanceResources;
@@ -51,13 +51,9 @@ import org.onap.so.client.orchestration.SDNCVfModuleResources;
 import org.onap.so.client.orchestration.SDNCVnfResources;
 import org.onap.so.client.orchestration.VnfAdapterVfModuleResources;
 import org.onap.so.client.orchestration.VnfAdapterVolumeGroupResources;
-import org.onap.so.client.sdnc.SDNCClient;
-import org.onap.so.client.sniro.SniroClient;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.client.RequestsDbClient;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.boot.test.mock.mockito.SpyBean;
+import org.springframework.core.env.Environment;
 
 @RunWith(MockitoJUnitRunner.Silent.class)
 public abstract class BaseTaskTest extends TestDataSetup {
@@ -111,6 +107,9 @@ public abstract class BaseTaskTest extends TestDataSetup {
 
        @Mock
        protected AAIInstanceGroupResources aaiInstanceGroupResources;
+       
+       @Mock
+       protected NamingServiceResources namingServiceResources;
 
        @Mock
        protected ApplicationControllerAction appCClient;
@@ -145,5 +144,9 @@ public abstract class BaseTaskTest extends TestDataSetup {
        @Mock
        protected ExceptionBuilder exceptionUtil;
 
-
+       @Mock
+       protected WorkflowActionExtractResourcesAAI workflowActionUtils;
+       
+       @Mock
+       protected Environment env;
 }
index 44b5666..da7e727 100644 (file)
@@ -417,4 +417,32 @@ public class AAICreateTasksTest extends BaseTaskTest{
                aaiCreateTasks.createConfiguration(execution);
                verify(aaiConfigurationResources, times(1)).createConfiguration(configuration);
        }
+       
+       @Test
+       public void connectVnfToCloudRegionTest() throws Exception {
+               gBBInput = execution.getGeneralBuildingBlock();
+               doNothing().when(aaiVnfResources).connectVnfToCloudRegion(genericVnf, gBBInput.getCloudRegion());
+               aaiCreateTasks.connectVnfToCloudRegion(execution);
+               verify(aaiVnfResources, times(1)).connectVnfToCloudRegion(genericVnf, gBBInput.getCloudRegion());
+       }
+       
+       @Test
+       public void connectNoneToVnfToCloudRegionTest() throws Exception {
+               String[] arr = new String[1];
+               arr[0] = "test25Region2";
+               doReturn(arr).when(env).getProperty("mso.bpmn.cloudRegionIdsToSkipAddingVnfEdgesTo", String[].class);
+               gBBInput = execution.getGeneralBuildingBlock();
+               gBBInput.getCloudRegion().setLcpCloudRegionId("test25Region2");
+               doNothing().when(aaiVnfResources).connectVnfToCloudRegion(genericVnf, gBBInput.getCloudRegion());
+               aaiCreateTasks.connectVnfToCloudRegion(execution);
+               verify(aaiVnfResources, times(0)).connectVnfToCloudRegion(genericVnf, gBBInput.getCloudRegion());
+       }
+       
+       @Test
+       public void connectVnfTenantTest() throws Exception {
+               gBBInput = execution.getGeneralBuildingBlock();
+               doNothing().when(aaiVnfResources).connectVnfToTenant(genericVnf, gBBInput.getCloudRegion());
+               aaiCreateTasks.connectVnfToTenant(execution);
+               verify(aaiVnfResources, times(1)).connectVnfToTenant(genericVnf, gBBInput.getCloudRegion());
+       }
 }
index 6c20938..f97b137 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.bpmn.infrastructure.aai.tasks;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
@@ -291,6 +292,17 @@ public class AAIUpdateTasksTest extends BaseTaskTest{
                assertEquals("newHeatStackId", vfModule.getHeatStackId());
        }
        
+       @Test
+       public void updateHeatStackIdVfModuleToNullTest() throws Exception {
+               execution.setVariable("heatStackId", null);
+               doNothing().when(aaiVfModuleResources).updateHeatStackIdVfModule(vfModule, genericVnf);
+
+               aaiUpdateTasks.updateHeatStackIdVfModule(execution);
+
+               verify(aaiVfModuleResources, times(1)).updateHeatStackIdVfModule(vfModule, genericVnf);
+               assertEquals(vfModule.getHeatStackId(), "");
+       }
+       
        @Test
        public void updateHeatStackIdVfModuleExceptionTest() throws Exception {
                doThrow(RuntimeException.class).when(aaiVfModuleResources).updateHeatStackIdVfModule(vfModule, genericVnf);
@@ -358,6 +370,16 @@ public class AAIUpdateTasksTest extends BaseTaskTest{
                verify(aaiVolumeGroupResources, times(1)).updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion);
                assertEquals("newHeatStackId", volumeGroup.getHeatStackId());
        }
+       @Test
+       public void updateHeatStackIdVolumeGroupToNullTest() throws Exception {
+               execution.setVariable("heatStackId", null);
+               doNothing().when(aaiVolumeGroupResources).updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion);
+
+               aaiUpdateTasks.updateHeatStackIdVolumeGroup(execution);
+
+               verify(aaiVolumeGroupResources, times(1)).updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion);
+               assertEquals(volumeGroup.getHeatStackId(), "");
+       }
        
        @Test
        public void updateHeatStackIdVolumeGroupExceptionTest() throws Exception {
index 756fe51..4ad6fba 100644 (file)
@@ -67,7 +67,7 @@ public class AssignVnfTest extends BaseTaskTest {
                modelVnfc.setFunction("function");
                
                ModelInfoInstanceGroup modelNetworkInstanceGroup = new ModelInfoInstanceGroup();
-               modelNetworkInstanceGroup.setType("networkInstanceGroup");
+               modelNetworkInstanceGroup.setType("L3-NETWORK");
                modelNetworkInstanceGroup.setFunction("function");
                
                instanceGroup1 = new InstanceGroup();
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceCreateTasksTest.java
new file mode 100644 (file)
index 0000000..41739f3
--- /dev/null
@@ -0,0 +1,82 @@
+/*-
+ * ============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.bpmn.infrastructure.namingservice.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.onap.so.bpmn.BaseTaskTest;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.client.exception.BBObjectNotFoundException;
+
+public class NamingServiceCreateTasksTest extends BaseTaskTest {
+       @InjectMocks
+       private NamingServiceCreateTasks namingServiceCreateTasks = new NamingServiceCreateTasks();     
+       
+       private InstanceGroup instanceGroup;
+       
+       @Before
+       public void before() throws BBObjectNotFoundException {
+               instanceGroup = setInstanceGroup();                             
+               when(extractPojosForBB.extractByKey(any(),ArgumentMatchers.eq(ResourceKey.INSTANCE_GROUP_ID), any())).thenReturn(instanceGroup);                
+       }
+       
+       @Test
+       public void createInstanceGroupTest() throws Exception {
+               String policyInstanceName = "policyInstanceName";
+               String nfNamingCode = "nfNamingCode";
+               String generatedName = "generatedInstanceGroupName";
+               execution.setVariable(policyInstanceName, policyInstanceName);
+               execution.setVariable(nfNamingCode, nfNamingCode);
+               doReturn(generatedName).when(namingServiceResources).generateInstanceGroupName(instanceGroup, policyInstanceName, nfNamingCode);
+               
+               namingServiceCreateTasks.createInstanceGroupName(execution);
+               verify(namingServiceResources, times(1)).generateInstanceGroupName(instanceGroup, policyInstanceName, nfNamingCode);
+               assertEquals(instanceGroup.getInstanceGroupName(), generatedName);
+       }
+       
+       @Test
+       public void createInstanceGroupExceptionTest() throws Exception {
+               expectedException.expect(BBObjectNotFoundException.class);              
+               lookupKeyMap.put(ResourceKey.INSTANCE_GROUP_ID, "notfound");
+               doThrow(BBObjectNotFoundException.class).when(extractPojosForBB).extractByKey(any(),ArgumentMatchers.eq(ResourceKey.INSTANCE_GROUP_ID),eq("notfound")); 
+               String policyInstanceName = "policyInstanceName";
+               String nfNamingCode = "nfNamingCode";
+               execution.setVariable(policyInstanceName, policyInstanceName);
+               execution.setVariable(nfNamingCode, nfNamingCode);
+               doReturn("").when(namingServiceResources).generateInstanceGroupName(instanceGroup, policyInstanceName, nfNamingCode);           
+               namingServiceCreateTasks.createInstanceGroupName(execution);
+               verify(namingServiceResources, times(1)).generateInstanceGroupName(instanceGroup, policyInstanceName, nfNamingCode);
+               
+       }
+       
+}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceDeleteTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/namingservice/tasks/NamingServiceDeleteTasksTest.java
new file mode 100644 (file)
index 0000000..97dcc61
--- /dev/null
@@ -0,0 +1,71 @@
+/*-
+ * ============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.bpmn.infrastructure.namingservice.tasks;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.onap.so.bpmn.BaseTaskTest;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.client.exception.BBObjectNotFoundException;
+
+public class NamingServiceDeleteTasksTest extends BaseTaskTest {
+       @InjectMocks
+       private NamingServiceDeleteTasks namingServiceDeleteTasks = new NamingServiceDeleteTasks();     
+       
+       private InstanceGroup instanceGroup;
+       
+       @Before
+       public void before() throws BBObjectNotFoundException {
+               instanceGroup = setInstanceGroup();                             
+               when(extractPojosForBB.extractByKey(any(),ArgumentMatchers.eq(ResourceKey.INSTANCE_GROUP_ID), any())).thenReturn(instanceGroup);        
+       }
+       
+       @Test
+       public void deleteInstanceGroupTest() throws Exception {
+               
+               doReturn("").when(namingServiceResources).deleteInstanceGroupName(instanceGroup);
+               
+               namingServiceDeleteTasks.deleteInstanceGroupName(execution);
+               verify(namingServiceResources, times(1)).deleteInstanceGroupName(instanceGroup);
+       }
+       
+       @Test
+       public void deleteInstanceGroupExceptionTest() throws Exception {
+               expectedException.expect(BBObjectNotFoundException.class);              
+               lookupKeyMap.put(ResourceKey.INSTANCE_GROUP_ID, "notfound");
+               doThrow(BBObjectNotFoundException.class).when(extractPojosForBB).extractByKey(any(),ArgumentMatchers.eq(ResourceKey.INSTANCE_GROUP_ID),eq("notfound")); 
+               doReturn("").when(namingServiceResources).deleteInstanceGroupName(instanceGroup);
+               namingServiceDeleteTasks.deleteInstanceGroupName(execution);
+               verify(namingServiceResources, times(1)).deleteInstanceGroupName(instanceGroup);
+       }
+       
+}
index a556346..65e7d24 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
+import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
@@ -34,6 +35,9 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
@@ -45,8 +49,8 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BBObjectNotFoundException;
-import org.springframework.beans.factory.annotation.Autowired;
-
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 
 public class SDNCActivateTaskTest extends BaseTaskTest{
        
@@ -83,47 +87,48 @@ public class SDNCActivateTaskTest extends BaseTaskTest{
 
        @Test
        public void activateVnfTest() throws Exception {
-               doReturn("success").when(sdncVnfResources).activateVnf(genericVnf,serviceInstance, customer, cloudRegion,requestContext);
+               doReturn(new GenericResourceApiVnfOperationInformation()).when(sdncVnfResources).activateVnf(genericVnf,serviceInstance, customer, cloudRegion,requestContext);
                sdncActivateTasks.activateVnf(execution);
                verify(sdncVnfResources, times(1)).activateVnf(genericVnf,serviceInstance, customer,cloudRegion,requestContext);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VNF,sdncRequest.getTopology());
        }
        
        @Test
        public void activateVnfTestException() throws Exception {
                expectedException.expect(BpmnError.class);
-               
                doThrow(RuntimeException.class).when(sdncVnfResources).activateVnf(genericVnf,serviceInstance, customer,cloudRegion,requestContext);
                sdncActivateTasks.activateVnf(execution);
        }
        
        @Test
        public void activateNetworkTest() throws Exception {
-               doReturn("response").when(sdncNetworkResources).activateNetwork(isA(L3Network.class), isA(ServiceInstance.class), isA(Customer.class), isA(RequestContext.class), isA(CloudRegion.class));
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(sdncNetworkResources).activateNetwork(isA(L3Network.class), isA(ServiceInstance.class), isA(Customer.class), isA(RequestContext.class), isA(CloudRegion.class));
                sdncActivateTasks.activateNetwork(execution);
                verify(sdncNetworkResources, times(1)).activateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.NETWORK,sdncRequest.getTopology());
        }
        
        @Test
        public void activateNetworkExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-               
                doThrow(RuntimeException.class).when(sdncNetworkResources).activateNetwork(isA(L3Network.class), isA(ServiceInstance.class), isA(Customer.class), isA(RequestContext.class), isA(CloudRegion.class));
                sdncActivateTasks.activateNetwork(execution);
        }
        
        @Test
        public void activateVfModuleTest() throws Exception {
-               doReturn("success").when(sdncVfModuleResources).activateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-
+               doReturn(new GenericResourceApiVfModuleOperationInformation()).when(sdncVfModuleResources).activateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                sdncActivateTasks.activateVfModule(execution);
-
                verify(sdncVfModuleResources, times(1)).activateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VFMODULE,sdncRequest.getTopology());
        }
        
        @Test
        public void activateVfModuleTestException() throws Exception {
                expectedException.expect(BpmnError.class);
-               
                doThrow(RuntimeException.class).when(sdncVfModuleResources).activateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                sdncActivateTasks.activateVfModule(execution);
        }
index 24ae88b..d021df5 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -35,6 +34,9 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
@@ -87,30 +89,25 @@ public class SDNCAssignTasksTest extends BaseTaskTest{
 
        @Test
        public void assignServiceInstanceTest() throws Exception {
-               doReturn("response").when(sdncServiceInstanceResources).assignServiceInstance(serviceInstance, customer, requestContext);
-
+               doReturn(new GenericResourceApiServiceOperationInformation()).when(sdncServiceInstanceResources).assignServiceInstance(serviceInstance, customer, requestContext);
                sdncAssignTasks.assignServiceInstance(execution);
-
                verify(sdncServiceInstanceResources, times(1)).assignServiceInstance(serviceInstance, customer, requestContext);
-               assertTrue(execution.getVariable("SDNCResponse").equals("response"));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.SERVICE,sdncRequest.getTopology());
        }
 
        @Test
        public void assignServiceInstanceExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-
                doThrow(RuntimeException.class).when(sdncServiceInstanceResources).assignServiceInstance(serviceInstance, customer, requestContext);
-
                sdncAssignTasks.assignServiceInstance(execution);
        }
 
        @Test
        public void assignVnfTest() throws Exception {
                doReturn(new GenericResourceApiVnfOperationInformation()).when(sdncVnfResources).assignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext, false);
-
                execution.setVariable("generalBuildingBlock", gBBInput);
                sdncAssignTasks.assignVnf(execution);
-
                verify(sdncVnfResources, times(1)).assignVnf(genericVnf, serviceInstance,customer, cloudRegion, requestContext, false);
                SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
                assertEquals(SDNCTopology.VNF,sdncRequest.getTopology());
@@ -119,46 +116,39 @@ public class SDNCAssignTasksTest extends BaseTaskTest{
        @Test
        public void assignVnfExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-
                doThrow(RuntimeException.class).when(sdncVnfResources).assignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext, false);
-
                sdncAssignTasks.assignVnf(execution);
        }
 
        @Test
        public void assignVfModuleTest() throws Exception {
-               doReturn("response").when(sdncVfModuleResources).assignVfModule(vfModule, volumeGroup, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-
+               doReturn(new GenericResourceApiVfModuleOperationInformation()).when(sdncVfModuleResources).assignVfModule(vfModule, volumeGroup, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                sdncAssignTasks.assignVfModule(execution);
-
                verify(sdncVfModuleResources, times(1)).assignVfModule(vfModule, volumeGroup, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               assertTrue(execution.getVariable("SDNCAssignResponse_" + vfModule.getVfModuleId()).equals("response"));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VFMODULE,sdncRequest.getTopology());
        }
 
        @Test
        public void assignVfModuleExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-
                doThrow(RuntimeException.class).when(sdncVfModuleResources).assignVfModule(vfModule, volumeGroup, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-
                sdncAssignTasks.assignVfModule(execution);
        }
 
        @Test
        public void assignNetworkTest() throws Exception {
-               doReturn("response").when(sdncNetworkResources).assignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(sdncNetworkResources).assignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
                sdncAssignTasks.assignNetwork(execution);
-
                verify(sdncNetworkResources, times(1)).assignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.NETWORK,sdncRequest.getTopology());
        }
 
        @Test
        public void assignNetworkExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-
                doThrow(RuntimeException.class).when(sdncNetworkResources).assignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-
                sdncAssignTasks.assignNetwork(execution);
        }
 }
index 99c680d..f01596c 100644 (file)
@@ -20,7 +20,6 @@
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -34,6 +33,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
@@ -44,7 +45,8 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BBObjectNotFoundException;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 
 public class SDNCChangeAssignTasksTest extends BaseTaskTest{
        @InjectMocks
@@ -74,15 +76,11 @@ public class SDNCChangeAssignTasksTest extends BaseTaskTest{
        
        @Test
        public void changeModelVnfTest() throws Exception {
-               String response = "sdncChangeModelServiceInstance";
-               
-               doReturn(response).when(sdncServiceInstanceResources).changeModelServiceInstance(serviceInstance, customer, requestContext);
-               
-               sdncChangeAssignTasks.changeModelServiceInstance(execution);
-               
-               verify(sdncServiceInstanceResources, times(1)).changeModelServiceInstance(serviceInstance, customer, requestContext);
-               
-               assertEquals(response, execution.getVariable("SDNCChangeAssignTasks.changeModelServiceInstance.response"));
+               doReturn(new GenericResourceApiVnfOperationInformation()).when(sdncVnfResources).changeModelVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
+               sdncChangeAssignTasks.changeModelVnf(execution);
+               verify(sdncVnfResources, times(1)).changeModelVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VNF,sdncRequest.getTopology());
        }
        
        @Test
@@ -94,13 +92,11 @@ public class SDNCChangeAssignTasksTest extends BaseTaskTest{
        
        @Test
        public void changeAssignModelVfModuleTest() throws Exception {
-               String response = "response";
-               doReturn(response).when(sdncVfModuleResources).changeAssignVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               
+               doReturn(new GenericResourceApiVfModuleOperationInformation()).when(sdncVfModuleResources).changeAssignVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                sdncChangeAssignTasks.changeAssignModelVfModule(execution);
-               
                verify(sdncVfModuleResources, times(1)).changeAssignVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               assertTrue(execution.getVariable("SDNCChangeAssignVfModuleResponse").equals(response));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VFMODULE,sdncRequest.getTopology());
        }
        
        @Test
index 66b8ecf..3d25add 100644 (file)
@@ -21,9 +21,6 @@
 package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -37,6 +34,10 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
@@ -48,7 +49,8 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BBObjectNotFoundException;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 
 public class SDNCDeactivateTaskTest extends BaseTaskTest {
        @InjectMocks
@@ -82,29 +84,27 @@ public class SDNCDeactivateTaskTest extends BaseTaskTest {
        
        @Test
        public void deactivateVfModuleTest() throws Exception {
-               doReturn("success").when(sdncVfModuleResources).deactivateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-
+               doReturn(new GenericResourceApiVfModuleOperationInformation()).when(sdncVfModuleResources).deactivateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                sdncDeactivateTasks.deactivateVfModule(execution);
-
                verify(sdncVfModuleResources, times(1)).deactivateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VFMODULE,sdncRequest.getTopology());
        }
        
        @Test
        public void deactivateVfModuleExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-               
                doThrow(RuntimeException.class).when(sdncVfModuleResources).deactivateVfModule(vfModule, genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-
                sdncDeactivateTasks.deactivateVfModule(execution);
        }
        
        @Test
        public void deactivateVnfTest() throws Exception {
-               doReturn("success").when(sdncVnfResources).deactivateVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-
+               doReturn(new GenericResourceApiVnfOperationInformation()).when(sdncVnfResources).deactivateVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                sdncDeactivateTasks.deactivateVnf(execution);
-
                verify(sdncVnfResources, times(1)).deactivateVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VNF,sdncRequest.getTopology());
        }
        
        @Test
@@ -116,13 +116,11 @@ public class SDNCDeactivateTaskTest extends BaseTaskTest {
        
        @Test
        public void deactivateServiceInstanceTest() throws Exception {
-               doReturn("response").when(sdncServiceInstanceResources).deactivateServiceInstance(serviceInstance, customer, requestContext);
-
+               doReturn(new GenericResourceApiServiceOperationInformation()).when(sdncServiceInstanceResources).deactivateServiceInstance(serviceInstance, customer, requestContext);
                sdncDeactivateTasks.deactivateServiceInstance(execution);
-
                verify(sdncServiceInstanceResources, times(1)).deactivateServiceInstance(serviceInstance, customer, requestContext);
-               assertEquals("response", execution.getVariable("deactivateServiceInstanceSDNCResponse"));
-               assertTrue(execution.getVariable("sdncServiceInstanceRollback"));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.SERVICE,sdncRequest.getTopology());
        }
        
        @Test
@@ -134,34 +132,18 @@ public class SDNCDeactivateTaskTest extends BaseTaskTest {
        
        @Test
        public void test_deactivateNetwork() throws Exception {
-               String expectedResponse = "return";
-               
-               doReturn(expectedResponse).when(sdncNetworkResources).deactivateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-               
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(sdncNetworkResources).deactivateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
                sdncDeactivateTasks.deactivateNetwork(execution);
-               
                verify(sdncNetworkResources, times(1)).deactivateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-               
-               assertEquals(expectedResponse, execution.getVariable("SDNCDeactivateTasks.deactivateNetwork.response"));
-               
-               assertTrue(execution.getVariable("SDNCDeactivateTasks.deactivateNetwork.rollback"));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.NETWORK,sdncRequest.getTopology());
        }
        
        @Test
        public void test_deactivateNetwork_exception() throws Exception {
                expectedException.expect(BpmnError.class);
-               
-               try {
-                       doThrow(RuntimeException.class).when(extractPojosForBB).extractByKey(any(),ArgumentMatchers.eq(ResourceKey.NETWORK_ID), any());
-                       
-                       sdncDeactivateTasks.deactivateNetwork(execution);
-               } finally {
-                       verify(sdncNetworkResources, times(0)).deactivateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-                       
-                       assertNull(execution.getVariable("SDNCDeactivateTasks.deactivateNetwork.response"));
-                       
-                       assertFalse(execution.getVariable("SDNCDeactivateTasks.deactivateNetwork.rollback"));
-               }
+               doThrow(RuntimeException.class).when(extractPojosForBB).extractByKey(any(),ArgumentMatchers.eq(ResourceKey.NETWORK_ID), any());
+               sdncDeactivateTasks.deactivateNetwork(execution);
+               verify(sdncNetworkResources, times(0)).deactivateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);      
        }
-
 }
index a6efbd5..f1779cf 100644 (file)
@@ -129,15 +129,6 @@ public class SDNCRequestTasksTest extends SDNCRequestTasks{
                sndcRequestTasks.handleTimeOutException(delegateExecution);             
        }
        
-       
-       @Test
-       public void HandleSyncError_Test() throws MapperException, BadResponseException{                
-               delegateExecution.setVariable("SDNCSyncError", "Error in SDNC Request");        
-               doReturn("processKey").when(exceptionBuilder).getProcessKey(delegateExecution);
-               expectedException.expect(BpmnError.class);
-               sndcRequestTasks.handleSyncError(delegateExecution);            
-       }
-       
        @Test
        public void processCallBack_Final_Test() throws MapperException, BadResponseException, IOException{
                final String sdncResponse = new String(Files.readAllBytes(Paths.get("src/test/resources/__files/SDNC_ASYNC_Request.json")));    
index da8ea8f..1301787 100644 (file)
@@ -23,7 +23,6 @@ package org.onap.so.bpmn.infrastructure.sdnc.tasks;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -37,6 +36,10 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiVnfOperationInformation;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
@@ -48,8 +51,8 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BBObjectNotFoundException;
-import org.onap.so.db.catalog.beans.OrchestrationStatus;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.onap.so.client.sdnc.beans.SDNCRequest;
+import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 
 public class SDNCUnassignTasksTest extends BaseTaskTest{
        @InjectMocks
@@ -81,101 +84,50 @@ public class SDNCUnassignTasksTest extends BaseTaskTest{
        
        @Test
        public void unassignServiceInstanceTest() throws Exception {
-               doReturn("test").when(sdncServiceInstanceResources).unassignServiceInstance(serviceInstance, customer, requestContext);
-               
+               doReturn(new GenericResourceApiServiceOperationInformation()).when(sdncServiceInstanceResources).unassignServiceInstance(serviceInstance, customer, requestContext);
                sdncUnassignTasks.unassignServiceInstance(execution);
-               
                verify(sdncServiceInstanceResources, times(1)).unassignServiceInstance(serviceInstance, customer, requestContext);
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.SERVICE,sdncRequest.getTopology());
        }
 
-       @Test
-       public void unassignServiceInstanceTest_inventoried() throws Exception {
-               doReturn("test").when(sdncServiceInstanceResources).unassignServiceInstance(serviceInstance, customer, requestContext);
-               
-               serviceInstance.setOrchestrationStatus(OrchestrationStatus.INVENTORIED);
-               
-               sdncUnassignTasks.unassignServiceInstance(execution);
-               
-               verify(sdncServiceInstanceResources, times(0)).unassignServiceInstance(serviceInstance, customer, requestContext);
-       }
+
 
        @Test
        public void unassignServiceInstanceExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-               
                doThrow(RuntimeException.class).when(sdncServiceInstanceResources).unassignServiceInstance(serviceInstance, customer, requestContext);
-               
                sdncUnassignTasks.unassignServiceInstance(execution);
        }       
                
        @Test
        public void unassignVfModuleTest() throws Exception {
-               doReturn("response").when(sdncVfModuleResources).unassignVfModule(vfModule, genericVnf, serviceInstance);
-
+               doReturn(new GenericResourceApiVfModuleOperationInformation()).when(sdncVfModuleResources).unassignVfModule(vfModule, genericVnf, serviceInstance);
                sdncUnassignTasks.unassignVfModule(execution);
-
                verify(sdncVfModuleResources, times(1)).unassignVfModule(vfModule, genericVnf, serviceInstance);
-               assertEquals("response", execution.getVariable("SDNCResponse"));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VFMODULE,sdncRequest.getTopology());
        }
        
-       @Test
-       public void unassignVfModuleTest_inventoried() throws Exception {
-               vfModule.setOrchestrationStatus(OrchestrationStatus.INVENTORIED);
-               
-               sdncUnassignTasks.unassignVfModule(execution);
 
-               verify(sdncVfModuleResources, times(0)).unassignVfModule(vfModule, genericVnf, serviceInstance);
-               assertNull(execution.getVariable("SDNCResponse"));
-       }
        
-       @Test
-       public void unassignVfModuleTest_pendingCreate() throws Exception {
-               vfModule.setOrchestrationStatus(OrchestrationStatus.PENDING_CREATE);
-               
-               sdncUnassignTasks.unassignVfModule(execution);
 
-               verify(sdncVfModuleResources, times(0)).unassignVfModule(vfModule, genericVnf, serviceInstance);
-               assertNull(execution.getVariable("SDNCResponse"));
-       }
-       
        @Test
        public void unassignVfModuleExceptionTest() throws Exception {
                expectedException.expect(BpmnError.class);
-               
                doThrow(RuntimeException.class).when(sdncVfModuleResources).unassignVfModule(vfModule, genericVnf, serviceInstance);
-
                sdncUnassignTasks.unassignVfModule(execution);
        }
        
        @Test
        public void unassignVnfTest() throws Exception {
-               doReturn("response").when(sdncVnfResources).unassignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-
+               doReturn(new GenericResourceApiVnfOperationInformation()).when(sdncVnfResources).unassignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                sdncUnassignTasks.unassignVnf(execution);
-
                verify(sdncVnfResources, times(1)).unassignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               assertTrue(execution.getVariable("sdncUnassignVnfResponse").equals("response"));
-       }
-       
-       @Test
-       public void unassignVnfTest_inventoried() throws Exception {
-               genericVnf.setOrchestrationStatus(OrchestrationStatus.INVENTORIED);
-               
-               sdncUnassignTasks.unassignVnf(execution);
-
-               verify(sdncVnfResources, times(0)).unassignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               assertNull(execution.getVariable("sdncUnassignVnfResponse"));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.VNF,sdncRequest.getTopology());       
        }
        
-       @Test
-       public void unassignVnfTest_created() throws Exception {
-               genericVnf.setOrchestrationStatus(OrchestrationStatus.CREATED);
-               
-               sdncUnassignTasks.unassignVnf(execution);
-
-               verify(sdncVnfResources, times(0)).unassignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               assertNull(execution.getVariable("sdncUnassignVnfResponse"));
-       }
        
        @Test
        public void unassignVnfExceptionTest() throws Exception {
@@ -187,28 +139,14 @@ public class SDNCUnassignTasksTest extends BaseTaskTest{
        @Test
        public void unassignNetworkTest() throws Exception {
                String cloudRegionSdnc = "AAIAIC25";
-               
                cloudRegion.setCloudRegionVersion("2.5");
-               
                execution.setVariable("cloudRegionSdnc", cloudRegionSdnc);
-               
-               doReturn("response").when(sdncNetworkResources).unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-               
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(sdncNetworkResources).unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
                assertNotEquals(cloudRegionSdnc, cloudRegion.getLcpCloudRegionId());
                sdncUnassignTasks.unassignNetwork(execution);
-
                verify(sdncNetworkResources, times(1)).unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-               assertEquals("response", execution.getVariable("SDNCUnAssignNetworkResponse"));
                assertEquals(cloudRegionSdnc, cloudRegion.getLcpCloudRegionId());
-       }
-       
-       @Test
-       public void unassignNetworkTest_inventoried() throws Exception {
-               network.setOrchestrationStatus(OrchestrationStatus.INVENTORIED);
-               
-               sdncUnassignTasks.unassignNetwork(execution);
-
-               verify(sdncNetworkResources, times(0)).unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-               assertNull(execution.getVariable("SDNCUnAssignNetworkResponse"));
+               SDNCRequest sdncRequest = execution.getVariable("SDNCRequest");
+               assertEquals(SDNCTopology.NETWORK,sdncRequest.getTopology());   
        }
 }
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBFailureTest.java
new file mode 100644 (file)
index 0000000..d9a7eeb
--- /dev/null
@@ -0,0 +1,126 @@
+package org.onap.so.bpmn.infrastructure.workflow.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
+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.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+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.db.request.beans.InfraActiveRequests;
+
+public class WorkflowActionBBFailureTest  extends BaseTaskTest {
+
+       @Mock
+       protected WorkflowAction workflowAction;
+       
+       @InjectMocks
+       @Spy
+       protected WorkflowActionBBFailure workflowActionBBFailure;
+       
+       @Mock
+       InfraActiveRequests reqMock;
+       
+       private DelegateExecution execution;
+       
+       @Rule
+       public ExpectedException thrown = ExpectedException.none();
+       
+       @Before
+       public void before() throws Exception {
+               execution = new DelegateExecutionFake();
+               org.onap.aai.domain.yang.ServiceInstance servInstance = new org.onap.aai.domain.yang.ServiceInstance();
+               servInstance.setServiceInstanceId("TEST");
+               when(bbSetupUtils.getAAIServiceInstanceByName(anyString(), isA(Customer.class))).thenReturn(servInstance);
+               workflowAction.setBbInputSetupUtils(bbSetupUtils);
+               workflowAction.setBbInputSetup(bbInputSetup);
+       }
+       
+       @Test
+       public void updateRequestStatusToFailed_Null_Rollback(){
+               String reqId = "reqId123";
+               execution.setVariable("mso-request-id", reqId);
+               execution.setVariable("retryCount", 3);
+               execution.setVariable("handlingCode","Success");
+               execution.setVariable("gCurrentSequence",1);
+               WorkflowException we = new WorkflowException("WorkflowAction",1231,"Error Case");
+               execution.setVariable("WorkflowException",we);
+               
+               doReturn(reqMock).when(requestsDbClient).getInfraActiveRequestbyRequestId(reqId);
+               workflowActionBBFailure.updateRequestStatusToFailed(execution);
+               Mockito.verify( reqMock, Mockito.times(1)).setStatusMessage("Error Case");
+               Mockito.verify( reqMock, Mockito.times(1)).setRequestStatus("FAILED");
+               Mockito.verify( reqMock, Mockito.times(1)).setProgress(Long.valueOf(100));
+               Mockito.verify( reqMock, Mockito.times(1)).setLastModifiedBy("CamundaBPMN");
+       }
+       
+       @Test
+       public void updateRequestStatusToFailed(){
+               execution.setVariable("mso-request-id", "123");
+               execution.setVariable("isRollbackComplete", false);
+               execution.setVariable("isRollback", false);
+               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);
+       }
+       
+       @Test
+       public void updateRequestStatusToFailedRollback(){
+               execution.setVariable("mso-request-id", "123");
+               execution.setVariable("isRollbackComplete", false);
+               execution.setVariable("isRollback", true);
+               InfraActiveRequests req = new InfraActiveRequests();
+               WorkflowException wfe = new WorkflowException("processKey123", 1, "error in rollback");
+               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("RollbackErrorMessage");
+               assertEquals("error in rollback", errorMsg);
+       }
+       
+       @Test
+       public void updateRequestStatusToFailedRollbackCompleted(){
+               execution.setVariable("mso-request-id", "123");
+               execution.setVariable("isRollbackComplete", true);
+               execution.setVariable("isRollback", true);
+               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);
+       }
+       
+       @Test
+       public void updateRequestStatusToFailedNoWorkflowException(){
+               execution.setVariable("mso-request-id", "123");
+               execution.setVariable("isRollbackComplete", false);
+               execution.setVariable("isRollback", false);
+               execution.setVariable("WorkflowExceptionErrorMessage", "error in test case");
+               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("ErrorMessage");
+               assertEquals("error in test case", errorMsg);
+       }
+}
index fc269cd..5c14859 100644 (file)
@@ -39,8 +39,10 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.Spy;
 import org.onap.so.bpmn.BaseTaskTest;
+import org.onap.so.bpmn.core.WorkflowException;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.db.request.beans.InfraActiveRequests;
@@ -50,10 +52,16 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
        @Mock
        protected WorkflowAction workflowAction;
        
+       @Mock
+       protected WorkflowActionBBFailure workflowActionBBFailure;
+       
        @InjectMocks
        @Spy
        protected WorkflowActionBBTasks workflowActionBBTasks;
        
+       @Mock
+       InfraActiveRequests reqMock;
+       
        private DelegateExecution execution;
        
        @Rule
@@ -106,16 +114,37 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
        }
        
        @Test
-       public void msoCompleteProcessTest() throws Exception{
-               execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+       public void updateRequestStatusToCompleteTest() throws Exception{
+               String reqId = "reqId123";
+               execution.setVariable("mso-request-id", reqId);
                execution.setVariable("requestAction", "createInstance");
-               execution.setVariable("resourceId", "123");
-               execution.setVariable("source","MSO");
                execution.setVariable("resourceName", "Service");
                execution.setVariable("aLaCarte", true);
-               workflowActionBBTasks.setupCompleteMsoProcess(execution);
-               String response = (String) execution.getVariable("CompleteMsoProcessRequest");
-               assertEquals(response,"<aetgt:MsoCompletionRequest xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\" xmlns:ns=\"http://org.onap/so/request/types/v1\"><request-info xmlns=\"http://org.onap/so/infra/vnf-request/v1\"><request-id>00f704ca-c5e5-4f95-a72c-6889db7b0688</request-id><action>createInstance</action><source>MSO</source></request-info><status-message>ALaCarte-Service-createInstance request was executed correctly.</status-message><serviceInstanceId>123</serviceInstanceId><mso-bpel-name>WorkflowActionBB</mso-bpel-name></aetgt:MsoCompletionRequest>");
+               InfraActiveRequests req = new InfraActiveRequests();
+               doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId(reqId);
+               doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class));
+               workflowActionBBTasks.updateRequestStatusToComplete(execution);
+               assertEquals("ALaCarte-Service-createInstance request was executed correctly.",execution.getVariable("finalStatusMessage"));
+       }
+       
+       @Test
+       public void updateRequestStatusToFailedFlowStatusTest() {
+               String reqId = "reqId123";
+               execution.setVariable("mso-request-id", reqId);
+               execution.setVariable("isRollbackComplete", false);
+               execution.setVariable("isRollback", false);
+               ExecuteBuildingBlock ebb = new ExecuteBuildingBlock();
+               BuildingBlock buildingBlock = new BuildingBlock();
+               buildingBlock.setBpmnFlowName("CreateNetworkBB");
+               ebb.setBuildingBlock(buildingBlock);
+               execution.setVariable("buildingBlock", ebb);
+               WorkflowException wfe = new WorkflowException("failure", 1, "failure");
+               execution.setVariable("WorkflowException", wfe);
+               InfraActiveRequests req = new InfraActiveRequests();
+               doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId(reqId);
+               doNothing().when(requestsDbClient).updateInfraActiveRequests(isA(InfraActiveRequests.class));
+               workflowActionBBTasks.updateRequestStatusToFailed(execution);
+               assertEquals("CreateNetworkBB has failed.",execution.getVariable("flowStatus"));
        }
        
        @Test
@@ -141,8 +170,8 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
                
                execution.setVariable("flowsToExecute", flowsToExecute);
                execution.setVariable("gCurrentSequence", 3);
-               doNothing().when(workflowActionBBTasks).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
-
+               doNothing().when(workflowActionBBFailure).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
+               
                workflowActionBBTasks.rollbackExecutionPath(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEquals(ebbs.get(0).getBuildingBlock().getBpmnFlowName(),"DeactivateVfModuleBB");
@@ -174,8 +203,8 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
                
                execution.setVariable("flowsToExecute", flowsToExecute);
                execution.setVariable("gCurrentSequence", 2);
-               doNothing().when(workflowActionBBTasks).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
-
+               doNothing().when(workflowActionBBFailure).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
+               
                workflowActionBBTasks.rollbackExecutionPath(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEquals(ebbs.get(0).getBuildingBlock().getBpmnFlowName(),"DeleteVfModuleBB");
@@ -212,8 +241,8 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
                
                execution.setVariable("flowsToExecute", flowsToExecute);
                execution.setVariable("gCurrentSequence", 3);
-               doNothing().when(workflowActionBBTasks).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
-
+               doNothing().when(workflowActionBBFailure).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
+               
                workflowActionBBTasks.rollbackExecutionPath(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEquals(ebbs.get(0).getBuildingBlock().getBpmnFlowName(),"UnassignNetworkBB");
@@ -250,7 +279,7 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
                
                execution.setVariable("flowsToExecute", flowsToExecute);
                execution.setVariable("gCurrentSequence", 3);
-               doNothing().when(workflowActionBBTasks).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
+               doNothing().when(workflowActionBBFailure).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
 
                workflowActionBBTasks.rollbackExecutionPath(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
@@ -262,7 +291,7 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
        public void checkRetryStatusTest(){
                String reqId = "reqId123";
                execution.setVariable("mso-request-id", reqId);
-               doNothing().when(workflowActionBBTasks).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
+               doNothing().when(workflowActionBBFailure).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
                execution.setVariable("handlingCode","Retry");
                execution.setVariable("retryCount", 1);
                execution.setVariable("gCurrentSequence",1);
index 76a8070..5699c94 100644 (file)
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 import static org.mockito.ArgumentMatchers.anyObject;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
@@ -49,17 +50,22 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.L3Network;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipList;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.VfModule;
 import org.onap.aai.domain.yang.VfModules;
 import org.onap.aai.domain.yang.VolumeGroup;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
+import org.onap.so.client.aai.entities.Relationships;
 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResource;
 import org.onap.so.db.catalog.beans.CollectionResourceCustomization;
@@ -77,14 +83,19 @@ import org.onap.so.serviceinstancebeans.RequestDetails;
 import org.onap.so.serviceinstancebeans.RequestParameters;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 import org.onap.so.serviceinstancebeans.SubscriberInfo;
+import org.springframework.core.env.Environment;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class WorkflowActionTest extends BaseTaskTest {
+       
+       
+       @Mock
+       protected Environment environment;
        @InjectMocks
        protected WorkflowAction workflowAction;
-       
        private DelegateExecution execution;
+
        
        @Rule
        public ExpectedException thrown = ExpectedException.none();
@@ -112,11 +123,12 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("aLaCarte", true);
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/networks/123");
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("AssignNetwork1802BB","CreateNetworkBB","ActivateNetworkBB");
                northBoundRequest.setOrchestrationFlowList(orchFlows);
 
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,true)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,true, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"AssignNetwork1802BB","CreateNetworkBB","ActivateNetworkBB");
@@ -133,11 +145,12 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("aLaCarte", true);
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/networks/123");
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("DeactivateNetworkBB","DeleteNetworkBB","UnassignNetwork1802BB");
                northBoundRequest.setOrchestrationFlowList(orchFlows);
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,true)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,true,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"DeactivateNetworkBB","DeleteNetworkBB","UnassignNetwork1802BB");
@@ -155,11 +168,12 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB","ActivateServiceInstanceBB");
                northBoundRequest.setOrchestrationFlowList(orchFlows);  
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,true)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,true,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"AssignServiceInstanceBB","ActivateServiceInstanceBB");
@@ -180,6 +194,54 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
+               NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+               List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB","AssignNetworkBB","AssignVnfBB","AssignVolumeGroupBB","AssignVfModuleBB");
+               northBoundRequest.setOrchestrationFlowList(orchFlows);
+               
+               VfModuleCustomization vfModuleCustomization = new VfModuleCustomization();
+               vfModuleCustomization.setModelCustomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f");
+               HeatEnvironment volumeHeatEnv = new HeatEnvironment();
+               vfModuleCustomization.setVolumeHeatEnv(volumeHeatEnv);
+               org.onap.so.db.catalog.beans.VfModule vfModule = new org.onap.so.db.catalog.beans.VfModule();
+               HeatTemplate volumeHeatTemplate = new HeatTemplate();
+               vfModule.setVolumeHeatTemplate(volumeHeatTemplate);
+               vfModuleCustomization.setVfModule(vfModule);
+               
+               VfModuleCustomization vfModuleCustomization2 = new VfModuleCustomization();
+               vfModuleCustomization2.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
+               HeatEnvironment heatEnvironment = new HeatEnvironment();
+               vfModuleCustomization2.setHeatEnvironment(heatEnvironment);
+               org.onap.so.db.catalog.beans.VfModule vfModule2 = new org.onap.so.db.catalog.beans.VfModule();
+               HeatTemplate moduleHeatTemplate = new HeatTemplate();
+               vfModule2.setModuleHeatTemplate(moduleHeatTemplate);
+               vfModuleCustomization2.setVfModule(vfModule2);
+               
+               VfModuleCustomization vfModuleCustomization3 = vfModuleCustomization2;
+               vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
+               
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
+               when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f")).thenReturn(vfModuleCustomization);
+               when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8")).thenReturn(vfModuleCustomization2);
+               when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("da4d4327-fb7d-4311-ac7a-be7ba60cf969")).thenReturn(vfModuleCustomization3);
+               workflowAction.selectExecutionList(execution);
+               List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+               assertEqualsBulkFlowName(ebbs,"AssignServiceInstanceBB","AssignVnfBB","AssignVolumeGroupBB","AssignVfModuleBB","AssignVfModuleBB","AssignVfModuleBB");
+       }
+       
+       @Test
+       public void selectExecutionListServiceMacroAssignNoCloudTest() throws Exception{
+               String gAction = "assignInstance";
+               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/ServiceMacroAssignNoCloud.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","AssignNetworkBB","AssignVnfBB","AssignVolumeGroupBB","AssignVfModuleBB");
                northBoundRequest.setOrchestrationFlowList(orchFlows);
@@ -205,7 +267,8 @@ public class WorkflowActionTest extends BaseTaskTest {
                VfModuleCustomization vfModuleCustomization3 = vfModuleCustomization2;
                vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(environment.getProperty("org.onap.so.cloud-owner")).thenReturn("att-aic");
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"att-aic")).thenReturn(northBoundRequest);
                when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f")).thenReturn(vfModuleCustomization);
                when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8")).thenReturn(vfModuleCustomization2);
                when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("da4d4327-fb7d-4311-ac7a-be7ba60cf969")).thenReturn(vfModuleCustomization3);
@@ -225,6 +288,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("aLaCarte", false);
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/si0");
+               
 
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("CreateNetworkBB","ActivateNetworkBB","CreateVolumeGroupBB","ActivateVolumeGroupBB","CreateVfModuleBB","ActivateVfModuleBB"
@@ -252,7 +316,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                
                doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("si0");
                doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"CreateVolumeGroupBB","ActivateVolumeGroupBB","CreateVfModuleBB","CreateVfModuleBB","ActivateVfModuleBB","ActivateVfModuleBB","ActivateVnfBB","ActivateServiceInstanceBB");
@@ -278,12 +342,13 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("aLaCarte", false);
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
-
+               
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("DeactivateServiceInstanceBB");
                northBoundRequest.setOrchestrationFlowList(orchFlows);  
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEquals(ebbs.get(0).getBuildingBlock().getBpmnFlowName(),"DeactivateServiceInstanceBB");
@@ -301,6 +366,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                northBoundRequest.setIsToplevelflow(true);
                List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB","CreateNetworkCollectionBB","AssignNetworkBB","AssignVnfBB","AssignVolumeGroupBB","AssignVfModuleBB"
@@ -310,7 +376,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                
                Service service = new Service();
                doReturn(service).when(catalogDbClient).getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a");
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"AssignServiceInstanceBB","ActivateServiceInstanceBB");
@@ -328,6 +394,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                northBoundRequest.setIsToplevelflow(true);
                List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB","CreateNetworkCollectionBB","AssignNetworkBB","AssignVnfBB","AssignVolumeGroupBB","AssignVfModuleBB"
@@ -340,7 +407,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                networkCustomization.setModelCustomizationUUID("1234");
                service.getNetworkCustomizations().add(networkCustomization);
                doReturn(service).when(catalogDbClient).getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a");
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"AssignServiceInstanceBB","AssignNetworkBB","CreateNetworkBB","ActivateNetworkBB","ActivateServiceInstanceBB");
@@ -358,6 +425,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                northBoundRequest.setIsToplevelflow(true);
                List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB","CreateNetworkCollectionBB","AssignNetworkBB","AssignVnfBB","AssignVolumeGroupBB","AssignVfModuleBB"
@@ -396,7 +464,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                service.getCollectionResourceCustomizations().add(collectionResourceCustomization);
                doReturn(service).when(catalogDbClient).getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a");
                doReturn(collectionResourceCustomization).when(catalogDbClient).getNetworkCollectionResourceCustomizationByID("123");
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"AssignServiceInstanceBB","CreateNetworkCollectionBB","AssignNetworkBB","CreateNetworkBB","ActivateNetworkBB","AssignNetworkBB","CreateNetworkBB","ActivateNetworkBB"
@@ -433,6 +501,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB","CreateNetworkCollectionBB","AssignNetworkBB","AssignVnfBB","AssignVolumeGroupBB","AssignVfModuleBB"
                                ,"CreateNetworkBB","ActivateNetworkBB","CreateVolumeGroupBB","ActivateVolumeGroupBB","CreateVfModuleBB","ActivateVfModuleBB","AssignFabricConfigurationBB","ActivateFabricConfigurationBB"
@@ -463,7 +532,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                VfModuleCustomization vfModuleCustomization3 = vfModuleCustomization2;
                vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f")).thenReturn(vfModuleCustomization);
                when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8")).thenReturn(vfModuleCustomization2);
                when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("da4d4327-fb7d-4311-ac7a-be7ba60cf969")).thenReturn(vfModuleCustomization3);
@@ -503,7 +572,8 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("aLaCarte", false);
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
-
+               
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB","DeleteVfModuleBB","DeactivateVolumeGroupBB","DeleteVolumeGroupBB","DeactivateVnfBB","DeactivateNetworkBB"
                                ,"DeleteNetworkBB","DeleteNetworkCollectionBB","DeactivateServiceInstanceBB","UnassignVfModuleBB","UnassignVolumeGroupBB","UnassignVnfBB","UnassignNetworkBB","UnassignServiceInstanceBB");
@@ -530,7 +600,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                
                doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("123");
                doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"DeactivateVfModuleBB","DeactivateVfModuleBB","DeleteVfModuleBB","DeleteVfModuleBB","DeactivateVolumeGroupBB","DeleteVolumeGroupBB","DeactivateVnfBB"
@@ -549,6 +619,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("UnassignVfModuleBB","UnassignVolumeGroupBB","UnassignVnfBB","UnassignNetworkBB","UnassignServiceInstanceBB");
                northBoundRequest.setOrchestrationFlowList(orchFlows);          
@@ -574,7 +645,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                
                doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("123");
                doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"UnassignVfModuleBB","UnassignVfModuleBB","UnassignVolumeGroupBB","UnassignVnfBB","UnassignServiceInstanceBB");
@@ -592,6 +663,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123");
                
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB","DeleteVfModuleBB","DeactivateVolumeGroupBB","DeleteVolumeGroupBB","DeactivateVnfBB","DeactivateNetworkBB"
                                ,"DeleteNetworkBB","DeleteNetworkCollectionBB","DeactivateServiceInstanceBB","UnassignVfModuleBB","UnassignVolumeGroupBB","UnassignVnfBB","UnassignNetworkBB","UnassignServiceInstanceBB");
@@ -613,13 +685,111 @@ public class WorkflowActionTest extends BaseTaskTest {
                
                doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("123");
                doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                assertEqualsBulkFlowName(ebbs,"DeactivateNetworkBB","DeleteNetworkBB","UnassignNetworkBB","DeactivateNetworkBB","DeleteNetworkBB","UnassignNetworkBB","DeleteNetworkCollectionBB"
                                ,"DeactivateServiceInstanceBB","UnassignServiceInstanceBB");
        }
        
+    @Test
+    public void selectExecutionListVnfMacroRecreateTest() throws Exception{
+        String gAction = "recreateInstance";
+        String resource = "Vnf";
+        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/VnfMacroReplace.json")));
+        execution.setVariable("bpmnRequest", bpmnRequest);          
+        execution.setVariable("aLaCarte", false);
+        execution.setVariable("apiVersion", "7");
+        execution.setVariable("requestUri", "v7/serviceInstances/123/vnfs/1234/recreate");
+        execution.setVariable("serviceInstanceId", "123");
+        execution.setVariable("vnfId", "1234");
+        
+        NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+        List<OrchestrationFlow> orchFlows = createFlowList("AAICheckVnfInMaintBB","AAISetVnfInMaintBB","DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB", "DeactivateVfModuleBB","DeleteVfModuleBB","DeactivateVnfBB","CreateVfModuleBB"
+                ,"ActivateVfModuleBB","AssignFabricConfigurationBB","ActivateFabricConfigurationBB","ActivateVnfBB","SDNOVnfHealthCheckBB","AAIUnsetVnfInMaintBB");
+        northBoundRequest.setOrchestrationFlowList(orchFlows);  
+        
+        ServiceInstance serviceInstanceAAI = new ServiceInstance();
+        serviceInstanceAAI.setServiceInstanceId("123");
+        org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO = new org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance();
+        org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf = new org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf();
+        vnf.setVnfId("1234");
+        
+        org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule = new org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule();
+        vfModule.setVfModuleId("vfModule1");
+        vnf.getVfModules().add(vfModule);
+        org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule2 = new org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule();
+        vfModule2.setVfModuleId("vfModule2");
+        vnf.getVfModules().add(vfModule2);
+        
+        serviceInstanceMSO.getVnfs().add(vnf);
+        
+        doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("123");
+        doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
+        when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"cloud-owner")).thenReturn(northBoundRequest);
+        workflowAction.selectExecutionList(execution);
+        List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+        assertEqualsBulkFlowName(ebbs,"AAICheckVnfInMaintBB","AAISetVnfInMaintBB","DeactivateVfModuleBB","DeactivateVfModuleBB","DeleteVfModuleBB","DeleteVfModuleBB","DeactivateVnfBB"
+                ,"CreateVfModuleBB","CreateVfModuleBB","ActivateVfModuleBB","ActivateVfModuleBB","ActivateVnfBB","SDNOVnfHealthCheckBB","AAIUnsetVnfInMaintBB");
+    }
+    
+    @Test
+    public void selectExecutionListVnfMacroReplaceTest() throws Exception{
+        String gAction = "replaceInstance";
+        String resource = "Vnf";
+        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/VnfMacroReplace.json")));
+        execution.setVariable("bpmnRequest", bpmnRequest);          
+        execution.setVariable("aLaCarte", false);
+        execution.setVariable("apiVersion", "7");
+        execution.setVariable("requestUri", "v7/serviceInstances/123/vnfs/1234/replace");
+        execution.setVariable("serviceInstanceId", "123");
+        execution.setVariable("vnfId", "1234");
+        
+        NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+        List<OrchestrationFlow> orchFlows = createFlowList("AAICheckVnfInMaintBB","AAISetVnfInMaintBB","DeactivateFabricConfigurationBB","UnassignFabricConfigurationBB","DeactivateVfModuleBB","DeleteVfModuleBB"
+                ,"DeactivateVnfBB","ChangeModelVfModuleBB","CreateVfModuleBB","ActivateVfModuleBB","AssignFabricConfigurationBB","ActivateFabricConfigurationBB","ChangeModelVnfBB","ActivateVnfBB","ChangeModelServiceInstanceBB","SDNOVnfHealthCheckBB","AAIUnsetVnfInMaintBB");
+        northBoundRequest.setOrchestrationFlowList(orchFlows);  
+
+        ServiceInstance serviceInstanceAAI = new ServiceInstance();
+        serviceInstanceAAI.setServiceInstanceId("123");
+        org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO = new org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance();
+        org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf = new org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf();
+        vnf.setVnfId("1234");
+        org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule = new org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule();
+        vfModule.setVfModuleId("vfModule1");
+        vnf.getVfModules().add(vfModule);
+        org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule2 = new org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule();
+        vfModule2.setVfModuleId("vfModule2");
+        vnf.getVfModules().add(vfModule2);
+        serviceInstanceMSO.getVnfs().add(vnf);
+        VfModule vfModuleAAI = new VfModule();
+        vfModuleAAI.setVfModuleId("vfModule2");
+        RelationshipList relationshipList = new RelationshipList();
+        Relationship relationship = new Relationship();
+        relationshipList.getRelationship().add(relationship);
+        vfModuleAAI.setRelationshipList(relationshipList);
+        Relationships relationships = new Relationships("abc");
+        Configuration config = new Configuration();
+        config.setConfigurationId("configId");
+        Optional<Configuration> configOp = Optional.of(config);
+        Optional<Relationships> relationshipsOp = Optional.of(relationships);
+        
+        doReturn(relationshipsOp).when(workflowActionUtils).extractRelationshipsVnfc(isA(Relationships.class));
+        doReturn(configOp).when(workflowActionUtils).extractRelationshipsConfiguration(isA(Relationships.class));
+        doReturn(vfModuleAAI).when(bbSetupUtils).getAAIVfModule("1234", "vfModule2");
+        doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("123");
+        doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
+        when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"cloud-owner")).thenReturn(northBoundRequest);
+        workflowAction.selectExecutionList(execution);
+        List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+        assertEqualsBulkFlowName(ebbs,"AAICheckVnfInMaintBB","AAISetVnfInMaintBB", "DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB", "DeactivateVfModuleBB","DeactivateVfModuleBB","DeleteVfModuleBB","DeleteVfModuleBB","DeactivateVnfBB"
+                ,"ChangeModelVfModuleBB" ,"ChangeModelVfModuleBB" , "CreateVfModuleBB","CreateVfModuleBB", "ActivateVfModuleBB","ActivateVfModuleBB", "AssignFabricConfigurationBB", "ActivateFabricConfigurationBB", "ChangeModelVnfBB", "ActivateVnfBB","ChangeModelServiceInstanceBB","SDNOVnfHealthCheckBB","AAIUnsetVnfInMaintBB");
+    }
+       
        @Ignore
        @Test
        public void selectExecutionListNetworkCollectionMacroCreate() throws Exception{
@@ -632,7 +802,8 @@ public class WorkflowActionTest extends BaseTaskTest {
                execution.setVariable("aLaCarte", false);
                execution.setVariable("apiVersion", "7");
                execution.setVariable("requestUri", "v6/serviceInstances/123/networkCollections/123");
-
+               
+               
                NorthBoundRequest northBoundRequest = new NorthBoundRequest();
                List<OrchestrationFlow> orchFlows = createFlowList("CreateNetworkCollectionBB","AssignNetworkBB","CreateNetworkBB","ActivateNetworkBB","ActivateNetworkCollectionBB");
                northBoundRequest.setOrchestrationFlowList(orchFlows);
@@ -644,7 +815,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                collectionResourceCustomization.setCollectionResource(collectionResource);
                service.getCollectionResourceCustomizations().add(collectionResourceCustomization);
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                when(catalogDbClient.getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a")).thenReturn(service);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
@@ -675,7 +846,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                collectionResourceCustomization.setCollectionResource(collectionResource);
                service.getCollectionResourceCustomizations().add(collectionResourceCustomization);
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(gAction,resource,false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                when(catalogDbClient.getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a")).thenReturn(service);
                workflowAction.selectExecutionList(execution);
                List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
@@ -797,9 +968,9 @@ public class WorkflowActionTest extends BaseTaskTest {
                northBoundRequest.setOrchestrationFlowList(orchFlows);
                List<OrchestrationFlow> macroFlows = createFlowList("DeactivateVfModuleBB","DeleteVfModuleBB","DeactivateVnfBB","CreateVfModuleBB","ActivateVfModuleBB","ActivateVnfBB");
                
-               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScope("replaceInstance","Vnf",false)).thenReturn(northBoundRequest);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner("replaceInstance","Vnf",false,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
                when(catalogDbClient.getOrchestrationFlowByAction("VNF-Macro-Replace")).thenReturn(macroFlows);
-               List<OrchestrationFlow> flows = workflowAction.queryNorthBoundRequestCatalogDb(execution, "replaceInstance", WorkflowType.VNF, false);
+               List<OrchestrationFlow> flows = workflowAction.queryNorthBoundRequestCatalogDb(execution, "replaceInstance", WorkflowType.VNF, false,"my-custom-cloud-owner");
                assertEquals(flows.get(0).getFlowName(),"AAICheckVnfInMaintBB");
                assertEquals(flows.get(1).getFlowName(),"AAISetVnfInMaintBB");
                assertEquals(flows.get(2).getFlowName(),"DeactivateVfModuleBB");
index 5c0a54f..4008240 100644 (file)
@@ -144,7 +144,7 @@ public class WorkflowActionUnitTest {
                flow.setFlowName("flow x");
                
                List<OrchestrationFlow> flows = Arrays.asList(flow);
-               doReturn(Arrays.asList(flow)).when(workflowAction).queryNorthBoundRequestCatalogDb(any(), any(), any(), anyBoolean());
+               doReturn(Arrays.asList(flow)).when(workflowAction).queryNorthBoundRequestCatalogDb(any(), any(), any(), anyBoolean(), any());
                workflowAction.selectExecutionList(execution);
                
                verify(workflowAction, times(1)).filterOrchFlows(eq(flows), any(), any());
index 8f0d00f..6f353fa 100644 (file)
@@ -144,7 +144,7 @@ public class NetworkAdapterObjectMapperTest extends TestDataSetup{
                List<Subnet> subnetList = new ArrayList<Subnet>();
                subnetList.add(openstackSubnet);
                l3Network.getSubnets().add(openstackSubnet);
-               l3Network.getModelInfoNetwork().setNetworkTechnology("Contrail");
+               l3Network.setNetworkTechnology("Contrail");
 
                CreateNetworkRequest createNetworkRequest  = SPY_networkAdapterObjectMapper.createNetworkRequestMapper(requestContext, cloudRegion, orchestrationContext, serviceInstance, l3Network, userInput, cloudRegionPo, customer);
                
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/namingservice/NamingClientResponseValidatorTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/namingservice/NamingClientResponseValidatorTest.java
new file mode 100644 (file)
index 0000000..70036e7
--- /dev/null
@@ -0,0 +1,84 @@
+package org.onap.so.client.namingservice;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.onap.namingservice.model.NameGenDeleteResponse;
+import org.onap.namingservice.model.NameGenResponse;
+import org.onap.namingservice.model.Respelement;
+import org.onap.so.bpmn.common.data.TestDataSetup;
+import org.onap.so.client.exception.BadResponseException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+public class NamingClientResponseValidatorTest extends TestDataSetup {
+       
+       private NamingClientResponseValidator responseValidator = new NamingClientResponseValidator();  
+       private String instanceGroupName = "generatedInstanceGroupName";
+       
+       @Test
+       public void validateNameGenResponseSuccessTest() throws BadResponseException {
+               NameGenResponse name = new NameGenResponse();
+               Respelement respElement = new Respelement();
+               respElement.setResourceName("instance-group-name");
+               respElement.setResourceValue(instanceGroupName);
+               List<Respelement> respList = new ArrayList<Respelement>();
+               respList.add(respElement);
+               name.setElements(respList);             
+               ResponseEntity<NameGenResponse> resp = new ResponseEntity<>(name, null, HttpStatus.OK);         
+               
+               String actual = responseValidator.validateNameGenResponse(resp);
+               
+               assertEquals(actual, "generatedInstanceGroupName");
+       }
+       
+       @Test
+       public void validateNameGenResponseNoNameGeneratedTest() throws BadResponseException {
+               NameGenResponse name = new NameGenResponse();
+               Respelement respElement = new Respelement();
+               respElement.setResourceName("instance-group");
+               respElement.setResourceValue(instanceGroupName);
+               List<Respelement> respList = new ArrayList<Respelement>();
+               respList.add(respElement);
+               name.setElements(respList);             
+               ResponseEntity<NameGenResponse> resp = new ResponseEntity<>(name, null, HttpStatus.OK);         
+               
+               String actual = responseValidator.validateNameGenResponse(resp);
+               
+               assertEquals(actual, "");
+       }
+       
+       @Test
+       public void validateNameGenResponseBadStatusTest() throws BadResponseException {
+               NameGenResponse name = new NameGenResponse();
+                       
+               ResponseEntity<NameGenResponse> resp = new ResponseEntity<>(name, null, HttpStatus.NOT_FOUND);          
+               
+               expectedException.expect(BadResponseException.class);
+               responseValidator.validateNameGenResponse(resp);                
+       }
+       
+       @Test
+       public void validateNameGenDeleteResponseSuccessTest() throws BadResponseException {
+               NameGenDeleteResponse name = new NameGenDeleteResponse();               
+               ResponseEntity<NameGenDeleteResponse> resp = new ResponseEntity<>(name, null, HttpStatus.OK);           
+               
+               String actual = responseValidator.validateNameGenDeleteResponse(resp);
+               
+               assertEquals(actual, "");
+       }       
+       
+       @Test
+       public void validateNameGenDeleteResponseBadStatusTest() throws BadResponseException {
+               NameGenDeleteResponse name = new NameGenDeleteResponse();
+                       
+               ResponseEntity<NameGenDeleteResponse> resp = new ResponseEntity<>(name, null, HttpStatus.NOT_FOUND);            
+               
+               expectedException.expect(BadResponseException.class);
+               responseValidator.validateNameGenDeleteResponse(resp);          
+       }
+       
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/namingservice/NamingRequestObjectBuilderTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/namingservice/NamingRequestObjectBuilderTest.java
new file mode 100644 (file)
index 0000000..0a2dc1e
--- /dev/null
@@ -0,0 +1,85 @@
+package org.onap.so.client.namingservice;
+
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.onap.namingservice.model.Deleteelement;
+import org.onap.namingservice.model.Element;
+import org.onap.namingservice.model.NameGenDeleteRequest;
+import org.onap.namingservice.model.NameGenRequest;
+import org.onap.so.client.namingservice.NamingRequestObjectBuilder;
+
+public class NamingRequestObjectBuilderTest {
+       
+       private NamingRequestObjectBuilder mapper = new NamingRequestObjectBuilder();
+       private String instanceGroupId = "95cbbe59-1017-4c13-b4e8-d824e54def3e";
+       private String policyInstanceName = "MSO_Policy.Config_MS_VNFInstanceGroup";
+       private String namingType = "InstanceGroup";
+       private String nfNamingCode = "NamingCode";
+       private String instanceGroupName = "InstanceGroupName";
+       
+       @Test
+       public void elementMapperTest(){
+               // Expected element
+               Element expected = new Element();
+               expected.setExternalKey(instanceGroupId);
+               expected.setPolicyInstanceName(policyInstanceName);
+               expected.setNamingType(namingType);
+               expected.setResourceName(instanceGroupName);
+               expected.setNamingIngredientsZeroOrMore(nfNamingCode);
+               
+               // Actual element
+               Element actual = mapper.elementMapper(instanceGroupId, policyInstanceName, namingType, nfNamingCode, instanceGroupName);
+               
+               assertThat(actual, sameBeanAs(expected));
+       }
+       @Test
+       public void deleteElementMapperTest(){
+               // Expected Deleteelement
+               Deleteelement expected = new Deleteelement();
+               expected.setExternalKey(instanceGroupId);
+               
+               // Actual Deleteelement
+               Deleteelement actual = mapper.deleteElementMapper(instanceGroupId);
+               
+               assertThat(actual, sameBeanAs(expected));
+       }
+       @Test
+       public void nameGenRequestMapper(){
+               // Expected NameGenRequest
+               NameGenRequest expected = new NameGenRequest();
+               List<Element> elements = new ArrayList<>();
+               Element element = new Element();
+               element.setExternalKey(instanceGroupId);
+               element.setPolicyInstanceName(policyInstanceName);
+               element.setNamingType(namingType);
+               element.setResourceName(instanceGroupName);
+               element.setNamingIngredientsZeroOrMore(nfNamingCode);
+               elements.add(element);
+               expected.setElements(elements);
+               
+               //Actual NameGenRequest
+               NameGenRequest actual = mapper.nameGenRequestMapper(elements);
+               
+               assertThat(actual, sameBeanAs(expected));
+       }
+       @Test
+       public void nameGenDeleteRequestMapper(){
+               // Expected NameGenDeleteRequest
+               NameGenDeleteRequest expected = new NameGenDeleteRequest();
+               List<Deleteelement> deleteElements = new ArrayList<>();
+               Deleteelement deleteElement = new Deleteelement();
+               deleteElement.setExternalKey(instanceGroupId);
+               deleteElements.add(deleteElement);
+               expected.setElements(deleteElements);
+               
+               // Actual NameGenDeleteRequest
+               NameGenDeleteRequest actual = mapper.nameGenDeleteRequestMapper(deleteElements);
+               
+               assertThat(actual, sameBeanAs(expected));
+       }
+}
\ No newline at end of file
index bd05f94..6b33440 100644 (file)
@@ -283,8 +283,8 @@ public class AAINetworkResourcesTest extends TestDataSetup{
        @Test
        public void connectNetworkToCloudRegionTest() throws Exception {
                aaiNetworkResources.connectNetworkToCloudRegion(network, cloudRegion);
-               verify(MOCK_aaiResourcesClient, times(1)).connect(eq(AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, 
-                               cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId())), eq(AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId())));
+               verify(MOCK_aaiResourcesClient, times(1)).connect(eq(AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId())),eq(AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, 
+                               cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId())));
        }
        
        @Test
index fcd6c30..c28bc05 100644 (file)
@@ -40,12 +40,15 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.bpmn.common.data.TestDataSetup;
 import org.onap.so.bpmn.common.InjectionHelper;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Platform;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 
@@ -55,6 +58,9 @@ public class AAIVnfResourcesTest extends TestDataSetup {
        private GenericVnf genericVnf;
 
        private ServiceInstance serviceInstance;
+       
+       private CloudRegion cloudRegion;
+       
        @Mock
        protected AAIResourcesClient MOCK_aaiResourcesClient;
 
@@ -71,6 +77,7 @@ public class AAIVnfResourcesTest extends TestDataSetup {
        public void before() {
                serviceInstance = buildServiceInstance();
                genericVnf = buildGenericVnf();
+               cloudRegion = buildCloudRegion();
                 doReturn(MOCK_aaiResourcesClient).when(MOCK_injectionHelper).getAaiClient();
        }
 
@@ -159,4 +166,20 @@ public class AAIVnfResourcesTest extends TestDataSetup {
                verify(MOCK_aaiResourcesClient, times(1)).get(eq(org.onap.aai.domain.yang.GenericVnf.class),isA(AAIResourceUri.class));
                assertEquals(inMaintFlag, true);
        }
+       
+       @Test
+       public void connectVnfToTenantTest() throws Exception {
+               aaiVnfResources.connectVnfToTenant(genericVnf, cloudRegion);
+               verify(MOCK_aaiResourcesClient, times(1)).connect(eq(AAIUriFactory.createResourceUri(AAIObjectType.TENANT, 
+                               cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), cloudRegion.getTenantId())), 
+                               eq(AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, genericVnf.getVnfId())));
+       }
+       
+       @Test
+       public void connectVnfToCloudRegionTest() throws Exception {
+               aaiVnfResources.connectVnfToCloudRegion(genericVnf, cloudRegion);
+               verify(MOCK_aaiResourcesClient, times(1)).connect(eq(AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, genericVnf.getVnfId())),
+                               eq(AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, 
+                                               cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId())));
+       }
 }
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/NamingServiceResourcesTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/NamingServiceResourcesTest.java
new file mode 100644 (file)
index 0000000..629e98a
--- /dev/null
@@ -0,0 +1,105 @@
+/*-
+ * ============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.client.orchestration;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+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.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.common.data.TestDataSetup;
+import org.onap.namingservice.model.Deleteelement;
+import org.onap.namingservice.model.Element;
+import org.onap.namingservice.model.NameGenDeleteRequest;
+import org.onap.namingservice.model.NameGenDeleteResponse;
+import org.onap.namingservice.model.NameGenRequest;
+import org.onap.namingservice.model.NameGenResponse;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
+import org.onap.so.client.namingservice.NamingClient;
+import org.onap.so.client.namingservice.NamingRequestObjectBuilder;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class NamingServiceResourcesTest extends TestDataSetup{
+       @InjectMocks
+       private NamingServiceResources namingServiceResources = new NamingServiceResources();   
+       
+       private InstanceGroup instanceGroup;
+       
+       @Mock
+       protected NamingRequestObjectBuilder MOCK_namingRequestObjectBuilder;   
+       
+       @Mock
+       protected NamingClient MOCK_namingClient;       
+
+       @Before
+       public void before() {          
+               instanceGroup = buildInstanceGroup();
+       }       
+
+       @Test
+       public void generateInstanceGroupNameTest() throws Exception {
+               NameGenResponse name = new NameGenResponse();
+               ResponseEntity<NameGenResponse> resp = new ResponseEntity<>(name, null, HttpStatus.OK);
+               Element element = new Element();
+               
+               NameGenRequest req = new NameGenRequest();
+               doReturn(element).when(MOCK_namingRequestObjectBuilder).elementMapper(isA(String.class), isA(String.class),
+                               isA(String.class), isA(String.class), isA(String.class));
+               doReturn("generatedInstanceGroupName").when(MOCK_namingClient).postNameGenRequest(isA(NameGenRequest.class));           
+               doReturn(req).when(MOCK_namingRequestObjectBuilder).nameGenRequestMapper(isA(List.class));
+
+               String generatedName = namingServiceResources.generateInstanceGroupName(instanceGroup, "policyInstanceName", "nfNamingCode");
+
+               verify(MOCK_namingClient, times(1)).postNameGenRequest(any(NameGenRequest.class));
+               assertEquals(generatedName, "generatedInstanceGroupName");
+       }
+
+       @Test
+       public void deleteInstanceGroupNameTest() throws Exception {            
+               NameGenDeleteResponse name = new NameGenDeleteResponse();
+               ResponseEntity<NameGenDeleteResponse> resp = new ResponseEntity<>(name, null, HttpStatus.OK);
+               Deleteelement deleteElement = new Deleteelement();
+               deleteElement.setExternalKey(instanceGroup.getId());
+               NameGenDeleteRequest req = new NameGenDeleteRequest();
+               doReturn(deleteElement).when(MOCK_namingRequestObjectBuilder).deleteElementMapper(isA(String.class));
+               doReturn("").when(MOCK_namingClient).deleteNameGenRequest(isA(NameGenDeleteRequest.class));             
+               doReturn(req).when(MOCK_namingRequestObjectBuilder).nameGenDeleteRequestMapper(isA(List.class));
+
+               namingServiceResources.deleteInstanceGroupName(instanceGroup);
+
+               verify(MOCK_namingClient, times(1)).deleteNameGenRequest(any(NameGenDeleteRequest.class));
+               
+       }
+
+       
+}
index b93328f..f275f3c 100644 (file)
 
 package org.onap.so.client.orchestration;
 
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -31,47 +27,42 @@ import static org.mockito.Mockito.verify;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
 import org.onap.so.bpmn.common.data.TestDataSetup;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceSubscription;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.MapperException;
 import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCSvcAction;
 import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.client.sdnc.mapper.NetworkTopologyOperationRequestMapper;
-import org.onap.so.db.catalog.beans.OrchestrationStatus;
-
-import org.onap.sdnc.northbound.client.model.GenericResourceApiNetworkOperationInformation;
-import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
 
 @RunWith(MockitoJUnitRunner.Silent.class)
-public class SDNCNetworkResourcesTest extends TestDataSetup{
-       
+public class SDNCNetworkResourcesTest extends TestDataSetup {
+
        @InjectMocks
        private SDNCNetworkResources sdncNetworkResources;
-       
+
        @Mock
        protected SDNCClient MOCK_sdncClient;
-       
+
        @Mock
-       protected NetworkTopologyOperationRequestMapper MOCK_networkTopologyOperationRequestMapper;     
-       
+       protected NetworkTopologyOperationRequestMapper MOCK_networkTopologyOperationRequestMapper;
+
        private L3Network network;
        private ServiceInstance serviceInstance;
        private Customer customer;
        private RequestContext requestContext;
        private CloudRegion cloudRegion;
-       
+
        @Before
        public void before() {
                network = buildL3Network();
@@ -81,125 +72,98 @@ public class SDNCNetworkResourcesTest extends TestDataSetup{
                serviceInstance = buildServiceInstance();
 
                requestContext = buildRequestContext();
-               
+
                cloudRegion = new CloudRegion();
        }
 
        @Test
        public void assignNetworkTest() throws Exception {
-               network.setOrchestrationStatus(OrchestrationStatus.ASSIGNED);
-               
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiNetworkOperationInformation.class), eq(SDNCTopology.NETWORK));
-               
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(MOCK_networkTopologyOperationRequestMapper)
+                               .reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN,
+                                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance,
+                                               customer, requestContext, cloudRegion);
                sdncNetworkResources.assignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-
-               verify(MOCK_sdncClient, times(1)).post(ArgumentMatchers.isNull(), eq(SDNCTopology.NETWORK));
-               
-               assertEquals(OrchestrationStatus.ASSIGNED, network.getOrchestrationStatus());
+               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(
+                               SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN,
+                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
+
        @Test
        public void rollbackAssignNetworkTest() throws Exception {
-               network.setOrchestrationStatus(OrchestrationStatus.ASSIGNED);
-
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiNetworkOperationInformation.class), eq(SDNCTopology.NETWORK));
-               
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(MOCK_networkTopologyOperationRequestMapper)
+                               .reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN,
+                                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance,
+                                               customer, requestContext, cloudRegion);
                sdncNetworkResources.rollbackAssignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-
-               verify(MOCK_sdncClient, times(1)).post(ArgumentMatchers.isNull(), eq(SDNCTopology.NETWORK));
-               
-               assertEquals(OrchestrationStatus.ASSIGNED, network.getOrchestrationStatus());
+               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(
+                               SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
+
        @Test
        public void activateNetworkTest() throws Exception {
-               network.setOrchestrationStatus(OrchestrationStatus.ASSIGNED);
-
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiNetworkOperationInformation.class), eq(SDNCTopology.NETWORK));
-               
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(MOCK_networkTopologyOperationRequestMapper)
+                               .reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.ACTIVATE,
+                                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance,
+                                               customer, requestContext, cloudRegion);
                sdncNetworkResources.activateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-
-               verify(MOCK_sdncClient, times(1)).post(ArgumentMatchers.isNull(), eq(SDNCTopology.NETWORK));
-               
-               assertEquals(OrchestrationStatus.ASSIGNED, network.getOrchestrationStatus());
+               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(
+                               SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.ACTIVATE,
+                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
+
        @Test
        public void deleteNetworkTest() throws Exception {
-               network.setOrchestrationStatus(OrchestrationStatus.ASSIGNED);
-
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiNetworkOperationInformation.class), eq(SDNCTopology.NETWORK));
-               
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(MOCK_networkTopologyOperationRequestMapper)
+                               .reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE,
+                                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance,
+                                               customer, requestContext, cloudRegion);
                sdncNetworkResources.deleteNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-
-               verify(MOCK_sdncClient, times(1)).post(ArgumentMatchers.isNull(), eq(SDNCTopology.NETWORK));
-               
-               assertEquals(OrchestrationStatus.ASSIGNED, network.getOrchestrationStatus());
+               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(
+                               SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
+
        @Test
        public void test_deactivateNetwork() throws MapperException, BadResponseException {
-               serviceInstance.getNetworks().add(network);
-
-               Customer customer = new Customer();
-               customer.setGlobalCustomerId("gcustId");
-               customer.setServiceSubscription(new ServiceSubscription());
-               // set Customer on service instance
-               customer.getServiceSubscription().getServiceInstances().add(serviceInstance);
-
-               GenericResourceApiNetworkOperationInformation expectedGenericResourceApiNetworkOperationInformation = new GenericResourceApiNetworkOperationInformation();
-               
-               String expectedResponse = "response";
-               
-               doReturn(expectedResponse).when(MOCK_sdncClient).post(expectedGenericResourceApiNetworkOperationInformation, SDNCTopology.NETWORK);
-               
-               doReturn(expectedGenericResourceApiNetworkOperationInformation).when(MOCK_networkTopologyOperationRequestMapper).reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               
-               String actualResponse = sdncNetworkResources.deactivateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-               
-               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               
-               verify(MOCK_sdncClient).post(expectedGenericResourceApiNetworkOperationInformation, SDNCTopology.NETWORK);
-               
-               assertEquals(expectedResponse, actualResponse);
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(MOCK_networkTopologyOperationRequestMapper)
+                               .reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE,
+                                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance,
+                                               customer, requestContext, cloudRegion);
+               sdncNetworkResources.deactivateNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
+               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(
+                               SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
+
        @Test
        public void changeAssignNetworkTest() throws MapperException, BadResponseException {
-               String expectedSdncResponse = "SDNCChangeAssignNetworkResponse";
-
-               serviceInstance.getNetworks().add(network);
-
-               Customer customer = new Customer();
-               customer.setGlobalCustomerId("globalCustomerId");
-               customer.setServiceSubscription(new ServiceSubscription());
-               // set Customer on service instance
-               customer.getServiceSubscription().getServiceInstances().add(serviceInstance);
-               
-               GenericResourceApiNetworkOperationInformation sdncReq = new GenericResourceApiNetworkOperationInformation();
-               
-               doReturn(sdncReq).when(MOCK_networkTopologyOperationRequestMapper).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class), isA(GenericResourceApiRequestActionEnumeration.class), isA(L3Network.class), isA(ServiceInstance.class), isA(Customer.class), isA(RequestContext.class), isA(CloudRegion.class));
-               
-               doReturn(expectedSdncResponse).when(MOCK_sdncClient).post(isA(GenericResourceApiNetworkOperationInformation.class), isA(SDNCTopology.class));
-               
-               String actualSdncResponse = sdncNetworkResources.changeAssignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
-               
-               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion);
-               verify(MOCK_sdncClient, times(1)).post(sdncReq, SDNCTopology.NETWORK);
-               assertEquals(actualSdncResponse, expectedSdncResponse);
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(MOCK_networkTopologyOperationRequestMapper)
+                               .reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN,
+                                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance,
+                                               customer, requestContext, cloudRegion);
+               sdncNetworkResources.changeAssignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
+               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(
+                               SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN,
+                               GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
        }
-       
+
        @Test
        public void unassignNetwork_Test() throws Exception {
-               network.setOrchestrationStatus(OrchestrationStatus.CREATED);
-
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiNetworkOperationInformation.class), eq(SDNCTopology.NETWORK));
-               
-               sdncNetworkResources.unassignNetwork(network, serviceInstance, customer,
-                               requestContext, cloudRegion);
-               verify(MOCK_sdncClient, times(1)).post(ArgumentMatchers.isNull(), eq(SDNCTopology.NETWORK));
-               
-               assertEquals(OrchestrationStatus.CREATED, network.getOrchestrationStatus());            
-       }               
+               doReturn(new GenericResourceApiNetworkOperationInformation()).when(MOCK_networkTopologyOperationRequestMapper)
+                               .reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN,
+                                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance,
+                                               customer, requestContext, cloudRegion);
+               sdncNetworkResources.unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion);
+               verify(MOCK_networkTopologyOperationRequestMapper, times(1)).reqMapper(
+                               SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN,
+                               GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer,
+                               requestContext, cloudRegion);
+       }
 }
\ No newline at end of file
index 42672e1..509dc1d 100644 (file)
@@ -21,7 +21,7 @@
 package org.onap.so.client.orchestration;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.times;
@@ -30,121 +30,100 @@ import static org.mockito.Mockito.verify;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
+import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
 import org.onap.so.bpmn.common.data.TestDataSetup;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.MapperException;
-import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCSvcAction;
 import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.client.sdnc.mapper.ServiceTopologyOperationMapper;
 
-import org.onap.sdnc.northbound.client.model.GenericResourceApiRequestActionEnumeration;
-import org.onap.sdnc.northbound.client.model.GenericResourceApiServiceOperationInformation;
-
 @RunWith(MockitoJUnitRunner.Silent.class)
 public class SDNCServiceInstanceResourcesTest  extends TestDataSetup{
+       
        @InjectMocks
     private SDNCServiceInstanceResources sdncServiceInstanceResources;
-       
-
        @Mock
        protected ServiceTopologyOperationMapper MOCK_serviceTopologyOperationMapper;
-       
        private RequestContext requestContext;
        private ServiceInstance serviceInstance;
        private Customer customer;
        
-       @Mock
-       protected SDNCClient MOCK_sdncClient;
-       
        @Before
        public void before() {
                requestContext = buildRequestContext();
-               
                serviceInstance = buildServiceInstance();
-
                customer = buildCustomer();
-
                customer.getServiceSubscription().getServiceInstances().add(serviceInstance);
        }
        
        @Test
        public void assignServiceInstanceSuccessTest() throws Exception {
                doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.ASSIGN), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doReturn("test").when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
                sdncServiceInstanceResources.assignServiceInstance(serviceInstance, customer, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               verify(MOCK_serviceTopologyOperationMapper, times(1)).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.ASSIGN), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
        }
        
        @Test
        public void assignServiceInstanceExceptionTest() throws Exception {
                expectedException.expect(Exception.class);
-               doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.ASSIGN), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doThrow(Exception.class).when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               doThrow(Exception.class).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.ASSIGN), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
                sdncServiceInstanceResources.assignServiceInstance(serviceInstance, customer, requestContext);
        }
        
        @Test
        public void deleteServiceInstanceSuccessTest() throws Exception {
                doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doReturn("test").when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
                sdncServiceInstanceResources.deleteServiceInstance(serviceInstance, customer, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               verify(MOCK_serviceTopologyOperationMapper, times(1)).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
        }
        
        @Test
        public void deleteServiceInstanceExceptionTest() throws Exception {
                expectedException.expect(Exception.class);
-               doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doThrow(Exception.class).when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               doThrow(Exception.class).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
                sdncServiceInstanceResources.deleteServiceInstance(serviceInstance, customer, requestContext);
        }
        
        @Test
        public void unassignServiceInstanceSuccessTest() throws Exception {
                doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doReturn("test").when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
                sdncServiceInstanceResources.unassignServiceInstance(serviceInstance, customer, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               verify(MOCK_serviceTopologyOperationMapper, times(1)).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
        }
        
        @Test
        public void unassignServiceInstanceExceptionTest() throws Exception {
                expectedException.expect(Exception.class);
-               doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doThrow(Exception.class).when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               doThrow(Exception.class).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DELETE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
                sdncServiceInstanceResources.unassignServiceInstance(serviceInstance,customer, requestContext);
        }
 
        @Test
        public void deactivateServiceInstanceSuccessTest() throws Exception {
-               doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doReturn("test").when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
                sdncServiceInstanceResources.deactivateServiceInstance(serviceInstance, customer, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(ArgumentMatchers.isNull(), eq(SDNCTopology.SERVICE));
+               verify(MOCK_serviceTopologyOperationMapper, times(1)).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
        }
        
        @Test
        public void deactivateServiceInstanceExceptionTest() throws Exception {
                expectedException.expect(Exception.class);
-               doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doThrow(Exception.class).when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               doThrow(Exception.class).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE), eq(GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
                sdncServiceInstanceResources.deactivateServiceInstance(serviceInstance, customer, requestContext);
        }
 
        @Test
        public void test_changeModelServiceInstance() throws MapperException, BadResponseException {
                doReturn(new GenericResourceApiServiceOperationInformation()).when(MOCK_serviceTopologyOperationMapper).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.CHANGE_ASSIGN), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
-               doReturn("test").when(MOCK_sdncClient).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
                sdncServiceInstanceResources.changeModelServiceInstance(serviceInstance, customer, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.SERVICE));
+               verify(MOCK_serviceTopologyOperationMapper, times(1)).reqMapper(eq(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION), eq(SDNCSvcAction.CHANGE_ASSIGN), eq(GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE), any(ServiceInstance.class), any(Customer.class), any(RequestContext.class));
        }
 }
index e27f0fc..7d05758 100644 (file)
@@ -20,8 +20,6 @@
 
 package org.onap.so.client.orchestration;
 
-import static org.mockito.Matchers.eq;
-import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -31,8 +29,8 @@ import org.junit.Test;
 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.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;
 import org.onap.so.bpmn.common.data.TestDataSetup;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
@@ -43,16 +41,18 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.MapperException;
-import org.onap.so.client.sdnc.SDNCClient;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
-import org.onap.so.client.sdnc.mapper.VfModuleTopologyOperationRequestMapper;
-
-import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleOperationInformation;;
+import org.onap.so.client.sdnc.beans.SDNCSvcAction;
+import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
+import org.onap.so.client.sdnc.mapper.VfModuleTopologyOperationRequestMapper;;
 
 @RunWith(MockitoJUnitRunner.Silent.class)
 public class SDNCVfModuleResourcesTest  extends TestDataSetup{ 
+
        @InjectMocks
-       private SDNCVfModuleResources sdncVfModuleResources = new SDNCVfModuleResources();
+       private SDNCVfModuleResources sdncVfModuleResources;
+       
+       @Mock
+       protected VfModuleTopologyOperationRequestMapper vfModuleTopologyMapper;
        
        private VfModule vfModule;
        private GenericVnf vnf;
@@ -61,12 +61,7 @@ public class SDNCVfModuleResourcesTest  extends TestDataSetup{
        private Customer customer;
        private CloudRegion cloudRegion;
        private RequestContext requestContext;
-       
-       @Mock
-       protected SDNCClient MOCK_sdncClient;
-       
-       @Spy
-       protected VfModuleTopologyOperationRequestMapper vfModuleTopologyMapper;
+       private GenericResourceApiVfModuleOperationInformation sdncReq;
        
        @Before
        public void before() {
@@ -77,50 +72,51 @@ public class SDNCVfModuleResourcesTest  extends TestDataSetup{
                customer = buildCustomer();
                cloudRegion = buildCloudRegion();
                requestContext = buildRequestContext();
+               sdncReq = new GenericResourceApiVfModuleOperationInformation();
        }
        
        @Test
-       public void assignVfModuleTest() throws MapperException, BadResponseException {
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiVfModuleOperationInformation.class), isA(SDNCTopology.class));
-               
+       public void assignVfModuleTest() throws MapperException {
+               doReturn(sdncReq).when(vfModuleTopologyMapper).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN, vfModule,
+                               volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
                sdncVfModuleResources.assignVfModule(vfModule, volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext);
-               
-               verify(MOCK_sdncClient, times(1)).post(isA(GenericResourceApiVfModuleOperationInformation.class), eq(SDNCTopology.VFMODULE));
+               verify(vfModuleTopologyMapper, times(1)).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN, vfModule,
+                               volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
        
        @Test
-       public void unassignVfModuleTest() throws MapperException, BadResponseException {
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiVfModuleOperationInformation.class), eq(SDNCTopology.VFMODULE));
-               
+       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);
                sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance);
-               
-               verify(MOCK_sdncClient, times(1)).post(isA(GenericResourceApiVfModuleOperationInformation.class), eq(SDNCTopology.VFMODULE));
+               verify(vfModuleTopologyMapper, times(1)).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.UNASSIGN, vfModule, null,
+                               vnf, serviceInstance, null, null, null, null);
        }
        
        @Test
-       public void activateVfModuleTest() throws MapperException, BadResponseException {
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiVfModuleOperationInformation.class), isA(SDNCTopology.class));
-               
+       public void activateVfModuleTest() throws MapperException {
+               doReturn(sdncReq).when(vfModuleTopologyMapper).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.ACTIVATE, vfModule, null,
+                               vnf, serviceInstance, customer, cloudRegion, requestContext, null);
                sdncVfModuleResources.activateVfModule(vfModule, vnf, serviceInstance, customer, cloudRegion, requestContext);
-               
-               verify(MOCK_sdncClient, times(1)).post(isA(GenericResourceApiVfModuleOperationInformation.class), eq(SDNCTopology.VFMODULE));
+               verify(vfModuleTopologyMapper, times(1)).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.ACTIVATE, vfModule, null,
+                               vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
        
        @Test
-       public void deactivateVfModuleTest() throws MapperException, BadResponseException {
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiVfModuleOperationInformation.class), isA(SDNCTopology.class));
-               
+       public void deactivateVfModuleTest() throws MapperException {
+               doReturn(sdncReq).when(vfModuleTopologyMapper).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, vfModule, null,
+                               vnf, serviceInstance, customer, cloudRegion, requestContext, null);
                sdncVfModuleResources.deactivateVfModule(vfModule, vnf, serviceInstance, customer, cloudRegion, requestContext);
-               
-               verify(MOCK_sdncClient, times(1)).post(isA(GenericResourceApiVfModuleOperationInformation.class), eq(SDNCTopology.VFMODULE));
+               verify(vfModuleTopologyMapper, times(1)).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, vfModule, null,
+                               vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
        
        @Test
        public void changeAssignVfModuleTest() throws MapperException, BadResponseException {
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiVfModuleOperationInformation.class), isA(SDNCTopology.class));
-               
+               doReturn(sdncReq).when(vfModuleTopologyMapper).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, vfModule,
+                               null, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
                sdncVfModuleResources.changeAssignVfModule(vfModule, vnf, serviceInstance, customer, cloudRegion, requestContext);
-               
-               verify(MOCK_sdncClient, times(1)).post(isA(GenericResourceApiVfModuleOperationInformation.class), eq(SDNCTopology.VFMODULE));
+               verify(vfModuleTopologyMapper, times(1)).reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, vfModule,
+                               null, vnf, serviceInstance, customer, cloudRegion, requestContext, null);
        }
 }
index 3329842..9bbf790 100644 (file)
 
 package org.onap.so.client.orchestration;
 
-import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
@@ -49,7 +48,6 @@ import org.onap.so.client.exception.MapperException;
 import org.onap.so.client.sdnc.SDNCClient;
 import org.onap.so.client.sdnc.beans.SDNCSvcAction;
 import org.onap.so.client.sdnc.beans.SDNCSvcOperation;
-import org.onap.so.client.sdnc.endpoint.SDNCTopology;
 import org.onap.so.client.sdnc.mapper.VnfTopologyOperationRequestMapper;
 
 @RunWith(MockitoJUnitRunner.Silent.class)
@@ -73,112 +71,83 @@ public class SDNCVnfResourcesTest  extends TestDataSetup{
        @Before
        public void before() {
                serviceInstance = buildServiceInstance();
-               
                genericVnf = buildGenericVnf();
-               
                customer = buildCustomer();
-               
                cloudRegion = buildCloudRegion();
-               
                requestContext = buildRequestContext();
-               
                sdncReq = new GenericResourceApiVnfOperationInformation();
        }
        
        @Test
-       public void assignVnfTest() throws MapperException, BadResponseException {
+       public void assignVnfTest() {
                doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());
-               
                sdncVnfResources.assignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext, false);
-               
                verify(MOCK_vnfTopologyOperationRequestMapper, times(1)).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());
        }
        
        @Test
-       public void activateVnfTest() throws MapperException, BadResponseException {
+       public void activateVnfTest() {
                doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
-               
                sdncVnfResources.activateVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               
-               verify(MOCK_sdncClient, times(1)).post(isA(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
+               verify(MOCK_vnfTopologyOperationRequestMapper, times(1)).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());
        }
        
        @Test
-       public void deleteVnfTest() throws MapperException, BadResponseException {
-               doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());
-               doReturn("test").when(MOCK_sdncClient).post(isA(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
-               
+       public void deleteVnfTest() {
+               doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());         
                sdncVnfResources.deleteVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               
-               verify(MOCK_sdncClient, times(1)).post(isA(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
+               verify(MOCK_vnfTopologyOperationRequestMapper, times(1)).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());               
        }
        
        @Test
        public void queryVnfTest() throws MapperException, BadResponseException {
                doReturn("test").when(MOCK_sdncClient).get(isA(String.class));
-               
                genericVnf.setSelflink("testSelflink");
-               
                sdncVnfResources.queryVnf(genericVnf);
-               
                verify(MOCK_sdncClient, times(1)).get(isA(String.class));
        }
        
        @Test
        public void queryVnfWithResourcePrefixTest() throws MapperException, BadResponseException {
                doReturn("test").when(MOCK_sdncClient).get(isA(String.class));
-               
                genericVnf.setSelflink("restconf/test:testSelflink");
-               
                sdncVnfResources.queryVnf(genericVnf);
-               
                verify(MOCK_sdncClient, times(1)).get(isA(String.class));
        }
        
        @Test
-       public void changeModelVnfTest() throws MapperException, BadResponseException {
+       public void changeModelVnfTest() {
                doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(isA(SDNCSvcOperation.class), isA(SDNCSvcAction.class),isA(GenericResourceApiRequestActionEnumeration.class), isA(GenericVnf.class), isA(ServiceInstance.class), isA(Customer.class), isA(CloudRegion.class), isA(RequestContext.class), anyBoolean());
-               doReturn("SDNCChangeModelVnfResponse").when(MOCK_sdncClient).post(isA(GenericResourceApiVnfOperationInformation.class), isA(SDNCTopology.class));
-               
-               String actualResponse = sdncVnfResources.changeModelVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               
+               sdncVnfResources.changeModelVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
                verify(MOCK_vnfTopologyOperationRequestMapper, times(1)).reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN,GenericResourceApiRequestActionEnumeration.CREATEVNFINSTANCE, genericVnf, serviceInstance, customer, cloudRegion, requestContext, false);
-               verify(MOCK_sdncClient, times(1)).post(sdncReq, SDNCTopology.VNF);
-               assertEquals("SDNCChangeModelVnfResponse", actualResponse);
        }
        
        @Test
-       public void deactivateVnfSuccessTest() throws Exception {
+       public void deactivateVnfSuccessTest() {
                doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
-               doReturn("test").when(MOCK_sdncClient).post(any(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
                sdncVnfResources.deactivateVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(any(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
+               verify(MOCK_vnfTopologyOperationRequestMapper, times(1)).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
                
        }
        
-       @Test(expected = Exception.class)
-       public void deactivateVnfExceptionTest() throws Exception {
-               doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
-               doThrow(Exception.class).when(MOCK_sdncClient).post(any(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
+       @Test
+       public void deactivateVnfExceptionTest() {
+               expectedException.expect(Exception.class);
+               doThrow(Exception.class).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.DEACTIVATE),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
                sdncVnfResources.deactivateVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(any(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
        }
 
        @Test
        public void unassignVnfSuccessTest() throws Exception {
                doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.UNASSIGN),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
-               doReturn("test").when(MOCK_sdncClient).post(any(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
                sdncVnfResources.unassignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               verify(MOCK_sdncClient, times(1)).post(any(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
+               verify(MOCK_vnfTopologyOperationRequestMapper, times(1)).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.UNASSIGN),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
        }
        
-       @Test(expected = Exception.class)
+       @Test
        public void unassignVnfExceptionTest() throws Exception {
-               doReturn(sdncReq).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.UNASSIGN),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
-               doThrow(Exception.class).when(MOCK_sdncClient).post(any(GenericResourceApiVnfOperationInformation.class), eq(SDNCTopology.VNF));
+               expectedException.expect(Exception.class);
+               doThrow(Exception.class).when(MOCK_vnfTopologyOperationRequestMapper).reqMapper(eq(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION), eq(SDNCSvcAction.UNASSIGN),isA(GenericResourceApiRequestActionEnumeration.class), any(GenericVnf.class),any(ServiceInstance.class), any(Customer.class), any(CloudRegion.class),any(RequestContext.class), anyBoolean());
                sdncVnfResources.unassignVnf(genericVnf, serviceInstance, customer, cloudRegion, requestContext);
-               //verify(client, times(1)).post(any(GenericResourceApiServiceOperationInformation.class), eq(SDNCTopology.VNF));
        }
-
 }
index e30fe66..2636aec 100644 (file)
@@ -60,12 +60,13 @@ public class SdnCommonTasksTest{
 
     @Test
     public void validateSDNResponseTest() throws BadResponseException {
+       String jsonResponse = "{\"output\":{\"response-code\":\"0\",\"response-message\":\"success\"}}";
         LinkedHashMap<String, Object> responseMap = new LinkedHashMap<>();
         LinkedHashMap<String, Object> output = new LinkedHashMap<>();
         output.put("response-code", "0");
         output.put("response-message", "success");
         responseMap.put("output", output);
-        assertEquals("success", sdnCommonTasks.validateSDNResponse(responseMap));
+        assertEquals(jsonResponse, sdnCommonTasks.validateSDNResponse(responseMap));
     }
 
     @Test
index cc1c5c5..9117b8e 100644 (file)
@@ -77,6 +77,6 @@ public class SDNCClientIT extends BaseIntegrationTest {
                         .withHeader("Content-Type", "application/json").withBody(responseJson)));
        
         String response = SPY_sdncClient.post("", SDNCTopology.NETWORK);
-        JSONAssert.assertEquals("", response, false);
+        JSONAssert.assertEquals(responseJson, response, true);
     }
 }
index 54ca116..63c3680 100644 (file)
@@ -67,7 +67,7 @@ public class VnfTopologyOperationRequestMapperTest {
                genericVnf.setModelCustomizationUuid("vnfModelCustomizationUUID");
 
                ModelInfoInstanceGroup modelL3Network = new ModelInfoInstanceGroup();
-               modelL3Network.setType("networkInstanceGroup");
+               modelL3Network.setType("L3-NETWORK");
 
                InstanceGroup instanceGroup1 = new InstanceGroup();
                instanceGroup1.setId("l3-network-ig-111");
index 7b369ab..579075f 100644 (file)
@@ -8,6 +8,7 @@
                        "modelVersion": "10"
                },
                "cloudConfiguration": {
+                       "cloudOwner" : "my-custom-cloud-owner",
                        "lcpCloudRegionId": "mdt1",
                        "tenantId": "88a6ca3ee0394ade9403f075db23167e"
                },
index 771283c..2683802 100644 (file)
@@ -7,6 +7,9 @@
                        "modelName": "MOW AVPN vMX BV vPE 1 Service",
                        "modelVersion": "10.0"
                },
+               "cloudConfiguration": {
+                       "cloudOwner" : "my-custom-cloud-owner"
+               },
                "owningEntity": {
                        "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
                        "owningEntityName": "PACKET CORE"
index 51caddd..ddb118e 100644 (file)
@@ -7,6 +7,9 @@
                        "modelName": "MOW AVPN vMX BV vPE 1 Service",
                        "modelVersion": "10.0"
                },
+               "cloudConfiguration": {
+                       "cloudOwner" : "my-custom-cloud-owner"
+               },
                "owningEntity": {
                        "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
                        "owningEntityName": "PACKET CORE"
diff --git a/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignNoCloud.json b/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignNoCloud.json
new file mode 100644 (file)
index 0000000..51caddd
--- /dev/null
@@ -0,0 +1,125 @@
+{
+       "requestDetails": {
+               "modelInfo": {
+                       "modelType": "service",
+                       "modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+                       "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+                       "modelName": "MOW AVPN vMX BV vPE 1 Service",
+                       "modelVersion": "10.0"
+               },
+               "owningEntity": {
+                       "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+                       "owningEntityName": "PACKET CORE"
+               },
+               "project": {
+                       "projectName": "{some project name}"
+               },
+               "subscriberInfo": {
+                       "globalSubscriberId": "{some subscriber id}"
+               },
+               "requestInfo": {
+                       "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+                       "source": "VID",
+                       "suppressRollback": true,
+                       "requestorId": "xxxxxx"
+               },
+               "requestParameters": {
+                       "subscriptionServiceType": "VMX",
+                       "aLaCarte": false,
+                       "userParams": [
+                               {
+                                       "service": {
+                                               "modelInfo": {
+                                                       "modelType": "service",
+                                                       "modelName": "MOW AVPN vMX BV vPE 1 Service",
+                                                       "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+                                               },
+                                               "instanceParams": [],
+                                               "resources": {
+                                                       "vnfs": [
+                                                               {
+                                                                       "modelInfo": {
+                                                                               "modelType": "vnf",
+                                                                               "modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+                                                                               "modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+                                                                               "modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+                                                                               "modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+                                                                       },
+                                                                       "cloudConfiguration": {
+                                                                               "lcpCloudRegionId": "mdt1",
+                                                                               "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+                                                                       },
+                                                                       "platform": {
+                                                                               "platformName": "test"
+                                                                       },
+                                                                       "lineOfBusiness": {
+                                                                               "lineOfBusinessName": "someValue"
+                                                                       },
+                                                                       "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+                                                                       "instanceParams": [],
+                                                                       "vfModules": [
+                                                                               {
+                                                                                       "modelInfo": {
+                                                                                               "modelType": "vfModule",
+                                                                                               "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+                                                                                               "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+                                                                                               "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+                                                                                       },
+                                                                                       "instanceParams": [
+                                                                                               {
+                                                                                                       "vmx_int_net_len": "24"
+                                                                                               }
+                                                                                       ]
+                                                                               },
+                                                                               {
+                                                                                       "modelInfo": {
+                                                                                               "modelType": "vfModule",
+                                                                                               "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                                                                                               "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                                                                                               "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8"
+                                                                                       },
+                                                                                       "instanceParams": [
+                                                                                               {
+                                                                                                       "availability_zone_0": "mtpocdv-kvm-az01",
+                                                                                                       "vre_a_volume_size_0": "100"
+                                                                                               }
+                                                                                       ]
+                                                                               },
+                                                                               {
+                                                                                       "modelInfo": {
+                                                                                               "modelType": "vfModule",
+                                                                                               "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                                                                                               "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                                                                                               "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8"
+                                                                                       },
+                                                                                       "instanceParams": [
+                                                                                               {
+                                                                                                       "availability_zone_0": "mtpocdv-kvm-az01",
+                                                                                                       "vre_a_volume_size_0": "50"
+                                                                                               }
+                                                                                       ]
+                                                                               },
+                                                                               {
+                                                                                       "modelInfo": {
+                                                                                               "modelType": "vfModule",
+                                                                                               "modelName": "201673MowAvpnVpeBvL..AVPN_vPFE_BV..module-2",
+                                                                                               "modelVersionId": "f555558f-d538-4876-8ffa-b102650fad64",
+                                                                                               "modelCustomizationId": "da4d4327-fb7d-4311-ac7a-be7ba60cf969"
+                                                                                       },
+                                                                                       "instanceParams": [
+                                                                                               {
+                                                                                                       "availability_zone_0": "mtpocdv-kvm-az01",
+                                                                                                       "vmx_vpfe_int_ip_0": "192.168.0.16"
+                                                                                               }
+                                                                                       ]
+                                                                               }
+                                                                       ]
+                                                               }
+                                                       ]
+                                               }
+                                       }
+                               }
+                       ]
+               }
+       }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/VnfMacroReplace.json b/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/VnfMacroReplace.json
new file mode 100644 (file)
index 0000000..5c34903
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  "requestDetails": {
+    "modelInfo": {
+      "modelType": "vnf",
+      "modelInvariantId": "2b80014c-851a-4051-a2f0-2994fcf26164",
+      "modelVersionId": "038111e7-dfb6-4875-ba06-d1fc1306b471",
+      "modelName": "Resource",
+      "modelVersion": "4.0",
+      "modelCustomizationName": "Resource 0",
+      "modelCustomizationId": "5769aaa9-84f0-4b9d-bf8a-d891e5c461e1"
+    },
+    "cloudConfiguration": {
+      "cloudOwner": "cloud-owner",
+      "lcpCloudRegionId": "abc3",
+      "tenantId": "ab33582f8d3948078dc8c18d6834bf75"
+    },
+    "requestInfo": {
+      "source": "VID",
+      "requestorId": "test"
+    },
+    "requestParameters": {
+      "testApi": "GR_API"
+    }
+  }
+}
\ No newline at end of file
index 4ecdc72..3d45cad 100644 (file)
@@ -41,6 +41,9 @@ pnf:
     consumerId: consumerId
     topicListenerDelayInSeconds: 5
 mso:
+  naming:
+    endpoint: http://localhost:${wiremock.server.port}/web/service/v1/genNetworkElementName
+    auth: Basic YnBlbDptc28tZGItMTUwNyE=
   adapters:
     requestDb:
       auth: Basic YnBlbDptc28tZGItMTUwNyE=
@@ -90,6 +93,7 @@ mso:
   bpmn:
     optimisticlockingexception:
       retrycount: '3'
+    cloudRegionIdsToSkipAddingVnfEdgesTo: test25Region1,test25Region2,test25Region99
   callbackRetryAttempts: '5'
   catalog:
     db:
@@ -182,6 +186,10 @@ oof:
   host: http://localhost:${wiremock.server.port}
   uri: /api/oof/v1/placement
   headers.auth: Basic dGVzdDp0ZXN0cHdk
+org:
+  onap:
+    so:
+      cloud-owner: att-aic
 spring:
   datasource:
     jdbc-url: jdbc:mariadb://localhost:3307/camundabpmn
index b9fd64e..7d468fa 100644 (file)
                </dependency>
                <dependency>
                        <groupId>javax.servlet</groupId>
-                       <artifactId>javax.servlet-api</artifactId>              
+                       <artifactId>javax.servlet-api</artifactId>
                </dependency>
                <dependency>
                        <groupId>org.springframework</groupId>
-                       <artifactId>spring-aspects</artifactId>                 
+                       <artifactId>spring-aspects</artifactId>
                </dependency>
                <dependency>
             <groupId>org.springframework.boot</groupId>
                <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
-        </dependency>                  
+        </dependency>
                <dependency>
                        <groupId>com.jayway.jsonpath</groupId>
-                       <artifactId>json-path</artifactId>                      
+                       <artifactId>json-path</artifactId>
                </dependency>
                <dependency>
                        <groupId>org.hibernate</groupId>
@@ -49,7 +49,7 @@
                <dependency>
                        <groupId>org.onap.aai.aai-common</groupId>
                        <artifactId>aai-schema</artifactId>
-                       <version>1.3.1</version>
+                       <version>1.4.1-SNAPSHOT</version>
                </dependency>
                <dependency>
                        <groupId>org.modelmapper</groupId>
@@ -85,7 +85,7 @@
                                        <artifactId>commons-lang3</artifactId>
                                </exclusion>
                        </exclusions>
-               </dependency>           
+               </dependency>
                <dependency>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-ext</artifactId>
                </dependency>
         <dependency>
             <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-web</artifactId>          
+            <artifactId>spring-security-web</artifactId>
         </dependency>
                <dependency>
                        <groupId>org.onap.logging-analytics</groupId>
index 12f19ac..6f13a86 100644 (file)
@@ -34,10 +34,10 @@ public class HttpClient extends RestClient {
 
        protected final Logger log = LoggerFactory.getLogger(HttpClient.class);
     private TargetEntity targetEntity;
-       public HttpClient(URL host, String contentType, TargetEntity targetEntity) {
+
+    HttpClient(URL host, String contentType, TargetEntity targetEntity) {
                super(host, contentType);
                this.targetEntity = targetEntity;
-
        }
 
     @Override
@@ -47,7 +47,6 @@ public class HttpClient extends RestClient {
 
        @Override
        protected void initializeHeaderMap(Map<String, String> headerMap) {
-
        }
 
        @Override
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP - SO
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 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.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+package org.onap.so.client;
 
-package org.onap.so.client.grm;
-
-import java.net.MalformedURLException;
 import java.net.URL;
-
 import javax.ws.rs.core.MediaType;
+import org.onap.so.utils.TargetEntity;
 
-public class GRMDefaultPropertiesImpl implements GRMProperties {
-       
-       public GRMDefaultPropertiesImpl() {
-       }
-
-       @Override
-       public URL getEndpoint() throws MalformedURLException {
-               return new URL("http://localhost:47389");
-       }
-
-       @Override
-       public String getSystemName() {
-               return "MSO";
-       }
-
-       @Override
-       public String getDefaultVersion() {
-               return "v1";
-       }
-
-       @Override
-       public String getUsername() {
-               return "gmruser";
-       }
+public class HttpClientFactory {
 
-       @Override
-       public String getPassword() {
-               return "cGFzc3dvcmQ=";
-       }
+    public HttpClient newJsonClient(URL host, TargetEntity targetEntity) {
+        return new HttpClient(host, MediaType.APPLICATION_JSON, targetEntity);
+    }
 
-       @Override
-       public String getContentType() {
-               return MediaType.APPLICATION_JSON;
-       }
+    public HttpClient newXmlClient(URL host, TargetEntity targetEntity) {
+        return new HttpClient(host, MediaType.APPLICATION_XML, targetEntity);
+    }
 
+    public HttpClient newTextXmlClient(URL host, TargetEntity targetEntity) {
+        return new HttpClient(host, MediaType.TEXT_XML, targetEntity);
+    }
 }
index ac4a8d1..8369eba 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.so.client;
 
 import java.io.FileInputStream;
 import java.net.URI;
+import java.nio.file.Paths;
 import java.security.KeyStore;
 import java.security.NoSuchAlgorithmException;
 import java.util.Optional;
@@ -72,7 +73,7 @@ public abstract class RestClientSSL extends RestClient {
        private KeyStore getKeyStore() {
                KeyStore ks = null;
            char[] password = System.getProperty(RestClientSSL.SSL_KEY_STORE_PASSWORD_KEY).toCharArray();
-           try(FileInputStream fis = new FileInputStream(System.getProperty(RestClientSSL.SSL_KEY_STORE_KEY))) {
+           try(FileInputStream fis = new FileInputStream(Paths.get(System.getProperty(RestClientSSL.SSL_KEY_STORE_KEY)).normalize().toString())) {
                ks = KeyStore.getInstance(KeyStore.getDefaultType());
                
                ks.load(fis, password);
index 51d0900..f003dc0 100644 (file)
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import org.onap.aai.annotations.Metadata;
 import org.onap.aai.domain.yang.AllottedResource;
+import org.onap.aai.domain.yang.AggregateRoute;
 import org.onap.aai.domain.yang.CloudRegion;
 import org.onap.aai.domain.yang.Collection;
 import org.onap.aai.domain.yang.Complex;
@@ -113,6 +114,7 @@ public enum AAIObjectType implements GraphInventoryObjectType {
        SP_PARTNER(AAINamespaceConstants.BUSINESS, SpPartner.class),
        DEVICE(AAINamespaceConstants.NETWORK, Device.class),
        EXT_AAI_NETWORK(AAINamespaceConstants.NETWORK, ExtAaiNetwork.class),
+       AGGREGATE_ROUTE(AAINamespaceConstants.NETWORK, AggregateRoute.class),
        UNKNOWN("", "");
 
        private final String uriTemplate;
index 84e25b9..653e1cc 100644 (file)
@@ -53,7 +53,7 @@ public class GRMClient {
                }
        }
        
-       protected ServiceEndPointLookupRequest buildServiceEndPointlookupRequest(String name, int majorVersion, String env) {
+       public ServiceEndPointLookupRequest buildServiceEndPointlookupRequest(String name, int majorVersion, String env) {
                VersionLookup version = new VersionLookup();
                version.setMajor(majorVersion);
                
index da9f215..1206896 100644 (file)
@@ -24,7 +24,7 @@ import org.onap.so.client.RestProperties;
 
 public interface GRMProperties extends RestProperties {
        public String getDefaultVersion();
-       public String getUsername();
-       public String getPassword();
+       public String getAuth();
+       public String getKey();
        public String getContentType();
 }
index ce16cca..0bb55e6 100644 (file)
@@ -32,13 +32,11 @@ import org.onap.so.utils.TargetEntity;
 
 public class GRMRestClient extends RestClient {
 
-       private final String username;
-       private final String password;
+       private final GRMProperties properties;
        
-       public GRMRestClient(RestProperties props, URI path, String username, String password) {
-               super(props, Optional.of(path));
-               this.username = username;
-               this.password = password;
+       public GRMRestClient(GRMProperties props, URI path) {
+               super(props, Optional.of(path));                
+               this.properties = props;
        }
 
     @Override
@@ -48,7 +46,12 @@ public class GRMRestClient extends RestClient {
 
        @Override
        protected void initializeHeaderMap(Map<String, String> headerMap) {
-               headerMap.put("Authorization", "Basic " + Base64.getEncoder().encodeToString(new String(username + ":" + password).getBytes()));
+               String auth = properties.getAuth();
+               String key = properties.getKey();
+
+               if (auth != null && !auth.isEmpty() && key != null && !key.isEmpty()) {
+                       addBasicAuthHeader(auth, key);
+               }       
        }
 
 }
index 3045cb3..0c95a66 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.so.client.grm;
 
 import java.net.URI;
-import java.util.Base64;
 
 import javax.ws.rs.core.UriBuilder;
 
@@ -34,11 +33,8 @@ public class GRMRestInvoker {
        
        public GRMRestInvoker(GRMAction action) {
                GRMProperties props = GRMPropertiesLoader.getInstance().getImpl();
-               if (props == null) {
-                       props = new GRMDefaultPropertiesImpl();
-               }
                this.properties = props;
-               this.client = new GRMRestClient(this.properties, this.createURI(action), this.properties.getUsername(), this.decode(this.properties.getPassword()));
+               this.client = new GRMRestClient(properties, this.createURI(action));
        }
        
        private URI createURI(GRMAction action) {
@@ -49,15 +45,6 @@ public class GRMRestInvoker {
                                .build();
        }
        
-       private String decode(String cred) {
-               try {
-                       return new String(Base64.getDecoder().decode(cred.getBytes()));
-               } 
-               catch(IllegalArgumentException iae) {
-                       return cred;
-               }
-       }
-       
        private RestClient getClient() {
                return this.client;
        }
index 6f415af..8154b91 100644 (file)
@@ -154,6 +154,6 @@ public class SDNOHealthCheckDmaapConsumer extends DmaapConsumer {
        
        @Override
        public int getMaximumElapsedTime() {
-               return 300000;
+               return 600000;
        }
 }
index 69d21c4..72374e0 100644 (file)
@@ -39,6 +39,8 @@ public class InstanceReferences {
        protected String networkInstanceId;
        protected String networkInstanceName;
        protected String requestorId;
+       protected String instanceGroupId;
+       protected String instanceGroupName;
 
 
        public String getServiceInstanceId() {
@@ -109,6 +111,18 @@ public class InstanceReferences {
        public void setRequestorId(String requestorId) {
                this.requestorId = requestorId;
        }
+       public String getInstanceGroupId() {
+               return instanceGroupId;
+       }
+       public void setInstanceGroupId(String instanceGroupId) {
+               this.instanceGroupId = instanceGroupId;
+       }
+       public String getInstanceGroupName() {
+               return instanceGroupName;
+       }
+       public void setInstanceGroupName(String instanceGroupName) {
+               this.instanceGroupName = instanceGroupName;
+       }
        @Override
        public String toString() {
                return new ToStringBuilder(this).append("serviceInstanceId", serviceInstanceId)
@@ -118,6 +132,7 @@ public class InstanceReferences {
                                .append("volumeGroupInstanceId", volumeGroupInstanceId)
                                .append("volumeGroupInstanceName", volumeGroupInstanceName)
                                .append("networkInstanceId", networkInstanceId).append("networkInstanceName", networkInstanceName)
-                               .append("requestorId", requestorId).toString();
+                               .append("requestorId", requestorId).append("instanceGroupId", instanceGroupId)
+                               .append("instanceGroupName", instanceGroupName).toString();
        }
 }
index 527aa03..8adce38 100644 (file)
@@ -31,6 +31,7 @@ public class RequestStatus {
     protected String statusMessage;
     protected Integer percentProgress;
     protected String finishTime;
+    protected String timeStamp;
 
 
        public String getRequestState() {
@@ -57,9 +58,15 @@ public class RequestStatus {
        public void setFinishTime(String finishTime) {
                this.finishTime = finishTime;
        }
+       public String getTimeStamp() {
+               return timeStamp;
+       }
+       public void setTimeStamp(String timeStamp) {
+               this.timeStamp = timeStamp;
+       }
        @Override
        public String toString() {
                return new ToStringBuilder(this).append("requestState", requestState).append("statusMessage", statusMessage)
-                               .append("percentProgress", percentProgress).append("finishTime", finishTime).toString();
+                               .append("percentProgress", percentProgress).append("finishTime", finishTime).append("timeStamp", timeStamp).toString();
        }
 }
index 221005c..75ce5f3 100644 (file)
@@ -30,22 +30,21 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
 import static com.github.tomakehurst.wiremock.client.WireMock.verify;
 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
 
+import com.github.tomakehurst.wiremock.junit.WireMockRule;
 import java.net.MalformedURLException;
 import java.net.URL;
-
 import org.junit.Rule;
 import org.junit.Test;
 import org.onap.so.utils.TargetEntity;
 
-import com.github.tomakehurst.wiremock.junit.WireMockRule;
-
 public class HttpClientTest{
 
 
+       private final HttpClientFactory httpClientFactory = new HttpClientFactory();
        @Rule
        public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicHttpsPort());
 
-    @Test(expected = Test.None.class)
+       @Test
        public void testPost_success() throws MalformedURLException{
 
         stubFor(post(urlEqualTo("/services/sdnc/post"))
@@ -54,7 +53,7 @@ public class HttpClientTest{
                 .withBody("")));
 
       URL url = new URL("http://localhost:" + wireMockConfig().portNumber() + "/services/sdnc/post");
-      HttpClient client = new HttpClient(url, "application/json", TargetEntity.BPMN);
+      HttpClient client = httpClientFactory.newJsonClient(url, TargetEntity.BPMN);
 
          client.addBasicAuthHeader("97FF88AB352DA16E00DDD81E3876431DEF8744465DACA489EB3B3BE1F10F63EDA1715E626D0A4827A3E19CD88421BF", "123");
          client.addAdditionalHeader("Accept", "application/json");
@@ -64,7 +63,7 @@ public class HttpClientTest{
          verify(exactly(1), postRequestedFor(urlEqualTo("/services/sdnc/post")));
        }
 
-    @Test(expected = Test.None.class)
+    @Test
        public void testPost_nullHeader() throws MalformedURLException{
 
         stubFor(post(urlEqualTo("/services/sdnc/post"))
@@ -73,7 +72,7 @@ public class HttpClientTest{
                 .withBody("")));
 
       URL url = new URL("http://localhost:" + wireMockConfig().portNumber() + "/services/sdnc/post");
-      HttpClient client = new HttpClient(url, "application/json", TargetEntity.BPMN);
+      HttpClient client = httpClientFactory.newJsonClient(url, TargetEntity.BPMN);
 
          client.addAdditionalHeader("Accept", "application/json");
          client.addAdditionalHeader("id", null);
@@ -84,7 +83,7 @@ public class HttpClientTest{
                          .withHeader("Accept", equalTo("application/json")));
        }
 
-    @Test(expected = Test.None.class)
+    @Test
        public void testPost_nullBasicAuth() throws MalformedURLException{
 
         stubFor(post(urlEqualTo("/services/sdnc/post"))
@@ -93,7 +92,7 @@ public class HttpClientTest{
                 .withBody("")));
 
       URL url = new URL("http://localhost:" + wireMockConfig().portNumber() + "/services/sdnc/post");
-      HttpClient client = new HttpClient(url, "application/json", TargetEntity.BPMN);
+      HttpClient client = httpClientFactory.newJsonClient(url, TargetEntity.BPMN);
 
       client.addBasicAuthHeader("", "12345");
          client.addAdditionalHeader("Accept", "application/json");
index 6fca4a1..06196fd 100644 (file)
@@ -47,11 +47,12 @@ import org.mockito.junit.MockitoJUnitRunner;
 @RunWith(MockitoJUnitRunner.class)
 public class RestClientTest {
 
-       
+
+       private final HttpClientFactory httpClientFactory = new HttpClientFactory();
        @Mock
        private RestProperties props;
-       
-       
+
+
        @Test
        public void retries() throws Exception {
                RestClient spy = buildSpy();
@@ -82,7 +83,8 @@ public class RestClientTest {
                
        }
        private RestClient buildSpy() throws MalformedURLException, IllegalArgumentException, UriBuilderException {
-               RestClient client = new HttpClient(UriBuilder.fromUri("http://localhost/test").build().toURL(), "application/json", TargetEntity.BPMN);
+               RestClient client = httpClientFactory
+                       .newJsonClient(UriBuilder.fromUri("http://localhost/test").build().toURL(), TargetEntity.BPMN);
                
                return spy(client);
        }
index e1afa82..c0633c1 100644 (file)
@@ -45,7 +45,7 @@ public class DmaapPublisherTest {
 
         @Override
         public Optional<String> getHost() {
-            return Optional.of("http://localhost:8080");
+            return Optional.of("http://test");
         }
     };
 
index 0cf7e0f..0caef0a 100644 (file)
@@ -5,7 +5,7 @@
 SO Offered and Consumed APIs
 =====================================
 
-The list of APIs that SO offerers could be find in the following table:
+The list of APIs that SO offers can be found in following table:
 
 .. |yml-icon| image:: swagger/images/yaml.png
               :width: 40px
@@ -22,3 +22,22 @@ The list of APIs that SO offerers could be find in the following table:
 
    "swagger json file", "html doc", "yaml doc"
    ":download:`link <swagger/swagger.json>`", ":download:`link <swagger/swagger.html>`", ":download:`link <swagger/swagger.yaml>`"
+   
+The list of APIs that SO offerers for monitroing the BPMN flows could be found in the following table:   
+
+.. csv-table::
+   :header: "|Swagger-icon|", "|yml-icon|"
+   :widths: 60,60
+
+   "swagger json file", "yaml doc"
+   ":download:`link <swagger/SO_MONITORING_SWAGGER.json>`", ":download:`link <swagger/SO_MONITORING_SWAGGER.yaml>`"
+
+Further Reading
+----------------------------------------
+
+Detailed documentation can be found here:
+
+.. toctree::
+   :maxdepth: 1
+
+   apis/SO_Interface.rst
\ No newline at end of file
diff --git a/docs/api/swagger/SO_MONITORING_SWAGGER.html b/docs/api/swagger/SO_MONITORING_SWAGGER.html
new file mode 100644 (file)
index 0000000..fe85ab6
--- /dev/null
@@ -0,0 +1,4650 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+  <title>SO Monitoring APIs</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <meta charset="UTF-8" />
+  <script>
+/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,
+r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==va()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===va()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;l<i;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;d<e;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Ma(a,b,f),(d<0||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)})},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);f<g;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);
+if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){if(c)return c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
+</script>
+
+  <script>
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a=
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=
+a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.charAt(0)];
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=
+g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com",
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,
+q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var r=j.createElement("ol");
+r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c,a.i),b=g.a;
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
+Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
+V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
+/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],
+["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q,
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,
+h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
+</script>
+
+  <script>
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2013 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
+</script>
+
+  <script>
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ */
+(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",/<!--[\s\S]*?-->/)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]||""});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].split(/ *\| */)}this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&(cap[1]==="pre"||cap[1]==="script"||cap[1]==="style"),text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */)}this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1].charAt(cap[1].length-1)==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",text:cap[0]});continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^<a /i.test(cap[0])){this.inLink=true}else if(this.inLink&&/^<\/a>/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(cap[0]):escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.text(escape(this.smartypants(cap[0])));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")};InlineLexer.prototype.mangle=function(text){if(!this.options.mangle)return text;var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>.5){ch="x"+ch.toString(16)}out+="&#"+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return"<pre><code>"+(escaped?code:escape(code,true))+"\n</code></pre>"}return'<pre><code class="'+this.options.langPrefix+escape(lang,true)+'">'+(escaped?code:escape(code,true))+"\n</code></pre>\n"};Renderer.prototype.blockquote=function(quote){return"<blockquote>\n"+quote+"</blockquote>\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"<h"+level+' id="'+this.options.headerPrefix+raw.toLowerCase().replace(/[^\w]+/g,"-")+'">'+text+"</h"+level+">\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+"</"+type+">\n"};Renderer.prototype.listitem=function(text){return"<li>"+text+"</li>\n"};Renderer.prototype.paragraph=function(text){return"<p>"+text+"</p>\n"};Renderer.prototype.table=function(header,body){return"<table>\n"+"<thead>\n"+header+"</thead>\n"+"<tbody>\n"+body+"</tbody>\n"+"</table>\n"};Renderer.prototype.tablerow=function(content){return"<tr>\n"+content+"</tr>\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+"</"+type+">\n"};Renderer.prototype.strong=function(text){return"<strong>"+text+"</strong>"};Renderer.prototype.em=function(text){return"<em>"+text+"</em>"};Renderer.prototype.codespan=function(text){return"<code>"+text+"</code>"};Renderer.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"};Renderer.prototype.del=function(text){return"<del>"+text+"</del>"};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='<a href="'+href+'"';if(title){out+=' title="'+title+'"'}out+=">"+text+"</a>";return out};Renderer.prototype.image=function(href,title,text){var out='<img src="'+href+'" alt="'+text+'"';if(title){out+=' title="'+title+'"'}out+=this.options.xhtml?"/>":">";return out};Renderer.prototype.text=function(text){return text};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return this.renderer.hr()}case"heading":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case"code":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case"table":{var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i<this.token.header.length;i++){flags={header:true,align:this.token.align[i]};cell+=this.renderer.tablecell(this.inline.output(this.token.header[i]),{header:true,align:this.token.align[i]})}header+=this.renderer.tablerow(cell);for(i=0;i<this.token.cells.length;i++){row=this.token.cells[i];cell="";for(j=0;j<row.length;j++){cell+=this.renderer.tablecell(this.inline.output(row[j]),{header:false,align:this.token.align[j]})}body+=this.renderer.tablerow(cell)}return this.renderer.table(header,body)}case"blockquote_start":{var body="";while(this.next().type!=="blockquote_end"){body+=this.tok()}return this.renderer.blockquote(body)}case"list_start":{var body="",ordered=this.token.ordered;while(this.next().type!=="list_end"){body+=this.tok()}return this.renderer.list(body,ordered)}case"list_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.token.type==="text"?this.parseText():this.tok()}return this.renderer.listitem(body)}case"loose_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.tok()}return this.renderer.listitem(body)}case"html":{var html=!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;return this.renderer.html(html)}case"paragraph":{return this.renderer.paragraph(this.inline.output(this.token.text))}case"text":{return this.renderer.paragraph(this.parseText())}}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon")return":";if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target){if(Object.prototype.hasOwnProperty.call(target,key)){obj[key]=target[key]}}}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}opt=merge({},marked.defaults,opt||{});var highlight=opt.highlight,tokens,pending,i=0;try{tokens=Lexer.lex(src,opt)}catch(e){return callback(e)}pending=tokens.length;var done=function(err){if(err){opt.highlight=highlight;return callback(err)}var out;try{out=Parser.parse(tokens,opt)}catch(e){err=e}opt.highlight=highlight;return err?callback(err):callback(null,out)};if(!highlight||highlight.length<3){return done()}delete opt.highlight;if(!pending)return done();for(;i<tokens.length;i++){(function(token){if(token.type!=="code"){return--pending||done()}return highlight(token.text,token.lang,function(err,code){if(err)return done(err);if(code==null||code===token.text){return--pending||done()}token.text=code;token.escaped=true;--pending||done()})})(tokens[i])}return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";if((opt||marked.defaults).silent){return"<p>An error occurred:</p><pre>"+escape(e.message+"",true)+"</pre>"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
+</script>
+
+  <script>
+    $( document ).ready(function() {
+      marked.setOptions({
+        renderer: new marked.Renderer(),
+        gfm: true,
+        tables: true,
+        breaks: false,
+        pedantic: false,
+        sanitize: false,
+        smartLists: true,
+        smartypants: false
+      });
+
+      var textFile = null;
+
+      /// Function to be used to download a text json schema
+      function makeTextFile(text) {
+
+        var data = new Blob([text], {type: 'text/plain'});
+
+        // If we are replacing a previously generated file we need to
+        // manually revoke the object URL to avoid memory leaks.
+        if (textFile !== null) {
+          window.URL.revokeObjectURL(textFile);
+        }
+
+        textFile = window.URL.createObjectURL(data);
+
+        var a = document.createElement("a");
+        document.body.appendChild(a);
+        a.style = "display: none";
+        a.href = textFile;
+        a.download = 'schema.txt';
+        a.click();
+
+        return textFile;
+      };
+
+      /// TODO: Implement resizing for expanding within iframe
+      function callResize() {
+        window.parent.postMessage('resize', "*");
+      }
+
+      function processMarked() {
+        $(".marked").each(function() {
+          $(this).html(marked($(this).html()));
+        });
+      }
+
+      // Bootstrap Scrollspy
+      $(this).scrollspy({ target: '#scrollingNav', offset: 18 });
+
+      // Content-Scroll on Navigation click.
+      $('.sidenav').find('a').on('click', function(e) {
+          e.preventDefault();
+          var id = $(this).attr('href');
+          if ($(id).length > 0)
+              $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 400);
+          window.location.hash = $(this).attr('href');
+      });
+
+      // Quickjump on Pageload to hash position.
+      if(window.location.hash) {
+          var id = window.location.hash;
+          if ($(id).length > 0)
+              $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 0);
+      }
+
+
+      function initDynamic() {
+        // tabs
+        $('.nav-tabs-examples a').click(function (e) {
+            e.preventDefault();
+            $(this).tab('show');
+        });
+
+
+        $('.nav-tabs-examples').find('a:first').tab('show');
+
+        // call scrollspy refresh method
+        $(window).scrollspy('refresh');
+      }
+
+      initDynamic();
+
+      // Pre- / Code-Format
+      prettyPrint();
+
+      //Convert elements with "marked" class to markdown
+      processMarked();
+    });
+  </script>
+  <style type="text/css">
+  
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2013 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
+
+  /* Pretty printing styles. Used with prettify.js. */
+/* Vim sunburst theme by David Leibovic */
+pre .str {
+  color: #65B042;
+}
+/* string  - green */
+pre .kwd {
+  color: #E28964;
+}
+/* keyword - dark pink */
+pre .com {
+  color: #AEAEAE;
+  font-style: italic;
+}
+/* comment - gray */
+pre .typ {
+  color: #89bdff;
+}
+/* type - light blue */
+pre .lit {
+  color: #3387CC;
+}
+/* literal - blue */
+pre .pun {
+  color: #fff;
+}
+/* punctuation - white */
+pre .pln {
+  color: #fff;
+}
+/* plaintext - white */
+pre .tag {
+  color: #89bdff;
+}
+/* html/xml tag    - light blue */
+pre .atn {
+  color: #bdb76b;
+}
+/* html/xml attribute name  - khaki */
+pre .atv {
+  color: #65B042;
+}
+/* html/xml attribute value - green */
+pre .dec {
+  color: #3387CC;
+}
+/* decimal - blue */
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums {
+  margin-top: 0;
+  margin-bottom: 0;
+  color: #AEAEAE;
+}
+/* IE indents via margin-left */
+li.L0,
+li.L1,
+li.L2,
+li.L3,
+li.L5,
+li.L6,
+li.L7,
+li.L8 {
+  list-style-type: none;
+}
+/* Alternate shading for lines */
+@media print {
+  pre .str {
+    color: #060;
+  }
+  pre .kwd {
+    color: #006;
+    font-weight: bold;
+  }
+  pre .com {
+    color: #600;
+    font-style: italic;
+  }
+  pre .typ {
+    color: #404;
+    font-weight: bold;
+  }
+  pre .lit {
+    color: #044;
+  }
+  pre .pun {
+    color: #440;
+  }
+  pre .pln {
+    color: #000;
+  }
+  pre .tag {
+    color: #006;
+    font-weight: bold;
+  }
+  pre .atn {
+    color: #404;
+  }
+  pre .atv {
+    color: #060;
+  }
+}
+  /* ------------------------------------------------------------------------------------------
+ * Content
+ * ------------------------------------------------------------------------------------------ */
+
+@import url('https://fonts.googleapis.com/css?family=Source+Code+Pro');
+* {
+  font-family: 'Source Code Pro', sans-serif;
+}
+body {
+  min-width: 980px;
+}
+
+body, p, a, div, th, td {
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 400;
+  font-size: 16px;
+  text-shadow: none !important;
+}
+
+td.code {
+  font-size: 14px;
+  font-family: "Source Code Pro", monospace;
+  font-style: normal;
+  font-weight: 400;
+}
+
+#content {
+  padding-top: 16px;
+  z-Index: -1;
+  margin-left: 270px;
+}
+
+p {
+  color: #808080;
+}
+
+h1 {
+  font-family: "Source Sans Pro Semibold", sans-serif;
+  font-weight: normal;
+  font-size: 44px;
+  line-height: 50px;
+  margin: 0 0 10px 0;
+  padding: 0;
+}
+
+h2 {
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: normal;
+  font-size: 24px;
+  line-height: 40px;
+  margin: 0 0 20px 0;
+  padding: 0;
+}
+
+section {
+  border-top: 1px solid #ebebeb;
+  padding: 30px 0;
+}
+
+section h1 {
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 700;
+  font-size: 32px;
+  line-height: 40px;
+  padding-bottom: 14px;
+  margin: 0 0 20px 0;
+  padding: 0;
+}
+
+article {
+  padding: 14px 0 30px 0;
+}
+
+article h1 {
+  font-family: "Source Sans Pro Bold", sans-serif;
+  font-weight: 600;
+  font-size: 24px;
+  line-height: 26px;
+}
+
+article h2 {
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 600;
+  font-size: 18px;
+  line-height: 24px;
+  margin: 0 0 10px 0;
+}
+
+article h3 {
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 600;
+  font-size: 16px;
+  line-height: 18px;
+  margin: 0 0 10px 0;
+}
+
+article h4 {
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 600;
+  font-size: 14px;
+  line-height: 16px;
+  margin: 0 0 8px 0;
+}
+
+table {
+  border-collapse: collapse;
+  width: 100%;
+  margin: 0 0 20px 0;
+}
+
+th {
+  background-color: #f5f5f5;
+  text-align: left;
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 700;
+  padding: 4px 8px;
+  border: #e0e0e0 1px solid;
+}
+
+td {
+  vertical-align: top;
+  padding: 2px 8px;
+  border: #e0e0e0 1px solid;
+}
+
+#generator .content {
+  color: #b0b0b0;
+  border-top: 1px solid #ebebeb;
+  padding: 10px 0;
+}
+
+.label-optional {
+  float: right;
+}
+
+.open-left {
+  right: 0;
+  left: auto;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * apidoc - intro
+ * ------------------------------------------------------------------------------------------ */
+
+#apidoc .apidoc {
+  border-top: 1px solid #ebebeb;
+  padding: 30px 0;
+}
+
+#apidoc h1 {
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 700;
+  font-size: 32px;
+  line-height: 40px;
+  padding-bottom: 14px;
+  margin: 0 0 20px 0;
+  padding: 0;
+}
+
+#apidoc h2 {
+  font-family: "Source Sans Pro Bold", sans-serif;
+  font-weight: 600;
+  font-size: 22px;
+  line-height: 26px;
+  padding-top: 14px;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * pre / code
+ * ------------------------------------------------------------------------------------------ */
+pre {
+  background-color: #292b36;
+  color: #ffffff;
+  padding: 10px;
+  border-radius: 6px;
+  position: relative;
+  margin: 10px 0 20px 0;
+}
+
+code.language-text {
+  word-wrap: break-word;
+}
+
+pre.language-json {
+  overflow: auto;
+}
+
+pre.language-html {
+  margin: 40px 0 20px 0;
+}
+
+pre.language-html:before {
+  content: attr(data-type);
+  position: absolute;
+  top: -30px;
+  left: 0;
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 600;
+  font-size: 15px;
+  display: inline-block;
+  padding: 2px 5px;
+  border-radius: 6px;
+  text-transform: uppercase;
+  background-color: #3387CC;
+  color: #ffffff;
+}
+
+pre.language-html[data-type="get"]:before {
+  background-color: green;
+}
+
+pre.language-html[data-type="put"]:before {
+  background-color: #e5c500;
+}
+
+pre.language-html[data-type="post"]:before {
+  background-color: #4070ec;
+}
+
+pre.language-html[data-type="delete"]:before {
+  background-color: #ed0039;
+}
+
+pre.language-api .str {
+  color: #ffffff;
+}
+
+pre.language-api .pln,
+pre.language-api .pun {
+  color: #65B042;
+}
+
+pre code {
+  display: block;
+  font-size: 14px;
+  font-family: "Source Code Pro", monospace;
+  font-style: normal;
+  font-weight: 400;
+}
+
+pre code.sample-request-response-json {
+  white-space: pre-wrap;
+  max-height: 500px;
+  overflow: auto;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Sidenav
+ * ------------------------------------------------------------------------------------------ */
+.sidenav {
+  width: 228px;
+  margin: 0;
+  padding: 20px;
+  position: fixed;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+  background-color: #f5f5f5;
+  z-index: 10;
+}
+
+.sidenav > li > a {
+  display: block;
+  width: 192px;
+  margin: 0;
+  padding: 2px 11px;
+  border: 0;
+  border-left: transparent 4px solid;
+  border-right: transparent 4px solid;
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 400;
+  font-size: 14px;
+}
+
+.sidenav > li.nav-header > a {
+  padding: 5px 15px;
+  border: 1px solid #e5e5e5;
+  width: 190px;
+  font-family: "Source Sans Pro", sans-serif;
+  font-weight: 700;
+  font-size: 16px;
+  background-color: #4c8eca;
+  color: #fff;
+}
+
+.sidenav > li.nav-header.active > a {
+  background-color: #4c8eca;
+  color: #fff;
+}
+
+
+00427D
+
+.sidenav > .active > a {
+  position: relative;
+  z-index: 2;
+}
+
+.sidenav > li > a:hover {
+  background-color: #ffffff;
+}
+
+.sidenav > li.has-modifications a {
+  border-right: #60d060 4px solid;
+}
+
+.sidenav > li.is-new a {
+  border-left: #e5e5e5 4px solid;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------
+ * Tabs
+ * ------------------------------------------------------------------------------------------ */
+ul.nav-tabs {
+  margin: 0;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Print
+ * ------------------------------------------------------------------------------------------ */
+
+@media print {
+
+  #sidenav,
+  #version,
+  #versions,
+  section .version,
+  section .versions {
+    display: none;
+  }
+
+  #content {
+    margin-left: 0;
+  }
+
+  a {
+    text-decoration: none;
+    color: inherit;
+  }
+
+  a:after {
+    content: " [" attr(href) "] ";
+  }
+
+  p {
+    color: #000000
+  }
+
+  pre {
+    background-color: #ffffff;
+    color: #000000;
+    padding: 10px;
+    border: #808080 1px solid;
+    border-radius: 6px;
+    position: relative;
+    margin: 10px 0 20px 0;
+  }
+
+} /* /@media print */
+
+
+.doc-chapter
+{
+display:none;
+background-color: #eee;
+border-radius: 1px;
+padding: 10px;
+margin-bottom: 20px;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*!
+ * json-schema-view-js
+ * https://github.com/mohsen1/json-schema-view-js#readme
+ * Version: 0.4.1 - 2015-11-12T17:19:27.615Z
+ * License: MIT
+ */.json-schema-view .toggle-handle:after,.json-schema-view.json-schema-view-dark .toggle-handle:after,json-schema-view .toggle-handle:after,json-schema-view[json-schema-view-dark] .toggle-handle:after{content:"\25BC"}.json-schema-view .title,.json-schema-view.json-schema-view-dark .title,json-schema-view .title,json-schema-view[json-schema-view-dark] .title{font-weight:700;cursor:pointer}.json-schema-view,json-schema-view{font-family:monospace;font-size:0;display:table-cell}.json-schema-view>*,json-schema-view>*{font-size:14px}.json-schema-view .toggle-handle,json-schema-view .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view .toggle-handle,.json-schema-view .toggle-handle:hover,json-schema-view .toggle-handle,json-schema-view .toggle-handle:hover{text-decoration:none;color:#333}.json-schema-view .description,json-schema-view .description{color:gray;font-style:italic}
+   .pattern {
+    color: blue;
+  }
+  .default {
+    color: black;
+  }
+  .required {
+    color:black;
+  }
+  .json-schema-view .title,.json-schema-view .title:hover,json-schema-view .title,json-schema-view .title:hover{text-decoration:none;color:#333}.json-schema-view .brace,.json-schema-view .bracket,.json-schema-view .title,json-schema-view .brace,json-schema-view .bracket,json-schema-view .title{color:#333}.json-schema-view .property,json-schema-view .property{font-size:0;display:table-row}.json-schema-view .property>*,json-schema-view .property>*{font-size:14px;padding:.2em}.json-schema-view .name,json-schema-view .name{color:#00f;display:table-cell;vertical-align:top}.json-schema-view .type,json-schema-view .type{color:green}.json-schema-view .type-any,json-schema-view .type-any{color:#33f}.json-schema-view .required,json-schema-view .required{color:red}.json-schema-view .inner,json-schema-view .inner{padding-left:18px}.json-schema-view.collapsed .description,.json-schema-view.collapsed .property,json-schema-view.collapsed .description,json-schema-view.collapsed .property{display:none}.json-schema-view.collapsed .closeing.brace,json-schema-view.collapsed .closeing.brace{display:inline-block}.json-schema-view.collapsed .toggle-handle,json-schema-view.collapsed .toggle-handle{transform:rotate(-90deg)}.json-schema-view.json-schema-view-dark,json-schema-view[json-schema-view-dark]{font-family:monospace;font-size:0;display:table-cell}.json-schema-view.json-schema-view-dark>*,json-schema-view[json-schema-view-dark]>*{font-size:14px}.json-schema-view.json-schema-view-dark .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view.json-schema-view-dark .toggle-handle,.json-schema-view.json-schema-view-dark .toggle-handle:hover,json-schema-view[json-schema-view-dark] .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .description,json-schema-view[json-schema-view-dark] .description{color:gray;font-style:italic}.json-schema-view.json-schema-view-dark .title,.json-schema-view.json-schema-view-dark .title:hover,json-schema-view[json-schema-view-dark] .title,json-schema-view[json-schema-view-dark] .title:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .brace,.json-schema-view.json-schema-view-dark .bracket,.json-schema-view.json-schema-view-dark .title,json-schema-view[json-schema-view-dark] .brace,json-schema-view[json-schema-view-dark] .bracket,json-schema-view[json-schema-view-dark] .title{color:#eee}.json-schema-view.json-schema-view-dark .property,json-schema-view[json-schema-view-dark] .property{font-size:0;display:table-row}.json-schema-view.json-schema-view-dark .property>*,json-schema-view[json-schema-view-dark] .property>*{font-size:14px;padding:.2em}.json-schema-view.json-schema-view-dark .name,json-schema-view[json-schema-view-dark] .name{color:#add8e6;display:table-cell;vertical-align:top}.json-schema-view.json-schema-view-dark .type,json-schema-view[json-schema-view-dark] .type{color:#90ee90}.json-schema-view.json-schema-view-dark .type-any,json-schema-view[json-schema-view-dark] .type-any{color:#d4ebf2}.json-schema-view.json-schema-view-dark .required,json-schema-view[json-schema-view-dark] .required{color:#fe0000}.json-schema-view.json-schema-view-dark .inner,json-schema-view[json-schema-view-dark] .inner{padding-left:18px}.json-schema-view.json-schema-view-dark.collapsed .description,.json-schema-view.json-schema-view-dark.collapsed .property,json-schema-view[json-schema-view-dark].collapsed .description,json-schema-view[json-schema-view-dark].collapsed .property{display:none}.json-schema-view.json-schema-view-dark.collapsed .closeing.brace,json-schema-view[json-schema-view-dark].collapsed .closeing.brace{display:inline-block}.json-schema-view.json-schema-view-dark.collapsed .toggle-handle,json-schema-view[json-schema-view-dark].collapsed .toggle-handle{transform:rotate(-90deg)}
+
+  </style>
+</head>
+<body>
+  <script>
+    // Script section to load models into a JS Var
+    var defs = {}
+            defs.inline_response_200 = {
+  "properties" : {
+    "processInstanceId" : {
+      "type" : "string",
+      "description" : "The process instance ID"
+    }
+  }
+};
+            defs.inline_response_200_1 = {
+  "properties" : {
+    "processInstanceId" : {
+      "type" : "string",
+      "description" : "The process instance ID"
+    },
+    "processDefinitionId" : {
+      "type" : "string",
+      "description" : "The process definition ID"
+    },
+    "processDefinitionName" : {
+      "type" : "string",
+      "description" : "The process definition name"
+    },
+    "superProcessInstanceId" : {
+      "type" : "string",
+      "description" : "The super process instance ID"
+    }
+  }
+};
+            defs.inline_response_200_2 = {
+  "properties" : {
+    "processDefinitionId" : {
+      "type" : "string",
+      "description" : "The process definition ID"
+    },
+    "processDefinitionXml" : {
+      "type" : "string",
+      "description" : "The process definition XML"
+    }
+  }
+};
+            defs.inline_response_200_3 = {
+  "properties" : {
+    "activityId" : {
+      "type" : "string",
+      "description" : "The activity ID"
+    },
+    "activityName" : {
+      "type" : "string",
+      "description" : "The activity name"
+    },
+    "activityType" : {
+      "type" : "string",
+      "description" : "The activity type"
+    },
+    "processInstanceId" : {
+      "type" : "string",
+      "description" : "The process instance ID"
+    },
+    "calledProcessInstanceId" : {
+      "type" : "string",
+      "description" : "The sub-process instance ID"
+    },
+    "startTime" : {
+      "type" : "string",
+      "description" : "The process execution start time"
+    },
+    "endTime" : {
+      "type" : "string",
+      "description" : "The process execution end time"
+    },
+    "durationInMilliseconds" : {
+      "type" : "string",
+      "description" : "The process execution duration in ms"
+    }
+  }
+};
+            defs.inline_response_200_4 = {
+  "properties" : {
+    "name" : {
+      "type" : "string",
+      "description" : "The variable name"
+    },
+    "value" : {
+      "type" : "object",
+      "description" : "The variable value",
+      "properties" : { }
+    },
+    "type" : {
+      "type" : "string",
+      "description" : "The variable type"
+    }
+  }
+};
+            defs.inline_response_200_5 = {
+  "properties" : {
+    "requestId" : {
+      "type" : "string",
+      "description" : "The request ID"
+    },
+    "serviceInstanceId" : {
+      "type" : "string",
+      "description" : "The service instance ID"
+    },
+    "serviceIstanceName" : {
+      "type" : "string",
+      "description" : "The service instance name"
+    },
+    "networkId" : {
+      "type" : "string",
+      "description" : "The network ID"
+    },
+    "requestStatus" : {
+      "type" : "string",
+      "description" : "The request status"
+    },
+    "serviceType" : {
+      "type" : "string",
+      "description" : "The service type"
+    },
+    "startTime" : {
+      "type" : "string",
+      "description" : "The process execution start time"
+    },
+    "endTime" : {
+      "type" : "string",
+      "description" : "The process execution send time"
+    }
+  }
+};
+  </script>
+
+  <div class="container-fluid">
+    <div class="row-fluid">
+      <div id="sidenav" class="span2">
+        <nav id="scrollingNav">
+          <ul class="sidenav nav nav-list">
+            <!-- Logo Area -->
+              <!--<div style="width: 80%; background-color: #4c8eca; color: white; padding: 20px; text-align: center; margin-bottom: 20px; ">
+
+              API Docs 2
+
+              </div>
+            -->
+            <li class="nav-fixed nav-header active" data-group="_"><a href="#api-_">API Summary</a></li>
+
+                  <li class="nav-header" data-group="GetActivityInstanceDetail"><a href="#api-GetActivityInstanceDetail">API Methods - GetActivityInstanceDetail</a></li>
+                    <li data-group="GetActivityInstanceDetail" data-name="getActivityInstanceDetail" class="">
+                      <a href="#api-GetActivityInstanceDetail-getActivityInstanceDetail">getActivityInstanceDetail</a>
+                    </li>
+                  <li class="nav-header" data-group="GetInfraActiveRequests"><a href="#api-GetInfraActiveRequests">API Methods - GetInfraActiveRequests</a></li>
+                    <li data-group="GetInfraActiveRequests" data-name="getInfraActiveRequests" class="">
+                      <a href="#api-GetInfraActiveRequests-getInfraActiveRequests">getInfraActiveRequests</a>
+                    </li>
+                  <li class="nav-header" data-group="GetProcessDefinitionXml"><a href="#api-GetProcessDefinitionXml">API Methods - GetProcessDefinitionXml</a></li>
+                    <li data-group="GetProcessDefinitionXml" data-name="getProcessDefinitionXml" class="">
+                      <a href="#api-GetProcessDefinitionXml-getProcessDefinitionXml">getProcessDefinitionXml</a>
+                    </li>
+                  <li class="nav-header" data-group="GetProcessInstanceId"><a href="#api-GetProcessInstanceId">API Methods - GetProcessInstanceId</a></li>
+                    <li data-group="GetProcessInstanceId" data-name="getProcessInstanceId" class="">
+                      <a href="#api-GetProcessInstanceId-getProcessInstanceId">getProcessInstanceId</a>
+                    </li>
+                  <li class="nav-header" data-group="GetProcessInstanceVariables"><a href="#api-GetProcessInstanceVariables">API Methods - GetProcessInstanceVariables</a></li>
+                    <li data-group="GetProcessInstanceVariables" data-name="getProcessInstanceVariables" class="">
+                      <a href="#api-GetProcessInstanceVariables-getProcessInstanceVariables">getProcessInstanceVariables</a>
+                    </li>
+                  <li class="nav-header" data-group="GetSingleProcessInstance"><a href="#api-GetSingleProcessInstance">API Methods - GetSingleProcessInstance</a></li>
+                    <li data-group="GetSingleProcessInstance" data-name="getSingleProcessInstance" class="">
+                      <a href="#api-GetSingleProcessInstance-getSingleProcessInstance">getSingleProcessInstance</a>
+                    </li>
+          </ul>
+        </nav>
+      </div>
+      <div id="content">
+        <div id="project">
+          <div class="pull-left">
+            <h1>SO Monitoring APIs</h1>
+          </div>
+          <div class="clearfix"></div>
+        </div>
+        <div id="header">
+          <div id="api-_">
+            <h2 id="welcome-to-apidoc">API and SDK Documentation</h2>
+              <div class="app-desc">Version: 3.1.2</div>
+            <hr>
+            <div>No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)</div>
+          </div>
+        </div>
+        <div id="sections">
+                <section id="api-GetActivityInstanceDetail">
+                  <h1>GetActivityInstanceDetail</h1>
+                    <div id="api-GetActivityInstanceDetail-getActivityInstanceDetail">
+                      <article id="api-GetActivityInstanceDetail-getActivityInstanceDetail-0" data-group="User" data-name="getActivityInstanceDetail" data-version="0">
+                        <div class="pull-left">
+                          <h1>getActivityInstanceDetail</h1>
+                          <p>Get activity instance details for given process instance ID</p>
+                        </div>
+                        <div class="pull-right"></div>
+                        <div class="clearfix"></div>
+                        <p></p>
+                        <p class="marked"></p>
+                        <p></p>
+                        <br />
+                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/so/monitoring/activity-instance/{processInstanceId}</span></code></pre>
+                        <p>
+                          <h3>Usage and SDK Samples</h3>
+                        </p>
+                        <ul class="nav nav-tabs nav-tabs-examples">
+                          <li class="active"><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-curl">Curl</a></li>
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-java">Java</a></li>
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-android">Android</a></li>
+                          <!--<li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-groovy">Groovy</a></li>-->
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-objc">Obj-C</a></li>
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-javascript">JavaScript</a></li>
+                          <!--<li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-angular">Angular</a></li>-->
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-csharp">C#</a></li>
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-php">PHP</a></li>
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-perl">Perl</a></li>
+                          <li class=""><a href="#examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-python">Python</a></li>
+                        </ul>
+
+                        <div class="tab-content">
+                          <div class="tab-pane active" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-curl">
+                            <pre class="prettyprint"><code class="language-bsh">curl -X GET "http://localhost/so/monitoring/activity-instance/{processInstanceId}"</code></pre>
+                          </div>
+                          <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-java">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.GetActivityInstanceDetailApi;
+
+import java.io.File;
+import java.util.*;
+
+public class GetActivityInstanceDetailApiExample {
+
+    public static void main(String[] args) {
+        
+        GetActivityInstanceDetailApi apiInstance = new GetActivityInstanceDetailApi();
+        String processInstanceId = processInstanceId_example; // String | 
+        try {
+            array[inline_response_200_3] result = apiInstance.getActivityInstanceDetail(processInstanceId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetActivityInstanceDetailApi#getActivityInstanceDetail");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+
+                          <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-android">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GetActivityInstanceDetailApi;
+
+public class GetActivityInstanceDetailApiExample {
+
+    public static void main(String[] args) {
+        GetActivityInstanceDetailApi apiInstance = new GetActivityInstanceDetailApi();
+        String processInstanceId = processInstanceId_example; // String | 
+        try {
+            array[inline_response_200_3] result = apiInstance.getActivityInstanceDetail(processInstanceId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetActivityInstanceDetailApi#getActivityInstanceDetail");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+  <!--
+  <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-groovy">
+  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+  </div> -->
+                            <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-objc">
+                              <pre class="prettyprint"><code class="language-cpp">String *processInstanceId = processInstanceId_example; // 
+
+GetActivityInstanceDetailApi *apiInstance = [[GetActivityInstanceDetailApi alloc] init];
+
+// Get activity instance details for given process instance ID
+[apiInstance getActivityInstanceDetailWith:processInstanceId
+              completionHandler: ^(array[inline_response_200_3] output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-javascript">
+                              <pre class="prettyprint"><code class="language-js">var SoMonitoringApIs = require('so_monitoring_ap_is');
+
+var api = new SoMonitoringApIs.GetActivityInstanceDetailApi()
+
+var processInstanceId = processInstanceId_example; // {String} 
+
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.getActivityInstanceDetail(processInstanceId, callback);
+</code></pre>
+                            </div>
+
+                            <!--<div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-angular">
+              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+            </div>-->
+                            <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-csharp">
+                              <pre class="prettyprint"><code class="language-cs">using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class getActivityInstanceDetailExample
+    {
+        public void main()
+        {
+            
+            var apiInstance = new GetActivityInstanceDetailApi();
+            var processInstanceId = processInstanceId_example;  // String | 
+
+            try
+            {
+                // Get activity instance details for given process instance ID
+                array[inline_response_200_3] result = apiInstance.getActivityInstanceDetail(processInstanceId);
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling GetActivityInstanceDetailApi.getActivityInstanceDetail: " + e.Message );
+            }
+        }
+    }
+}
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-php">
+                              <pre class="prettyprint"><code class="language-php"><&#63;php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\Api\GetActivityInstanceDetailApi();
+$processInstanceId = processInstanceId_example; // String | 
+
+try {
+    $result = $api_instance->getActivityInstanceDetail($processInstanceId);
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling GetActivityInstanceDetailApi->getActivityInstanceDetail: ', $e->getMessage(), PHP_EOL;
+}
+?></code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-perl">
+                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::GetActivityInstanceDetailApi;
+
+my $api_instance = WWW::SwaggerClient::GetActivityInstanceDetailApi->new();
+my $processInstanceId = processInstanceId_example; # String | 
+
+eval { 
+    my $result = $api_instance->getActivityInstanceDetail(processInstanceId => $processInstanceId);
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling GetActivityInstanceDetailApi->getActivityInstanceDetail: $@\n";
+}</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetActivityInstanceDetail-getActivityInstanceDetail-0-python">
+                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.GetActivityInstanceDetailApi()
+processInstanceId = processInstanceId_example # String | 
+
+try: 
+    # Get activity instance details for given process instance ID
+    api_response = api_instance.get_activity_instance_detail(processInstanceId)
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling GetActivityInstanceDetailApi->getActivityInstanceDetail: %s\n" % e)</code></pre>
+                            </div>
+                          </div>
+
+                          <h2>Parameters</h2>
+
+                            <div class="methodsubtabletitle">Path parameters</div>
+                            <table id="methodsubtable">
+                                <tr>
+                                  <th width="150px">Name</th>
+                                  <th>Description</th>
+                                </tr>
+                                  <tr><td style="width:150px;">processInstanceId*</td>
+<td>
+
+
+    <div id="d2e199_getActivityInstanceDetail_processInstanceId">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    String
+                </span>
+
+            </div>
+                <div class="inner required">
+                    Required
+                </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                            </table>
+
+
+
+
+
+                          <h2>Responses</h2>
+                            <h3> Status: 200 - A ActivityInstanceDetail object </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                                <li class="active">
+                                  <a data-toggle="tab" href="#responses-getActivityInstanceDetail-200-schema">Schema</a>
+                                </li>
+
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                                <div class="tab-pane active" id="responses-getActivityInstanceDetail-200-schema">
+                                  <div id='responses-getActivityInstanceDetail-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
+                                    <script>
+                                      $(document).ready(function() {
+                                        var schemaWrapper = {
+  "description" : "A ActivityInstanceDetail object",
+  "schema" : {
+    "type" : "array",
+    "items" : {
+      "$ref" : "#/definitions/inline_response_200_3"
+    }
+  }
+};
+                                        var schema = schemaWrapper.schema;
+                                        if (schema.$ref != null) {
+                                          schema = defsParser.$refs.get(schema.$ref);
+                                        } else {
+                                          schemaWrapper.definitions = Object.assign({}, defs);
+                                          $RefParser.dereference(schemaWrapper).catch(function(err) {
+                                            console.log(err);
+                                          });
+                                        }
+
+                                        //console.log(JSON.stringify(schema));
+                                        var view = new JSONSchemaView(schema, 3);
+                                        $('#responses-getActivityInstanceDetail-200-schema-data').val(stringify(schema));
+                                        var result = $('#responses-getActivityInstanceDetail-200-schema-200');
+                                        result.empty();
+                                        result.append(view.render());
+                                      });
+                                    </script>
+                                  </div>
+                                  <input id='responses-getActivityInstanceDetail-200-schema-data' type='hidden' value=''></input>
+                                </div>
+                            </div>
+
+                            <h3> Status: 204 - Unable to find process instance variables for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 400 - Unable to find process instance variables for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 500 - Unable to find process instance variables for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                        </article>
+                      </div>
+                      <hr>
+                  </section>
+                <section id="api-GetInfraActiveRequests">
+                  <h1>GetInfraActiveRequests</h1>
+                    <div id="api-GetInfraActiveRequests-getInfraActiveRequests">
+                      <article id="api-GetInfraActiveRequests-getInfraActiveRequests-0" data-group="User" data-name="getInfraActiveRequests" data-version="0">
+                        <div class="pull-left">
+                          <h1>getInfraActiveRequests</h1>
+                          <p>Search infra active request for given parameter map and parameters</p>
+                        </div>
+                        <div class="pull-right"></div>
+                        <div class="clearfix"></div>
+                        <p></p>
+                        <p class="marked"></p>
+                        <p></p>
+                        <br />
+                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/so/monitoring/v1/search</span></code></pre>
+                        <p>
+                          <h3>Usage and SDK Samples</h3>
+                        </p>
+                        <ul class="nav nav-tabs nav-tabs-examples">
+                          <li class="active"><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-curl">Curl</a></li>
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-java">Java</a></li>
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-android">Android</a></li>
+                          <!--<li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-groovy">Groovy</a></li>-->
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-objc">Obj-C</a></li>
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-javascript">JavaScript</a></li>
+                          <!--<li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-angular">Angular</a></li>-->
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-csharp">C#</a></li>
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-php">PHP</a></li>
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-perl">Perl</a></li>
+                          <li class=""><a href="#examples-GetInfraActiveRequests-getInfraActiveRequests-0-python">Python</a></li>
+                        </ul>
+
+                        <div class="tab-content">
+                          <div class="tab-pane active" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-curl">
+                            <pre class="prettyprint"><code class="language-bsh">curl -X POST "http://localhost/so/monitoring/v1/search?from=&to=&maxResult="</code></pre>
+                          </div>
+                          <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-java">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.GetInfraActiveRequestsApi;
+
+import java.io.File;
+import java.util.*;
+
+public class GetInfraActiveRequestsApiExample {
+
+    public static void main(String[] args) {
+        
+        GetInfraActiveRequestsApi apiInstance = new GetInfraActiveRequestsApi();
+        Object filters = ; // Object | 
+        BigDecimal from = 8.14; // BigDecimal | 
+        BigDecimal to = 8.14; // BigDecimal | 
+        BigDecimal maxResult = 8.14; // BigDecimal | 
+        try {
+            array[inline_response_200_5] result = apiInstance.getInfraActiveRequests(filters, from, to, maxResult);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetInfraActiveRequestsApi#getInfraActiveRequests");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+
+                          <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-android">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GetInfraActiveRequestsApi;
+
+public class GetInfraActiveRequestsApiExample {
+
+    public static void main(String[] args) {
+        GetInfraActiveRequestsApi apiInstance = new GetInfraActiveRequestsApi();
+        Object filters = ; // Object | 
+        BigDecimal from = 8.14; // BigDecimal | 
+        BigDecimal to = 8.14; // BigDecimal | 
+        BigDecimal maxResult = 8.14; // BigDecimal | 
+        try {
+            array[inline_response_200_5] result = apiInstance.getInfraActiveRequests(filters, from, to, maxResult);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetInfraActiveRequestsApi#getInfraActiveRequests");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+  <!--
+  <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-groovy">
+  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+  </div> -->
+                            <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-objc">
+                              <pre class="prettyprint"><code class="language-cpp">Object *filters = ; // 
+BigDecimal *from = 8.14; // 
+BigDecimal *to = 8.14; // 
+BigDecimal *maxResult = 8.14; //  (optional)
+
+GetInfraActiveRequestsApi *apiInstance = [[GetInfraActiveRequestsApi alloc] init];
+
+// Search infra active request for given parameter map and parameters
+[apiInstance getInfraActiveRequestsWith:filters
+    from:from
+    to:to
+    maxResult:maxResult
+              completionHandler: ^(array[inline_response_200_5] output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-javascript">
+                              <pre class="prettyprint"><code class="language-js">var SoMonitoringApIs = require('so_monitoring_ap_is');
+
+var api = new SoMonitoringApIs.GetInfraActiveRequestsApi()
+
+var filters = ; // {Object} 
+
+var from = 8.14; // {BigDecimal} 
+
+var to = 8.14; // {BigDecimal} 
+
+var opts = { 
+  'maxResult': 8.14 // {BigDecimal} 
+};
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.getInfraActiveRequests(filters, from, to, opts, callback);
+</code></pre>
+                            </div>
+
+                            <!--<div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-angular">
+              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+            </div>-->
+                            <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-csharp">
+                              <pre class="prettyprint"><code class="language-cs">using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class getInfraActiveRequestsExample
+    {
+        public void main()
+        {
+            
+            var apiInstance = new GetInfraActiveRequestsApi();
+            var filters = new Object(); // Object | 
+            var from = 8.14;  // BigDecimal | 
+            var to = 8.14;  // BigDecimal | 
+            var maxResult = 8.14;  // BigDecimal |  (optional) 
+
+            try
+            {
+                // Search infra active request for given parameter map and parameters
+                array[inline_response_200_5] result = apiInstance.getInfraActiveRequests(filters, from, to, maxResult);
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling GetInfraActiveRequestsApi.getInfraActiveRequests: " + e.Message );
+            }
+        }
+    }
+}
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-php">
+                              <pre class="prettyprint"><code class="language-php"><&#63;php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\Api\GetInfraActiveRequestsApi();
+$filters = ; // Object | 
+$from = 8.14; // BigDecimal | 
+$to = 8.14; // BigDecimal | 
+$maxResult = 8.14; // BigDecimal | 
+
+try {
+    $result = $api_instance->getInfraActiveRequests($filters, $from, $to, $maxResult);
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling GetInfraActiveRequestsApi->getInfraActiveRequests: ', $e->getMessage(), PHP_EOL;
+}
+?></code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-perl">
+                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::GetInfraActiveRequestsApi;
+
+my $api_instance = WWW::SwaggerClient::GetInfraActiveRequestsApi->new();
+my $filters = WWW::SwaggerClient::Object::Object->new(); # Object | 
+my $from = 8.14; # BigDecimal | 
+my $to = 8.14; # BigDecimal | 
+my $maxResult = 8.14; # BigDecimal | 
+
+eval { 
+    my $result = $api_instance->getInfraActiveRequests(filters => $filters, from => $from, to => $to, maxResult => $maxResult);
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling GetInfraActiveRequestsApi->getInfraActiveRequests: $@\n";
+}</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetInfraActiveRequests-getInfraActiveRequests-0-python">
+                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.GetInfraActiveRequestsApi()
+filters =  # Object | 
+from = 8.14 # BigDecimal | 
+to = 8.14 # BigDecimal | 
+maxResult = 8.14 # BigDecimal |  (optional)
+
+try: 
+    # Search infra active request for given parameter map and parameters
+    api_response = api_instance.get_infra_active_requests(filters, from, to, maxResult=maxResult)
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling GetInfraActiveRequestsApi->getInfraActiveRequests: %s\n" % e)</code></pre>
+                            </div>
+                          </div>
+
+                          <h2>Parameters</h2>
+
+
+
+                            <div class="methodsubtabletitle">Body parameters</div>
+                            <table id="methodsubtable">
+                              <tr>
+                                <th width="150px">Name</th>
+                                <th>Description</th>
+                              </tr>
+                                <tr><td style="width:150px;">filters <span style="color:red;">*</span></td>
+<td>
+
+
+<script>
+$(document).ready(function() {
+  var schemaWrapper = {
+  "in" : "body",
+  "name" : "filters",
+  "required" : true,
+  "schema" : {
+    "type" : "object",
+    "additionalProperties" : {
+      "type" : "string"
+    }
+  }
+};
+  var schema = schemaWrapper.schema;
+  if (schema.$ref != null) {
+    schema = defsParser.$refs.get(schema.$ref);
+  } else {
+    schemaWrapper.definitions = Object.assign({}, defs);
+    $RefParser.dereference(schemaWrapper).catch(function(err) {
+      console.log(err);
+    });
+  }
+
+  var view = new JSONSchemaView(schema,2,{isBodyParam: true});
+  var result = $('#d2e199_getInfraActiveRequests_filters');
+  result.empty();
+  result.append(view.render());
+});
+</script>
+<div id="d2e199_getInfraActiveRequests_filters"></div>
+</td>
+</tr>
+
+                            </table>
+
+
+                            <div class="methodsubtabletitle">Query parameters</div>
+                            <table id="methodsubtable">
+                              <tr>
+                                <th width="150px">Name</th>
+                                <th>Description</th>
+                              </tr>
+                                <tr><td style="width:150px;">from*</td>
+<td>
+
+
+    <div id="d2e199_getInfraActiveRequests_from">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    BigDecimal
+                </span>
+
+            </div>
+                <div class="inner required">
+                    Required
+                </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                                <tr><td style="width:150px;">to*</td>
+<td>
+
+
+    <div id="d2e199_getInfraActiveRequests_to">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    BigDecimal
+                </span>
+
+            </div>
+                <div class="inner required">
+                    Required
+                </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                                <tr><td style="width:150px;">maxResult</td>
+<td>
+
+
+    <div id="d2e199_getInfraActiveRequests_maxResult">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    BigDecimal
+                </span>
+
+            </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                            </table>
+
+                          <h2>Responses</h2>
+                            <h3> Status: 200 - A SoInfraRequest object </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                                <li class="active">
+                                  <a data-toggle="tab" href="#responses-getInfraActiveRequests-200-schema">Schema</a>
+                                </li>
+
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                                <div class="tab-pane active" id="responses-getInfraActiveRequests-200-schema">
+                                  <div id='responses-getInfraActiveRequests-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
+                                    <script>
+                                      $(document).ready(function() {
+                                        var schemaWrapper = {
+  "description" : "A SoInfraRequest object",
+  "schema" : {
+    "type" : "array",
+    "items" : {
+      "$ref" : "#/definitions/inline_response_200_5"
+    }
+  }
+};
+                                        var schema = schemaWrapper.schema;
+                                        if (schema.$ref != null) {
+                                          schema = defsParser.$refs.get(schema.$ref);
+                                        } else {
+                                          schemaWrapper.definitions = Object.assign({}, defs);
+                                          $RefParser.dereference(schemaWrapper).catch(function(err) {
+                                            console.log(err);
+                                          });
+                                        }
+
+                                        //console.log(JSON.stringify(schema));
+                                        var view = new JSONSchemaView(schema, 3);
+                                        $('#responses-getInfraActiveRequests-200-schema-data').val(stringify(schema));
+                                        var result = $('#responses-getInfraActiveRequests-200-schema-200');
+                                        result.empty();
+                                        result.append(view.render());
+                                      });
+                                    </script>
+                                  </div>
+                                  <input id='responses-getInfraActiveRequests-200-schema-data' type='hidden' value=''></input>
+                                </div>
+                            </div>
+
+                            <h3> Status: 204 - Unable to find search request for given filter and parameters. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 400 - Unable to find search request for given filter and parameters </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 500 - Unable to find search request for given filter and parameters </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                        </article>
+                      </div>
+                      <hr>
+                  </section>
+                <section id="api-GetProcessDefinitionXml">
+                  <h1>GetProcessDefinitionXml</h1>
+                    <div id="api-GetProcessDefinitionXml-getProcessDefinitionXml">
+                      <article id="api-GetProcessDefinitionXml-getProcessDefinitionXml-0" data-group="User" data-name="getProcessDefinitionXml" data-version="0">
+                        <div class="pull-left">
+                          <h1>getProcessDefinitionXml</h1>
+                          <p>Get process definition for given process definition ID</p>
+                        </div>
+                        <div class="pull-right"></div>
+                        <div class="clearfix"></div>
+                        <p></p>
+                        <p class="marked"></p>
+                        <p></p>
+                        <br />
+                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/so/monitoring/process-definition/{processDefinitionId}</span></code></pre>
+                        <p>
+                          <h3>Usage and SDK Samples</h3>
+                        </p>
+                        <ul class="nav nav-tabs nav-tabs-examples">
+                          <li class="active"><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-curl">Curl</a></li>
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-java">Java</a></li>
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-android">Android</a></li>
+                          <!--<li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-groovy">Groovy</a></li>-->
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-objc">Obj-C</a></li>
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-javascript">JavaScript</a></li>
+                          <!--<li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-angular">Angular</a></li>-->
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-csharp">C#</a></li>
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-php">PHP</a></li>
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-perl">Perl</a></li>
+                          <li class=""><a href="#examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-python">Python</a></li>
+                        </ul>
+
+                        <div class="tab-content">
+                          <div class="tab-pane active" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-curl">
+                            <pre class="prettyprint"><code class="language-bsh">curl -X GET "http://localhost/so/monitoring/process-definition/{processDefinitionId}"</code></pre>
+                          </div>
+                          <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-java">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.GetProcessDefinitionXmlApi;
+
+import java.io.File;
+import java.util.*;
+
+public class GetProcessDefinitionXmlApiExample {
+
+    public static void main(String[] args) {
+        
+        GetProcessDefinitionXmlApi apiInstance = new GetProcessDefinitionXmlApi();
+        String processDefinitionId = processDefinitionId_example; // String | 
+        try {
+            inline_response_200_2 result = apiInstance.getProcessDefinitionXml(processDefinitionId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetProcessDefinitionXmlApi#getProcessDefinitionXml");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+
+                          <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-android">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GetProcessDefinitionXmlApi;
+
+public class GetProcessDefinitionXmlApiExample {
+
+    public static void main(String[] args) {
+        GetProcessDefinitionXmlApi apiInstance = new GetProcessDefinitionXmlApi();
+        String processDefinitionId = processDefinitionId_example; // String | 
+        try {
+            inline_response_200_2 result = apiInstance.getProcessDefinitionXml(processDefinitionId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetProcessDefinitionXmlApi#getProcessDefinitionXml");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+  <!--
+  <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-groovy">
+  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+  </div> -->
+                            <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-objc">
+                              <pre class="prettyprint"><code class="language-cpp">String *processDefinitionId = processDefinitionId_example; // 
+
+GetProcessDefinitionXmlApi *apiInstance = [[GetProcessDefinitionXmlApi alloc] init];
+
+// Get process definition for given process definition ID
+[apiInstance getProcessDefinitionXmlWith:processDefinitionId
+              completionHandler: ^(inline_response_200_2 output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-javascript">
+                              <pre class="prettyprint"><code class="language-js">var SoMonitoringApIs = require('so_monitoring_ap_is');
+
+var api = new SoMonitoringApIs.GetProcessDefinitionXmlApi()
+
+var processDefinitionId = processDefinitionId_example; // {String} 
+
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.getProcessDefinitionXml(processDefinitionId, callback);
+</code></pre>
+                            </div>
+
+                            <!--<div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-angular">
+              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+            </div>-->
+                            <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-csharp">
+                              <pre class="prettyprint"><code class="language-cs">using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class getProcessDefinitionXmlExample
+    {
+        public void main()
+        {
+            
+            var apiInstance = new GetProcessDefinitionXmlApi();
+            var processDefinitionId = processDefinitionId_example;  // String | 
+
+            try
+            {
+                // Get process definition for given process definition ID
+                inline_response_200_2 result = apiInstance.getProcessDefinitionXml(processDefinitionId);
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling GetProcessDefinitionXmlApi.getProcessDefinitionXml: " + e.Message );
+            }
+        }
+    }
+}
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-php">
+                              <pre class="prettyprint"><code class="language-php"><&#63;php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\Api\GetProcessDefinitionXmlApi();
+$processDefinitionId = processDefinitionId_example; // String | 
+
+try {
+    $result = $api_instance->getProcessDefinitionXml($processDefinitionId);
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling GetProcessDefinitionXmlApi->getProcessDefinitionXml: ', $e->getMessage(), PHP_EOL;
+}
+?></code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-perl">
+                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::GetProcessDefinitionXmlApi;
+
+my $api_instance = WWW::SwaggerClient::GetProcessDefinitionXmlApi->new();
+my $processDefinitionId = processDefinitionId_example; # String | 
+
+eval { 
+    my $result = $api_instance->getProcessDefinitionXml(processDefinitionId => $processDefinitionId);
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling GetProcessDefinitionXmlApi->getProcessDefinitionXml: $@\n";
+}</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessDefinitionXml-getProcessDefinitionXml-0-python">
+                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.GetProcessDefinitionXmlApi()
+processDefinitionId = processDefinitionId_example # String | 
+
+try: 
+    # Get process definition for given process definition ID
+    api_response = api_instance.get_process_definition_xml(processDefinitionId)
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling GetProcessDefinitionXmlApi->getProcessDefinitionXml: %s\n" % e)</code></pre>
+                            </div>
+                          </div>
+
+                          <h2>Parameters</h2>
+
+                            <div class="methodsubtabletitle">Path parameters</div>
+                            <table id="methodsubtable">
+                                <tr>
+                                  <th width="150px">Name</th>
+                                  <th>Description</th>
+                                </tr>
+                                  <tr><td style="width:150px;">processDefinitionId*</td>
+<td>
+
+
+    <div id="d2e199_getProcessDefinitionXml_processDefinitionId">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    String
+                </span>
+
+            </div>
+                <div class="inner required">
+                    Required
+                </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                            </table>
+
+
+
+
+
+                          <h2>Responses</h2>
+                            <h3> Status: 200 - A ProcessDefinitionDetail object </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                                <li class="active">
+                                  <a data-toggle="tab" href="#responses-getProcessDefinitionXml-200-schema">Schema</a>
+                                </li>
+
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                                <div class="tab-pane active" id="responses-getProcessDefinitionXml-200-schema">
+                                  <div id='responses-getProcessDefinitionXml-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
+                                    <script>
+                                      $(document).ready(function() {
+                                        var schemaWrapper = {
+  "description" : "A ProcessDefinitionDetail object",
+  "schema" : {
+    "$ref" : "#/definitions/inline_response_200_2"
+  }
+};
+                                        var schema = schemaWrapper.schema;
+                                        if (schema.$ref != null) {
+                                          schema = defsParser.$refs.get(schema.$ref);
+                                        } else {
+                                          schemaWrapper.definitions = Object.assign({}, defs);
+                                          $RefParser.dereference(schemaWrapper).catch(function(err) {
+                                            console.log(err);
+                                          });
+                                        }
+
+                                        //console.log(JSON.stringify(schema));
+                                        var view = new JSONSchemaView(schema, 3);
+                                        $('#responses-getProcessDefinitionXml-200-schema-data').val(stringify(schema));
+                                        var result = $('#responses-getProcessDefinitionXml-200-schema-200');
+                                        result.empty();
+                                        result.append(view.render());
+                                      });
+                                    </script>
+                                  </div>
+                                  <input id='responses-getProcessDefinitionXml-200-schema-data' type='hidden' value=''></input>
+                                </div>
+                            </div>
+
+                            <h3> Status: 204 - Unable to find process definition xml for given process definition ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 400 - Unable to find process definition xml for given process definition ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 500 - Unable to find process definition xml for given process definition ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                        </article>
+                      </div>
+                      <hr>
+                  </section>
+                <section id="api-GetProcessInstanceId">
+                  <h1>GetProcessInstanceId</h1>
+                    <div id="api-GetProcessInstanceId-getProcessInstanceId">
+                      <article id="api-GetProcessInstanceId-getProcessInstanceId-0" data-group="User" data-name="getProcessInstanceId" data-version="0">
+                        <div class="pull-left">
+                          <h1>getProcessInstanceId</h1>
+                          <p>Get process instance ID for given request ID</p>
+                        </div>
+                        <div class="pull-right"></div>
+                        <div class="clearfix"></div>
+                        <p></p>
+                        <p class="marked"></p>
+                        <p></p>
+                        <br />
+                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/so/monitoring/process-instance-id/{requestId}</span></code></pre>
+                        <p>
+                          <h3>Usage and SDK Samples</h3>
+                        </p>
+                        <ul class="nav nav-tabs nav-tabs-examples">
+                          <li class="active"><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-curl">Curl</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-java">Java</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-android">Android</a></li>
+                          <!--<li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-groovy">Groovy</a></li>-->
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-objc">Obj-C</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-javascript">JavaScript</a></li>
+                          <!--<li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-angular">Angular</a></li>-->
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-csharp">C#</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-php">PHP</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-perl">Perl</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceId-getProcessInstanceId-0-python">Python</a></li>
+                        </ul>
+
+                        <div class="tab-content">
+                          <div class="tab-pane active" id="examples-GetProcessInstanceId-getProcessInstanceId-0-curl">
+                            <pre class="prettyprint"><code class="language-bsh">curl -X GET "http://localhost/so/monitoring/process-instance-id/{requestId}"</code></pre>
+                          </div>
+                          <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-java">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.GetProcessInstanceIdApi;
+
+import java.io.File;
+import java.util.*;
+
+public class GetProcessInstanceIdApiExample {
+
+    public static void main(String[] args) {
+        
+        GetProcessInstanceIdApi apiInstance = new GetProcessInstanceIdApi();
+        String requestId = requestId_example; // String | 
+        try {
+            inline_response_200 result = apiInstance.getProcessInstanceId(requestId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetProcessInstanceIdApi#getProcessInstanceId");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+
+                          <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-android">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GetProcessInstanceIdApi;
+
+public class GetProcessInstanceIdApiExample {
+
+    public static void main(String[] args) {
+        GetProcessInstanceIdApi apiInstance = new GetProcessInstanceIdApi();
+        String requestId = requestId_example; // String | 
+        try {
+            inline_response_200 result = apiInstance.getProcessInstanceId(requestId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetProcessInstanceIdApi#getProcessInstanceId");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+  <!--
+  <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-groovy">
+  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+  </div> -->
+                            <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-objc">
+                              <pre class="prettyprint"><code class="language-cpp">String *requestId = requestId_example; // 
+
+GetProcessInstanceIdApi *apiInstance = [[GetProcessInstanceIdApi alloc] init];
+
+// Get process instance ID for given request ID
+[apiInstance getProcessInstanceIdWith:requestId
+              completionHandler: ^(inline_response_200 output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-javascript">
+                              <pre class="prettyprint"><code class="language-js">var SoMonitoringApIs = require('so_monitoring_ap_is');
+
+var api = new SoMonitoringApIs.GetProcessInstanceIdApi()
+
+var requestId = requestId_example; // {String} 
+
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.getProcessInstanceId(requestId, callback);
+</code></pre>
+                            </div>
+
+                            <!--<div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-angular">
+              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+            </div>-->
+                            <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-csharp">
+                              <pre class="prettyprint"><code class="language-cs">using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class getProcessInstanceIdExample
+    {
+        public void main()
+        {
+            
+            var apiInstance = new GetProcessInstanceIdApi();
+            var requestId = requestId_example;  // String | 
+
+            try
+            {
+                // Get process instance ID for given request ID
+                inline_response_200 result = apiInstance.getProcessInstanceId(requestId);
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling GetProcessInstanceIdApi.getProcessInstanceId: " + e.Message );
+            }
+        }
+    }
+}
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-php">
+                              <pre class="prettyprint"><code class="language-php"><&#63;php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\Api\GetProcessInstanceIdApi();
+$requestId = requestId_example; // String | 
+
+try {
+    $result = $api_instance->getProcessInstanceId($requestId);
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling GetProcessInstanceIdApi->getProcessInstanceId: ', $e->getMessage(), PHP_EOL;
+}
+?></code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-perl">
+                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::GetProcessInstanceIdApi;
+
+my $api_instance = WWW::SwaggerClient::GetProcessInstanceIdApi->new();
+my $requestId = requestId_example; # String | 
+
+eval { 
+    my $result = $api_instance->getProcessInstanceId(requestId => $requestId);
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling GetProcessInstanceIdApi->getProcessInstanceId: $@\n";
+}</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceId-getProcessInstanceId-0-python">
+                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.GetProcessInstanceIdApi()
+requestId = requestId_example # String | 
+
+try: 
+    # Get process instance ID for given request ID
+    api_response = api_instance.get_process_instance_id(requestId)
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling GetProcessInstanceIdApi->getProcessInstanceId: %s\n" % e)</code></pre>
+                            </div>
+                          </div>
+
+                          <h2>Parameters</h2>
+
+                            <div class="methodsubtabletitle">Path parameters</div>
+                            <table id="methodsubtable">
+                                <tr>
+                                  <th width="150px">Name</th>
+                                  <th>Description</th>
+                                </tr>
+                                  <tr><td style="width:150px;">requestId*</td>
+<td>
+
+
+    <div id="d2e199_getProcessInstanceId_requestId">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    String
+                </span>
+
+            </div>
+                <div class="inner required">
+                    Required
+                </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                            </table>
+
+
+
+
+
+                          <h2>Responses</h2>
+                            <h3> Status: 200 - A ProcessInstanceIdDetail object </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                                <li class="active">
+                                  <a data-toggle="tab" href="#responses-getProcessInstanceId-200-schema">Schema</a>
+                                </li>
+
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                                <div class="tab-pane active" id="responses-getProcessInstanceId-200-schema">
+                                  <div id='responses-getProcessInstanceId-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
+                                    <script>
+                                      $(document).ready(function() {
+                                        var schemaWrapper = {
+  "description" : "A ProcessInstanceIdDetail object",
+  "schema" : {
+    "$ref" : "#/definitions/inline_response_200"
+  }
+};
+                                        var schema = schemaWrapper.schema;
+                                        if (schema.$ref != null) {
+                                          schema = defsParser.$refs.get(schema.$ref);
+                                        } else {
+                                          schemaWrapper.definitions = Object.assign({}, defs);
+                                          $RefParser.dereference(schemaWrapper).catch(function(err) {
+                                            console.log(err);
+                                          });
+                                        }
+
+                                        //console.log(JSON.stringify(schema));
+                                        var view = new JSONSchemaView(schema, 3);
+                                        $('#responses-getProcessInstanceId-200-schema-data').val(stringify(schema));
+                                        var result = $('#responses-getProcessInstanceId-200-schema-200');
+                                        result.empty();
+                                        result.append(view.render());
+                                      });
+                                    </script>
+                                  </div>
+                                  <input id='responses-getProcessInstanceId-200-schema-data' type='hidden' value=''></input>
+                                </div>
+                            </div>
+
+                            <h3> Status: 204 - Unable to find process instance id for given request ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 400 - Unable to find process instance id for given request ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 500 - Unable to find process instance id for given request ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                        </article>
+                      </div>
+                      <hr>
+                  </section>
+                <section id="api-GetProcessInstanceVariables">
+                  <h1>GetProcessInstanceVariables</h1>
+                    <div id="api-GetProcessInstanceVariables-getProcessInstanceVariables">
+                      <article id="api-GetProcessInstanceVariables-getProcessInstanceVariables-0" data-group="User" data-name="getProcessInstanceVariables" data-version="0">
+                        <div class="pull-left">
+                          <h1>getProcessInstanceVariables</h1>
+                          <p>Get process instance variables for given process instance ID</p>
+                        </div>
+                        <div class="pull-right"></div>
+                        <div class="clearfix"></div>
+                        <p></p>
+                        <p class="marked"></p>
+                        <p></p>
+                        <br />
+                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/so/monitoring/variable-instance/{processInstanceId}</span></code></pre>
+                        <p>
+                          <h3>Usage and SDK Samples</h3>
+                        </p>
+                        <ul class="nav nav-tabs nav-tabs-examples">
+                          <li class="active"><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-curl">Curl</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-java">Java</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-android">Android</a></li>
+                          <!--<li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-groovy">Groovy</a></li>-->
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-objc">Obj-C</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-javascript">JavaScript</a></li>
+                          <!--<li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-angular">Angular</a></li>-->
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-csharp">C#</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-php">PHP</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-perl">Perl</a></li>
+                          <li class=""><a href="#examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-python">Python</a></li>
+                        </ul>
+
+                        <div class="tab-content">
+                          <div class="tab-pane active" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-curl">
+                            <pre class="prettyprint"><code class="language-bsh">curl -X GET "http://localhost/so/monitoring/variable-instance/{processInstanceId}"</code></pre>
+                          </div>
+                          <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-java">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.GetProcessInstanceVariablesApi;
+
+import java.io.File;
+import java.util.*;
+
+public class GetProcessInstanceVariablesApiExample {
+
+    public static void main(String[] args) {
+        
+        GetProcessInstanceVariablesApi apiInstance = new GetProcessInstanceVariablesApi();
+        String processInstanceId = processInstanceId_example; // String | 
+        try {
+            inline_response_200_4 result = apiInstance.getProcessInstanceVariables(processInstanceId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetProcessInstanceVariablesApi#getProcessInstanceVariables");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+
+                          <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-android">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GetProcessInstanceVariablesApi;
+
+public class GetProcessInstanceVariablesApiExample {
+
+    public static void main(String[] args) {
+        GetProcessInstanceVariablesApi apiInstance = new GetProcessInstanceVariablesApi();
+        String processInstanceId = processInstanceId_example; // String | 
+        try {
+            inline_response_200_4 result = apiInstance.getProcessInstanceVariables(processInstanceId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetProcessInstanceVariablesApi#getProcessInstanceVariables");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+  <!--
+  <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-groovy">
+  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+  </div> -->
+                            <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-objc">
+                              <pre class="prettyprint"><code class="language-cpp">String *processInstanceId = processInstanceId_example; // 
+
+GetProcessInstanceVariablesApi *apiInstance = [[GetProcessInstanceVariablesApi alloc] init];
+
+// Get process instance variables for given process instance ID
+[apiInstance getProcessInstanceVariablesWith:processInstanceId
+              completionHandler: ^(inline_response_200_4 output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-javascript">
+                              <pre class="prettyprint"><code class="language-js">var SoMonitoringApIs = require('so_monitoring_ap_is');
+
+var api = new SoMonitoringApIs.GetProcessInstanceVariablesApi()
+
+var processInstanceId = processInstanceId_example; // {String} 
+
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.getProcessInstanceVariables(processInstanceId, callback);
+</code></pre>
+                            </div>
+
+                            <!--<div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-angular">
+              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+            </div>-->
+                            <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-csharp">
+                              <pre class="prettyprint"><code class="language-cs">using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class getProcessInstanceVariablesExample
+    {
+        public void main()
+        {
+            
+            var apiInstance = new GetProcessInstanceVariablesApi();
+            var processInstanceId = processInstanceId_example;  // String | 
+
+            try
+            {
+                // Get process instance variables for given process instance ID
+                inline_response_200_4 result = apiInstance.getProcessInstanceVariables(processInstanceId);
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling GetProcessInstanceVariablesApi.getProcessInstanceVariables: " + e.Message );
+            }
+        }
+    }
+}
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-php">
+                              <pre class="prettyprint"><code class="language-php"><&#63;php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\Api\GetProcessInstanceVariablesApi();
+$processInstanceId = processInstanceId_example; // String | 
+
+try {
+    $result = $api_instance->getProcessInstanceVariables($processInstanceId);
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling GetProcessInstanceVariablesApi->getProcessInstanceVariables: ', $e->getMessage(), PHP_EOL;
+}
+?></code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-perl">
+                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::GetProcessInstanceVariablesApi;
+
+my $api_instance = WWW::SwaggerClient::GetProcessInstanceVariablesApi->new();
+my $processInstanceId = processInstanceId_example; # String | 
+
+eval { 
+    my $result = $api_instance->getProcessInstanceVariables(processInstanceId => $processInstanceId);
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling GetProcessInstanceVariablesApi->getProcessInstanceVariables: $@\n";
+}</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetProcessInstanceVariables-getProcessInstanceVariables-0-python">
+                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.GetProcessInstanceVariablesApi()
+processInstanceId = processInstanceId_example # String | 
+
+try: 
+    # Get process instance variables for given process instance ID
+    api_response = api_instance.get_process_instance_variables(processInstanceId)
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling GetProcessInstanceVariablesApi->getProcessInstanceVariables: %s\n" % e)</code></pre>
+                            </div>
+                          </div>
+
+                          <h2>Parameters</h2>
+
+                            <div class="methodsubtabletitle">Path parameters</div>
+                            <table id="methodsubtable">
+                                <tr>
+                                  <th width="150px">Name</th>
+                                  <th>Description</th>
+                                </tr>
+                                  <tr><td style="width:150px;">processInstanceId*</td>
+<td>
+
+
+    <div id="d2e199_getProcessInstanceVariables_processInstanceId">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    String
+                </span>
+
+            </div>
+                <div class="inner required">
+                    Required
+                </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                            </table>
+
+
+
+
+
+                          <h2>Responses</h2>
+                            <h3> Status: 200 - A ProcessInstanceVariableDetail object </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                                <li class="active">
+                                  <a data-toggle="tab" href="#responses-getProcessInstanceVariables-200-schema">Schema</a>
+                                </li>
+
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                                <div class="tab-pane active" id="responses-getProcessInstanceVariables-200-schema">
+                                  <div id='responses-getProcessInstanceVariables-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
+                                    <script>
+                                      $(document).ready(function() {
+                                        var schemaWrapper = {
+  "description" : "A ProcessInstanceVariableDetail object",
+  "schema" : {
+    "$ref" : "#/definitions/inline_response_200_4"
+  }
+};
+                                        var schema = schemaWrapper.schema;
+                                        if (schema.$ref != null) {
+                                          schema = defsParser.$refs.get(schema.$ref);
+                                        } else {
+                                          schemaWrapper.definitions = Object.assign({}, defs);
+                                          $RefParser.dereference(schemaWrapper).catch(function(err) {
+                                            console.log(err);
+                                          });
+                                        }
+
+                                        //console.log(JSON.stringify(schema));
+                                        var view = new JSONSchemaView(schema, 3);
+                                        $('#responses-getProcessInstanceVariables-200-schema-data').val(stringify(schema));
+                                        var result = $('#responses-getProcessInstanceVariables-200-schema-200');
+                                        result.empty();
+                                        result.append(view.render());
+                                      });
+                                    </script>
+                                  </div>
+                                  <input id='responses-getProcessInstanceVariables-200-schema-data' type='hidden' value=''></input>
+                                </div>
+                            </div>
+
+                            <h3> Status: 204 - Unable to find activity instance for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 400 - Unable to find activity instance for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 500 - Unable to find activity instance for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                        </article>
+                      </div>
+                      <hr>
+                  </section>
+                <section id="api-GetSingleProcessInstance">
+                  <h1>GetSingleProcessInstance</h1>
+                    <div id="api-GetSingleProcessInstance-getSingleProcessInstance">
+                      <article id="api-GetSingleProcessInstance-getSingleProcessInstance-0" data-group="User" data-name="getSingleProcessInstance" data-version="0">
+                        <div class="pull-left">
+                          <h1>getSingleProcessInstance</h1>
+                          <p>Get process instance for given process instance ID</p>
+                        </div>
+                        <div class="pull-right"></div>
+                        <div class="clearfix"></div>
+                        <p></p>
+                        <p class="marked"></p>
+                        <p></p>
+                        <br />
+                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/so/monitoring/process-instance/{processInstanceId}</span></code></pre>
+                        <p>
+                          <h3>Usage and SDK Samples</h3>
+                        </p>
+                        <ul class="nav nav-tabs nav-tabs-examples">
+                          <li class="active"><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-curl">Curl</a></li>
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-java">Java</a></li>
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-android">Android</a></li>
+                          <!--<li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-groovy">Groovy</a></li>-->
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-objc">Obj-C</a></li>
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-javascript">JavaScript</a></li>
+                          <!--<li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-angular">Angular</a></li>-->
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-csharp">C#</a></li>
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-php">PHP</a></li>
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-perl">Perl</a></li>
+                          <li class=""><a href="#examples-GetSingleProcessInstance-getSingleProcessInstance-0-python">Python</a></li>
+                        </ul>
+
+                        <div class="tab-content">
+                          <div class="tab-pane active" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-curl">
+                            <pre class="prettyprint"><code class="language-bsh">curl -X GET "http://localhost/so/monitoring/process-instance/{processInstanceId}"</code></pre>
+                          </div>
+                          <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-java">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.GetSingleProcessInstanceApi;
+
+import java.io.File;
+import java.util.*;
+
+public class GetSingleProcessInstanceApiExample {
+
+    public static void main(String[] args) {
+        
+        GetSingleProcessInstanceApi apiInstance = new GetSingleProcessInstanceApi();
+        String processInstanceId = processInstanceId_example; // String | 
+        try {
+            inline_response_200_1 result = apiInstance.getSingleProcessInstance(processInstanceId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetSingleProcessInstanceApi#getSingleProcessInstance");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+
+                          <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-android">
+                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GetSingleProcessInstanceApi;
+
+public class GetSingleProcessInstanceApiExample {
+
+    public static void main(String[] args) {
+        GetSingleProcessInstanceApi apiInstance = new GetSingleProcessInstanceApi();
+        String processInstanceId = processInstanceId_example; // String | 
+        try {
+            inline_response_200_1 result = apiInstance.getSingleProcessInstance(processInstanceId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling GetSingleProcessInstanceApi#getSingleProcessInstance");
+            e.printStackTrace();
+        }
+    }
+}</code></pre>
+                          </div>
+  <!--
+  <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-groovy">
+  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+  </div> -->
+                            <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-objc">
+                              <pre class="prettyprint"><code class="language-cpp">String *processInstanceId = processInstanceId_example; // 
+
+GetSingleProcessInstanceApi *apiInstance = [[GetSingleProcessInstanceApi alloc] init];
+
+// Get process instance for given process instance ID
+[apiInstance getSingleProcessInstanceWith:processInstanceId
+              completionHandler: ^(inline_response_200_1 output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-javascript">
+                              <pre class="prettyprint"><code class="language-js">var SoMonitoringApIs = require('so_monitoring_ap_is');
+
+var api = new SoMonitoringApIs.GetSingleProcessInstanceApi()
+
+var processInstanceId = processInstanceId_example; // {String} 
+
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.getSingleProcessInstance(processInstanceId, callback);
+</code></pre>
+                            </div>
+
+                            <!--<div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-angular">
+              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
+            </div>-->
+                            <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-csharp">
+                              <pre class="prettyprint"><code class="language-cs">using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class getSingleProcessInstanceExample
+    {
+        public void main()
+        {
+            
+            var apiInstance = new GetSingleProcessInstanceApi();
+            var processInstanceId = processInstanceId_example;  // String | 
+
+            try
+            {
+                // Get process instance for given process instance ID
+                inline_response_200_1 result = apiInstance.getSingleProcessInstance(processInstanceId);
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling GetSingleProcessInstanceApi.getSingleProcessInstance: " + e.Message );
+            }
+        }
+    }
+}
+</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-php">
+                              <pre class="prettyprint"><code class="language-php"><&#63;php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\Api\GetSingleProcessInstanceApi();
+$processInstanceId = processInstanceId_example; // String | 
+
+try {
+    $result = $api_instance->getSingleProcessInstance($processInstanceId);
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling GetSingleProcessInstanceApi->getSingleProcessInstance: ', $e->getMessage(), PHP_EOL;
+}
+?></code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-perl">
+                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::GetSingleProcessInstanceApi;
+
+my $api_instance = WWW::SwaggerClient::GetSingleProcessInstanceApi->new();
+my $processInstanceId = processInstanceId_example; # String | 
+
+eval { 
+    my $result = $api_instance->getSingleProcessInstance(processInstanceId => $processInstanceId);
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling GetSingleProcessInstanceApi->getSingleProcessInstance: $@\n";
+}</code></pre>
+                            </div>
+
+                            <div class="tab-pane" id="examples-GetSingleProcessInstance-getSingleProcessInstance-0-python">
+                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.GetSingleProcessInstanceApi()
+processInstanceId = processInstanceId_example # String | 
+
+try: 
+    # Get process instance for given process instance ID
+    api_response = api_instance.get_single_process_instance(processInstanceId)
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling GetSingleProcessInstanceApi->getSingleProcessInstance: %s\n" % e)</code></pre>
+                            </div>
+                          </div>
+
+                          <h2>Parameters</h2>
+
+                            <div class="methodsubtabletitle">Path parameters</div>
+                            <table id="methodsubtable">
+                                <tr>
+                                  <th width="150px">Name</th>
+                                  <th>Description</th>
+                                </tr>
+                                  <tr><td style="width:150px;">processInstanceId*</td>
+<td>
+
+
+    <div id="d2e199_getSingleProcessInstance_processInstanceId">
+        <div class="json-schema-view">
+            <div class="primitive">
+                <span class="type">
+                    String
+                </span>
+
+            </div>
+                <div class="inner required">
+                    Required
+                </div>
+        </div>
+    </div>
+</td>
+</tr>
+
+                            </table>
+
+
+
+
+
+                          <h2>Responses</h2>
+                            <h3> Status: 200 - A ProcessInstanceDetail object </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                                <li class="active">
+                                  <a data-toggle="tab" href="#responses-getSingleProcessInstance-200-schema">Schema</a>
+                                </li>
+
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                                <div class="tab-pane active" id="responses-getSingleProcessInstance-200-schema">
+                                  <div id='responses-getSingleProcessInstance-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
+                                    <script>
+                                      $(document).ready(function() {
+                                        var schemaWrapper = {
+  "description" : "A ProcessInstanceDetail object",
+  "schema" : {
+    "$ref" : "#/definitions/inline_response_200_1"
+  }
+};
+                                        var schema = schemaWrapper.schema;
+                                        if (schema.$ref != null) {
+                                          schema = defsParser.$refs.get(schema.$ref);
+                                        } else {
+                                          schemaWrapper.definitions = Object.assign({}, defs);
+                                          $RefParser.dereference(schemaWrapper).catch(function(err) {
+                                            console.log(err);
+                                          });
+                                        }
+
+                                        //console.log(JSON.stringify(schema));
+                                        var view = new JSONSchemaView(schema, 3);
+                                        $('#responses-getSingleProcessInstance-200-schema-data').val(stringify(schema));
+                                        var result = $('#responses-getSingleProcessInstance-200-schema-200');
+                                        result.empty();
+                                        result.append(view.render());
+                                      });
+                                    </script>
+                                  </div>
+                                  <input id='responses-getSingleProcessInstance-200-schema-data' type='hidden' value=''></input>
+                                </div>
+                            </div>
+
+                            <h3> Status: 204 - Unable to find process instance for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 400 - Unable to find process instance for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                            <h3> Status: 500 - Unable to find process instance  for given process instance ID. </h3>
+
+                            <ul class="nav nav-tabs nav-tabs-examples" >
+                            </ul>
+
+                            <div class="tab-content" style='margin-bottom: 10px;'>
+                            </div>
+
+                        </article>
+                      </div>
+                      <hr>
+                  </section>
+          </div>
+          <div id="footer">
+            <div id="api-_footer">
+              <p>Suggestions, contact, support and error reporting;
+                  <div class="app-desc">Information URL: <a href="https://helloreverb.com">https://helloreverb.com</a></div>
+                  <div class="app-desc">Contact Info: <a href="hello@helloreverb.com">hello@helloreverb.com</a></div>
+              </p>
+                <div class="license-info">All rights reserved</div>
+                <div class="license-url">http://apache.org/licenses/LICENSE-2.0.html</div>
+            </div>
+          </div>
+          <div id="generator">
+            <div class="content">
+              Generated 2018-11-19T03:21:44.307Z
+            </div>
+          </div>
+      </div>
+    </div>
+  </div>
+  <script>
+(function webpackUniversalModuleDefinition(root, factory) {
+       if(typeof exports === 'object' && typeof module === 'object')
+               module.exports = factory();
+       else if(typeof define === 'function' && define.amd)
+               define("JSONFormatter", [], factory);
+       else if(typeof exports === 'object')
+               exports["JSONFormatter"] = factory();
+       else
+               root["JSONFormatter"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/       // The module cache
+/******/       var installedModules = {};
+/******/
+/******/       // The require function
+/******/       function __webpack_require__(moduleId) {
+/******/
+/******/               // Check if module is in cache
+/******/               if(installedModules[moduleId])
+/******/                       return installedModules[moduleId].exports;
+/******/
+/******/               // Create a new module (and put it into the cache)
+/******/               var module = installedModules[moduleId] = {
+/******/                       exports: {},
+/******/                       id: moduleId,
+/******/                       loaded: false
+/******/               };
+/******/
+/******/               // Execute the module function
+/******/               modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/               // Flag the module as loaded
+/******/               module.loaded = true;
+/******/
+/******/               // Return the exports of the module
+/******/               return module.exports;
+/******/       }
+/******/
+/******/
+/******/       // expose the modules object (__webpack_modules__)
+/******/       __webpack_require__.m = modules;
+/******/
+/******/       // expose the module cache
+/******/       __webpack_require__.c = installedModules;
+/******/
+/******/       // __webpack_public_path__
+/******/       __webpack_require__.p = "dist";
+/******/
+/******/       // Load entry module and return exports
+/******/       return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+       module.exports = __webpack_require__(1);
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+       "use strict";
+       __webpack_require__(2);
+       var helpers_ts_1 = __webpack_require__(6);
+       var DATE_STRING_REGEX = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
+       var PARTIAL_DATE_REGEX = /\d{2}:\d{2}:\d{2} GMT-\d{4}/;
+       var JSON_DATE_REGEX = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/;
+       // When toggleing, don't animated removal or addition of more than a few items
+       var MAX_ANIMATED_TOGGLE_ITEMS = 10;
+       var requestAnimationFrame = window.requestAnimationFrame || function (cb) { cb(); return 0; };
+       ;
+       var _defaultConfig = {
+           hoverPreviewEnabled: false,
+           hoverPreviewArrayCount: 100,
+           hoverPreviewFieldCount: 5,
+           animateOpen: true,
+           animateClose: true,
+           theme: null
+       };
+       module.exports = (function () {
+           /**
+            * @param {object} json The JSON object you want to render. It has to be an
+            * object or array. Do NOT pass raw JSON string.
+            *
+            * @param {number} [open=1] his number indicates up to how many levels the
+            * rendered tree should expand. Set it to `0` to make the whole tree collapsed
+            * or set it to `Infinity` to expand the tree deeply
+            *
+            * @param {object} [config=defaultConfig] -
+            *  defaultConfig = {
+            *   hoverPreviewEnabled: false,
+            *   hoverPreviewArrayCount: 100,
+            *   hoverPreviewFieldCount: 5
+            * }
+            *
+            * Available configurations:
+            *  #####Hover Preview
+            * * `hoverPreviewEnabled`:  enable preview on hover
+            * * `hoverPreviewArrayCount`: number of array items to show in preview Any
+            *    array larger than this number will be shown as `Array[XXX]` where `XXX`
+            *    is length of the array.
+            * * `hoverPreviewFieldCount`: number of object properties to show for object
+            *   preview. Any object with more properties that thin number will be
+            *   truncated.
+            *
+            * @param {string} [key=undefined] The key that this object in it's parent
+            * context
+           */
+           function JSONFormatter(json, open, config, key) {
+               if (open === void 0) { open = 1; }
+               if (config === void 0) { config = _defaultConfig; }
+               this.json = json;
+               this.open = open;
+               this.config = config;
+               this.key = key;
+               // Hold the open state after the toggler is used
+               this._isOpen = null;
+               // Setting default values for config object
+               if (this.config.hoverPreviewEnabled === undefined) {
+                   this.config.hoverPreviewEnabled = _defaultConfig.hoverPreviewEnabled;
+               }
+               if (this.config.hoverPreviewArrayCount === undefined) {
+                   this.config.hoverPreviewArrayCount = _defaultConfig.hoverPreviewArrayCount;
+               }
+               if (this.config.hoverPreviewFieldCount === undefined) {
+                   this.config.hoverPreviewFieldCount = _defaultConfig.hoverPreviewFieldCount;
+               }
+           }
+           Object.defineProperty(JSONFormatter.prototype, "isOpen", {
+               /*
+                * is formatter open?
+               */
+               get: function () {
+                   if (this._isOpen !== null) {
+                       return this._isOpen;
+                   }
+                   else {
+                       return this.open > 0;
+                   }
+               },
+               /*
+                * set open state (from toggler)
+               */
+               set: function (value) {
+                   this._isOpen = value;
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "isDate", {
+               /*
+                * is this a date string?
+               */
+               get: function () {
+                   return (this.type === 'string') &&
+                       (DATE_STRING_REGEX.test(this.json) ||
+                           JSON_DATE_REGEX.test(this.json) ||
+                           PARTIAL_DATE_REGEX.test(this.json));
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "isUrl", {
+               /*
+                * is this a URL string?
+               */
+               get: function () {
+                   return this.type === 'string' && (this.json.indexOf('http') === 0);
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "isArray", {
+               /*
+                * is this an array?
+               */
+               get: function () {
+                   return Array.isArray(this.json);
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "isObject", {
+               /*
+                * is this an object?
+                * Note: In this context arrays are object as well
+               */
+               get: function () {
+                   return helpers_ts_1.isObject(this.json);
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "isEmptyObject", {
+               /*
+                * is this an empty object with no properties?
+               */
+               get: function () {
+                   return !this.keys.length && !this.isArray;
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "isEmpty", {
+               /*
+                * is this an empty object or array?
+               */
+               get: function () {
+                   return this.isEmptyObject || (this.keys && !this.keys.length && this.isArray);
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "hasKey", {
+               /*
+                * did we receive a key argument?
+                * This means that the formatter was called as a sub formatter of a parent formatter
+               */
+               get: function () {
+                   return typeof this.key !== 'undefined';
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "constructorName", {
+               /*
+                * if this is an object, get constructor function name
+               */
+               get: function () {
+                   return helpers_ts_1.getObjectName(this.json);
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "type", {
+               /*
+                * get type of this value
+                * Possible values: all JavaScript primitive types plus "array" and "null"
+               */
+               get: function () {
+                   return helpers_ts_1.getType(this.json);
+               },
+               enumerable: true,
+               configurable: true
+           });
+           Object.defineProperty(JSONFormatter.prototype, "keys", {
+               /*
+                * get object keys
+                * If there is an empty key we pad it wit quotes to make it visible
+               */
+               get: function () {
+                   if (this.isObject) {
+                       return Object.keys(this.json).map(function (key) { return key ? key : '""'; });
+                   }
+                   else {
+                       return [];
+                   }
+               },
+               enumerable: true,
+               configurable: true
+           });
+           /**
+            * Toggles `isOpen` state
+            *
+           */
+           JSONFormatter.prototype.toggleOpen = function () {
+               this.isOpen = !this.isOpen;
+               if (this.element) {
+                   if (this.isOpen) {
+                       this.appendChildren(this.config.animateOpen);
+                   }
+                   else {
+                       this.removeChildren(this.config.animateClose);
+                   }
+                   this.element.classList.toggle(helpers_ts_1.cssClass('open'));
+               }
+           };
+           /**
+           * Open all children up to a certain depth.
+           * Allows actions such as expand all/collapse all
+           *
+           */
+           JSONFormatter.prototype.openAtDepth = function (depth) {
+               if (depth === void 0) { depth = 1; }
+               if (depth < 0) {
+                   return;
+               }
+               this.open = depth;
+               this.isOpen = (depth !== 0);
+               if (this.element) {
+                   this.removeChildren(false);
+                   if (depth === 0) {
+                       this.element.classList.remove(helpers_ts_1.cssClass('open'));
+                   }
+                   else {
+                       this.appendChildren(this.config.animateOpen);
+                       this.element.classList.add(helpers_ts_1.cssClass('open'));
+                   }
+               }
+           };
+           /**
+            * Generates inline preview
+            *
+            * @returns {string}
+           */
+           JSONFormatter.prototype.getInlinepreview = function () {
+               var _this = this;
+               if (this.isArray) {
+                   // if array length is greater then 100 it shows "Array[101]"
+                   if (this.json.length > this.config.hoverPreviewArrayCount) {
+                       return "Array[" + this.json.length + "]";
+                   }
+                   else {
+                       return "[" + this.json.map(helpers_ts_1.getPreview).join(', ') + "]";
+                   }
+               }
+               else {
+                   var keys = this.keys;
+                   // the first five keys (like Chrome Developer Tool)
+                   var narrowKeys = keys.slice(0, this.config.hoverPreviewFieldCount);
+                   // json value schematic information
+                   var kvs = narrowKeys.map(function (key) { return (key + ":" + helpers_ts_1.getPreview(_this.json[key])); });
+                   // if keys count greater then 5 then show ellipsis
+                   var ellipsis = keys.length >= this.config.hoverPreviewFieldCount ? '…' : '';
+                   return "{" + kvs.join(', ') + ellipsis + "}";
+               }
+           };
+           /**
+            * Renders an HTML element and installs event listeners
+            *
+            * @returns {HTMLDivElement}
+           */
+           JSONFormatter.prototype.render = function () {
+               // construct the root element and assign it to this.element
+               this.element = helpers_ts_1.createElement('div', 'row');
+               // construct the toggler link
+               var togglerLink = helpers_ts_1.createElement('a', 'toggler-link');
+               // if this is an object we need a wrapper span (toggler)
+               if (this.isObject) {
+                   togglerLink.appendChild(helpers_ts_1.createElement('span', 'toggler'));
+               }
+               // if this is child of a parent formatter we need to append the key
+               if (this.hasKey) {
+                   togglerLink.appendChild(helpers_ts_1.createElement('span', 'key', this.key + ":"));
+               }
+               // Value for objects and arrays
+               if (this.isObject) {
+                   // construct the value holder element
+                   var value = helpers_ts_1.createElement('span', 'value');
+                   // we need a wrapper span for objects
+                   var objectWrapperSpan = helpers_ts_1.createElement('span');
+                   // get constructor name and append it to wrapper span
+                   var constructorName = helpers_ts_1.createElement('span', 'constructor-name', this.constructorName);
+                   objectWrapperSpan.appendChild(constructorName);
+                   // if it's an array append the array specific elements like brackets and length
+                   if (this.isArray) {
+                       var arrayWrapperSpan = helpers_ts_1.createElement('span');
+                       arrayWrapperSpan.appendChild(helpers_ts_1.createElement('span', 'bracket', '['));
+                       arrayWrapperSpan.appendChild(helpers_ts_1.createElement('span', 'number', (this.json.length)));
+                       arrayWrapperSpan.appendChild(helpers_ts_1.createElement('span', 'bracket', ']'));
+                       objectWrapperSpan.appendChild(arrayWrapperSpan);
+                   }
+                   // append object wrapper span to toggler link
+                   value.appendChild(objectWrapperSpan);
+                   togglerLink.appendChild(value);
+               }
+               else {
+                   // make a value holder element
+                   var value = this.isUrl ? helpers_ts_1.createElement('a') : helpers_ts_1.createElement('span');
+                   // add type and other type related CSS classes
+                   value.classList.add(helpers_ts_1.cssClass(this.type));
+                   if (this.isDate) {
+                       value.classList.add(helpers_ts_1.cssClass('date'));
+                   }
+                   if (this.isUrl) {
+                       value.classList.add(helpers_ts_1.cssClass('url'));
+                       value.setAttribute('href', this.json);
+                   }
+                   // Append value content to value element
+                   var valuePreview = helpers_ts_1.getValuePreview(this.json, this.json);
+                   value.appendChild(document.createTextNode(valuePreview));
+                   // append the value element to toggler link
+                   togglerLink.appendChild(value);
+               }
+               // if hover preview is enabled, append the inline preview element
+               if (this.isObject && this.config.hoverPreviewEnabled) {
+                   var preview = helpers_ts_1.createElement('span', 'preview-text');
+                   preview.appendChild(document.createTextNode(this.getInlinepreview()));
+                   togglerLink.appendChild(preview);
+               }
+               // construct a children element
+               var children = helpers_ts_1.createElement('div', 'children');
+               // set CSS classes for children
+               if (this.isObject) {
+                   children.classList.add(helpers_ts_1.cssClass('object'));
+               }
+               if (this.isArray) {
+                   children.classList.add(helpers_ts_1.cssClass('array'));
+               }
+               if (this.isEmpty) {
+                   children.classList.add(helpers_ts_1.cssClass('empty'));
+               }
+               // set CSS classes for root element
+               if (this.config && this.config.theme) {
+                   this.element.classList.add(helpers_ts_1.cssClass(this.config.theme));
+               }
+               if (this.isOpen) {
+                   this.element.classList.add(helpers_ts_1.cssClass('open'));
+               }
+               // append toggler and children elements to root element
+               this.element.appendChild(togglerLink);
+               this.element.appendChild(children);
+               // if formatter is set to be open call appendChildren
+               if (this.isObject && this.isOpen) {
+                   this.appendChildren();
+               }
+               // add event listener for toggling
+               if (this.isObject) {
+                   togglerLink.addEventListener('click', this.toggleOpen.bind(this));
+               }
+               return this.element;
+           };
+           /**
+            * Appends all the children to children element
+            * Animated option is used when user triggers this via a click
+           */
+           JSONFormatter.prototype.appendChildren = function (animated) {
+               var _this = this;
+               if (animated === void 0) { animated = false; }
+               var children = this.element.querySelector("div." + helpers_ts_1.cssClass('children'));
+               if (!children || this.isEmpty) {
+                   return;
+               }
+               if (animated) {
+                   var index_1 = 0;
+                   var addAChild_1 = function () {
+                       var key = _this.keys[index_1];
+                       var formatter = new JSONFormatter(_this.json[key], _this.open - 1, _this.config, key);
+                       children.appendChild(formatter.render());
+                       index_1 += 1;
+                       if (index_1 < _this.keys.length) {
+                           if (index_1 > MAX_ANIMATED_TOGGLE_ITEMS) {
+                               addAChild_1();
+                           }
+                           else {
+                               requestAnimationFrame(addAChild_1);
+                           }
+                       }
+                   };
+                   requestAnimationFrame(addAChild_1);
+               }
+               else {
+                   this.keys.forEach(function (key) {
+                       var formatter = new JSONFormatter(_this.json[key], _this.open - 1, _this.config, key);
+                       children.appendChild(formatter.render());
+                   });
+               }
+           };
+           /**
+            * Removes all the children from children element
+            * Animated option is used when user triggers this via a click
+           */
+           JSONFormatter.prototype.removeChildren = function (animated) {
+               if (animated === void 0) { animated = false; }
+               var childrenElement = this.element.querySelector("div." + helpers_ts_1.cssClass('children'));
+               if (animated) {
+                   var childrenRemoved_1 = 0;
+                   var removeAChild_1 = function () {
+                       if (childrenElement && childrenElement.children.length) {
+                           childrenElement.removeChild(childrenElement.children[0]);
+                           childrenRemoved_1 += 1;
+                           if (childrenRemoved_1 > MAX_ANIMATED_TOGGLE_ITEMS) {
+                               removeAChild_1();
+                           }
+                           else {
+                               requestAnimationFrame(removeAChild_1);
+                           }
+                       }
+                   };
+                   requestAnimationFrame(removeAChild_1);
+               }
+               else {
+                   if (childrenElement) {
+                       childrenElement.innerHTML = '';
+                   }
+               }
+           };
+           return JSONFormatter;
+       }());
+
+
+/***/ },
+/* 2 */
+/***/ function(module, exports, __webpack_require__) {
+
+       // style-loader: Adds some css to the DOM by adding a <style> tag
+       
+       // load the styles
+       var content = __webpack_require__(3);
+       if(typeof content === 'string') content = [[module.id, content, '']];
+       // add the styles to the DOM
+       var update = __webpack_require__(5)(content, {"sourceMap":true});
+       if(content.locals) module.exports = content.locals;
+       // Hot Module Replacement
+       if(false) {
+               // When the styles change, update the <style> tags
+               if(!content.locals) {
+                       module.hot.accept("!!./../node_modules/css-loader/index.js?sourceMap!./../node_modules/less-loader/index.js?sourceMap!./style.less", function() {
+                               var newContent = require("!!./../node_modules/css-loader/index.js?sourceMap!./../node_modules/less-loader/index.js?sourceMap!./style.less");
+                               if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
+                               update(newContent);
+                       });
+               }
+               // When the module is disposed, remove the <style> tags
+               module.hot.dispose(function() { update(); });
+       }
+
+/***/ },
+/* 3 */
+/***/ function(module, exports, __webpack_require__) {
+
+       exports = module.exports = __webpack_require__(4)();
+       // imports
+       
+       
+       // module
+       exports.push([module.id, ".json-formatter-row {\n  font-family: monospace;\n}\n.json-formatter-row,\n.json-formatter-row a,\n.json-formatter-row a:hover {\n  color: black;\n  text-decoration: none;\n}\n.json-formatter-row .json-formatter-row {\n  margin-left: 1rem;\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty {\n  opacity: 0.5;\n  margin-left: 1rem;\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty:after {\n  display: none;\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-object:after {\n  content: \"No properties\";\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-array:after {\n  content: \"[]\";\n}\n.json-formatter-row .json-formatter-string {\n  color: green;\n  white-space: pre;\n  word-wrap: break-word;\n}\n.json-formatter-row .json-formatter-number {\n  color: blue;\n}\n.json-formatter-row .json-formatter-boolean {\n  color: red;\n}\n.json-formatter-row .json-formatter-null {\n  color: #855A00;\n}\n.json-formatter-row .json-formatter-undefined {\n  color: #ca0b69;\n}\n.json-formatter-row .json-formatter-function {\n  color: #FF20ED;\n}\n.json-formatter-row .json-formatter-date {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n.json-formatter-row .json-formatter-url {\n  text-decoration: underline;\n  color: blue;\n  cursor: pointer;\n}\n.json-formatter-row .json-formatter-bracket {\n  color: blue;\n}\n.json-formatter-row .json-formatter-key {\n  color: #00008B;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-row .json-formatter-constructor-name {\n  cursor: pointer;\n}\n.json-formatter-row .json-formatter-toggler {\n  line-height: 1.2rem;\n  font-size: 0.7rem;\n  vertical-align: middle;\n  opacity: 0.6;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-row .json-formatter-toggler:after {\n  display: inline-block;\n  transition: transform 100ms ease-in;\n  content: \"\\25BA\";\n}\n.json-formatter-row > a > .json-formatter-preview-text {\n  opacity: 0;\n  transition: opacity 0.15s ease-in;\n  font-style: italic;\n}\n.json-formatter-row:hover > a > .json-formatter-preview-text {\n  opacity: 0.6;\n}\n.json-formatter-row.json-formatter-open > .json-formatter-toggler-link .json-formatter-toggler:after {\n  transform: rotate(90deg);\n}\n.json-formatter-row.json-formatter-open > .json-formatter-children:after {\n  display: inline-block;\n}\n.json-formatter-row.json-formatter-open > a > .json-formatter-preview-text {\n  display: none;\n}\n.json-formatter-row.json-formatter-open.json-formatter-empty:after {\n  display: block;\n}\n.json-formatter-dark.json-formatter-row {\n  font-family: monospace;\n}\n.json-formatter-dark.json-formatter-row,\n.json-formatter-dark.json-formatter-row a,\n.json-formatter-dark.json-formatter-row a:hover {\n  color: white;\n  text-decoration: none;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-row {\n  margin-left: 1rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty {\n  opacity: 0.5;\n  margin-left: 1rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty:after {\n  display: none;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-object:after {\n  content: \"No properties\";\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-array:after {\n  content: \"[]\";\n}\n.json-formatter-dark.json-formatter-row .json-formatter-string {\n  color: #31F031;\n  white-space: pre;\n  word-wrap: break-word;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-number {\n  color: #66C2FF;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-boolean {\n  color: #EC4242;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-null {\n  color: #EEC97D;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-undefined {\n  color: #ef8fbe;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-function {\n  color: #FD48CB;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-date {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n.json-formatter-dark.json-formatter-row .json-formatter-url {\n  text-decoration: underline;\n  color: #027BFF;\n  cursor: pointer;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-bracket {\n  color: #9494FF;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-key {\n  color: #23A0DB;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-constructor-name {\n  cursor: pointer;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-toggler {\n  line-height: 1.2rem;\n  font-size: 0.7rem;\n  vertical-align: middle;\n  opacity: 0.6;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-toggler:after {\n  display: inline-block;\n  transition: transform 100ms ease-in;\n  content: \"\\25BA\";\n}\n.json-formatter-dark.json-formatter-row > a > .json-formatter-preview-text {\n  opacity: 0;\n  transition: opacity 0.15s ease-in;\n  font-style: italic;\n}\n.json-formatter-dark.json-formatter-row:hover > a > .json-formatter-preview-text {\n  opacity: 0.6;\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open > .json-formatter-toggler-link .json-formatter-toggler:after {\n  transform: rotate(90deg);\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open > .json-formatter-children:after {\n  display: inline-block;\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open > a > .json-formatter-preview-text {\n  display: none;\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open.json-formatter-empty:after {\n  display: block;\n}\n", "", {"version":3,"sources":["/./src/style.less","/./src/style.less"],"names":[],"mappings":"AA0GA;EA3FE,uBAAA;CCbD;ADcC;;;EACE,aAAA;EACA,sBAAA;CCVH;ADkGD;EApFI,kBAAA;CCXH;ADeG;EACE,aAAA;EACA,kBAAA;CCbL;ADeK;EAAU,cAAA;CCZf;ADaK;EAAgC,yBAAA;CCVrC;ADWK;EAA+B,cAAA;CCRpC;ADkFD;EArEI,aAAA;EACA,iBAAA;EACA,sBAAA;CCVH;AD6ED;EAjE2B,YAAA;CCT1B;AD0ED;EAhE4B,WAAA;CCP3B;ADuED;EA/DyB,eAAA;CCLxB;ADoED;EA9D8B,eAAA;CCH7B;ADiED;EA7D6B,eAAA;CCD5B;AD8DD;EA5DyB,sCAAA;CCCxB;AD2DD;EA1DI,2BAAA;EACA,YAAA;EACA,gBAAA;CCEH;ADsDD;EArD4B,YAAA;CCE3B;ADmDD;EAnDI,eAAA;EACA,gBAAA;EACA,sBAAA;CCGH;AD8CD;EA9CI,gBAAA;CCGH;AD2CD;EA1CI,oBAAA;EACA,kBAAA;EACA,uBAAA;EACA,aAAA;EACA,gBAAA;EACA,sBAAA;CCEH;ADAG;EACE,sBAAA;EACA,oCAAA;EACA,iBAAA;CCEL;AD8BD;EA1BI,WAAA;EACA,kCAAA;EACA,mBAAA;CCDH;ADGC;EACE,aAAA;CCDH;ADKC;EAEI,yBAAA;CCJL;ADEC;EAKI,sBAAA;CCJL;ADDC;EAQI,cAAA;CCJL;ADMG;EACE,eAAA;CCJL;ADeD;EAhGE,uBAAA;CCoFD;ADnFC;;;EACE,aAAA;EACA,sBAAA;CCuFH;ADMD;EAzFI,kBAAA;CCsFH;ADlFG;EACE,aAAA;EACA,kBAAA;CCoFL;ADlFK;EAAU,cAAA;CCqFf;ADpFK;EAAgC,yBAAA;CCuFrC;ADtFK;EAA+B,cAAA;CCyFpC;ADVD;EA1EI,eAAA;EACA,iBAAA;EACA,sBAAA;CCuFH;ADfD;EAtE2B,eAAA;CCwF1B;ADlBD;EArE4B,eAAA;CC0F3B;ADrBD;EApEyB,eAAA;CC4FxB;ADxBD;EAnE8B,eAAA;CC8F7B;AD3BD;EAlE6B,eAAA;CCgG5B;AD9BD;EAjEyB,4CAAA;CCkGxB;ADjCD;EA/DI,2BAAA;EACA,eAAA;EACA,gBAAA;CCmGH;ADtCD;EA1D4B,eAAA;CCmG3B;ADzCD;EAxDI,eAAA;EACA,gBAAA;EACA,sBAAA;CCoGH;AD9CD;EAnDI,gBAAA;CCoGH;ADjDD;EA/CI,oBAAA;EACA,kBAAA;EACA,uBAAA;EACA,aAAA;EACA,gBAAA;EACA,sBAAA;CCmGH;ADjGG;EACE,sBAAA;EACA,oCAAA;EACA,iBAAA;CCmGL;AD9DD;EA/BI,WAAA;EACA,kCAAA;EACA,mBAAA;CCgGH;AD9FC;EACE,aAAA;CCgGH;AD5FC;EAEI,yBAAA;CC6FL;AD/FC;EAKI,sBAAA;CC6FL;ADlGC;EAQI,cAAA;CC6FL;AD3FG;EACE,eAAA;CC6FL","file":"style.less","sourcesContent":[".theme(\n  @default-color: black,\n  @string-color: green,\n  @number-color: blue,\n  @boolean-color: red,\n  @null-color: #855A00,\n  @undefined-color: rgb(202, 11, 105),\n  @function-color: #FF20ED,\n  @rotate-time: 100ms,\n  @toggler-opacity: 0.6,\n  @toggler-color: #45376F,\n  @bracket-color: blue,\n  @key-color: #00008B,\n  @url-color: blue ){\n\n  font-family: monospace;\n  &, a, a:hover {\n    color: @default-color;\n    text-decoration: none;\n  }\n\n  .json-formatter-row {\n    margin-left: 1rem;\n  }\n\n  .json-formatter-children {\n    &.json-formatter-empty {\n      opacity: 0.5;\n      margin-left: 1rem;\n\n      &:after { display: none; }\n      &.json-formatter-object:after { content: \"No properties\"; }\n      &.json-formatter-array:after { content: \"[]\"; }\n    }\n  }\n\n  .json-formatter-string {\n    color: @string-color;\n    white-space: pre;\n    word-wrap: break-word;\n  }\n  .json-formatter-number { color: @number-color; }\n  .json-formatter-boolean { color: @boolean-color; }\n  .json-formatter-null { color: @null-color; }\n  .json-formatter-undefined { color: @undefined-color; }\n  .json-formatter-function { color: @function-color; }\n  .json-formatter-date { background-color: fade(@default-color, 5%); }\n  .json-formatter-url {\n    text-decoration: underline;\n    color: @url-color;\n    cursor: pointer;\n  }\n\n  .json-formatter-bracket { color: @bracket-color; }\n  .json-formatter-key {\n    color: @key-color;\n    cursor: pointer;\n    padding-right: 0.2rem;\n  }\n  .json-formatter-constructor-name {\n    cursor: pointer;\n  }\n\n  .json-formatter-toggler {\n    line-height: 1.2rem;\n    font-size: 0.7rem;\n    vertical-align: middle;\n    opacity: @toggler-opacity;\n    cursor: pointer;\n    padding-right: 0.2rem;\n\n    &:after {\n      display: inline-block;\n      transition: transform @rotate-time ease-in;\n      content: \"►\";\n    }\n  }\n\n  // Inline preview on hover (optional)\n  > a > .json-formatter-preview-text {\n    opacity: 0;\n    transition: opacity .15s ease-in;\n    font-style: italic;\n  }\n  &:hover > a > .json-formatter-preview-text {\n    opacity: 0.6;\n  }\n\n  // Open state\n  &.json-formatter-open {\n    > .json-formatter-toggler-link .json-formatter-toggler:after{\n      transform: rotate(90deg);\n    }\n    > .json-formatter-children:after {\n      display: inline-block;\n    }\n    > a > .json-formatter-preview-text {\n      display: none;\n    }\n    &.json-formatter-empty:after {\n      display: block;\n    }\n  }\n}\n\n// Default theme\n.json-formatter-row {\n  .theme();\n}\n\n// Dark theme\n.json-formatter-dark.json-formatter-row {\n  .theme(\n    @default-color: white,\n    @string-color: #31F031,\n    @number-color: #66C2FF,\n    @boolean-color: #EC4242,\n    @null-color: #EEC97D,\n    @undefined-color: rgb(239, 143, 190),\n    @function-color: #FD48CB,\n    @rotate-time: 100ms,\n    @toggler-opacity: 0.6,\n    @toggler-color: #45376F,\n    @bracket-color: #9494FF,\n    @key-color: #23A0DB,\n    @url-color: #027BFF);\n}\n",".json-formatter-row {\n  font-family: monospace;\n}\n.json-formatter-row,\n.json-formatter-row a,\n.json-formatter-row a:hover {\n  color: black;\n  text-decoration: none;\n}\n.json-formatter-row .json-formatter-row {\n  margin-left: 1rem;\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty {\n  opacity: 0.5;\n  margin-left: 1rem;\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty:after {\n  display: none;\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-object:after {\n  content: \"No properties\";\n}\n.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-array:after {\n  content: \"[]\";\n}\n.json-formatter-row .json-formatter-string {\n  color: green;\n  white-space: pre;\n  word-wrap: break-word;\n}\n.json-formatter-row .json-formatter-number {\n  color: blue;\n}\n.json-formatter-row .json-formatter-boolean {\n  color: red;\n}\n.json-formatter-row .json-formatter-null {\n  color: #855A00;\n}\n.json-formatter-row .json-formatter-undefined {\n  color: #ca0b69;\n}\n.json-formatter-row .json-formatter-function {\n  color: #FF20ED;\n}\n.json-formatter-row .json-formatter-date {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n.json-formatter-row .json-formatter-url {\n  text-decoration: underline;\n  color: blue;\n  cursor: pointer;\n}\n.json-formatter-row .json-formatter-bracket {\n  color: blue;\n}\n.json-formatter-row .json-formatter-key {\n  color: #00008B;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-row .json-formatter-constructor-name {\n  cursor: pointer;\n}\n.json-formatter-row .json-formatter-toggler {\n  line-height: 1.2rem;\n  font-size: 0.7rem;\n  vertical-align: middle;\n  opacity: 0.6;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-row .json-formatter-toggler:after {\n  display: inline-block;\n  transition: transform 100ms ease-in;\n  content: \"►\";\n}\n.json-formatter-row > a > .json-formatter-preview-text {\n  opacity: 0;\n  transition: opacity 0.15s ease-in;\n  font-style: italic;\n}\n.json-formatter-row:hover > a > .json-formatter-preview-text {\n  opacity: 0.6;\n}\n.json-formatter-row.json-formatter-open > .json-formatter-toggler-link .json-formatter-toggler:after {\n  transform: rotate(90deg);\n}\n.json-formatter-row.json-formatter-open > .json-formatter-children:after {\n  display: inline-block;\n}\n.json-formatter-row.json-formatter-open > a > .json-formatter-preview-text {\n  display: none;\n}\n.json-formatter-row.json-formatter-open.json-formatter-empty:after {\n  display: block;\n}\n.json-formatter-dark.json-formatter-row {\n  font-family: monospace;\n}\n.json-formatter-dark.json-formatter-row,\n.json-formatter-dark.json-formatter-row a,\n.json-formatter-dark.json-formatter-row a:hover {\n  color: white;\n  text-decoration: none;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-row {\n  margin-left: 1rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty {\n  opacity: 0.5;\n  margin-left: 1rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty:after {\n  display: none;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-object:after {\n  content: \"No properties\";\n}\n.json-formatter-dark.json-formatter-row .json-formatter-children.json-formatter-empty.json-formatter-array:after {\n  content: \"[]\";\n}\n.json-formatter-dark.json-formatter-row .json-formatter-string {\n  color: #31F031;\n  white-space: pre;\n  word-wrap: break-word;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-number {\n  color: #66C2FF;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-boolean {\n  color: #EC4242;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-null {\n  color: #EEC97D;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-undefined {\n  color: #ef8fbe;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-function {\n  color: #FD48CB;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-date {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n.json-formatter-dark.json-formatter-row .json-formatter-url {\n  text-decoration: underline;\n  color: #027BFF;\n  cursor: pointer;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-bracket {\n  color: #9494FF;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-key {\n  color: #23A0DB;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-constructor-name {\n  cursor: pointer;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-toggler {\n  line-height: 1.2rem;\n  font-size: 0.7rem;\n  vertical-align: middle;\n  opacity: 0.6;\n  cursor: pointer;\n  padding-right: 0.2rem;\n}\n.json-formatter-dark.json-formatter-row .json-formatter-toggler:after {\n  display: inline-block;\n  transition: transform 100ms ease-in;\n  content: \"►\";\n}\n.json-formatter-dark.json-formatter-row > a > .json-formatter-preview-text {\n  opacity: 0;\n  transition: opacity 0.15s ease-in;\n  font-style: italic;\n}\n.json-formatter-dark.json-formatter-row:hover > a > .json-formatter-preview-text {\n  opacity: 0.6;\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open > .json-formatter-toggler-link .json-formatter-toggler:after {\n  transform: rotate(90deg);\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open > .json-formatter-children:after {\n  display: inline-block;\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open > a > .json-formatter-preview-text {\n  display: none;\n}\n.json-formatter-dark.json-formatter-row.json-formatter-open.json-formatter-empty:after {\n  display: block;\n}\n"],"sourceRoot":"webpack://"}]);
+       
+       // exports
+
+
+/***/ },
+/* 4 */
+/***/ function(module, exports) {
+
+       /*
+               MIT License http://www.opensource.org/licenses/mit-license.php
+               Author Tobias Koppers @sokra
+       */
+       // css base code, injected by the css-loader
+       module.exports = function() {
+               var list = [];
+       
+               // return the list of modules as css string
+               list.toString = function toString() {
+                       var result = [];
+                       for(var i = 0; i < this.length; i++) {
+                               var item = this[i];
+                               if(item[2]) {
+                                       result.push("@media " + item[2] + "{" + item[1] + "}");
+                               } else {
+                                       result.push(item[1]);
+                               }
+                       }
+                       return result.join("");
+               };
+       
+               // import a list of modules into the list
+               list.i = function(modules, mediaQuery) {
+                       if(typeof modules === "string")
+                               modules = [[null, modules, ""]];
+                       var alreadyImportedModules = {};
+                       for(var i = 0; i < this.length; i++) {
+                               var id = this[i][0];
+                               if(typeof id === "number")
+                                       alreadyImportedModules[id] = true;
+                       }
+                       for(i = 0; i < modules.length; i++) {
+                               var item = modules[i];
+                               // skip already imported module
+                               // this implementation is not 100% perfect for weird media query combinations
+                               //  when a module is imported multiple times with different media queries.
+                               //  I hope this will never occur (Hey this way we have smaller bundles)
+                               if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
+                                       if(mediaQuery && !item[2]) {
+                                               item[2] = mediaQuery;
+                                       } else if(mediaQuery) {
+                                               item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
+                                       }
+                                       list.push(item);
+                               }
+                       }
+               };
+               return list;
+       };
+
+
+/***/ },
+/* 5 */
+/***/ function(module, exports, __webpack_require__) {
+
+       /*
+               MIT License http://www.opensource.org/licenses/mit-license.php
+               Author Tobias Koppers @sokra
+       */
+       var stylesInDom = {},
+               memoize = function(fn) {
+                       var memo;
+                       return function () {
+                               if (typeof memo === "undefined") memo = fn.apply(this, arguments);
+                               return memo;
+                       };
+               },
+               isOldIE = memoize(function() {
+                       return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
+               }),
+               getHeadElement = memoize(function () {
+                       return document.head || document.getElementsByTagName("head")[0];
+               }),
+               singletonElement = null,
+               singletonCounter = 0,
+               styleElementsInsertedAtTop = [];
+       
+       module.exports = function(list, options) {
+               if(false) {
+                       if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
+               }
+       
+               options = options || {};
+               // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
+               // tags it will allow on a page
+               if (typeof options.singleton === "undefined") options.singleton = isOldIE();
+       
+               // By default, add <style> tags to the bottom of <head>.
+               if (typeof options.insertAt === "undefined") options.insertAt = "bottom";
+       
+               var styles = listToStyles(list);
+               addStylesToDom(styles, options);
+       
+               return function update(newList) {
+                       var mayRemove = [];
+                       for(var i = 0; i < styles.length; i++) {
+                               var item = styles[i];
+                               var domStyle = stylesInDom[item.id];
+                               domStyle.refs--;
+                               mayRemove.push(domStyle);
+                       }
+                       if(newList) {
+                               var newStyles = listToStyles(newList);
+                               addStylesToDom(newStyles, options);
+                       }
+                       for(var i = 0; i < mayRemove.length; i++) {
+                               var domStyle = mayRemove[i];
+                               if(domStyle.refs === 0) {
+                                       for(var j = 0; j < domStyle.parts.length; j++)
+                                               domStyle.parts[j]();
+                                       delete stylesInDom[domStyle.id];
+                               }
+                       }
+               };
+       }
+       
+       function addStylesToDom(styles, options) {
+               for(var i = 0; i < styles.length; i++) {
+                       var item = styles[i];
+                       var domStyle = stylesInDom[item.id];
+                       if(domStyle) {
+                               domStyle.refs++;
+                               for(var j = 0; j < domStyle.parts.length; j++) {
+                                       domStyle.parts[j](item.parts[j]);
+                               }
+                               for(; j < item.parts.length; j++) {
+                                       domStyle.parts.push(addStyle(item.parts[j], options));
+                               }
+                       } else {
+                               var parts = [];
+                               for(var j = 0; j < item.parts.length; j++) {
+                                       parts.push(addStyle(item.parts[j], options));
+                               }
+                               stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
+                       }
+               }
+       }
+       
+       function listToStyles(list) {
+               var styles = [];
+               var newStyles = {};
+               for(var i = 0; i < list.length; i++) {
+                       var item = list[i];
+                       var id = item[0];
+                       var css = item[1];
+                       var media = item[2];
+                       var sourceMap = item[3];
+                       var part = {css: css, media: media, sourceMap: sourceMap};
+                       if(!newStyles[id])
+                               styles.push(newStyles[id] = {id: id, parts: [part]});
+                       else
+                               newStyles[id].parts.push(part);
+               }
+               return styles;
+       }
+       
+       function insertStyleElement(options, styleElement) {
+               var head = getHeadElement();
+               var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
+               if (options.insertAt === "top") {
+                       if(!lastStyleElementInsertedAtTop) {
+                               head.insertBefore(styleElement, head.firstChild);
+                       } else if(lastStyleElementInsertedAtTop.nextSibling) {
+                               head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
+                       } else {
+                               head.appendChild(styleElement);
+                       }
+                       styleElementsInsertedAtTop.push(styleElement);
+               } else if (options.insertAt === "bottom") {
+                       head.appendChild(styleElement);
+               } else {
+                       throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
+               }
+       }
+       
+       function removeStyleElement(styleElement) {
+               styleElement.parentNode.removeChild(styleElement);
+               var idx = styleElementsInsertedAtTop.indexOf(styleElement);
+               if(idx >= 0) {
+                       styleElementsInsertedAtTop.splice(idx, 1);
+               }
+       }
+       
+       function createStyleElement(options) {
+               var styleElement = document.createElement("style");
+               styleElement.type = "text/css";
+               insertStyleElement(options, styleElement);
+               return styleElement;
+       }
+       
+       function createLinkElement(options) {
+               var linkElement = document.createElement("link");
+               linkElement.rel = "stylesheet";
+               insertStyleElement(options, linkElement);
+               return linkElement;
+       }
+       
+       function addStyle(obj, options) {
+               var styleElement, update, remove;
+       
+               if (options.singleton) {
+                       var styleIndex = singletonCounter++;
+                       styleElement = singletonElement || (singletonElement = createStyleElement(options));
+                       update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
+                       remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
+               } else if(obj.sourceMap &&
+                       typeof URL === "function" &&
+                       typeof URL.createObjectURL === "function" &&
+                       typeof URL.revokeObjectURL === "function" &&
+                       typeof Blob === "function" &&
+                       typeof btoa === "function") {
+                       styleElement = createLinkElement(options);
+                       update = updateLink.bind(null, styleElement);
+                       remove = function() {
+                               removeStyleElement(styleElement);
+                               if(styleElement.href)
+                                       URL.revokeObjectURL(styleElement.href);
+                       };
+               } else {
+                       styleElement = createStyleElement(options);
+                       update = applyToTag.bind(null, styleElement);
+                       remove = function() {
+                               removeStyleElement(styleElement);
+                       };
+               }
+       
+               update(obj);
+       
+               return function updateStyle(newObj) {
+                       if(newObj) {
+                               if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
+                                       return;
+                               update(obj = newObj);
+                       } else {
+                               remove();
+                       }
+               };
+       }
+       
+       var replaceText = (function () {
+               var textStore = [];
+       
+               return function (index, replacement) {
+                       textStore[index] = replacement;
+                       return textStore.filter(Boolean).join('\n');
+               };
+       })();
+       
+       function applyToSingletonTag(styleElement, index, remove, obj) {
+               var css = remove ? "" : obj.css;
+       
+               if (styleElement.styleSheet) {
+                       styleElement.styleSheet.cssText = replaceText(index, css);
+               } else {
+                       var cssNode = document.createTextNode(css);
+                       var childNodes = styleElement.childNodes;
+                       if (childNodes[index]) styleElement.removeChild(childNodes[index]);
+                       if (childNodes.length) {
+                               styleElement.insertBefore(cssNode, childNodes[index]);
+                       } else {
+                               styleElement.appendChild(cssNode);
+                       }
+               }
+       }
+       
+       function applyToTag(styleElement, obj) {
+               var css = obj.css;
+               var media = obj.media;
+       
+               if(media) {
+                       styleElement.setAttribute("media", media)
+               }
+       
+               if(styleElement.styleSheet) {
+                       styleElement.styleSheet.cssText = css;
+               } else {
+                       while(styleElement.firstChild) {
+                               styleElement.removeChild(styleElement.firstChild);
+                       }
+                       styleElement.appendChild(document.createTextNode(css));
+               }
+       }
+       
+       function updateLink(linkElement, obj) {
+               var css = obj.css;
+               var sourceMap = obj.sourceMap;
+       
+               if(sourceMap) {
+            // https://developer.mozilla.org/en/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
+                       css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
+               }
+       
+               var blob = new Blob([css], { type: "text/css" });
+       
+               var oldSrc = linkElement.href;
+       
+               linkElement.href = URL.createObjectURL(blob);
+       
+               if(oldSrc)
+                       URL.revokeObjectURL(oldSrc);
+       }
+
+
+/***/ },
+/* 6 */
+/***/ function(module, exports) {
+
+       "use strict";
+       /*
+        * Escapes `"` characters from string
+        */
+       function escapeString(str) {
+           return str.replace('"', '\"');
+       }
+       /*
+        * Determines if a value is an object
+        */
+       function isObject(value) {
+           var type = typeof value;
+           return !!value && (type == 'object');
+       }
+       exports.isObject = isObject;
+       /*
+        * Gets constructor name of an object.
+        *
+        */
+       function getObjectName(object) {
+           if (object === undefined) {
+               return '';
+           }
+           if (object === null || (typeof object === 'object' && !object.constructor)) {
+               return 'Object';
+           }
+           var funcNameRegex = /function ([^(]*)/;
+           var results = (funcNameRegex).exec((object).constructor.toString());
+           if (results && results.length > 1) {
+               return results[1];
+           } else {
+               return '';
+           }
+       }
+       exports.getObjectName = getObjectName;
+       /*
+        * Gets type of an object. Returns "null" for null objects
+        */
+       function getType(object) {
+           if (object === null) {
+               return 'null';
+           }
+           return typeof object;
+       }
+       exports.getType = getType;
+       /*
+        * Generates inline preview for a JavaScript object based on a value
+       */
+       function getValuePreview(object, value) {
+           var type = getType(object);
+           if (type === 'null' || type === 'undefined') {
+               return type;
+           }
+           if (type === 'string') {
+               value = '"' + escapeString(value) + '"';
+           }
+           if (type === 'function') {
+               // Remove content of the function
+               return object.toString()
+                   .replace(/[\r\n]/g, '')
+                   .replace(/\{.*\}/, '') + '{…}';
+           }
+           return value;
+       }
+       exports.getValuePreview = getValuePreview;
+       /*
+        * Generates inline preview for a JavaScript object
+       */
+       function getPreview(object) {
+           var value = '';
+           if (isObject(object)) {
+               value = getObjectName(object);
+               if (Array.isArray(object))
+                   value += '[' + object.length + ']';
+           }
+           else {
+               value = getValuePreview(object, object);
+           }
+           return value;
+       }
+       exports.getPreview = getPreview;
+       /*
+        * Generates a prefixed CSS class name
+       */
+       function cssClass(className) {
+           return "json-formatter-" + className;
+       }
+       exports.cssClass = cssClass;
+       /*
+         * Creates a new DOM element with given type and class
+         * TODO: move me to helpers
+       */
+       function createElement(type, className, content) {
+           var el = document.createElement(type);
+           if (className) {
+               el.classList.add(cssClass(className));
+           }
+           if (content !== undefined) {
+               if (content instanceof Node) {
+                   el.appendChild(content);
+               }
+               else {
+                   el.appendChild(document.createTextNode(String(content)));
+               }
+           }
+           return el;
+       }
+       exports.createElement = createElement;
+
+
+/***/ }
+/******/ ])
+});
+;
+//# sourceMappingURL=json-formatter.js.map
+
+</script>
+
+  <script>
+
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSONSchemaView = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+'use strict';
+/*
+ * Converts anyOf, allOf and oneOf to human readable string
+*/
+Object.defineProperty(exports, '__esModule', {
+  value: true
+});
+exports.convertXOf = convertXOf;
+exports._if = _if;
+
+function convertXOf(type) {
+  return type.substring(0, 3) + ' of';
+}
+
+/*
+ * if condition for ES6 template strings
+ * to be used only in template string
+ *
+ * @example mystr = `Random is ${_if(Math.random() > 0.5)`greater than 0.5``
+ *
+ * @param {boolean} condition
+ *
+ * @returns {function} the template function
+*/
+
+function _if(condition) {
+  return condition ? normal : empty;
+}
+
+function empty() {
+  return '';
+}
+function normal(template) {
+  for (var _len = arguments.length, expressions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+    expressions[_key - 1] = arguments[_key];
+  }
+
+  return template.slice(1).reduce(function (accumulator, part, i) {
+    return accumulator + expressions[i] + part;
+  }, template[0]);
+}
+
+},{}],2:[function(require,module,exports){
+'use strict';
+
+/* globals JSONSchemaView */
+
+Object.defineProperty(exports, '__esModule', {
+  value: true
+});
+
+var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+var _templateObject = _taggedTemplateLiteral(['\n        <div class="any">\n          ', '\n\n          <span class="type type-any">&lt;any&gt;</span>\n\n          ', '\n\t\t \n\t\t  ', '\n\t\t  ', '\n\t\t   ', '\n        </div>\n      '], ['\n        <div class="any">\n          ', '\n\n          <span class="type type-any">&lt;any&gt;</span>\n\n          ', '\n\t\t \n\t\t  ', '\n\t\t  ', '\n\t\t   ', '\n        </div>\n      ']),
+    _templateObject2 = _taggedTemplateLiteral(['\n            <a class="title"><span class="toggle-handle"></span>', ' </a>\n          '], ['\n            <a class="title"><span class="toggle-handle"></span>', ' </a>\n          ']),
+    _templateObject3 = _taggedTemplateLiteral(['\n            <div class="inner description marked">', '</div>\n          '], ['\n            <div class="inner description marked">', '</div>\n          ']),
+    _templateObject4 = _taggedTemplateLiteral(['\n            <div class="inner required">Required: ', '</div>\n          '], ['\n            <div class="inner required">Required: ', '</div>\n          ']),
+    _templateObject5 = _taggedTemplateLiteral(['\n            <div class="inner default">Default: ', '</div>\n          '], ['\n            <div class="inner default">Default: ', '</div>\n          ']),
+    _templateObject6 = _taggedTemplateLiteral(['\n            <div class="inner pattern">Pattern: ', '</div>\n          '], ['\n            <div class="inner pattern">Pattern: ', '</div>\n          ']),
+    _templateObject7 = _taggedTemplateLiteral(['\n        <div class="primitive">\n          ', '\n\n            <span class="type">', '</span>\n\n         \n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\t\t  \n\t\t \n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t   ', '\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n        </div>\n      '], ['\n        <div class="primitive">\n          ', '\n\n            <span class="type">', '</span>\n\n         \n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\t\t  \n\t\t \n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t   ', '\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n        </div>\n      ']),
+    _templateObject8 = _taggedTemplateLiteral(['\n            <span class="format">(', ')</span>\n          '], ['\n            <span class="format">(', ')</span>\n          ']),
+    _templateObject9 = _taggedTemplateLiteral(['\n            <span class="range minimum">minimum:', '</span>\n          '], ['\n            <span class="range minimum">minimum:', '</span>\n          ']),
+    _templateObject10 = _taggedTemplateLiteral(['\n            <span class="range exclusiveMinimum">(ex)minimum:', '</span>\n          '], ['\n            <span class="range exclusiveMinimum">(ex)minimum:', '</span>\n          ']),
+    _templateObject11 = _taggedTemplateLiteral(['\n            <span class="range maximum">maximum:', '</span>\n          '], ['\n            <span class="range maximum">maximum:', '</span>\n          ']),
+    _templateObject12 = _taggedTemplateLiteral(['\n            <span class="range exclusiveMaximum">(ex)maximum:', '</span>\n          '], ['\n            <span class="range exclusiveMaximum">(ex)maximum:', '</span>\n          ']),
+    _templateObject13 = _taggedTemplateLiteral(['\n            <span class="range minLength">minLength:', '</span>\n          '], ['\n            <span class="range minLength">minLength:', '</span>\n          ']),
+    _templateObject14 = _taggedTemplateLiteral(['\n            <span class="range maxLength">maxLength:', '</span>\n          '], ['\n            <span class="range maxLength">maxLength:', '</span>\n          ']),
+    _templateObject15 = _taggedTemplateLiteral(['\n            <div class="inner required">Required</div>\n          '], ['\n            <div class="inner required">Required</div>\n          ']),
+    _templateObject16 = _taggedTemplateLiteral(['\n            ', '\n          '], ['\n            ', '\n          ']),
+    _templateObject17 = _taggedTemplateLiteral(['', ''], ['', '']),
+    _templateObject18 = _taggedTemplateLiteral(['\n        <div class="array">\n          <a class="title"><span class="toggle-handle"></span>', '<span class="opening bracket">[</span>', '</a>\n          ', '\n          <div class="inner">\n            ', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      '], ['\n        <div class="array">\n          <a class="title"><span class="toggle-handle"></span>', '<span class="opening bracket">[</span>', '</a>\n          ', '\n          <div class="inner">\n            ', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      ']),
+    _templateObject19 = _taggedTemplateLiteral(['<span class="closing bracket">]</span>'], ['<span class="closing bracket">]</span>']),
+    _templateObject20 = _taggedTemplateLiteral(['\n          <span>\n            <span title="items range">(', '..', ')</span>\n            ', '\n          </span>\n          '], ['\n          <span>\n            <span title="items range">(', '..', ')</span>\n            ', '\n          </span>\n          ']),
+    _templateObject21 = _taggedTemplateLiteral(['<span title="unique" class="uniqueItems">♦</span>'], ['<span title="unique" class="uniqueItems">♦</span>']),
+    _templateObject22 = _taggedTemplateLiteral(['\n              <div class="description">', '</div>\n            '], ['\n              <div class="description">', '</div>\n            ']),
+    _templateObject23 = _taggedTemplateLiteral(['\n          <span class="closing bracket">]</span>\n          '], ['\n          <span class="closing bracket">]</span>\n          ']),
+    _templateObject24 = _taggedTemplateLiteral(['\n        <div class="object">\n          <a class="title"><span\n            class="toggle-handle"></span>', ' <span\n            class="opening brace">{</span>', '</a>\n\n          <div class="inner">\n            ', '\n            <!-- children go here -->\n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t  \n\t\t\t', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      '], ['\n        <div class="object">\n          <a class="title"><span\n            class="toggle-handle"></span>', ' <span\n            class="opening brace">{</span>', '</a>\n\n          <div class="inner">\n            ', '\n            <!-- children go here -->\n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t  \n\t\t\t', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      ']),
+    _templateObject25 = _taggedTemplateLiteral(['\n              <span class="closing brace" ng-if="isCollapsed">}</span>\n          '], ['\n              <span class="closing brace" ng-if="isCollapsed">}</span>\n          ']),
+    _templateObject26 = _taggedTemplateLiteral(['\n            <div class="required">Required: ', '</div>\n          '], ['\n            <div class="required">Required: ', '</div>\n          ']),
+   _templateObject266 = _taggedTemplateLiteral(['\n            <div class="required">Required: ', '</div>\n          '], ['\n            <div class="required">Required: ', '</div>\n          ']),
+    _templateObject27 = _taggedTemplateLiteral(['\n            <div class="default">Default: ', '</div>\n          '], ['\n            <div class="default">Default: ', '</div>\n          ']),
+    _templateObject28 = _taggedTemplateLiteral(['\n              <div class="pattern">Pattern: ', '</div>\n            '], ['\n              <div class="pattern">Pattern: ', '</div>\n            ']),
+    _templateObject29 = _taggedTemplateLiteral(['\n          <span class="closing brace">}</span>\n          '], ['\n          <span class="closing brace">}</span>\n          ']),
+    _templateObject30 = _taggedTemplateLiteral(['\n        <div class="inner enums">\n          <b>Enum:</b>\n        </div>\n      '], ['\n        <div class="inner enums">\n          <b>Enum:</b>\n        </div>\n      ']);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
+
+var _helpersJs = require('./helpers.js');
+
+/**
+ * @class JSONSchemaView
+ *
+ * A pure JavaScript component for rendering JSON Schema in HTML.
+*/
+
+var JSONSchemaView = (function () {
+
+  /**
+   * @param {object} schema The JSON Schema object
+   *
+   * @param {number} [open=1] his number indicates up to how many levels the
+   * rendered tree should expand. Set it to `0` to make the whole tree collapsed
+   * or set it to `Infinity` to expand the tree deeply
+   * @param {object} options.
+   *  theme {string}: one of the following options: ['dark']
+  */
+
+  function JSONSchemaView(schema, open) {
+    var _this = this;
+
+    var options = arguments.length <= 2 || arguments[2] === undefined ? { theme: null } : arguments[2];
+
+    _classCallCheck(this, JSONSchemaView);
+
+    this.schema = schema; //console.log(schema);
+    this.open = open;
+    this.options = options;
+    this.isCollapsed = open <= 0;
+
+    // if schema is an empty object which means any JOSN
+    this.isAny = typeof schema === 'object' && !Array.isArray(schema) && !Object.keys(schema).filter(function (k) {
+      return ['title', 'description'].indexOf(k) === -1;
+    }).length;
+
+    // Determine if a schema is an array
+    this.isArray = !this.isAny && this.schema && this.schema.type === 'array';
+
+    this.isObject = this.schema && (this.schema.type === 'object' || this.schema.properties || this.schema.anyOf || this.schema.oneof || this.schema.allOf);
+
+    // Determine if a schema is a primitive
+    this.isPrimitive = !this.isAny && !this.isArray && !this.isObject;
+
+    //
+    this.showToggle = this.schema.description || this.schema.title || this.isPrimitive && (this.schema.minimum || this.schema.maximum || this.schema.exclusiveMinimum || this.schema.exclusiveMaximum);
+
+    // populate isRequired property down to properties
+    if (this.schema && Array.isArray(this.schema.required)) {
+      this.schema.required.forEach(function (requiredProperty) {
+        if (typeof _this.schema.properties[requiredProperty] === 'object') {
+          _this.schema.properties[requiredProperty].isRequired = true;
+        }
+      });
+    }
+  }
+
+  /*
+   * Returns the template with populated properties.
+   * This template does not have the children
+  */
+
+  _createClass(JSONSchemaView, [{
+    key: 'template',
+    value: function template() {
+      if (!this.schema) {
+        return '';
+      }
+
+      return ('\n      <!-- Any -->\n      ' + (0, _helpersJs._if)(this.isAny)(_templateObject, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, marked(this.schema.description || "")), (0, _helpersJs._if)(this.schema.required && !this.isCollapsed)(_templateObject4, this.schema.required), (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject5, this.schema['default']), (0, _helpersJs._if)(this.schema.pattern && !this.isCollapsed)(_templateObject6, this.schema.pattern)) + '\n\n      <!-- Primitive -->\n      ' + (0, _helpersJs._if)(this.isPrimitive)(_templateObject7, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), this.schema.type, (0, _helpersJs._if)(!this.isCollapsed && this.schema.format)(_templateObject8, this.schema.format), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minimum)(_templateObject9, this.schema.minimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMinimum)(_templateObject10, this.schema.exclusiveMinimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maximum)(_templateObject11, this.schema.maximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMaximum)(_templateObject12, this.schema.exclusiveMaximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minLength)(_templateObject13, this.schema.minLength), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maxLength)(_templateObject14, this.schema.maxLength), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, marked(this.schema.description || "")), (0, _helpersJs._if)(this.schema.required && !this.isCollapsed)(_templateObject15), (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject5, this.schema['default']), (0, _helpersJs._if)(this.schema.pattern && !this.isCollapsed)(_templateObject6, this.schema.pattern), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf'))) + '\n\n\n      <!-- Array -->\n      ' + (0, _helpersJs._if)(this.isArray)(_templateObject18, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject19), (0, _helpersJs._if)(!this.isCollapsed && (this.schema.uniqueItems || this.schema.minItems || this.schema.maxItems))(_templateObject20, this.schema.minItems || 0, this.schema.maxItems || '∞', (0, _helpersJs._if)(!this.isCollapsed && this.schema.uniqueItems)(_templateObject21)), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject22, marked(this.schema.description || "")), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject23)) + '\n\n      <!-- Object -->\n      ' + (0, _helpersJs._if)(!this.isPrimitive && !this.isArray && !this.isAny)(_templateObject24, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject25), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject22, marked(this.schema.description || "")),
+
+        (0, _helpersJs._if)(this.schema.required && !this.isCollapsed && this.options.isBodyParam != true)(_templateObject26, this.schema.required),
+        (0, _helpersJs._if)(this.schema.required && !this.isCollapsed && this.options.isBodyParam == true)(_templateObject266, this.schema.required),
+
+        (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject27, this.schema['default']),(0, _helpersJs._if)(!this.isCollapsed)(_templateObject29),
+        (0, _helpersJs._if)(!this.isCollapsed && this.schema.pattern)(_templateObject28, this.schema.pattern),
+        (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf'))) + '\n').replace(/\s*\n/g, '\n').replace(/(\<\!\-\-).+/g, '').trim();
+    }
+
+    /*
+     * Template for oneOf, anyOf and allOf
+    */
+  }, {
+    key: 'xOf',
+    value: function xOf(schema, type) {
+      return '\n      <div class="inner ' + type + '">\n        <b>' + (0, _helpersJs.convertXOf)(type) + ':</b>\n      </div>\n    ';
+    }
+
+    /*
+     * Template for enums
+    */
+  }, {
+    key: 'enum',
+    value: function _enum(schema, isCollapsed, open) {
+      return '\n      ' + (0, _helpersJs._if)(!isCollapsed && schema['enum'])(_templateObject30) + '\n    ';
+    }
+
+    /*
+     * Toggles the 'collapsed' state
+    */
+  }, {
+    key: 'toggle',
+    value: function toggle() {
+      this.isCollapsed = !this.isCollapsed;
+      this.render();
+    }
+
+    /*
+     * Renders the element and returns it
+    */
+  }, {
+    key: 'render',
+    value: function render() {
+      if (!this.element) {
+        this.element = document.createElement('div');
+        this.element.classList.add('json-schema-view');
+      }
+
+      if (this.isCollapsed) {
+        this.element.classList.add('collapsed');
+      } else {
+        this.element.classList.remove('collapsed');
+      }
+
+      if (this.options.theme) {
+        this.element.classList.add('json-schema-view-' + this.options.theme);
+      }
+
+      this.element.innerHTML = this.template();
+
+      if (!this.schema) {
+        return this.element;
+      }
+
+      if (!this.isCollapsed) {
+        this.appendChildren(this.element);
+      }
+
+      // add event listener for toggling
+      if (this.element.querySelector('a.title')) {
+        this.element.querySelector('a.title').addEventListener('click', this.toggle.bind(this));
+      }
+      return this.element;
+    }
+
+    /*
+     * Appends children to given element based on current schema
+    */
+  }, {
+    key: 'appendChildren',
+    value: function appendChildren(element) {
+      var _this2 = this;
+
+      var inner = element.querySelector('.inner');
+
+      if (!inner) {
+        return;
+      }
+
+      if (this.schema['enum']) {
+        var tempDiv = document.createElement('span');;
+        tempDiv.classList.add('inner');
+        tempDiv.innerHTML = '<code>' + this.schema['enum'].join('</code>, <code>') + '</code>';
+        element.querySelector('.enums.inner').appendChild(tempDiv);
+      }
+
+      if (this.isArray) {
+        var view = new JSONSchemaView(this.schema.items, Infinity);
+        inner.appendChild(view.render());
+      }
+
+      if (typeof this.schema.properties === 'object') {
+        Object.keys(this.schema.properties).forEach(function (propertyName) {
+          var property = _this2.schema.properties[propertyName];
+          var tempDiv = document.createElement('div');;
+          tempDiv.innerHTML = '<div class="property">\n          <span class="name">' + propertyName + ':</span>\n        </div>';
+          var view = new JSONSchemaView(property, _this2.open - 1);
+          tempDiv.querySelector('.property').appendChild(view.render());
+
+          inner.appendChild(tempDiv.querySelector('.property'));
+        });
+      }
+
+      if (this.schema.allOf) {
+        appendXOf.call(this, 'allOf');
+      }
+      if (this.schema.oneOf) {
+        appendXOf.call(this, 'oneOf');
+      }
+      if (this.schema.anyOf) {
+        appendXOf.call(this, 'anyOf');
+      }
+
+      function appendXOf(type) {
+        var _this3 = this;
+
+        var innerAllOf = element.querySelector('.inner.' + type);
+
+        this.schema[type].forEach(function (schema) {
+          var inner = document.createElement('div');
+          inner.classList.add('inner');
+          var view = new JSONSchemaView(schema, _this3.open - 1);
+          inner.appendChild(view.render());
+          innerAllOf.appendChild(inner);
+        });
+      }
+    }
+  }]);
+
+  return JSONSchemaView;
+})();
+
+exports['default'] = JSONSchemaView;
+module.exports = exports['default'];
+
+},{"./helpers.js":1}]},{},[2])(2)
+});
+//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJDOi9Vc2Vycy9qYW1lc2hpL0Rlc2t0b3AvanNvbi1zY2hlbWEtdmlldy1qcy1tYXN0ZXIvc3JjL2hlbHBlcnMuanMiLCJDOi9Vc2Vycy9qYW1lc2hpL0Rlc2t0b3AvanNvbi1zY2hlbWEtdmlldy1qcy1tYXN0ZXIvc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7O0FBSU4sU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQy9CLFNBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQ3JDOzs7Ozs7Ozs7Ozs7O0FBWU0sU0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFO0FBQzdCLFNBQU8sU0FBUyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7Q0FDbkM7O0FBQ0QsU0FBUyxLQUFLLEdBQUU7QUFDZCxTQUFPLEVBQUUsQ0FBQztDQUNYO0FBQ0QsU0FBUyxNQUFNLENBQUUsUUFBUSxFQUFrQjtvQ0FBYixXQUFXO0FBQVgsZUFBVzs7O0FBQ3ZDLFNBQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBSztBQUN4RCxXQUFPLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0dBQzVDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakI7OztBQzVCRCxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt5QkFPTixjQUFjOzs7Ozs7OztJQVFBLGNBQWM7Ozs7Ozs7Ozs7OztBQVd0QixXQVhRLGNBQWMsQ0FXckIsTUFBTSxFQUFFLElBQUksRUFBMkI7OztRQUF6QixPQUFPLHlEQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQzs7MEJBWDlCLGNBQWM7O0FBWS9CLFFBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQzs7O0FBRzdCLFFBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUNyQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQ3RCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDbkIsTUFBTSxDQUFDLFVBQUEsQ0FBQzthQUFHLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDOzs7QUFHakUsUUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7O0FBRTFFLFFBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQSxBQUFDLENBQUM7OztBQUd0QixRQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7QUFHbEUsUUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQ2hCLElBQUksQ0FBQyxXQUFXLEtBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFBLEFBQUMsQUFDOUIsQ0FBQzs7O0FBR0osUUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUN0RCxVQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQSxnQkFBZ0IsRUFBSTtBQUMvQyxZQUFJLE9BQU8sTUFBSyxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssUUFBUSxFQUFFO0FBQ2hFLGdCQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzVEO09BQ0YsQ0FBQyxDQUFDO0tBQ0o7R0FDRjs7Ozs7OztlQXREa0IsY0FBYzs7V0E0RHpCLG9CQUFHO0FBQ1QsVUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDaEIsZUFBTyxFQUFFLENBQUM7T0FDWDs7QUFFRCxhQUFPLGtDQUVILG9CQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBRVgsb0JBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFDa0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxHQUs3RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUc5RCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBRWxFLG9CQUFJLElBQUksQ0FBQyxNQUFNLFdBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0QsSUFBSSxDQUFDLE1BQU0sV0FBUSxHQUU5RCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLDhDQU03RCxvQkFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUVqQixvQkFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUNrQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBR3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUlyQyxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUcxQyxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBR3pELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9CQUNILElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEdBRy9FLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FHekQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FHL0Usb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUcvRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBRy9ELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBSzdELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFHL0Msb0JBQUksSUFBSSxDQUFDLE1BQU0sV0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDRCxJQUFJLENBQUMsTUFBTSxXQUFRLEdBRTlELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FHekQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUssQ0FBQyxvQkFDeEMsSUFBSSxRQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FHckQsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsNENBTWhGLG9CQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBRXVDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBeUMsb0JBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFDekksb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFBLEFBQUMsQ0FBQyxvQkFFdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEdBQUcsRUFDcEYsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUlqRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUlwRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sUUFBSyxDQUFDLG9CQUN4QyxJQUFJLFFBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUdyRCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUU1RSxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsNkRBTzFCLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUduQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQ3RCLG9CQUFJLElBQUksQ0FBQyxXQUFXLENBQUMscUJBS25ELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxvQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBSXpELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FFbEUsb0JBQUksSUFBSSxDQUFDLE1BQU0sV0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFDUCxJQUFJLENBQUMsTUFBTSxXQUFRLEdBRzFELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFDSixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FJckQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUssQ0FBQyxvQkFDeEMsSUFBSSxRQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FHckQsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FFNUUsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUtoQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDM0Q7Ozs7Ozs7V0FLRSxhQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDaEIsNENBQ3NCLElBQUksdUJBQ2pCLDJCQUFXLElBQUksQ0FBQywrQkFFdkI7S0FDSDs7Ozs7OztXQUtHLGVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7QUFDOUIsMEJBQ0ksb0JBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxRQUFLLENBQUMsK0JBS2xDO0tBQ0g7Ozs7Ozs7V0FLSyxrQkFBRztBQUNQLFVBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQ3JDLFVBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNmOzs7Ozs7O1dBS0ssa0JBQUc7QUFDUCxVQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0MsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7T0FDaEQ7O0FBRUQsVUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQ3BCLFlBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztPQUN6QyxNQUFNO0FBQ0wsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO09BQzVDOztBQUVELFVBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDdEIsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyx1QkFBcUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUcsQ0FBQztPQUN0RTs7QUFFRCxVQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0FBRXpDLFVBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2hCLGVBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztPQUNyQjs7QUFFRCxVQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUNyQixZQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztPQUNuQzs7O0FBR0QsVUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUN6QyxZQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztPQUN6RjtBQUNELGFBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUNyQjs7Ozs7OztXQUthLHdCQUFDLE9BQU8sRUFBRTs7O0FBQ3RCLFVBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRTlDLFVBQUksQ0FBQyxLQUFLLEVBQUU7QUFDVixlQUFPO09BQ1I7O0FBRUQsVUFBSSxJQUFJLENBQUMsTUFBTSxRQUFLLEVBQUU7QUFDcEIsWUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckUsWUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3ZDLG1CQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxlQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztPQUVoRTs7QUFFRCxVQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDaEIsWUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNqRSxhQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO09BQ2xDOztBQUVELFVBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUU7QUFDOUMsY0FBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLFlBQVksRUFBSTtBQUMxRCxjQUFNLFFBQVEsR0FBRyxPQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdEQsY0FBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9DLGlCQUFPLENBQUMsU0FBUyw2REFDTSxZQUFZLDZCQUM1QixDQUFDO0FBQ1IsY0FBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQzs7QUFFOUQsZUFBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDdkQsQ0FBQyxDQUFDO09BQ0o7O0FBRUQsVUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUFFLGlCQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztPQUFFO0FBQ3pELFVBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFBRSxpQkFBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7T0FBRTtBQUN6RCxVQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQUUsaUJBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQUU7O0FBRXpELGVBQVMsU0FBUyxDQUFDLElBQUksRUFBRTs7O0FBQ3ZCLFlBQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLGFBQVcsSUFBSSxDQUFHLENBQUM7O0FBRTNELFlBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTSxFQUFJO0FBQ2xDLGNBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUMsZUFBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0IsY0FBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELGVBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDakMsb0JBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0IsQ0FBQyxDQUFDO09BQ0o7S0FDRjs7O1NBOVZrQixjQUFjOzs7cUJBQWQsY0FBYyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG4vKlxuICogQ29udmVydHMgYW55T2YsIGFsbE9mIGFuZCBvbmVPZiB0byBodW1hbiByZWFkYWJsZSBzdHJpbmdcbiovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFhPZih0eXBlKSB7XG4gIHJldHVybiB0eXBlLnN1YnN0cmluZygwLCAzKSArICcgb2YnO1xufVxuXG4vKlxuICogaWYgY29uZGl0aW9uIGZvciBFUzYgdGVtcGxhdGUgc3RyaW5nc1xuICogdG8gYmUgdXNlZCBvbmx5IGluIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIEBleGFtcGxlIG15c3RyID0gYFJhbmRvbSBpcyAke19pZihNYXRoLnJhbmRvbSgpID4gMC41KWBncmVhdGVyIHRoYW4gMC41YGBcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNvbmRpdGlvblxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gdGhlIHRlbXBsYXRlIGZ1bmN0aW9uXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIF9pZihjb25kaXRpb24pIHtcbiAgcmV0dXJuIGNvbmRpdGlvbiA/IG5vcm1hbCA6IGVtcHR5O1xufVxuZnVuY3Rpb24gZW1wdHkoKXtcbiAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gbm9ybWFsICh0ZW1wbGF0ZSwgLi4uZXhwcmVzc2lvbnMpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnNsaWNlKDEpLnJlZHVjZSgoYWNjdW11bGF0b3IsIHBhcnQsIGkpID0+IHtcbiAgICByZXR1cm4gYWNjdW11bGF0b3IgKyBleHByZXNzaW9uc1tpXSArIHBhcnQ7XG4gIH0sIHRlbXBsYXRlWzBdKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbHMgSlNPTlNjaGVtYVZpZXcgKi9cblxuaW1wb3J0IHtcbiAgY29udmVydFhPZixcbiAgX2lmXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5cblxuLyoqXG4gKiBAY2xhc3MgSlNPTlNjaGVtYVZpZXdcbiAqXG4gKiBBIHB1cmUgSmF2YVNjcmlwdCBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBKU09OIFNjaGVtYSBpbiBIVE1MLlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTT05TY2hlbWFWaWV3IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYSBUaGUgSlNPTiBTY2hlbWEgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3Blbj0xXSBoaXMgbnVtYmVyIGluZGljYXRlcyB1cCB0byBob3cgbWFueSBsZXZlbHMgdGhlXG4gICAqIHJlbmRlcmVkIHRyZWUgc2hvdWxkIGV4cGFuZC4gU2V0IGl0IHRvIGAwYCB0byBtYWtlIHRoZSB3aG9sZSB0cmVlIGNvbGxhcHNlZFxuICAgKiBvciBzZXQgaXQgdG8gYEluZmluaXR5YCB0byBleHBhbmQgdGhlIHRyZWUgZGVlcGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLlxuICAgKiAgdGhlbWUge3N0cmluZ306IG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IFsnZGFyayddXG4gICovXG4gIGNvbnN0cnVjdG9yKHNjaGVtYSwgb3Blbiwgb3B0aW9ucyA9IHt0aGVtZTogbnVsbH0pIHtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IG9wZW4gPD0gMDtcblxuICAgIC8vIGlmIHNjaGVtYSBpcyBhbiBlbXB0eSBvYmplY3Qgd2hpY2ggbWVhbnMgYW55IEpPU05cbiAgICB0aGlzLmlzQW55ID0gdHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYSkgJiZcbiAgICAgICFPYmplY3Qua2V5cyhzY2hlbWEpXG4gICAgICAuZmlsdGVyKGs9PiBbJ3RpdGxlJywgJ2Rlc2NyaXB0aW9uJ10uaW5kZXhPZihrKSA9PT0gLTEpLmxlbmd0aDtcblxuICAgIC8vIERldGVybWluZSBpZiBhIHNjaGVtYSBpcyBhbiBhcnJheVxuICAgIHRoaXMuaXNBcnJheSA9ICF0aGlzLmlzQW55ICYmIHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLnR5cGUgPT09ICdhcnJheSc7XG5cbiAgICB0aGlzLmlzT2JqZWN0ID0gdGhpcy5zY2hlbWEgJiZcbiAgICAgICh0aGlzLnNjaGVtYS50eXBlID09PSAnb2JqZWN0JyB8fFxuICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXMgfHxcbiAgICAgICB0aGlzLnNjaGVtYS5hbnlPZiB8fFxuICAgICAgIHRoaXMuc2NoZW1hLm9uZW9mIHx8XG4gICAgICAgdGhpcy5zY2hlbWEuYWxsT2YpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgc2NoZW1hIGlzIGEgcHJpbWl0aXZlXG4gICAgdGhpcy5pc1ByaW1pdGl2ZSA9ICF0aGlzLmlzQW55ICYmICF0aGlzLmlzQXJyYXkgJiYgIXRoaXMuaXNPYmplY3Q7XG5cbiAgICAvL1xuICAgIHRoaXMuc2hvd1RvZ2dsZSA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uIHx8XG4gICAgICB0aGlzLnNjaGVtYS50aXRsZSB8fFxuICAgICAgKHRoaXMuaXNQcmltaXRpdmUgJiYgKFxuICAgICAgICB0aGlzLnNjaGVtYS5taW5pbXVtIHx8XG4gICAgICAgIHRoaXMuc2NoZW1hLm1heGltdW0gfHxcbiAgICAgICAgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKVxuICAgICAgKTtcblxuICAgIC8vIHBvcHVsYXRlIGlzUmVxdWlyZWQgcHJvcGVydHkgZG93biB0byBwcm9wZXJ0aWVzXG4gICAgaWYgKHRoaXMuc2NoZW1hICYmIEFycmF5LmlzQXJyYXkodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7XG4gICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZC5mb3JFYWNoKHJlcXVpcmVkUHJvcGVydHkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcmVxdWlyZWRQcm9wZXJ0eV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5zY2hlbWEucHJvcGVydGllc1tyZXF1aXJlZFByb3BlcnR5XS5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgd2l0aCBwb3B1bGF0ZWQgcHJvcGVydGllcy5cbiAgICogVGhpcyB0ZW1wbGF0ZSBkb2VzIG5vdCBoYXZlIHRoZSBjaGlsZHJlblxuICAqL1xuICB0ZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIDwhLS0gQW55IC0tPlxuICAgICAgJHtfaWYodGhpcy5pc0FueSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnlcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZSB0eXBlLWFueVwiPiZsdDthbnkmZ3Q7PC9zcGFuPlxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCBcblx0XHQgICR7X2lmKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciByZXF1aXJlZFwiPlJlcXVpcmVkOiAke3RoaXMuc2NoZW1hLnJlcXVpcmVkfTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAke19pZih0aGlzLnNjaGVtYS5kZWZhdWx0ICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciBkZWZhdWx0XCI+RGVmYXVsdDogJHt0aGlzLnNjaGVtYS5kZWZhdWx0fTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAgJHtfaWYodGhpcy5zY2hlbWEucGF0dGVybiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgcGF0dGVyblwiPlBhdHRlcm46ICR7dGhpcy5zY2hlbWEucGF0dGVybn08L2Rpdj5cbiAgICAgICAgICBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cbiAgICAgIDwhLS0gUHJpbWl0aXZlIC0tPlxuICAgICAgJHtfaWYodGhpcy5pc1ByaW1pdGl2ZSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmltaXRpdmVcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0eXBlXCI+JHt0aGlzLnNjaGVtYS50eXBlfTwvc3Bhbj5cblxuICAgICAgICAgXG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5mb3JtYXQpYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtYXRcIj4oJHt0aGlzLnNjaGVtYS5mb3JtYXR9KTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluaW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1pbmltdW1cIj5taW5pbXVtOiR7dGhpcy5zY2hlbWEubWluaW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNaW5pbXVtXCI+KGV4KW1pbmltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4aW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1heGltdW1cIj5tYXhpbXVtOiR7dGhpcy5zY2hlbWEubWF4aW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNYXhpbXVtXCI+KGV4KW1heGltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluTGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWluTGVuZ3RoXCI+bWluTGVuZ3RoOiR7dGhpcy5zY2hlbWEubWluTGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4TGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWF4TGVuZ3RoXCI+bWF4TGVuZ3RoOiR7dGhpcy5zY2hlbWEubWF4TGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgXG5cdFx0IFxuXHRcdCAgXG5cdFx0ICAgJHtfaWYodGhpcy5zY2hlbWEucmVxdWlyZWQgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIHJlcXVpcmVkXCI+UmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgJHtfaWYodGhpcy5zY2hlbWEuZGVmYXVsdCAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgZGVmYXVsdFwiPkRlZmF1bHQ6ICR7dGhpcy5zY2hlbWEuZGVmYXVsdH08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgICR7X2lmKHRoaXMuc2NoZW1hLnBhdHRlcm4gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIHBhdHRlcm5cIj5QYXR0ZXJuOiAke3RoaXMuc2NoZW1hLnBhdHRlcm59PC9kaXY+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmVudW0pYFxuICAgICAgICAgICAgJHt0aGlzLmVudW0odGhpcy5zY2hlbWEsIHRoaXMuaXNDb2xsYXBzZWQsIHRoaXMub3Blbil9XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFsbE9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYWxsT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLm9uZU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnb25lT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFueU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYW55T2YnKX1gfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cblxuICAgICAgPCEtLSBBcnJheSAtLT5cbiAgICAgICR7X2lmKHRoaXMuaXNBcnJheSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcnJheVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhbiBjbGFzcz1cInRvZ2dsZS1oYW5kbGVcIj48L3NwYW4+JHt0aGlzLnNjaGVtYS50aXRsZSB8fCAnJ308c3BhbiBjbGFzcz1cIm9wZW5pbmcgYnJhY2tldFwiPls8L3NwYW4+JHtfaWYodGhpcy5pc0NvbGxhcHNlZClgPHNwYW4gY2xhc3M9XCJjbG9zaW5nIGJyYWNrZXRcIj5dPC9zcGFuPmB9PC9hPlxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmICh0aGlzLnNjaGVtYS51bmlxdWVJdGVtcyB8fCB0aGlzLnNjaGVtYS5taW5JdGVtcyB8fCB0aGlzLnNjaGVtYS5tYXhJdGVtcykpYFxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJpdGVtcyByYW5nZVwiPigke3RoaXMuc2NoZW1hLm1pbkl0ZW1zIHx8IDB9Li4ke3RoaXMuc2NoZW1hLm1heEl0ZW1zIHx8ICfiiJ4nfSk8L3NwYW4+XG4gICAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcylgPHNwYW4gdGl0bGU9XCJ1bmlxdWVcIiBjbGFzcz1cInVuaXF1ZUl0ZW1zXCI+4pmmPC9zcGFuPmB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+XG4gICAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbilgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPiR7dGhpcy5zY2hlbWEuZGVzY3JpcHRpb259PC9kaXY+XG4gICAgICAgICAgICBgfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZW51bSlgXG4gICAgICAgICAgICAke3RoaXMuZW51bSh0aGlzLnNjaGVtYSwgdGhpcy5pc0NvbGxhcHNlZCwgdGhpcy5vcGVuKX1cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYWxsT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbGxPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEub25lT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdvbmVPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYW55T2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbnlPZicpfWB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zaW5nIGJyYWNrZXRcIj5dPC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cblxuICAgICAgPCEtLSBPYmplY3QgLS0+XG4gICAgICAke19pZighdGhpcy5pc1ByaW1pdGl2ZSAmJiAhdGhpcy5pc0FycmF5ICYmICF0aGlzLmlzQW55KWBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9iamVjdFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtaGFuZGxlXCI+PC9zcGFuPiR7dGhpcy5zY2hlbWEudGl0bGUgfHwgJyd9IDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cIm9wZW5pbmcgYnJhY2VcIj57PC9zcGFuPiR7X2lmKHRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2VcIiBuZy1pZj1cImlzQ29sbGFwc2VkXCI+fTwvc3Bhbj5cbiAgICAgICAgICBgfTwvYT5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiPlxuICAgICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZGVzY3JpcHRpb24pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4ke3RoaXMuc2NoZW1hLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICAgICAgYH1cbiAgICAgICAgICAgIDwhLS0gY2hpbGRyZW4gZ28gaGVyZSAtLT5cblx0XHQgIFxuXHRcdCAgICR7X2lmKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1aXJlZFwiPkRlZmF1bHQgRmllbGRzOiAke3RoaXMuc2NoZW1hLnJlcXVpcmVkfTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAke19pZih0aGlzLnNjaGVtYS5kZWZhdWx0ICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWZhdWx0XCI+RGVmYXVsdDogJHt0aGlzLnNjaGVtYS5kZWZhdWx0fTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICBcblx0XHRcdCR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLnBhdHRlcm4pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF0dGVyblwiPlBhdHRlcm46ICR7dGhpcy5zY2hlbWEucGF0dGVybn08L2Rpdj5cbiAgICAgICAgICAgIGB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5lbnVtKWBcbiAgICAgICAgICAgICR7dGhpcy5lbnVtKHRoaXMuc2NoZW1hLCB0aGlzLmlzQ29sbGFwc2VkLCB0aGlzLm9wZW4pfVxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbGxPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FsbE9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5vbmVPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ29uZU9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbnlPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FueU9mJyl9YH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2VcIj59PC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cbmAucmVwbGFjZSgvXFxzKlxcbi9nLCAnXFxuJykucmVwbGFjZSgvKFxcPFxcIVxcLVxcLSkuKy9nLCAnJykudHJpbSgpO1xuICB9XG5cbiAgLypcbiAgICogVGVtcGxhdGUgZm9yIG9uZU9mLCBhbnlPZiBhbmQgYWxsT2ZcbiAgKi9cbiAgeE9mKHNjaGVtYSwgdHlwZSkge1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgJHt0eXBlfVwiPlxuICAgICAgICA8Yj4ke2NvbnZlcnRYT2YodHlwZSl9OjwvYj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKlxuICAgKiBUZW1wbGF0ZSBmb3IgZW51bXNcbiAgKi9cbiAgZW51bShzY2hlbWEsIGlzQ29sbGFwc2VkLCBvcGVuKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgICR7X2lmKCFpc0NvbGxhcHNlZCAmJiBzY2hlbWEuZW51bSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciBlbnVtc1wiPlxuICAgICAgICAgIDxiPkVudW06PC9iPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG4gICAgYDtcbiAgfVxuXG4gIC8qXG4gICAqIFRvZ2dsZXMgdGhlICdjb2xsYXBzZWQnIHN0YXRlXG4gICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qXG4gICAqIFJlbmRlcnMgdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgaXRcbiAgKi9cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqc29uLXNjaGVtYS12aWV3Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2NvbGxhcHNlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGhlbWUpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKGBqc29uLXNjaGVtYS12aWV3LSR7dGhpcy5vcHRpb25zLnRoZW1lfWApO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlKCk7XG5cbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZHJlbih0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciBmb3IgdG9nZ2xpbmdcbiAgICBpZiAodGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EudGl0bGUnKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EudGl0bGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICB9XG5cbiAgLypcbiAgICogQXBwZW5kcyBjaGlsZHJlbiB0byBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGN1cnJlbnQgc2NoZW1hXG4gICovXG4gIGFwcGVuZENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbm5lciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlubmVyJyk7XG5cbiAgICBpZiAoIWlubmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2NoZW1hLmVudW0pIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBKU09ORm9ybWF0dGVyKHRoaXMuc2NoZW1hLmVudW0sIHRoaXMub3BlbiAtIDEpO1xuICAgICAgY29uc3QgZm9ybWF0dGVyRWwgPSBmb3JtYXR0ZXIucmVuZGVyKCk7XG4gICAgICBmb3JtYXR0ZXJFbC5jbGFzc0xpc3QuYWRkKCdpbm5lcicpO1xuICAgICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZW51bXMuaW5uZXInKS5hcHBlbmRDaGlsZChmb3JtYXR0ZXJFbCk7XG5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0FycmF5KSB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IEpTT05TY2hlbWFWaWV3KHRoaXMuc2NoZW1hLml0ZW1zLCB0aGlzLm9wZW4gLSAxKVxuICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzID09PSAnb2JqZWN0Jykge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zY2hlbWEucHJvcGVydGllcykuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOztcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInByb3BlcnR5XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+JHtwcm9wZXJ0eU5hbWV9Ojwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBKU09OU2NoZW1hVmlldyhwcm9wZXJ0eSwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICAgIHRlbXBEaXYucXVlcnlTZWxlY3RvcignLnByb3BlcnR5JykuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG5cbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodGVtcERpdi5xdWVyeVNlbGVjdG9yKCcucHJvcGVydHknKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2hlbWEuYWxsT2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ2FsbE9mJyk7IH1cbiAgICBpZiAodGhpcy5zY2hlbWEub25lT2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ29uZU9mJyk7IH1cbiAgICBpZiAodGhpcy5zY2hlbWEuYW55T2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ2FueU9mJyk7IH1cblxuICAgIGZ1bmN0aW9uIGFwcGVuZFhPZih0eXBlKSB7XG4gICAgICBjb25zdCBpbm5lckFsbE9mID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKGAuaW5uZXIuJHt0eXBlfWApO1xuXG4gICAgICB0aGlzLnNjaGVtYVt0eXBlXS5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGlubmVyLmNsYXNzTGlzdC5hZGQoJ2lubmVyJyk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgSlNPTlNjaGVtYVZpZXcoc2NoZW1hLCB0aGlzLm9wZW4gLSAxKTtcbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG4gICAgICAgIGlubmVyQWxsT2YuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
+
+</script>
+
+  <script>
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.$RefParser = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+/** !
+ * JSON Schema $Ref Parser v3.1.2
+ *
+ * @link https://github.com/BigstickCarpet/json-schema-ref-parser
+ * @license MIT
+ */
+"use strict";function bundle(e,r){debug("Bundling $ref pointers in %s",e.$refs._root$Ref.path);var t=[];crawl(e,"schema",e.$refs._root$Ref.path+"#","#",t,e.$refs,r),remap(t)}function crawl(e,r,t,f,n,i,a){var o=null===r?e:e[r];if(o&&"object"==typeof o)if($Ref.is$Ref(o))inventory$Ref(e,r,t,f,n,i,a);else{var l=Object.keys(o),u=l.indexOf("definitions");u>0&&l.splice(0,0,l.splice(u,1)[0]),l.forEach(function(e){var r=Pointer.join(t,e),l=Pointer.join(f,e),u=o[e];$Ref.is$Ref(u)?inventory$Ref(o,e,t,l,n,i,a):crawl(o,e,r,l,n,i,a)})}}function inventory$Ref(e,r,t,f,n,i,a){if(!n.some(function(t){return t.parent===e&&t.key===r})){var o=null===r?e:e[r],l=url.resolve(t,o.$ref),u=i._resolve(l,a),h=Pointer.parse(f).length,s=url.stripHash(u.path),$=url.getHash(u.path),c=s!==i._root$Ref.path,p=$Ref.isExtended$Ref(o);n.push({$ref:o,parent:e,key:r,pathFromRoot:f,depth:h,file:s,hash:$,value:u.value,circular:u.circular,extended:p,external:c}),crawl(u.value,null,u.path,f,n,i,a)}}function remap(e){e.sort(function(e,r){return e.file!==r.file?e.file<r.file?-1:1:e.hash!==r.hash?e.hash<r.hash?-1:1:e.circular!==r.circular?e.circular?-1:1:e.extended!==r.extended?e.extended?1:-1:e.depth!==r.depth?e.depth-r.depth:r.pathFromRoot.lastIndexOf("/definitions")-e.pathFromRoot.lastIndexOf("/definitions")});var r,t,f;e.forEach(function(e){debug('Re-mapping $ref pointer "%s" at %s',e.$ref.$ref,e.pathFromRoot),e.external?e.file===r&&e.hash===t?e.$ref.$ref=f:e.file===r&&0===e.hash.indexOf(t+"/")?e.$ref.$ref=Pointer.join(f,Pointer.parse(e.hash)):(r=e.file,t=e.hash,f=e.pathFromRoot,e.$ref=e.parent[e.key]=$Ref.dereference(e.$ref,e.value),e.circular&&(e.$ref.$ref=e.pathFromRoot)):e.$ref.$ref=e.hash,debug("    new value: %s",e.$ref&&e.$ref.$ref?e.$ref.$ref:"[object Object]")})}var $Ref=require("./ref"),Pointer=require("./pointer"),debug=require("./util/debug"),url=require("./util/url");module.exports=bundle;
+
+},{"./pointer":10,"./ref":11,"./util/debug":16,"./util/url":19}],2:[function(require,module,exports){
+"use strict";function dereference(e,r){debug("Dereferencing $ref pointers in %s",e.$refs._root$Ref.path);var c=crawl(e.schema,e.$refs._root$Ref.path,"#",[],e.$refs,r);e.$refs.circular=c.circular,e.schema=c.value}function crawl(e,r,c,u,f,i){var n,a={value:e,circular:!1};return e&&"object"==typeof e&&(u.push(e),$Ref.isAllowed$Ref(e,i)?(n=dereference$Ref(e,r,c,u,f,i),a.circular=n.circular,a.value=n.value):Object.keys(e).forEach(function(l){var o=Pointer.join(r,l),t=Pointer.join(c,l),d=e[l],$=!1;$Ref.isAllowed$Ref(d,i)?(n=dereference$Ref(d,o,t,u,f,i),$=n.circular,e[l]=n.value):-1===u.indexOf(d)?(n=crawl(d,o,t,u,f,i),$=n.circular,e[l]=n.value):$=foundCircularReference(o,f,i),a.circular=a.circular||$}),u.pop()),a}function dereference$Ref(e,r,c,u,f,i){debug('Dereferencing $ref pointer "%s" at %s',e.$ref,r);var n=url.resolve(r,e.$ref),a=f._resolve(n,i),l=a.circular,o=l||-1!==u.indexOf(a.value);o&&foundCircularReference(r,f,i);var t=$Ref.dereference(e,a.value);if(!o){var d=crawl(t,a.path,c,u,f,i);o=d.circular,t=d.value}return o&&!l&&"ignore"===i.dereference.circular&&(t=e),l&&(t.$ref=c),{circular:o,value:t}}function foundCircularReference(e,r,c){if(r.circular=!0,!c.dereference.circular)throw ono.reference("Circular $ref pointer found at %s",e);return!0}var $Ref=require("./ref"),Pointer=require("./pointer"),ono=require("ono"),debug=require("./util/debug"),url=require("./util/url");module.exports=dereference;
+
+},{"./pointer":10,"./ref":11,"./util/debug":16,"./util/url":19,"ono":69}],3:[function(require,module,exports){
+(function (Buffer){
+"use strict";function $RefParser(){this.schema=null,this.$refs=new $Refs}function normalizeArgs(e){var r,t,a,s;return e=Array.prototype.slice.call(e),"function"==typeof e[e.length-1]&&(s=e.pop()),"string"==typeof e[0]?(r=e[0],"object"==typeof e[2]?(t=e[1],a=e[2]):(t=void 0,a=e[1])):(r="",t=e[0],a=e[1]),a instanceof Options||(a=new Options(a)),{path:r,schema:t,options:a,callback:s}}var Promise=require("./util/promise"),Options=require("./options"),$Refs=require("./refs"),parse=require("./parse"),resolveExternal=require("./resolve-external"),bundle=require("./bundle"),dereference=require("./dereference"),url=require("./util/url"),maybe=require("call-me-maybe"),ono=require("ono");module.exports=$RefParser,module.exports.YAML=require("./util/yaml"),$RefParser.parse=function(e,r,t){var a=this,s=new a;return s.parse.apply(s,arguments)},$RefParser.prototype.parse=function(e,r,t){var a,s=normalizeArgs(arguments);if(!s.path&&!s.schema){var n=ono("Expected a file path, URL, or object. Got %s",s.path||s.schema);return maybe(s.callback,Promise.reject(n))}this.schema=null,this.$refs=new $Refs,url.isFileSystemPath(s.path)&&(s.path=url.fromFileSystemPath(s.path)),s.path=url.resolve(url.cwd(),s.path),s.schema&&"object"==typeof s.schema?(this.$refs._add(s.path,s.schema),a=Promise.resolve(s.schema)):a=parse(s.path,this.$refs,s.options);var o=this;return a.then(function(e){if(!e||"object"!=typeof e||Buffer.isBuffer(e))throw ono.syntax('"%s" is not a valid JSON Schema',o.$refs._root$Ref.path||e);return o.schema=e,maybe(s.callback,Promise.resolve(o.schema))})["catch"](function(e){return maybe(s.callback,Promise.reject(e))})},$RefParser.resolve=function(e,r,t){var a=this,s=new a;return s.resolve.apply(s,arguments)},$RefParser.prototype.resolve=function(e,r,t){var a=this,s=normalizeArgs(arguments);return this.parse(s.path,s.schema,s.options).then(function(){return resolveExternal(a,s.options)}).then(function(){return maybe(s.callback,Promise.resolve(a.$refs))})["catch"](function(e){return maybe(s.callback,Promise.reject(e))})},$RefParser.bundle=function(e,r,t){var a=this,s=new a;return s.bundle.apply(s,arguments)},$RefParser.prototype.bundle=function(e,r,t){var a=this,s=normalizeArgs(arguments);return this.resolve(s.path,s.schema,s.options).then(function(){return bundle(a,s.options),maybe(s.callback,Promise.resolve(a.schema))})["catch"](function(e){return maybe(s.callback,Promise.reject(e))})},$RefParser.dereference=function(e,r,t){var a=this,s=new a;return s.dereference.apply(s,arguments)},$RefParser.prototype.dereference=function(e,r,t){var a=this,s=normalizeArgs(arguments);return this.resolve(s.path,s.schema,s.options).then(function(){return dereference(a,s.options),maybe(s.callback,Promise.resolve(a.schema))})["catch"](function(e){return maybe(s.callback,Promise.reject(e))})};
+
+}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
+
+},{"../node_modules/is-buffer/index.js":36,"./bundle":1,"./dereference":2,"./options":4,"./parse":5,"./refs":12,"./resolve-external":13,"./util/promise":18,"./util/url":19,"./util/yaml":20,"call-me-maybe":27,"ono":69}],4:[function(require,module,exports){
+"use strict";function $RefParserOptions(e){merge(this,$RefParserOptions.defaults),merge(this,e)}function merge(e,r){if(isMergeable(r))for(var s=Object.keys(r),a=0;a<s.length;a++){var t=s[a],i=r[t],o=e[t];isMergeable(i)?e[t]=merge(o||{},i):void 0!==i&&(e[t]=i)}return e}function isMergeable(e){return e&&"object"==typeof e&&!Array.isArray(e)&&!(e instanceof RegExp)&&!(e instanceof Date)}var jsonParser=require("./parsers/json"),yamlParser=require("./parsers/yaml"),textParser=require("./parsers/text"),binaryParser=require("./parsers/binary"),fileResolver=require("./resolvers/file"),httpResolver=require("./resolvers/http"),zschemaValidator=require("./validators/z-schema");module.exports=$RefParserOptions,$RefParserOptions.defaults={parse:{json:jsonParser,yaml:yamlParser,text:textParser,binary:binaryParser},resolve:{file:fileResolver,http:httpResolver,external:!0},dereference:{circular:!0},validate:{zschema:zschemaValidator}};
+
+},{"./parsers/binary":6,"./parsers/json":7,"./parsers/text":8,"./parsers/yaml":9,"./resolvers/file":14,"./resolvers/http":15,"./validators/z-schema":21}],5:[function(require,module,exports){
+(function (Buffer){
+"use strict";function parse(r,e,n){try{r=url.stripHash(r);var t=e._add(r),u={url:r,extension:url.getExtension(r)};return readFile(u,n).then(function(r){return t.pathType=r.plugin.name,u.data=r.result,parseFile(u,n)}).then(function(r){return t.value=r.result,r.result})}catch(i){return Promise.reject(i)}}function readFile(r,e){return new Promise(function(n,t){function u(e){t(!e||e instanceof SyntaxError?ono.syntax('Unable to resolve $ref pointer "%s"',r.url):e)}debug("Reading %s",r.url);var i=plugins.all(e.resolve);i=plugins.filter(i,"canRead",r),plugins.sort(i),plugins.run(i,"read",r).then(n,u)})}function parseFile(r,e){return new Promise(function(n,t){function u(e){!e.plugin.allowEmpty&&isEmpty(e.result)?t(ono.syntax('Error parsing "%s" as %s. \nParsed value is empty',r.url,e.plugin.name)):n(e)}function i(e){e?(e=e instanceof Error?e:new Error(e),t(ono.syntax(e,"Error parsing %s",r.url))):t(ono.syntax("Unable to parse %s",r.url))}debug("Parsing %s",r.url);var s=plugins.all(e.parse),l=plugins.filter(s,"canParse",r),o=l.length>0?l:s;plugins.sort(o),plugins.run(o,"parse",r).then(u,i)})}function isEmpty(r){return void 0===r||"object"==typeof r&&0===Object.keys(r).length||"string"==typeof r&&0===r.trim().length||Buffer.isBuffer(r)&&0===r.length}var ono=require("ono"),debug=require("./util/debug"),url=require("./util/url"),plugins=require("./util/plugins"),Promise=require("./util/promise");module.exports=parse;
+
+}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
+
+},{"../node_modules/is-buffer/index.js":36,"./util/debug":16,"./util/plugins":17,"./util/promise":18,"./util/url":19,"ono":69}],6:[function(require,module,exports){
+(function (Buffer){
+"use strict";var BINARY_REGEXP=/\.(jpeg|jpg|gif|png|bmp|ico)$/i;module.exports={order:400,allowEmpty:!0,canParse:function(r){return Buffer.isBuffer(r.data)&&BINARY_REGEXP.test(r.url)},parse:function(r){return Buffer.isBuffer(r.data)?r.data:new Buffer(r.data)}};
+
+}).call(this,require("buffer").Buffer)
+
+},{"buffer":25}],7:[function(require,module,exports){
+(function (Buffer){
+"use strict";var Promise=require("../util/promise");module.exports={order:100,allowEmpty:!0,canParse:".json",parse:function(r){return new Promise(function(e,t){var i=r.data;Buffer.isBuffer(i)&&(i=i.toString()),e("string"==typeof i?0===i.trim().length?void 0:JSON.parse(i):i)})}};
+
+}).call(this,{"isBuffer":require("../../node_modules/is-buffer/index.js")})
+
+},{"../../node_modules/is-buffer/index.js":36,"../util/promise":18}],8:[function(require,module,exports){
+(function (Buffer){
+"use strict";var TEXT_REGEXP=/\.(txt|htm|html|md|xml|js|min|map|css|scss|less|svg)$/i;module.exports={order:300,allowEmpty:!0,encoding:"utf8",canParse:function(t){return("string"==typeof t.data||Buffer.isBuffer(t.data))&&TEXT_REGEXP.test(t.url)},parse:function(t){if("string"==typeof t.data)return t.data;if(Buffer.isBuffer(t.data))return t.data.toString(this.encoding);throw new Error("data is not text")}};
+
+}).call(this,{"isBuffer":require("../../node_modules/is-buffer/index.js")})
+
+},{"../../node_modules/is-buffer/index.js":36}],9:[function(require,module,exports){
+(function (Buffer){
+"use strict";var Promise=require("../util/promise"),YAML=require("../util/yaml");module.exports={order:200,allowEmpty:!0,canParse:[".yaml",".yml",".json"],parse:function(r){return new Promise(function(e,t){var i=r.data;Buffer.isBuffer(i)&&(i=i.toString()),e("string"==typeof i?YAML.parse(i):i)})}};
+
+}).call(this,{"isBuffer":require("../../node_modules/is-buffer/index.js")})
+
+},{"../../node_modules/is-buffer/index.js":36,"../util/promise":18,"../util/yaml":20}],10:[function(require,module,exports){
+"use strict";function Pointer(e,r){this.$ref=e,this.path=r,this.value=void 0,this.circular=!1}function resolveIf$Ref(e,r){if($Ref.isAllowed$Ref(e.value,r)){var t=url.resolve(e.path,e.value.$ref);if(t!==e.path){var s=e.$ref.$refs._resolve(t,r);return $Ref.isExtended$Ref(e.value)?e.value=$Ref.dereference(e.value,s.value):(e.$ref=s.$ref,e.path=s.path,e.value=s.value),!0}e.circular=!0}}function setValue(e,r,t){if(!e.value||"object"!=typeof e.value)throw ono.syntax('Error assigning $ref pointer "%s". \nCannot set "%s" of a non-object.',e.path,r);return"-"===r&&Array.isArray(e.value)?e.value.push(t):e.value[r]=t,t}module.exports=Pointer;var $Ref=require("./ref"),url=require("./util/url"),ono=require("ono"),slashes=/\//g,tildes=/~/g,escapedSlash=/~1/g,escapedTilde=/~0/g;Pointer.prototype.resolve=function(e,r){var t=Pointer.parse(this.path);this.value=e;for(var s=0;s<t.length;s++){resolveIf$Ref(this,r)&&(this.path=Pointer.join(this.path,t.slice(s)));var i=t[s];if(void 0===this.value[i])throw ono.syntax('Error resolving $ref pointer "%s". \nToken "%s" does not exist.',this.path,i);this.value=this.value[i]}return resolveIf$Ref(this,r),this},Pointer.prototype.set=function(e,r,t){var s,i=Pointer.parse(this.path);if(0===i.length)return this.value=r,r;this.value=e;for(var a=0;a<i.length-1;a++)resolveIf$Ref(this,t),s=i[a],this.value&&void 0!==this.value[s]?this.value=this.value[s]:this.value=setValue(this,s,{});return resolveIf$Ref(this,t),s=i[i.length-1],setValue(this,s,r),e},Pointer.parse=function(e){var r=url.getHash(e).substr(1);if(!r)return[];r=r.split("/");for(var t=0;t<r.length;t++)r[t]=decodeURI(r[t].replace(escapedSlash,"/").replace(escapedTilde,"~"));if(""!==r[0])throw ono.syntax('Invalid $ref pointer "%s". Pointers must begin with "#/"',r);return r.slice(1)},Pointer.join=function(e,r){-1===e.indexOf("#")&&(e+="#"),r=Array.isArray(r)?r:[r];for(var t=0;t<r.length;t++){var s=r[t];e+="/"+encodeURI(s.replace(tildes,"~0").replace(slashes,"~1"))}return e};
+
+},{"./ref":11,"./util/url":19,"ono":69}],11:[function(require,module,exports){
+"use strict";function $Ref(){this.path=void 0,this.value=void 0,this.$refs=void 0,this.pathType=void 0}module.exports=$Ref;var Pointer=require("./pointer");$Ref.prototype.exists=function(e,t){try{return this.resolve(e,t),!0}catch(r){return!1}},$Ref.prototype.get=function(e,t){return this.resolve(e,t).value},$Ref.prototype.resolve=function(e,t){var r=new Pointer(this,e);return r.resolve(this.value,t)},$Ref.prototype.set=function(e,t){var r=new Pointer(this,e);this.value=r.set(this.value,t)},$Ref.is$Ref=function(e){return e&&"object"==typeof e&&"string"==typeof e.$ref&&e.$ref.length>0},$Ref.isExternal$Ref=function(e){return $Ref.is$Ref(e)&&"#"!==e.$ref[0]},$Ref.isAllowed$Ref=function(e,t){return!$Ref.is$Ref(e)||"#"!==e.$ref[0]&&t&&!t.resolve.external?void 0:!0},$Ref.isExtended$Ref=function(e){return $Ref.is$Ref(e)&&Object.keys(e).length>1},$Ref.dereference=function(e,t){if(t&&"object"==typeof t&&$Ref.isExtended$Ref(e)){var r={};return Object.keys(e).forEach(function(t){"$ref"!==t&&(r[t]=e[t])}),Object.keys(t).forEach(function(e){e in r||(r[e]=t[e])}),r}return t};
+
+},{"./pointer":10}],12:[function(require,module,exports){
+"use strict";function $Refs(){this.circular=!1,this._$refs={},this._root$Ref=null}function getPaths(e,r){var t=Object.keys(e);return r=Array.isArray(r[0])?r[0]:Array.prototype.slice.call(r),r.length>0&&r[0]&&(t=t.filter(function(t){return-1!==r.indexOf(e[t].pathType)})),t.map(function(r){return{encoded:r,decoded:"file"===e[r].pathType?url.toFileSystemPath(r,!0):r}})}var ono=require("ono"),$Ref=require("./ref"),url=require("./util/url");module.exports=$Refs,$Refs.prototype.paths=function(e){var r=getPaths(this._$refs,arguments);return r.map(function(e){return e.decoded})},$Refs.prototype.values=function(e){var r=this._$refs,t=getPaths(r,arguments);return t.reduce(function(e,t){return e[t.decoded]=r[t.encoded].value,e},{})},$Refs.prototype.toJSON=$Refs.prototype.values,$Refs.prototype.exists=function(e,r){try{return this._resolve(e,r),!0}catch(t){return!1}},$Refs.prototype.get=function(e,r){return this._resolve(e,r).value},$Refs.prototype.set=function(e,r){e=url.resolve(this._root$Ref.path,e);var t=url.stripHash(e),o=this._$refs[t];if(!o)throw ono('Error resolving $ref pointer "%s". \n"%s" not found.',e,t);o.set(e,r)},$Refs.prototype._add=function(e,r){var t=url.stripHash(e),o=new $Ref;return o.path=t,o.value=r,o.$refs=this,this._$refs[t]=o,this._root$Ref=this._root$Ref||o,o},$Refs.prototype._resolve=function(e,r){e=url.resolve(this._root$Ref.path,e);var t=url.stripHash(e),o=this._$refs[t];if(!o)throw ono('Error resolving $ref pointer "%s". \n"%s" not found.',e,t);return o.resolve(e,r)},$Refs.prototype._get$Ref=function(e){e=url.resolve(this._root$Ref.path,e);var r=url.stripHash(e);return this._$refs[r]};
+
+},{"./ref":11,"./util/url":19,"ono":69}],13:[function(require,module,exports){
+"use strict";function resolveExternal(e,r){if(!r.resolve.external)return Promise.resolve();try{debug("Resolving $ref pointers in %s",e.$refs._root$Ref.path);var s=crawl(e.schema,e.$refs._root$Ref.path+"#",e.$refs,r);return Promise.all(s)}catch(t){return Promise.reject(t)}}function crawl(e,r,s,t){var o=[];return e&&"object"==typeof e&&($Ref.isExternal$Ref(e)?o.push(resolve$Ref(e,r,s,t)):Object.keys(e).forEach(function(i){var n=Pointer.join(r,i),l=e[i];$Ref.isExternal$Ref(l)?o.push(resolve$Ref(l,n,s,t)):o=o.concat(crawl(l,n,s,t))})),o}function resolve$Ref(e,r,s,t){debug('Resolving $ref pointer "%s" at %s',e.$ref,r);var o=url.resolve(r,e.$ref),i=url.stripHash(o);return e=s._$refs[i],e?Promise.resolve(e.value):parse(o,s,t).then(function(e){debug("Resolving $ref pointers in %s",i);var r=crawl(e,i+"#",s,t);return Promise.all(r)})}var Promise=require("./util/promise"),$Ref=require("./ref"),Pointer=require("./pointer"),parse=require("./parse"),debug=require("./util/debug"),url=require("./util/url");module.exports=resolveExternal;
+
+},{"./parse":5,"./pointer":10,"./ref":11,"./util/debug":16,"./util/promise":18,"./util/url":19}],14:[function(require,module,exports){
+"use strict";var fs=require("fs"),ono=require("ono"),Promise=require("../util/promise"),url=require("../util/url"),debug=require("../util/debug");module.exports={order:100,canRead:function(r){return url.isFileSystemPath(r.url)},read:function(r){return new Promise(function(e,i){var u;try{u=url.toFileSystemPath(r.url)}catch(o){i(ono.uri(o,"Malformed URI: %s",r.url))}debug("Opening file: %s",u);try{fs.readFile(u,function(r,o){r?i(ono(r,'Error opening file "%s"',u)):e(o)})}catch(o){i(ono(o,'Error opening file "%s"',u))}})}};
+
+},{"../util/debug":16,"../util/promise":18,"../util/url":19,"fs":24,"ono":69}],15:[function(require,module,exports){
+(function (process,Buffer){
+"use strict";function download(e,t,o){return new Promise(function(r,n){e=url.parse(e),o=o||[],o.push(e.href),get(e,t).then(function(s){if(s.statusCode>=400)throw ono({status:s.statusCode},"HTTP ERROR %d",s.statusCode);if(s.statusCode>=300)if(o.length>t.redirects)n(ono({status:s.statusCode},"Error downloading %s. \nToo many redirects: \n  %s",o[0],o.join(" \n  ")));else{if(!s.headers.location)throw ono({status:s.statusCode},"HTTP %d redirect with no location header",s.statusCode);debug("HTTP %d redirect %s -> %s",s.statusCode,e.href,s.headers.location);var u=url.resolve(e,s.headers.location);download(u,t,o).then(r,n)}else r(s.body||new Buffer(0))})["catch"](function(t){n(ono(t,"Error downloading",e.href))})})}function get(e,t){return new Promise(function(o,r){debug("GET",e.href);var n="https:"===e.protocol?https:http,s=n.get({hostname:e.hostname,port:e.port,path:e.path,auth:e.auth,headers:t.headers||{},withCredentials:t.withCredentials});"function"==typeof s.setTimeout&&s.setTimeout(t.timeout),s.on("timeout",function(){s.abort()}),s.on("error",r),s.once("response",function(e){e.body=new Buffer(0),e.on("data",function(t){e.body=Buffer.concat([e.body,new Buffer(t)])}),e.on("error",r),e.on("end",function(){o(e)})})})}var http=require("http"),https=require("https"),ono=require("ono"),url=require("../util/url"),debug=require("../util/debug"),Promise=require("../util/promise");module.exports={order:200,headers:null,timeout:5e3,redirects:5,withCredentials:!1,canRead:function(e){return url.isHttp(e.url)},read:function(e){var t=url.parse(e.url);return process.browser&&!t.protocol&&(t.protocol=url.parse(location.href).protocol),download(t,this)}};
+
+}).call(this,require('_process'),require("buffer").Buffer)
+
+},{"../util/debug":16,"../util/promise":18,"../util/url":19,"_process":71,"buffer":25,"http":87,"https":33,"ono":69}],16:[function(require,module,exports){
+"use strict";var debug=require("debug");module.exports=debug("json-schema-ref-parser");
+
+},{"debug":29}],17:[function(require,module,exports){
+"use strict";function getResult(e,r,t,n){var u=e[r];if("function"==typeof u)return u.apply(e,[t,n]);if(!n){if(u instanceof RegExp)return u.test(t.url);if("string"==typeof u)return u===t.extension;if(Array.isArray(u))return-1!==u.indexOf(t.extension)}return u}var Promise=require("./promise"),debug=require("./debug");exports.all=function(e){return Object.keys(e).filter(function(r){return"object"==typeof e[r]}).map(function(r){return e[r].name=r,e[r]})},exports.filter=function(e,r,t){return e.filter(function(e){return!!getResult(e,r,t)})},exports.sort=function(e){return e.forEach(function(e){e.order=e.order||Number.MAX_SAFE_INTEGER}),e.sort(function(e,r){return e.order-r.order})},exports.run=function(e,r,t){var n,u,i=0;return new Promise(function(o,f){function s(){if(n=e[i++],!n)return f(u);try{debug("  %s",n.name);var o=getResult(n,r,t,c);o&&"function"==typeof o.then?o.then(a,p):void 0!==o&&a(o)}catch(s){p(s)}}function c(e,r){e?p(e):a(r)}function a(e){debug("    success"),o({plugin:n,result:e})}function p(e){debug("    %s",e.message||e),u=e,s()}s()})};
+
+},{"./debug":16,"./promise":18}],18:[function(require,module,exports){
+"use strict";module.exports="function"==typeof Promise?Promise:require("es6-promise").Promise;
+
+},{"es6-promise":31}],19:[function(require,module,exports){
+(function (process){
+"use strict";var isWindows=/^win/.test(process.platform),forwardSlashPattern=/\//g,protocolPattern=/^([a-z0-9.+-]+):\/\//i,url=module.exports,urlEncodePatterns=[/\?/g,"%3F",/\#/g,"%23",isWindows?/\\/g:/\//,"/"],urlDecodePatterns=[/\%23/g,"#",/\%24/g,"$",/\%26/g,"&",/\%2C/g,",",/\%40/g,"@"];exports.parse=require("url").parse,exports.resolve=require("url").resolve,exports.cwd=function(){return process.browser?location.href:process.cwd()+"/"},exports.getProtocol=function(r){var e=protocolPattern.exec(r);return e?e[1].toLowerCase():void 0},exports.getExtension=function(r){var e=r.lastIndexOf(".");return e>=0?r.substr(e).toLowerCase():""},exports.getHash=function(r){var e=r.indexOf("#");return e>=0?r.substr(e):"#"},exports.stripHash=function(r){var e=r.indexOf("#");return e>=0&&(r=r.substr(0,e)),r},exports.isHttp=function(r){var e=url.getProtocol(r);return"http"===e||"https"===e?!0:void 0===e?process.browser:!1},exports.isFileSystemPath=function(r){if(process.browser)return!1;var e=url.getProtocol(r);return void 0===e||"file"===e},exports.fromFileSystemPath=function(r){for(var e=0;e<urlEncodePatterns.length;e+=2)r=r.replace(urlEncodePatterns[e],urlEncodePatterns[e+1]);return encodeURI(r)},exports.toFileSystemPath=function(r,e){r=decodeURI(r);for(var t=0;t<urlDecodePatterns.length;t+=2)r=r.replace(urlDecodePatterns[t],urlDecodePatterns[t+1]);var o="file://"===r.substr(0,7).toLowerCase();return o&&(r="/"===r[7]?r.substr(8):r.substr(7),isWindows&&"/"===r[1]&&(r=r[0]+":"+r.substr(1)),e?r="file:///"+r:(o=!1,r=isWindows?r:"/"+r)),isWindows&&!o&&(r=r.replace(forwardSlashPattern,"\\")),r};
+
+}).call(this,require('_process'))
+
+},{"_process":71,"url":93}],20:[function(require,module,exports){
+"use strict";var yaml=require("js-yaml"),ono=require("ono");module.exports={parse:function(r,e){try{return yaml.safeLoad(r)}catch(o){throw o instanceof Error?o:ono(o,o.message)}},stringify:function(r,e,o){try{var t=("string"==typeof o?o.length:o)||2;return yaml.safeDump(r,{indent:t})}catch(n){throw n instanceof Error?n:ono(n,n.message)}}};
+
+},{"js-yaml":38,"ono":69}],21:[function(require,module,exports){
+"use strict";module.exports={order:100,canValidate:function(e){return!!e.resolved},validate:function(e){}};
+
+},{}],22:[function(require,module,exports){
+var lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";!function(t){"use strict";function r(t){var r=t.charCodeAt(0);return r===h||r===u?62:r===c||r===f?63:o>r?-1:o+10>r?r-o+26+26:i+26>r?r-i:A+26>r?r-A+26:void 0}function e(t){function e(t){i[f++]=t}var n,h,c,o,A,i;if(t.length%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var u=t.length;A="="===t.charAt(u-2)?2:"="===t.charAt(u-1)?1:0,i=new a(3*t.length/4-A),c=A>0?t.length-4:t.length;var f=0;for(n=0,h=0;c>n;n+=4,h+=3)o=r(t.charAt(n))<<18|r(t.charAt(n+1))<<12|r(t.charAt(n+2))<<6|r(t.charAt(n+3)),e((16711680&o)>>16),e((65280&o)>>8),e(255&o);return 2===A?(o=r(t.charAt(n))<<2|r(t.charAt(n+1))>>4,e(255&o)):1===A&&(o=r(t.charAt(n))<<10|r(t.charAt(n+1))<<4|r(t.charAt(n+2))>>2,e(o>>8&255),e(255&o)),i}function n(t){function r(t){return lookup.charAt(t)}function e(t){return r(t>>18&63)+r(t>>12&63)+r(t>>6&63)+r(63&t)}var n,a,h,c=t.length%3,o="";for(n=0,h=t.length-c;h>n;n+=3)a=(t[n]<<16)+(t[n+1]<<8)+t[n+2],o+=e(a);switch(c){case 1:a=t[t.length-1],o+=r(a>>2),o+=r(a<<4&63),o+="==";break;case 2:a=(t[t.length-2]<<8)+t[t.length-1],o+=r(a>>10),o+=r(a>>4&63),o+=r(a<<2&63),o+="="}return o}var a="undefined"!=typeof Uint8Array?Uint8Array:Array,h="+".charCodeAt(0),c="/".charCodeAt(0),o="0".charCodeAt(0),A="a".charCodeAt(0),i="A".charCodeAt(0),u="-".charCodeAt(0),f="_".charCodeAt(0);t.toByteArray=e,t.fromByteArray=n}("undefined"==typeof exports?this.base64js={}:exports);
+
+},{}],23:[function(require,module,exports){
+
+},{}],24:[function(require,module,exports){
+
+},{}],25:[function(require,module,exports){
+(function (global){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license  MIT
+ */
+"use strict";function typedArraySupport(){function t(){}try{var e=new Uint8Array(1);return e.foo=function(){return 42},e.constructor=t,42===e.foo()&&e.constructor===t&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(r){return!1}}function kMaxLength(){return Buffer.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Buffer(t){return this instanceof Buffer?(Buffer.TYPED_ARRAY_SUPPORT||(this.length=0,this.parent=void 0),"number"==typeof t?fromNumber(this,t):"string"==typeof t?fromString(this,t,arguments.length>1?arguments[1]:"utf8"):fromObject(this,t)):arguments.length>1?new Buffer(t,arguments[1]):new Buffer(t)}function fromNumber(t,e){if(t=allocate(t,0>e?0:0|checked(e)),!Buffer.TYPED_ARRAY_SUPPORT)for(var r=0;e>r;r++)t[r]=0;return t}function fromString(t,e,r){"string"==typeof r&&""!==r||(r="utf8");var n=0|byteLength(e,r);return t=allocate(t,n),t.write(e,r),t}function fromObject(t,e){if(Buffer.isBuffer(e))return fromBuffer(t,e);if(isArray(e))return fromArray(t,e);if(null==e)throw new TypeError("must start with number, buffer, array or string");if("undefined"!=typeof ArrayBuffer){if(e.buffer instanceof ArrayBuffer)return fromTypedArray(t,e);if(e instanceof ArrayBuffer)return fromArrayBuffer(t,e)}return e.length?fromArrayLike(t,e):fromJsonObject(t,e)}function fromBuffer(t,e){var r=0|checked(e.length);return t=allocate(t,r),e.copy(t,0,0,r),t}function fromArray(t,e){var r=0|checked(e.length);t=allocate(t,r);for(var n=0;r>n;n+=1)t[n]=255&e[n];return t}function fromTypedArray(t,e){var r=0|checked(e.length);t=allocate(t,r);for(var n=0;r>n;n+=1)t[n]=255&e[n];return t}function fromArrayBuffer(t,e){return Buffer.TYPED_ARRAY_SUPPORT?(e.byteLength,t=Buffer._augment(new Uint8Array(e))):t=fromTypedArray(t,new Uint8Array(e)),t}function fromArrayLike(t,e){var r=0|checked(e.length);t=allocate(t,r);for(var n=0;r>n;n+=1)t[n]=255&e[n];return t}function fromJsonObject(t,e){var r,n=0;"Buffer"===e.type&&isArray(e.data)&&(r=e.data,n=0|checked(r.length)),t=allocate(t,n);for(var f=0;n>f;f+=1)t[f]=255&r[f];return t}function allocate(t,e){Buffer.TYPED_ARRAY_SUPPORT?(t=Buffer._augment(new Uint8Array(e)),t.__proto__=Buffer.prototype):(t.length=e,t._isBuffer=!0);var r=0!==e&&e<=Buffer.poolSize>>>1;return r&&(t.parent=rootParent),t}function checked(t){if(t>=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return 0|t}function SlowBuffer(t,e){if(!(this instanceof SlowBuffer))return new SlowBuffer(t,e);var r=new Buffer(t,e);return delete r.parent,r}function byteLength(t,e){"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"binary":case"raw":case"raws":return r;case"utf8":case"utf-8":return utf8ToBytes(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return base64ToBytes(t).length;default:if(n)return utf8ToBytes(t).length;e=(""+e).toLowerCase(),n=!0}}function slowToString(t,e,r){var n=!1;if(e=0|e,r=void 0===r||r===1/0?this.length:0|r,t||(t="utf8"),0>e&&(e=0),r>this.length&&(r=this.length),e>=r)return"";for(;;)switch(t){case"hex":return hexSlice(this,e,r);case"utf8":case"utf-8":return utf8Slice(this,e,r);case"ascii":return asciiSlice(this,e,r);case"binary":return binarySlice(this,e,r);case"base64":return base64Slice(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function hexWrite(t,e,r,n){r=Number(r)||0;var f=t.length-r;n?(n=Number(n),n>f&&(n=f)):n=f;var i=e.length;if(i%2!==0)throw new Error("Invalid hex string");n>i/2&&(n=i/2);for(var o=0;n>o;o++){var u=parseInt(e.substr(2*o,2),16);if(isNaN(u))throw new Error("Invalid hex string");t[r+o]=u}return o}function utf8Write(t,e,r,n){return blitBuffer(utf8ToBytes(e,t.length-r),t,r,n)}function asciiWrite(t,e,r,n){return blitBuffer(asciiToBytes(e),t,r,n)}function binaryWrite(t,e,r,n){return asciiWrite(t,e,r,n)}function base64Write(t,e,r,n){return blitBuffer(base64ToBytes(e),t,r,n)}function ucs2Write(t,e,r,n){return blitBuffer(utf16leToBytes(e,t.length-r),t,r,n)}function base64Slice(t,e,r){return 0===e&&r===t.length?base64.fromByteArray(t):base64.fromByteArray(t.slice(e,r))}function utf8Slice(t,e,r){r=Math.min(t.length,r);for(var n=[],f=e;r>f;){var i=t[f],o=null,u=i>239?4:i>223?3:i>191?2:1;if(r>=f+u){var s,a,h,c;switch(u){case 1:128>i&&(o=i);break;case 2:s=t[f+1],128===(192&s)&&(c=(31&i)<<6|63&s,c>127&&(o=c));break;case 3:s=t[f+1],a=t[f+2],128===(192&s)&&128===(192&a)&&(c=(15&i)<<12|(63&s)<<6|63&a,c>2047&&(55296>c||c>57343)&&(o=c));break;case 4:s=t[f+1],a=t[f+2],h=t[f+3],128===(192&s)&&128===(192&a)&&128===(192&h)&&(c=(15&i)<<18|(63&s)<<12|(63&a)<<6|63&h,c>65535&&1114112>c&&(o=c))}}null===o?(o=65533,u=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),f+=u}return decodeCodePointsArray(n)}function decodeCodePointsArray(t){var e=t.length;if(MAX_ARGUMENTS_LENGTH>=e)return String.fromCharCode.apply(String,t);for(var r="",n=0;e>n;)r+=String.fromCharCode.apply(String,t.slice(n,n+=MAX_ARGUMENTS_LENGTH));return r}function asciiSlice(t,e,r){var n="";r=Math.min(t.length,r);for(var f=e;r>f;f++)n+=String.fromCharCode(127&t[f]);return n}function binarySlice(t,e,r){var n="";r=Math.min(t.length,r);for(var f=e;r>f;f++)n+=String.fromCharCode(t[f]);return n}function hexSlice(t,e,r){var n=t.length;(!e||0>e)&&(e=0),(!r||0>r||r>n)&&(r=n);for(var f="",i=e;r>i;i++)f+=toHex(t[i]);return f}function utf16leSlice(t,e,r){for(var n=t.slice(e,r),f="",i=0;i<n.length;i+=2)f+=String.fromCharCode(n[i]+256*n[i+1]);return f}function checkOffset(t,e,r){if(t%1!==0||0>t)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function checkInt(t,e,r,n,f,i){if(!Buffer.isBuffer(t))throw new TypeError("buffer must be a Buffer instance");if(e>f||i>e)throw new RangeError("value is out of bounds");if(r+n>t.length)throw new RangeError("index out of range")}function objectWriteUInt16(t,e,r,n){0>e&&(e=65535+e+1);for(var f=0,i=Math.min(t.length-r,2);i>f;f++)t[r+f]=(e&255<<8*(n?f:1-f))>>>8*(n?f:1-f)}function objectWriteUInt32(t,e,r,n){0>e&&(e=4294967295+e+1);for(var f=0,i=Math.min(t.length-r,4);i>f;f++)t[r+f]=e>>>8*(n?f:3-f)&255}function checkIEEE754(t,e,r,n,f,i){if(e>f||i>e)throw new RangeError("value is out of bounds");if(r+n>t.length)throw new RangeError("index out of range");if(0>r)throw new RangeError("index out of range")}function writeFloat(t,e,r,n,f){return f||checkIEEE754(t,e,r,4,3.4028234663852886e38,-3.4028234663852886e38),ieee754.write(t,e,r,n,23,4),r+4}function writeDouble(t,e,r,n,f){return f||checkIEEE754(t,e,r,8,1.7976931348623157e308,-1.7976931348623157e308),ieee754.write(t,e,r,n,52,8),r+8}function base64clean(t){if(t=stringtrim(t).replace(INVALID_BASE64_RE,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function stringtrim(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function toHex(t){return 16>t?"0"+t.toString(16):t.toString(16)}function utf8ToBytes(t,e){e=e||1/0;for(var r,n=t.length,f=null,i=[],o=0;n>o;o++){if(r=t.charCodeAt(o),r>55295&&57344>r){if(!f){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&i.push(239,191,189);continue}f=r;continue}if(56320>r){(e-=3)>-1&&i.push(239,191,189),f=r;continue}r=(f-55296<<10|r-56320)+65536}else f&&(e-=3)>-1&&i.push(239,191,189);if(f=null,128>r){if((e-=1)<0)break;i.push(r)}else if(2048>r){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(65536>r){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(1114112>r))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function asciiToBytes(t){for(var e=[],r=0;r<t.length;r++)e.push(255&t.charCodeAt(r));return e}function utf16leToBytes(t,e){for(var r,n,f,i=[],o=0;o<t.length&&!((e-=2)<0);o++)r=t.charCodeAt(o),n=r>>8,f=r%256,i.push(f),i.push(n);return i}function base64ToBytes(t){return base64.toByteArray(base64clean(t))}function blitBuffer(t,e,r,n){for(var f=0;n>f&&!(f+r>=e.length||f>=t.length);f++)e[f+r]=t[f];return f}var base64=require("base64-js"),ieee754=require("ieee754"),isArray=require("isarray");exports.Buffer=Buffer,exports.SlowBuffer=SlowBuffer,exports.INSPECT_MAX_BYTES=50,Buffer.poolSize=8192;var rootParent={};Buffer.TYPED_ARRAY_SUPPORT=void 0!==global.TYPED_ARRAY_SUPPORT?global.TYPED_ARRAY_SUPPORT:typedArraySupport(),Buffer.TYPED_ARRAY_SUPPORT?(Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array):(Buffer.prototype.length=void 0,Buffer.prototype.parent=void 0),Buffer.isBuffer=function(t){return!(null==t||!t._isBuffer)},Buffer.compare=function(t,e){if(!Buffer.isBuffer(t)||!Buffer.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,n=e.length,f=0,i=Math.min(r,n);i>f&&t[f]===e[f];)++f;return f!==i&&(r=t[f],n=e[f]),n>r?-1:r>n?1:0},Buffer.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"raw":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Buffer.concat=function(t,e){if(!isArray(t))throw new TypeError("list argument must be an Array of Buffers.");if(0===t.length)return new Buffer(0);var r;if(void 0===e)for(e=0,r=0;r<t.length;r++)e+=t[r].length;var n=new Buffer(e),f=0;for(r=0;r<t.length;r++){var i=t[r];i.copy(n,f),f+=i.length}return n},Buffer.byteLength=byteLength,Buffer.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?utf8Slice(this,0,t):slowToString.apply(this,arguments)},Buffer.prototype.equals=function(t){if(!Buffer.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t?!0:0===Buffer.compare(this,t)},Buffer.prototype.inspect=function(){var t="",e=exports.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),"<Buffer "+t+">"},Buffer.prototype.compare=function(t){if(!Buffer.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t?0:Buffer.compare(this,t)},Buffer.prototype.indexOf=function(t,e){function r(t,e,r){for(var n=-1,f=0;r+f<t.length;f++)if(t[r+f]===e[-1===n?0:f-n]){if(-1===n&&(n=f),f-n+1===e.length)return r+n}else n=-1;return-1}if(e>2147483647?e=2147483647:-2147483648>e&&(e=-2147483648),e>>=0,0===this.length)return-1;if(e>=this.length)return-1;if(0>e&&(e=Math.max(this.length+e,0)),"string"==typeof t)return 0===t.length?-1:String.prototype.indexOf.call(this,t,e);if(Buffer.isBuffer(t))return r(this,t,e);if("number"==typeof t)return Buffer.TYPED_ARRAY_SUPPORT&&"function"===Uint8Array.prototype.indexOf?Uint8Array.prototype.indexOf.call(this,t,e):r(this,[t],e);throw new TypeError("val must be string, number or Buffer")},Buffer.prototype.get=function(t){return console.log(".get() is deprecated. Access using array indexes instead."),this.readUInt8(t)},Buffer.prototype.set=function(t,e){return console.log(".set() is deprecated. Access using array indexes instead."),this.writeUInt8(t,e)},Buffer.prototype.write=function(t,e,r,n){if(void 0===e)n="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)n=e,r=this.length,e=0;else if(isFinite(e))e=0|e,isFinite(r)?(r=0|r,void 0===n&&(n="utf8")):(n=r,r=void 0);else{var f=n;n=e,e=0|r,r=f}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(0>r||0>e)||e>this.length)throw new RangeError("attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return hexWrite(this,t,e,r);case"utf8":case"utf-8":return utf8Write(this,t,e,r);case"ascii":return asciiWrite(this,t,e,r);case"binary":return binaryWrite(this,t,e,r);case"base64":return base64Write(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;Buffer.prototype.slice=function(t,e){var r=this.length;t=~~t,e=void 0===e?r:~~e,0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),t>e&&(e=t);var n;if(Buffer.TYPED_ARRAY_SUPPORT)n=Buffer._augment(this.subarray(t,e));else{var f=e-t;n=new Buffer(f,void 0);for(var i=0;f>i;i++)n[i]=this[i+t]}return n.length&&(n.parent=this.parent||this),n},Buffer.prototype.readUIntLE=function(t,e,r){t=0|t,e=0|e,r||checkOffset(t,e,this.length);for(var n=this[t],f=1,i=0;++i<e&&(f*=256);)n+=this[t+i]*f;return n},Buffer.prototype.readUIntBE=function(t,e,r){t=0|t,e=0|e,r||checkOffset(t,e,this.length);for(var n=this[t+--e],f=1;e>0&&(f*=256);)n+=this[t+--e]*f;return n},Buffer.prototype.readUInt8=function(t,e){return e||checkOffset(t,1,this.length),this[t]},Buffer.prototype.readUInt16LE=function(t,e){return e||checkOffset(t,2,this.length),this[t]|this[t+1]<<8},Buffer.prototype.readUInt16BE=function(t,e){return e||checkOffset(t,2,this.length),this[t]<<8|this[t+1]},Buffer.prototype.readUInt32LE=function(t,e){return e||checkOffset(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},Buffer.prototype.readUInt32BE=function(t,e){return e||checkOffset(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},Buffer.prototype.readIntLE=function(t,e,r){t=0|t,e=0|e,r||checkOffset(t,e,this.length);for(var n=this[t],f=1,i=0;++i<e&&(f*=256);)n+=this[t+i]*f;return f*=128,n>=f&&(n-=Math.pow(2,8*e)),n},Buffer.prototype.readIntBE=function(t,e,r){t=0|t,e=0|e,r||checkOffset(t,e,this.length);for(var n=e,f=1,i=this[t+--n];n>0&&(f*=256);)i+=this[t+--n]*f;return f*=128,i>=f&&(i-=Math.pow(2,8*e)),i},Buffer.prototype.readInt8=function(t,e){return e||checkOffset(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},Buffer.prototype.readInt16LE=function(t,e){e||checkOffset(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt16BE=function(t,e){e||checkOffset(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt32LE=function(t,e){return e||checkOffset(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},Buffer.prototype.readInt32BE=function(t,e){return e||checkOffset(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},Buffer.prototype.readFloatLE=function(t,e){return e||checkOffset(t,4,this.length),ieee754.read(this,t,!0,23,4)},Buffer.prototype.readFloatBE=function(t,e){return e||checkOffset(t,4,this.length),ieee754.read(this,t,!1,23,4)},Buffer.prototype.readDoubleLE=function(t,e){return e||checkOffset(t,8,this.length),ieee754.read(this,t,!0,52,8)},Buffer.prototype.readDoubleBE=function(t,e){return e||checkOffset(t,8,this.length),ieee754.read(this,t,!1,52,8)},Buffer.prototype.writeUIntLE=function(t,e,r,n){t=+t,e=0|e,r=0|r,n||checkInt(this,t,e,r,Math.pow(2,8*r),0);var f=1,i=0;for(this[e]=255&t;++i<r&&(f*=256);)this[e+i]=t/f&255;return e+r},Buffer.prototype.writeUIntBE=function(t,e,r,n){t=+t,e=0|e,r=0|r,n||checkInt(this,t,e,r,Math.pow(2,8*r),0);var f=r-1,i=1;for(this[e+f]=255&t;--f>=0&&(i*=256);)this[e+f]=t/i&255;return e+r},Buffer.prototype.writeUInt8=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,1,255,0),Buffer.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},Buffer.prototype.writeUInt16LE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):objectWriteUInt16(this,t,e,!0),e+2},Buffer.prototype.writeUInt16BE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):objectWriteUInt16(this,t,e,!1),e+2},Buffer.prototype.writeUInt32LE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):objectWriteUInt32(this,t,e,!0),e+4},Buffer.prototype.writeUInt32BE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):objectWriteUInt32(this,t,e,!1),e+4},Buffer.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e=0|e,!n){var f=Math.pow(2,8*r-1);checkInt(this,t,e,r,f-1,-f)}var i=0,o=1,u=0>t?1:0;for(this[e]=255&t;++i<r&&(o*=256);)this[e+i]=(t/o>>0)-u&255;return e+r},Buffer.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e=0|e,!n){var f=Math.pow(2,8*r-1);checkInt(this,t,e,r,f-1,-f)}var i=r-1,o=1,u=0>t?1:0;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=(t/o>>0)-u&255;return e+r},Buffer.prototype.writeInt8=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),0>t&&(t=255+t+1),this[e]=255&t,e+1},Buffer.prototype.writeInt16LE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):objectWriteUInt16(this,t,e,!0),e+2},Buffer.prototype.writeInt16BE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):objectWriteUInt16(this,t,e,!1),e+2},Buffer.prototype.writeInt32LE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):objectWriteUInt32(this,t,e,!0),e+4},Buffer.prototype.writeInt32BE=function(t,e,r){return t=+t,e=0|e,r||checkInt(this,t,e,4,2147483647,-2147483648),0>t&&(t=4294967295+t+1),Buffer.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):objectWriteUInt32(this,t,e,!1),e+4},Buffer.prototype.writeFloatLE=function(t,e,r){return writeFloat(this,t,e,!0,r)},Buffer.prototype.writeFloatBE=function(t,e,r){return writeFloat(this,t,e,!1,r)},Buffer.prototype.writeDoubleLE=function(t,e,r){return writeDouble(this,t,e,!0,r)},Buffer.prototype.writeDoubleBE=function(t,e,r){return writeDouble(this,t,e,!1,r)},Buffer.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&r>n&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(0>e)throw new RangeError("targetStart out of bounds");if(0>r||r>=this.length)throw new RangeError("sourceStart out of bounds");if(0>n)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);var f,i=n-r;if(this===t&&e>r&&n>e)for(f=i-1;f>=0;f--)t[f+e]=this[f+r];else if(1e3>i||!Buffer.TYPED_ARRAY_SUPPORT)for(f=0;i>f;f++)t[f+e]=this[f+r];else t._set(this.subarray(r,r+i),e);return i},Buffer.prototype.fill=function(t,e,r){if(t||(t=0),e||(e=0),r||(r=this.length),e>r)throw new RangeError("end < start");if(r!==e&&0!==this.length){if(0>e||e>=this.length)throw new RangeError("start out of bounds");if(0>r||r>this.length)throw new RangeError("end out of bounds");var n;if("number"==typeof t)for(n=e;r>n;n++)this[n]=t;else{var f=utf8ToBytes(t.toString()),i=f.length;for(n=e;r>n;n++)this[n]=f[n%i]}return this}},Buffer.prototype.toArrayBuffer=function(){if("undefined"!=typeof Uint8Array){if(Buffer.TYPED_ARRAY_SUPPORT)return new Buffer(this).buffer;for(var t=new Uint8Array(this.length),e=0,r=t.length;r>e;e+=1)t[e]=this[e];return t.buffer}throw new TypeError("Buffer.toArrayBuffer not supported in this browser")};var BP=Buffer.prototype;Buffer._augment=function(t){return t.constructor=Buffer,t._isBuffer=!0,t._set=t.set,t.get=BP.get,t.set=BP.set,t.write=BP.write,t.toString=BP.toString,t.toLocaleString=BP.toString,t.toJSON=BP.toJSON,t.equals=BP.equals,t.compare=BP.compare,t.indexOf=BP.indexOf,t.copy=BP.copy,t.slice=BP.slice,t.readUIntLE=BP.readUIntLE,t.readUIntBE=BP.readUIntBE,t.readUInt8=BP.readUInt8,t.readUInt16LE=BP.readUInt16LE,t.readUInt16BE=BP.readUInt16BE,t.readUInt32LE=BP.readUInt32LE,t.readUInt32BE=BP.readUInt32BE,t.readIntLE=BP.readIntLE,t.readIntBE=BP.readIntBE,t.readInt8=BP.readInt8,t.readInt16LE=BP.readInt16LE,t.readInt16BE=BP.readInt16BE,t.readInt32LE=BP.readInt32LE,t.readInt32BE=BP.readInt32BE,t.readFloatLE=BP.readFloatLE,t.readFloatBE=BP.readFloatBE,t.readDoubleLE=BP.readDoubleLE,t.readDoubleBE=BP.readDoubleBE,t.writeUInt8=BP.writeUInt8,t.writeUIntLE=BP.writeUIntLE,t.writeUIntBE=BP.writeUIntBE,t.writeUInt16LE=BP.writeUInt16LE,t.writeUInt16BE=BP.writeUInt16BE,t.writeUInt32LE=BP.writeUInt32LE,t.writeUInt32BE=BP.writeUInt32BE,t.writeIntLE=BP.writeIntLE,t.writeIntBE=BP.writeIntBE,t.writeInt8=BP.writeInt8,t.writeInt16LE=BP.writeInt16LE,t.writeInt16BE=BP.writeInt16BE,t.writeInt32LE=BP.writeInt32LE,t.writeInt32BE=BP.writeInt32BE,t.writeFloatLE=BP.writeFloatLE,t.writeFloatBE=BP.writeFloatBE,t.writeDoubleLE=BP.writeDoubleLE,t.writeDoubleBE=BP.writeDoubleBE,t.fill=BP.fill,t.inspect=BP.inspect,t.toArrayBuffer=BP.toArrayBuffer,t};var INVALID_BASE64_RE=/[^+\/0-9A-Za-z-_]/g;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{"base64-js":22,"ieee754":34,"isarray":37}],26:[function(require,module,exports){
+module.exports={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",208:"Already Reported",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",307:"Temporary Redirect",308:"Permanent Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",421:"Misdirected Request",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Unordered Collection",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",509:"Bandwidth Limit Exceeded",510:"Not Extended",511:"Network Authentication Required"};
+
+},{}],27:[function(require,module,exports){
+(function (process,global){
+"use strict";var next=global.process&&process.nextTick||global.setImmediate||function(n){setTimeout(n,0)};module.exports=function(n,t){return n?void t.then(function(t){next(function(){n(null,t)})},function(t){next(function(){n(t)})}):t};
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{"_process":71}],28:[function(require,module,exports){
+(function (Buffer){
+function isArray(r){return Array.isArray?Array.isArray(r):"[object Array]"===objectToString(r)}function isBoolean(r){return"boolean"==typeof r}function isNull(r){return null===r}function isNullOrUndefined(r){return null==r}function isNumber(r){return"number"==typeof r}function isString(r){return"string"==typeof r}function isSymbol(r){return"symbol"==typeof r}function isUndefined(r){return void 0===r}function isRegExp(r){return"[object RegExp]"===objectToString(r)}function isObject(r){return"object"==typeof r&&null!==r}function isDate(r){return"[object Date]"===objectToString(r)}function isError(r){return"[object Error]"===objectToString(r)||r instanceof Error}function isFunction(r){return"function"==typeof r}function isPrimitive(r){return null===r||"boolean"==typeof r||"number"==typeof r||"string"==typeof r||"symbol"==typeof r||"undefined"==typeof r}function objectToString(r){return Object.prototype.toString.call(r)}exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=Buffer.isBuffer;
+
+}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
+
+},{"../../is-buffer/index.js":36}],29:[function(require,module,exports){
+function useColors(){return"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}function formatArgs(){var o=arguments,e=this.useColors;if(o[0]=(e?"%c":"")+this.namespace+(e?" %c":" ")+o[0]+(e?"%c ":" ")+"+"+exports.humanize(this.diff),!e)return o;var r="color: "+this.color;o=[o[0],r,"color: inherit"].concat(Array.prototype.slice.call(o,1));var t=0,s=0;return o[0].replace(/%[a-z%]/g,function(o){"%%"!==o&&(t++,"%c"===o&&(s=t))}),o.splice(s,0,r),o}function log(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(o){try{null==o?exports.storage.removeItem("debug"):exports.storage.debug=o}catch(e){}}function load(){var o;try{o=exports.storage.debug}catch(e){}return o}function localstorage(){try{return window.localStorage}catch(o){}}exports=module.exports=require("./debug"),exports.log=log,exports.formatArgs=formatArgs,exports.save=save,exports.load=load,exports.useColors=useColors,exports.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:localstorage(),exports.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],exports.formatters.j=function(o){return JSON.stringify(o)},exports.enable(load());
+
+},{"./debug":30}],30:[function(require,module,exports){
+function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(e){function r(){}function o(){var e=o,r=+new Date,s=r-(prevTime||r);e.diff=s,e.prev=prevTime,e.curr=r,prevTime=r,null==e.useColors&&(e.useColors=exports.useColors()),null==e.color&&e.useColors&&(e.color=selectColor());var t=Array.prototype.slice.call(arguments);t[0]=exports.coerce(t[0]),"string"!=typeof t[0]&&(t=["%o"].concat(t));var n=0;t[0]=t[0].replace(/%([a-z%])/g,function(r,o){if("%%"===r)return r;n++;var s=exports.formatters[o];if("function"==typeof s){var p=t[n];r=s.call(e,p),t.splice(n,1),n--}return r}),"function"==typeof exports.formatArgs&&(t=exports.formatArgs.apply(e,t));var p=o.log||exports.log||console.log.bind(console);p.apply(e,t)}r.enabled=!1,o.enabled=!0;var s=exports.enabled(e)?o:r;return s.namespace=e,s}function enable(e){exports.save(e);for(var r=(e||"").split(/[\s,]+/),o=r.length,s=0;o>s;s++)r[s]&&(e=r[s].replace(/\*/g,".*?"),"-"===e[0]?exports.skips.push(new RegExp("^"+e.substr(1)+"$")):exports.names.push(new RegExp("^"+e+"$")))}function disable(){exports.enable("")}function enabled(e){var r,o;for(r=0,o=exports.skips.length;o>r;r++)if(exports.skips[r].test(e))return!1;for(r=0,o=exports.names.length;o>r;r++)if(exports.names[r].test(e))return!0;return!1}function coerce(e){return e instanceof Error?e.stack||e.message:e}exports=module.exports=debug,exports.coerce=coerce,exports.disable=disable,exports.enable=enable,exports.enabled=enabled,exports.humanize=require("ms"),exports.names=[],exports.skips=[],exports.formatters={};var prevColor=0,prevTime;
+
+},{"ms":68}],31:[function(require,module,exports){
+(function (process,global){
+/*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
+ * @version   3.1.2
+ */
+(function(){"use strict";function t(t){return"function"==typeof t||"object"==typeof t&&null!==t}function e(t){return"function"==typeof t}function n(t){W=t}function r(t){H=t}function o(){return function(){process.nextTick(a)}}function i(){return function(){U(a)}}function s(){var t=0,e=new Q(a),n=document.createTextNode("");return e.observe(n,{characterData:!0}),function(){n.data=t=++t%2}}function u(){var t=new MessageChannel;return t.port1.onmessage=a,function(){t.port2.postMessage(0)}}function c(){return function(){setTimeout(a,1)}}function a(){for(var t=0;G>t;t+=2){var e=X[t],n=X[t+1];e(n),X[t]=void 0,X[t+1]=void 0}G=0}function f(){try{var t=require,e=t("vertx");return U=e.runOnLoop||e.runOnContext,i()}catch(n){return c()}}function l(t,e){var n=this,r=n._state;if(r===et&&!t||r===nt&&!e)return this;var o=new this.constructor(p),i=n._result;if(r){var s=arguments[r-1];H(function(){C(r,o,s,i)})}else j(n,o,t,e);return o}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return g(n,t),n}function p(){}function _(){return new TypeError("You cannot resolve a promise with itself")}function v(){return new TypeError("A promises callback cannot return that same promise.")}function d(t){try{return t.then}catch(e){return rt.error=e,rt}}function y(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function m(t,e,n){H(function(t){var r=!1,o=y(n,e,function(n){r||(r=!0,e!==n?g(t,n):E(t,n))},function(e){r||(r=!0,S(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,S(t,o))},t)}function w(t,e){e._state===et?E(t,e._result):e._state===nt?S(t,e._result):j(e,void 0,function(e){g(t,e)},function(e){S(t,e)})}function b(t,n,r){n.constructor===t.constructor&&r===Z&&constructor.resolve===$?w(t,n):r===rt?S(t,rt.error):void 0===r?E(t,n):e(r)?m(t,n,r):E(t,n)}function g(e,n){e===n?S(e,_()):t(n)?b(e,n,d(n)):E(e,n)}function A(t){t._onerror&&t._onerror(t._result),T(t)}function E(t,e){t._state===tt&&(t._result=e,t._state=et,0!==t._subscribers.length&&H(T,t))}function S(t,e){t._state===tt&&(t._state=nt,t._result=e,H(A,t))}function j(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+et]=n,o[i+nt]=r,0===i&&t._state&&H(T,t)}function T(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r,o,i=t._result,s=0;s<e.length;s+=3)r=e[s],o=e[s+n],r?C(n,r,o,i):o(i);t._subscribers.length=0}}function P(){this.error=null}function x(t,e){try{return t(e)}catch(n){return ot.error=n,ot}}function C(t,n,r,o){var i,s,u,c,a=e(r);if(a){if(i=x(r,o),i===ot?(c=!0,s=i.error,i=null):u=!0,n===i)return void S(n,v())}else i=o,u=!0;n._state!==tt||(a&&u?g(n,i):c?S(n,s):t===et?E(n,i):t===nt&&S(n,i))}function M(t,e){try{e(function(e){g(t,e)},function(e){S(t,e)})}catch(n){S(t,n)}}function O(t){return new ft(this,t).promise}function k(t){function e(t){g(o,t)}function n(t){S(o,t)}var r=this,o=new r(p);if(!B(t))return S(o,new TypeError("You must pass an array to race.")),o;for(var i=t.length,s=0;o._state===tt&&i>s;s++)j(r.resolve(t[s]),void 0,e,n);return o}function Y(t){var e=this,n=new e(p);return S(n,t),n}function q(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function F(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function D(t){this._id=ct++,this._state=void 0,this._result=void 0,this._subscribers=[],p!==t&&("function"!=typeof t&&q(),this instanceof D?M(this,t):F())}function K(t,e){this._instanceConstructor=t,this.promise=new t(p),Array.isArray(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?E(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&E(this.promise,this._result))):S(this.promise,this._validationError())}function L(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;n&&"[object Promise]"===Object.prototype.toString.call(n.resolve())&&!n.cast||(t.Promise=at)}var N;N=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var U,W,z,B=N,G=0,H=function(t,e){X[G]=t,X[G+1]=e,G+=2,2===G&&(W?W(a):z())},I="undefined"!=typeof window?window:void 0,J=I||{},Q=J.MutationObserver||J.WebKitMutationObserver,R="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),V="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,X=new Array(1e3);z=R?o():Q?s():V?u():void 0===I&&"function"==typeof require?f():c();var Z=l,$=h,tt=void 0,et=1,nt=2,rt=new P,ot=new P,it=O,st=k,ut=Y,ct=0,at=D;D.all=it,D.race=st,D.resolve=$,D.reject=ut,D._setScheduler=n,D._setAsap=r,D._asap=H,D.prototype={constructor:D,then:Z,"catch":function(t){return this.then(null,t)}};var ft=K;K.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},K.prototype._enumerate=function(){for(var t=this.length,e=this._input,n=0;this._state===tt&&t>n;n++)this._eachEntry(e[n],n)},K.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===$){var o=d(t);if(o===Z&&t._state!==tt)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===at){var i=new n(p);b(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new n(function(e){e(t)}),e)}else this._willSettleAt(r(t),e)},K.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===tt&&(this._remaining--,t===nt?S(r,n):this._result[e]=n),0===this._remaining&&E(r,this._result)},K.prototype._willSettleAt=function(t,e){var n=this;j(t,void 0,function(t){n._settledAt(et,e,t)},function(t){n._settledAt(nt,e,t)})};var lt=L,ht={Promise:at,polyfill:lt};"function"==typeof define&&define.amd?define(function(){return ht}):"undefined"!=typeof module&&module.exports?module.exports=ht:"undefined"!=typeof this&&(this.ES6Promise=ht),lt()}).call(this);
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{"_process":71}],32:[function(require,module,exports){
+function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(e){return"function"==typeof e}function isNumber(e){return"number"==typeof e}function isObject(e){return"object"==typeof e&&null!==e}function isUndefined(e){return void 0===e}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(e){if(!isNumber(e)||0>e||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},EventEmitter.prototype.emit=function(e){var t,i,n,s,r,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;throw TypeError('Uncaught, unspecified "error" event.')}if(i=this._events[e],isUndefined(i))return!1;if(isFunction(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),i.apply(this,s)}else if(isObject(i))for(s=Array.prototype.slice.call(arguments,1),o=i.slice(),n=o.length,r=0;n>r;r++)o[r].apply(this,s);return!0},EventEmitter.prototype.addListener=function(e,t){var i;if(!isFunction(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,isFunction(t.listener)?t.listener:t),this._events[e]?isObject(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,isObject(this._events[e])&&!this._events[e].warned&&(i=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(e,t){function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}if(!isFunction(t))throw TypeError("listener must be a function");var n=!1;return i.listener=t,this.on(e,i),this},EventEmitter.prototype.removeListener=function(e,t){var i,n,s,r;if(!isFunction(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(i=this._events[e],s=i.length,n=-1,i===t||isFunction(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(isObject(i)){for(r=s;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){n=r;break}if(0>n)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(n,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},EventEmitter.prototype.removeAllListeners=function(e){var t,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(i=this._events[e],isFunction(i))this.removeListener(e,i);else if(i)for(;i.length;)this.removeListener(e,i[i.length-1]);return delete this._events[e],this},EventEmitter.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?isFunction(this._events[e])?[this._events[e]]:this._events[e].slice():[]},EventEmitter.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(isFunction(t))return 1;if(t)return t.length}return 0},EventEmitter.listenerCount=function(e,t){return e.listenerCount(t)};
+
+},{}],33:[function(require,module,exports){
+var http=require("http"),https=module.exports;for(var key in http)http.hasOwnProperty(key)&&(https[key]=http[key]);https.request=function(t,e){return t||(t={}),t.scheme="https",t.protocol="https:",http.request.call(this,t,e)};
+
+},{"http":87}],34:[function(require,module,exports){
+exports.read=function(a,o,t,r,h){var M,p,w=8*h-r-1,f=(1<<w)-1,e=f>>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<<e)-1,N=i>>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=0>o||0===o&&0>1/o?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<<h|w,e+=h;e>0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l};
+
+},{}],35:[function(require,module,exports){
+"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t};
+
+},{}],36:[function(require,module,exports){
+module.exports=function(r){return!(null==r||!(r._isBuffer||r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r)))};
+
+},{}],37:[function(require,module,exports){
+var toString={}.toString;module.exports=Array.isArray||function(r){return"[object Array]"==toString.call(r)};
+
+},{}],38:[function(require,module,exports){
+"use strict";var yaml=require("./lib/js-yaml.js");module.exports=yaml;
+
+},{"./lib/js-yaml.js":39}],39:[function(require,module,exports){
+"use strict";function deprecated(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}var loader=require("./js-yaml/loader"),dumper=require("./js-yaml/dumper");module.exports.Type=require("./js-yaml/type"),module.exports.Schema=require("./js-yaml/schema"),module.exports.FAILSAFE_SCHEMA=require("./js-yaml/schema/failsafe"),module.exports.JSON_SCHEMA=require("./js-yaml/schema/json"),module.exports.CORE_SCHEMA=require("./js-yaml/schema/core"),module.exports.DEFAULT_SAFE_SCHEMA=require("./js-yaml/schema/default_safe"),module.exports.DEFAULT_FULL_SCHEMA=require("./js-yaml/schema/default_full"),module.exports.load=loader.load,module.exports.loadAll=loader.loadAll,module.exports.safeLoad=loader.safeLoad,module.exports.safeLoadAll=loader.safeLoadAll,module.exports.dump=dumper.dump,module.exports.safeDump=dumper.safeDump,module.exports.YAMLException=require("./js-yaml/exception"),module.exports.MINIMAL_SCHEMA=require("./js-yaml/schema/failsafe"),module.exports.SAFE_SCHEMA=require("./js-yaml/schema/default_safe"),module.exports.DEFAULT_SCHEMA=require("./js-yaml/schema/default_full"),module.exports.scan=deprecated("scan"),module.exports.parse=deprecated("parse"),module.exports.compose=deprecated("compose"),module.exports.addConstructor=deprecated("addConstructor");
+
+},{"./js-yaml/dumper":41,"./js-yaml/exception":42,"./js-yaml/loader":43,"./js-yaml/schema":45,"./js-yaml/schema/core":46,"./js-yaml/schema/default_full":47,"./js-yaml/schema/default_safe":48,"./js-yaml/schema/failsafe":49,"./js-yaml/schema/json":50,"./js-yaml/type":51}],40:[function(require,module,exports){
+"use strict";function isNothing(e){return"undefined"==typeof e||null===e}function isObject(e){return"object"==typeof e&&null!==e}function toArray(e){return Array.isArray(e)?e:isNothing(e)?[]:[e]}function extend(e,t){var r,o,n,i;if(t)for(i=Object.keys(t),r=0,o=i.length;o>r;r+=1)n=i[r],e[n]=t[n];return e}function repeat(e,t){var r,o="";for(r=0;t>r;r+=1)o+=e;return o}function isNegativeZero(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}module.exports.isNothing=isNothing,module.exports.isObject=isObject,module.exports.toArray=toArray,module.exports.repeat=repeat,module.exports.isNegativeZero=isNegativeZero,module.exports.extend=extend;
+
+},{}],41:[function(require,module,exports){
+"use strict";function compileStyleMap(e,t){var n,i,r,E,o,l,a;if(null===t)return{};for(n={},i=Object.keys(t),r=0,E=i.length;E>r;r+=1)o=i[r],l=String(t[o]),"!!"===o.slice(0,2)&&(o="tag:yaml.org,2002:"+o.slice(2)),a=e.compiledTypeMap[o],a&&_hasOwnProperty.call(a.styleAliases,l)&&(l=a.styleAliases[l]),n[o]=l;return n}function encodeHex(e){var t,n,i;if(t=e.toString(16).toUpperCase(),255>=e)n="x",i=2;else if(65535>=e)n="u",i=4;else{if(!(4294967295>=e))throw new YAMLException("code point within a string may not be greater than 0xFFFFFFFF");n="U",i=8}return"\\"+n+common.repeat("0",i-t.length)+t}function State(e){this.schema=e.schema||DEFAULT_FULL_SCHEMA,this.indent=Math.max(1,e.indent||2),this.skipInvalid=e.skipInvalid||!1,this.flowLevel=common.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=compileStyleMap(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function indentString(e,t){for(var n,i=common.repeat(" ",t),r=0,E=-1,o="",l=e.length;l>r;)E=e.indexOf("\n",r),-1===E?(n=e.slice(r),r=l):(n=e.slice(r,E+1),r=E+1),n.length&&"\n"!==n&&(o+=i),o+=n;return o}function generateNextLine(e,t){return"\n"+common.repeat(" ",e.indent*t)}function testImplicitResolving(e,t){var n,i,r;for(n=0,i=e.implicitTypes.length;i>n;n+=1)if(r=e.implicitTypes[n],r.resolve(t))return!0;return!1}function isWhitespace(e){return e===CHAR_SPACE||e===CHAR_TAB}function isPrintable(e){return e>=32&&126>=e||e>=161&&55295>=e&&8232!==e&&8233!==e||e>=57344&&65533>=e&&65279!==e||e>=65536&&1114111>=e}function isPlainSafe(e){return isPrintable(e)&&65279!==e&&e!==CHAR_COMMA&&e!==CHAR_LEFT_SQUARE_BRACKET&&e!==CHAR_RIGHT_SQUARE_BRACKET&&e!==CHAR_LEFT_CURLY_BRACKET&&e!==CHAR_RIGHT_CURLY_BRACKET&&e!==CHAR_COLON&&e!==CHAR_SHARP}function isPlainSafeFirst(e){return isPrintable(e)&&65279!==e&&!isWhitespace(e)&&e!==CHAR_MINUS&&e!==CHAR_QUESTION&&e!==CHAR_COLON&&e!==CHAR_COMMA&&e!==CHAR_LEFT_SQUARE_BRACKET&&e!==CHAR_RIGHT_SQUARE_BRACKET&&e!==CHAR_LEFT_CURLY_BRACKET&&e!==CHAR_RIGHT_CURLY_BRACKET&&e!==CHAR_SHARP&&e!==CHAR_AMPERSAND&&e!==CHAR_ASTERISK&&e!==CHAR_EXCLAMATION&&e!==CHAR_VERTICAL_LINE&&e!==CHAR_GREATER_THAN&&e!==CHAR_SINGLE_QUOTE&&e!==CHAR_DOUBLE_QUOTE&&e!==CHAR_PERCENT&&e!==CHAR_COMMERCIAL_AT&&e!==CHAR_GRAVE_ACCENT}function chooseScalarStyle(e,t,n,i,r){var E,o,l=!1,a=!1,s=-1!==i,c=-1,A=isPlainSafeFirst(e.charCodeAt(0))&&!isWhitespace(e.charCodeAt(e.length-1));if(t)for(E=0;E<e.length;E++){if(o=e.charCodeAt(E),!isPrintable(o))return STYLE_DOUBLE;A=A&&isPlainSafe(o)}else{for(E=0;E<e.length;E++){if(o=e.charCodeAt(E),o===CHAR_LINE_FEED)l=!0,s&&(a=a||E-c-1>i&&" "!==e[c+1],c=E);else if(!isPrintable(o))return STYLE_DOUBLE;A=A&&isPlainSafe(o)}a=a||s&&E-c-1>i&&" "!==e[c+1]}return l||a?" "===e[0]&&n>9?STYLE_DOUBLE:a?STYLE_FOLDED:STYLE_LITERAL:A&&!r(e)?STYLE_PLAIN:STYLE_SINGLE}function writeScalar(e,t,n,i){e.dump=function(){function r(t){return testImplicitResolving(e,t)}if(0===t.length)return"''";if(!e.noCompatMode&&-1!==DEPRECATED_BOOLEANS_SYNTAX.indexOf(t))return"'"+t+"'";var E=e.indent*Math.max(1,n),o=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-E),l=i||e.flowLevel>-1&&n>=e.flowLevel;switch(chooseScalarStyle(t,l,e.indent,o,r)){case STYLE_PLAIN:return t;case STYLE_SINGLE:return"'"+t.replace(/'/g,"''")+"'";case STYLE_LITERAL:return"|"+blockHeader(t,e.indent)+dropEndingNewline(indentString(t,E));case STYLE_FOLDED:return">"+blockHeader(t,e.indent)+dropEndingNewline(indentString(foldString(t,o),E));case STYLE_DOUBLE:return'"'+escapeString(t,o)+'"';default:throw new YAMLException("impossible error: invalid scalar style")}}()}function blockHeader(e,t){var n=" "===e[0]?String(t):"",i="\n"===e[e.length-1],r=i&&("\n"===e[e.length-2]||"\n"===e),E=r?"+":i?"":"-";return n+E+"\n"}function dropEndingNewline(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function foldString(e,t){for(var n,i,r=/(\n+)([^\n]*)/g,E=function(){var n=e.indexOf("\n");return n=-1!==n?n:e.length,r.lastIndex=n,foldLine(e.slice(0,n),t)}(),o="\n"===e[0]||" "===e[0];i=r.exec(e);){var l=i[1],a=i[2];n=" "===a[0],E+=l+(o||n||""===a?"":"\n")+foldLine(a,t),o=n}return E}function foldLine(e,t){if(""===e||" "===e[0])return e;for(var n,i,r=/ [^ ]/g,E=0,o=0,l=0,a="";n=r.exec(e);)l=n.index,l-E>t&&(i=o>E?o:l,a+="\n"+e.slice(E,i),E=i+1),o=l;return a+="\n",a+=e.length-E>t&&o>E?e.slice(E,o)+"\n"+e.slice(o+1):e.slice(E),a.slice(1)}function escapeString(e){for(var t,n,i="",r=0;r<e.length;r++)t=e.charCodeAt(r),n=ESCAPE_SEQUENCES[t],i+=!n&&isPrintable(t)?e[r]:n||encodeHex(t);return i}function writeFlowSequence(e,t,n){var i,r,E="",o=e.tag;for(i=0,r=n.length;r>i;i+=1)writeNode(e,t,n[i],!1,!1)&&(0!==i&&(E+=", "),E+=e.dump);e.tag=o,e.dump="["+E+"]"}function writeBlockSequence(e,t,n,i){var r,E,o="",l=e.tag;for(r=0,E=n.length;E>r;r+=1)writeNode(e,t+1,n[r],!0,!0)&&(i&&0===r||(o+=generateNextLine(e,t)),o+="- "+e.dump);e.tag=l,e.dump=o||"[]"}function writeFlowMapping(e,t,n){var i,r,E,o,l,a="",s=e.tag,c=Object.keys(n);for(i=0,r=c.length;r>i;i+=1)l="",0!==i&&(l+=", "),E=c[i],o=n[E],writeNode(e,t,E,!1,!1)&&(e.dump.length>1024&&(l+="? "),l+=e.dump+": ",writeNode(e,t,o,!1,!1)&&(l+=e.dump,a+=l));e.tag=s,e.dump="{"+a+"}"}function writeBlockMapping(e,t,n,i){var r,E,o,l,a,s,c="",A=e.tag,u=Object.keys(n);if(e.sortKeys===!0)u.sort();else if("function"==typeof e.sortKeys)u.sort(e.sortKeys);else if(e.sortKeys)throw new YAMLException("sortKeys must be a boolean or a function");for(r=0,E=u.length;E>r;r+=1)s="",i&&0===r||(s+=generateNextLine(e,t)),o=u[r],l=n[o],writeNode(e,t+1,o,!0,!0,!0)&&(a=null!==e.tag&&"?"!==e.tag||e.dump&&e.dump.length>1024,a&&(s+=e.dump&&CHAR_LINE_FEED===e.dump.charCodeAt(0)?"?":"? "),s+=e.dump,a&&(s+=generateNextLine(e,t)),writeNode(e,t+1,l,!0,a)&&(s+=e.dump&&CHAR_LINE_FEED===e.dump.charCodeAt(0)?":":": ",s+=e.dump,c+=s));e.tag=A,e.dump=c||"{}"}function detectType(e,t,n){var i,r,E,o,l,a;for(r=n?e.explicitTypes:e.implicitTypes,E=0,o=r.length;o>E;E+=1)if(l=r[E],(l.instanceOf||l.predicate)&&(!l.instanceOf||"object"==typeof t&&t instanceof l.instanceOf)&&(!l.predicate||l.predicate(t))){if(e.tag=n?l.tag:"?",l.represent){if(a=e.styleMap[l.tag]||l.defaultStyle,"[object Function]"===_toString.call(l.represent))i=l.represent(t,a);else{if(!_hasOwnProperty.call(l.represent,a))throw new YAMLException("!<"+l.tag+'> tag resolver accepts not "'+a+'" style');i=l.represent[a](t,a)}e.dump=i}return!0}return!1}function writeNode(e,t,n,i,r,E){e.tag=null,e.dump=n,detectType(e,n,!1)||detectType(e,n,!0);var o=_toString.call(e.dump);i&&(i=e.flowLevel<0||e.flowLevel>t);var l,a,s="[object Object]"===o||"[object Array]"===o;if(s&&(l=e.duplicates.indexOf(n),a=-1!==l),(null!==e.tag&&"?"!==e.tag||a||2!==e.indent&&t>0)&&(r=!1),a&&e.usedDuplicates[l])e.dump="*ref_"+l;else{if(s&&a&&!e.usedDuplicates[l]&&(e.usedDuplicates[l]=!0),"[object Object]"===o)i&&0!==Object.keys(e.dump).length?(writeBlockMapping(e,t,e.dump,r),a&&(e.dump="&ref_"+l+e.dump)):(writeFlowMapping(e,t,e.dump),a&&(e.dump="&ref_"+l+" "+e.dump));else if("[object Array]"===o)i&&0!==e.dump.length?(writeBlockSequence(e,t,e.dump,r),a&&(e.dump="&ref_"+l+e.dump)):(writeFlowSequence(e,t,e.dump),a&&(e.dump="&ref_"+l+" "+e.dump));else{if("[object String]"!==o){if(e.skipInvalid)return!1;throw new YAMLException("unacceptable kind of an object to dump "+o)}"?"!==e.tag&&writeScalar(e,e.dump,t,E)}null!==e.tag&&"?"!==e.tag&&(e.dump="!<"+e.tag+"> "+e.dump)}return!0}function getDuplicateReferences(e,t){var n,i,r=[],E=[];for(inspectNode(e,r,E),n=0,i=E.length;i>n;n+=1)t.duplicates.push(r[E[n]]);t.usedDuplicates=new Array(i)}function inspectNode(e,t,n){var i,r,E;if(null!==e&&"object"==typeof e)if(r=t.indexOf(e),-1!==r)-1===n.indexOf(r)&&n.push(r);else if(t.push(e),Array.isArray(e))for(r=0,E=e.length;E>r;r+=1)inspectNode(e[r],t,n);else for(i=Object.keys(e),r=0,E=i.length;E>r;r+=1)inspectNode(e[i[r]],t,n)}function dump(e,t){t=t||{};var n=new State(t);return n.noRefs||getDuplicateReferences(e,n),writeNode(n,0,e,!0,!0)?n.dump+"\n":""}function safeDump(e,t){return dump(e,common.extend({schema:DEFAULT_SAFE_SCHEMA},t))}var common=require("./common"),YAMLException=require("./exception"),DEFAULT_FULL_SCHEMA=require("./schema/default_full"),DEFAULT_SAFE_SCHEMA=require("./schema/default_safe"),_toString=Object.prototype.toString,_hasOwnProperty=Object.prototype.hasOwnProperty,CHAR_TAB=9,CHAR_LINE_FEED=10,CHAR_SPACE=32,CHAR_EXCLAMATION=33,CHAR_DOUBLE_QUOTE=34,CHAR_SHARP=35,CHAR_PERCENT=37,CHAR_AMPERSAND=38,CHAR_SINGLE_QUOTE=39,CHAR_ASTERISK=42,CHAR_COMMA=44,CHAR_MINUS=45,CHAR_COLON=58,CHAR_GREATER_THAN=62,CHAR_QUESTION=63,CHAR_COMMERCIAL_AT=64,CHAR_LEFT_SQUARE_BRACKET=91,CHAR_RIGHT_SQUARE_BRACKET=93,CHAR_GRAVE_ACCENT=96,CHAR_LEFT_CURLY_BRACKET=123,CHAR_VERTICAL_LINE=124,CHAR_RIGHT_CURLY_BRACKET=125,ESCAPE_SEQUENCES={};ESCAPE_SEQUENCES[0]="\\0",ESCAPE_SEQUENCES[7]="\\a",ESCAPE_SEQUENCES[8]="\\b",ESCAPE_SEQUENCES[9]="\\t",ESCAPE_SEQUENCES[10]="\\n",ESCAPE_SEQUENCES[11]="\\v",ESCAPE_SEQUENCES[12]="\\f",ESCAPE_SEQUENCES[13]="\\r",ESCAPE_SEQUENCES[27]="\\e",ESCAPE_SEQUENCES[34]='\\"',ESCAPE_SEQUENCES[92]="\\\\",ESCAPE_SEQUENCES[133]="\\N",ESCAPE_SEQUENCES[160]="\\_",ESCAPE_SEQUENCES[8232]="\\L",ESCAPE_SEQUENCES[8233]="\\P";var DEPRECATED_BOOLEANS_SYNTAX=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],STYLE_PLAIN=1,STYLE_SINGLE=2,STYLE_LITERAL=3,STYLE_FOLDED=4,STYLE_DOUBLE=5;module.exports.dump=dump,module.exports.safeDump=safeDump;
+
+},{"./common":40,"./exception":42,"./schema/default_full":47,"./schema/default_safe":48}],42:[function(require,module,exports){
+"use strict";function YAMLException(t,r){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=t,this.mark=r,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}YAMLException.prototype=Object.create(Error.prototype),YAMLException.prototype.constructor=YAMLException,YAMLException.prototype.toString=function(t){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!t&&this.mark&&(r+=" "+this.mark.toString()),r},module.exports=YAMLException;
+
+},{}],43:[function(require,module,exports){
+"use strict";function is_EOL(e){return 10===e||13===e}function is_WHITE_SPACE(e){return 9===e||32===e}function is_WS_OR_EOL(e){return 9===e||32===e||10===e||13===e}function is_FLOW_INDICATOR(e){return 44===e||91===e||93===e||123===e||125===e}function fromHexCode(e){var t;return e>=48&&57>=e?e-48:(t=32|e,t>=97&&102>=t?t-97+10:-1)}function escapedHexLen(e){return 120===e?2:117===e?4:85===e?8:0}function fromDecimalCode(e){return e>=48&&57>=e?e-48:-1}function simpleEscapeSequence(e){return 48===e?"\x00":97===e?"\a":98===e?"\b":116===e?"   ":9===e?"   ":110===e?"\n":118===e?"\x0B":102===e?"\f":114===e?"\r":101===e?"\e":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"\85":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function charFromCodepoint(e){return 65535>=e?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function State(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||DEFAULT_FULL_SCHEMA,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function generateError(e,t){return new YAMLException(t,new Mark(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function throwError(e,t){throw generateError(e,t)}function throwWarning(e,t){e.onWarning&&e.onWarning.call(null,generateError(e,t))}function captureSegment(e,t,n,i){var o,r,a,s;if(n>t){if(s=e.input.slice(t,n),i)for(o=0,r=s.length;r>o;o+=1)a=s.charCodeAt(o),9===a||a>=32&&1114111>=a||throwError(e,"expected valid JSON character");else PATTERN_NON_PRINTABLE.test(s)&&throwError(e,"the stream contains non-printable characters");e.result+=s}}function mergeMappings(e,t,n,i){var o,r,a,s;for(common.isObject(n)||throwError(e,"cannot merge mappings; the provided source object is unacceptable"),o=Object.keys(n),a=0,s=o.length;s>a;a+=1)r=o[a],_hasOwnProperty.call(t,r)||(t[r]=n[r],i[r]=!0)}function storeMappingPair(e,t,n,i,o,r){var a,s;if(o=String(o),null===t&&(t={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(r))for(a=0,s=r.length;s>a;a+=1)mergeMappings(e,t,r[a],n);else mergeMappings(e,t,r,n);else e.json||_hasOwnProperty.call(n,o)||!_hasOwnProperty.call(t,o)||throwError(e,"duplicated mapping key"),t[o]=r,delete n[o];return t}function readLineBreak(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):throwError(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function skipSeparationSpace(e,t,n){for(var i=0,o=e.input.charCodeAt(e.position);0!==o;){for(;is_WHITE_SPACE(o);)o=e.input.charCodeAt(++e.position);if(t&&35===o)do o=e.input.charCodeAt(++e.position);while(10!==o&&13!==o&&0!==o);if(!is_EOL(o))break;for(readLineBreak(e),o=e.input.charCodeAt(e.position),i++,e.lineIndent=0;32===o;)e.lineIndent++,o=e.input.charCodeAt(++e.position)}return-1!==n&&0!==i&&e.lineIndent<n&&throwWarning(e,"deficient indentation"),i}function testDocumentSeparator(e){var t,n=e.position;return t=e.input.charCodeAt(n),(45===t||46===t)&&t===e.input.charCodeAt(n+1)&&t===e.input.charCodeAt(n+2)&&(n+=3,t=e.input.charCodeAt(n),0===t||is_WS_OR_EOL(t))}function writeFoldedLines(e,t){1===t?e.result+=" ":t>1&&(e.result+=common.repeat("\n",t-1))}function readPlainScalar(e,t,n){var i,o,r,a,s,p,c,l,u,d=e.kind,h=e.result;if(u=e.input.charCodeAt(e.position),is_WS_OR_EOL(u)||is_FLOW_INDICATOR(u)||35===u||38===u||42===u||33===u||124===u||62===u||39===u||34===u||37===u||64===u||96===u)return!1;if((63===u||45===u)&&(o=e.input.charCodeAt(e.position+1),is_WS_OR_EOL(o)||n&&is_FLOW_INDICATOR(o)))return!1;for(e.kind="scalar",e.result="",r=a=e.position,s=!1;0!==u;){if(58===u){if(o=e.input.charCodeAt(e.position+1),is_WS_OR_EOL(o)||n&&is_FLOW_INDICATOR(o))break}else if(35===u){if(i=e.input.charCodeAt(e.position-1),is_WS_OR_EOL(i))break}else{if(e.position===e.lineStart&&testDocumentSeparator(e)||n&&is_FLOW_INDICATOR(u))break;if(is_EOL(u)){if(p=e.line,c=e.lineStart,l=e.lineIndent,skipSeparationSpace(e,!1,-1),e.lineIndent>=t){s=!0,u=e.input.charCodeAt(e.position);continue}e.position=a,e.line=p,e.lineStart=c,e.lineIndent=l;break}}s&&(captureSegment(e,r,a,!1),writeFoldedLines(e,e.line-p),r=a=e.position,s=!1),is_WHITE_SPACE(u)||(a=e.position+1),u=e.input.charCodeAt(++e.position)}return captureSegment(e,r,a,!1),e.result?!0:(e.kind=d,e.result=h,!1)}function readSingleQuotedScalar(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind="scalar",e.result="",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(captureSegment(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=o=e.position,e.position++}else is_EOL(n)?(captureSegment(e,i,o,!0),writeFoldedLines(e,skipSeparationSpace(e,!1,t)),i=o=e.position):e.position===e.lineStart&&testDocumentSeparator(e)?throwError(e,"unexpected end of the document within a single quoted scalar"):(e.position++,o=e.position);throwError(e,"unexpected end of the stream within a single quoted scalar")}function readDoubleQuotedScalar(e,t){var n,i,o,r,a,s;if(s=e.input.charCodeAt(e.position),34!==s)return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(s=e.input.charCodeAt(e.position));){if(34===s)return captureSegment(e,n,e.position,!0),e.position++,!0;if(92===s){if(captureSegment(e,n,e.position,!0),s=e.input.charCodeAt(++e.position),is_EOL(s))skipSeparationSpace(e,!1,t);else if(256>s&&simpleEscapeCheck[s])e.result+=simpleEscapeMap[s],e.position++;else if((a=escapedHexLen(s))>0){for(o=a,r=0;o>0;o--)s=e.input.charCodeAt(++e.position),(a=fromHexCode(s))>=0?r=(r<<4)+a:throwError(e,"expected hexadecimal character");e.result+=charFromCodepoint(r),e.position++}else throwError(e,"unknown escape sequence");n=i=e.position}else is_EOL(s)?(captureSegment(e,n,i,!0),writeFoldedLines(e,skipSeparationSpace(e,!1,t)),n=i=e.position):e.position===e.lineStart&&testDocumentSeparator(e)?throwError(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}throwError(e,"unexpected end of the stream within a double quoted scalar")}function readFlowCollection(e,t){var n,i,o,r,a,s,p,c,l,u,d,h=!0,f=e.tag,_=e.anchor,A={};if(d=e.input.charCodeAt(e.position),91===d)r=93,p=!1,i=[];else{if(123!==d)return!1;r=125,p=!0,i={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),d=e.input.charCodeAt(++e.position);0!==d;){if(skipSeparationSpace(e,!0,t),d=e.input.charCodeAt(e.position),d===r)return e.position++,e.tag=f,e.anchor=_,e.kind=p?"mapping":"sequence",e.result=i,!0;h||throwError(e,"missed comma between flow collection entries"),l=c=u=null,a=s=!1,63===d&&(o=e.input.charCodeAt(e.position+1),is_WS_OR_EOL(o)&&(a=s=!0,e.position++,skipSeparationSpace(e,!0,t))),n=e.line,composeNode(e,t,CONTEXT_FLOW_IN,!1,!0),l=e.tag,c=e.result,skipSeparationSpace(e,!0,t),d=e.input.charCodeAt(e.position),!s&&e.line!==n||58!==d||(a=!0,d=e.input.charCodeAt(++e.position),skipSeparationSpace(e,!0,t),composeNode(e,t,CONTEXT_FLOW_IN,!1,!0),u=e.result),p?storeMappingPair(e,i,A,l,c,u):a?i.push(storeMappingPair(e,null,A,l,c,u)):i.push(c),skipSeparationSpace(e,!0,t),d=e.input.charCodeAt(e.position),44===d?(h=!0,d=e.input.charCodeAt(++e.position)):h=!1}throwError(e,"unexpected end of the stream within a flow collection")}function readBlockScalar(e,t){var n,i,o,r,a=CHOMPING_CLIP,s=!1,p=!1,c=t,l=0,u=!1;if(r=e.input.charCodeAt(e.position),124===r)i=!1;else{if(62!==r)return!1;i=!0}for(e.kind="scalar",e.result="";0!==r;)if(r=e.input.charCodeAt(++e.position),43===r||45===r)CHOMPING_CLIP===a?a=43===r?CHOMPING_KEEP:CHOMPING_STRIP:throwError(e,"repeat of a chomping mode identifier");else{if(!((o=fromDecimalCode(r))>=0))break;0===o?throwError(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):p?throwError(e,"repeat of an indentation width identifier"):(c=t+o-1,p=!0)}if(is_WHITE_SPACE(r)){do r=e.input.charCodeAt(++e.position);while(is_WHITE_SPACE(r));if(35===r)do r=e.input.charCodeAt(++e.position);while(!is_EOL(r)&&0!==r)}for(;0!==r;){for(readLineBreak(e),e.lineIndent=0,r=e.input.charCodeAt(e.position);(!p||e.lineIndent<c)&&32===r;)e.lineIndent++,r=e.input.charCodeAt(++e.position);if(!p&&e.lineIndent>c&&(c=e.lineIndent),is_EOL(r))l++;else{if(e.lineIndent<c){a===CHOMPING_KEEP?e.result+=common.repeat("\n",s?1+l:l):a===CHOMPING_CLIP&&s&&(e.result+="\n");break}for(i?is_WHITE_SPACE(r)?(u=!0,e.result+=common.repeat("\n",s?1+l:l)):u?(u=!1,e.result+=common.repeat("\n",l+1)):0===l?s&&(e.result+=" "):e.result+=common.repeat("\n",l):e.result+=common.repeat("\n",s?1+l:l),s=!0,p=!0,l=0,n=e.position;!is_EOL(r)&&0!==r;)r=e.input.charCodeAt(++e.position);captureSegment(e,n,e.position,!1)}}return!0}function readBlockSequence(e,t){var n,i,o,r=e.tag,a=e.anchor,s=[],p=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=s),o=e.input.charCodeAt(e.position);0!==o&&45===o&&(i=e.input.charCodeAt(e.position+1),is_WS_OR_EOL(i));)if(p=!0,e.position++,skipSeparationSpace(e,!0,-1)&&e.lineIndent<=t)s.push(null),o=e.input.charCodeAt(e.position);else if(n=e.line,composeNode(e,t,CONTEXT_BLOCK_IN,!1,!0),s.push(e.result),skipSeparationSpace(e,!0,-1),o=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==o)throwError(e,"bad indentation of a sequence entry");else if(e.lineIndent<t)break;return p?(e.tag=r,e.anchor=a,e.kind="sequence",e.result=s,!0):!1}function readBlockMapping(e,t,n){var i,o,r,a,s=e.tag,p=e.anchor,c={},l={},u=null,d=null,h=null,f=!1,_=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=c),a=e.input.charCodeAt(e.position);0!==a;){if(i=e.input.charCodeAt(e.position+1),r=e.line,63!==a&&58!==a||!is_WS_OR_EOL(i)){if(!composeNode(e,n,CONTEXT_FLOW_OUT,!1,!0))break;if(e.line===r){for(a=e.input.charCodeAt(e.position);is_WHITE_SPACE(a);)a=e.input.charCodeAt(++e.position);if(58===a)a=e.input.charCodeAt(++e.position),is_WS_OR_EOL(a)||throwError(e,"a whitespace character is expected after the key-value separator within a block mapping"),f&&(storeMappingPair(e,c,l,u,d,null),u=d=h=null),_=!0,f=!1,o=!1,u=e.tag,d=e.result;else{if(!_)return e.tag=s,e.anchor=p,!0;throwError(e,"can not read an implicit mapping pair; a colon is missed")}}else{if(!_)return e.tag=s,e.anchor=p,!0;throwError(e,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===a?(f&&(storeMappingPair(e,c,l,u,d,null),u=d=h=null),_=!0,f=!0,o=!0):f?(f=!1,o=!0):throwError(e,"incomplete explicit mapping pair; a key node is missed"),e.position+=1,a=i;if((e.line===r||e.lineIndent>t)&&(composeNode(e,t,CONTEXT_BLOCK_OUT,!0,o)&&(f?d=e.result:h=e.result),f||(storeMappingPair(e,c,l,u,d,h),u=d=h=null),skipSeparationSpace(e,!0,-1),a=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==a)throwError(e,"bad indentation of a mapping entry");else if(e.lineIndent<t)break}return f&&storeMappingPair(e,c,l,u,d,null),_&&(e.tag=s,e.anchor=p,e.kind="mapping",e.result=c),_}function readTagProperty(e){var t,n,i,o,r=!1,a=!1;if(o=e.input.charCodeAt(e.position),33!==o)return!1;if(null!==e.tag&&throwError(e,"duplication of a tag property"),o=e.input.charCodeAt(++e.position),60===o?(r=!0,o=e.input.charCodeAt(++e.position)):33===o?(a=!0,n="!!",o=e.input.charCodeAt(++e.position)):n="!",t=e.position,r){do o=e.input.charCodeAt(++e.position);while(0!==o&&62!==o);e.position<e.length?(i=e.input.slice(t,e.position),o=e.input.charCodeAt(++e.position)):throwError(e,"unexpected end of the stream within a verbatim tag")}else{for(;0!==o&&!is_WS_OR_EOL(o);)33===o&&(a?throwError(e,"tag suffix cannot contain exclamation marks"):(n=e.input.slice(t-1,e.position+1),PATTERN_TAG_HANDLE.test(n)||throwError(e,"named tag handle cannot contain such characters"),a=!0,t=e.position+1)),o=e.input.charCodeAt(++e.position);i=e.input.slice(t,e.position),PATTERN_FLOW_INDICATORS.test(i)&&throwError(e,"tag suffix cannot contain flow indicator characters")}return i&&!PATTERN_TAG_URI.test(i)&&throwError(e,"tag name cannot contain such characters: "+i),r?e.tag=i:_hasOwnProperty.call(e.tagMap,n)?e.tag=e.tagMap[n]+i:"!"===n?e.tag="!"+i:"!!"===n?e.tag="tag:yaml.org,2002:"+i:throwError(e,'undeclared tag handle "'+n+'"'),!0}function readAnchorProperty(e){var t,n;if(n=e.input.charCodeAt(e.position),38!==n)return!1;for(null!==e.anchor&&throwError(e,"duplication of an anchor property"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!is_WS_OR_EOL(n)&&!is_FLOW_INDICATOR(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&throwError(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(t,e.position),!0}function readAlias(e){var t,n,i;if(i=e.input.charCodeAt(e.position),42!==i)return!1;for(i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!is_WS_OR_EOL(i)&&!is_FLOW_INDICATOR(i);)i=e.input.charCodeAt(++e.position);return e.position===t&&throwError(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),e.anchorMap.hasOwnProperty(n)||throwError(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],skipSeparationSpace(e,!0,-1),!0}function composeNode(e,t,n,i,o){var r,a,s,p,c,l,u,d,h=1,f=!1,_=!1;if(null!==e.listener&&e.listener("open",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,r=a=s=CONTEXT_BLOCK_OUT===n||CONTEXT_BLOCK_IN===n,i&&skipSeparationSpace(e,!0,-1)&&(f=!0,e.lineIndent>t?h=1:e.lineIndent===t?h=0:e.lineIndent<t&&(h=-1)),1===h)for(;readTagProperty(e)||readAnchorProperty(e);)skipSeparationSpace(e,!0,-1)?(f=!0,s=r,e.lineIndent>t?h=1:e.lineIndent===t?h=0:e.lineIndent<t&&(h=-1)):s=!1;if(s&&(s=f||o),1!==h&&CONTEXT_BLOCK_OUT!==n||(u=CONTEXT_FLOW_IN===n||CONTEXT_FLOW_OUT===n?t:t+1,d=e.position-e.lineStart,1===h?s&&(readBlockSequence(e,d)||readBlockMapping(e,d,u))||readFlowCollection(e,u)?_=!0:(a&&readBlockScalar(e,u)||readSingleQuotedScalar(e,u)||readDoubleQuotedScalar(e,u)?_=!0:readAlias(e)?(_=!0,null===e.tag&&null===e.anchor||throwError(e,"alias node should not have any properties")):readPlainScalar(e,u,CONTEXT_FLOW_IN===n)&&(_=!0,null===e.tag&&(e.tag="?")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===h&&(_=s&&readBlockSequence(e,d))),null!==e.tag&&"!"!==e.tag)if("?"===e.tag){for(p=0,c=e.implicitTypes.length;c>p;p+=1)if(l=e.implicitTypes[p],l.resolve(e.result)){e.result=l.construct(e.result),e.tag=l.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else _hasOwnProperty.call(e.typeMap,e.tag)?(l=e.typeMap[e.tag],null!==e.result&&l.kind!==e.kind&&throwError(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+l.kind+'", not "'+e.kind+'"'),l.resolve(e.result)?(e.result=l.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):throwError(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):throwError(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||_}function readDocument(e){var t,n,i,o,r=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(o=e.input.charCodeAt(e.position))&&(skipSeparationSpace(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==o));){for(a=!0,o=e.input.charCodeAt(++e.position),t=e.position;0!==o&&!is_WS_OR_EOL(o);)o=e.input.charCodeAt(++e.position);for(n=e.input.slice(t,e.position),i=[],n.length<1&&throwError(e,"directive name must not be less than one character in length");0!==o;){for(;is_WHITE_SPACE(o);)o=e.input.charCodeAt(++e.position);if(35===o){do o=e.input.charCodeAt(++e.position);while(0!==o&&!is_EOL(o));break}if(is_EOL(o))break;for(t=e.position;0!==o&&!is_WS_OR_EOL(o);)o=e.input.charCodeAt(++e.position);i.push(e.input.slice(t,e.position))}0!==o&&readLineBreak(e),_hasOwnProperty.call(directiveHandlers,n)?directiveHandlers[n](e,n,i):throwWarning(e,'unknown document directive "'+n+'"')}return skipSeparationSpace(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,skipSeparationSpace(e,!0,-1)):a&&throwError(e,"directives end mark is expected"),composeNode(e,e.lineIndent-1,CONTEXT_BLOCK_OUT,!1,!0),skipSeparationSpace(e,!0,-1),e.checkLineBreaks&&PATTERN_NON_ASCII_LINE_BREAKS.test(e.input.slice(r,e.position))&&throwWarning(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&testDocumentSeparator(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,skipSeparationSpace(e,!0,-1))):void(e.position<e.length-1&&throwError(e,"end of the stream or a document separator is expected"))}function loadDocuments(e,t){e=String(e),t=t||{},0!==e.length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+="\n"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new State(e,t);for(n.input+="\x00";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)readDocument(n);return n.documents}function loadAll(e,t,n){var i,o,r=loadDocuments(e,n);for(i=0,o=r.length;o>i;i+=1)t(r[i])}function load(e,t){var n=loadDocuments(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new YAMLException("expected a single document in the stream, but found more")}}function safeLoadAll(e,t,n){loadAll(e,t,common.extend({schema:DEFAULT_SAFE_SCHEMA},n))}function safeLoad(e,t){return load(e,common.extend({schema:DEFAULT_SAFE_SCHEMA},t))}for(var common=require("./common"),YAMLException=require("./exception"),Mark=require("./mark"),DEFAULT_SAFE_SCHEMA=require("./schema/default_safe"),DEFAULT_FULL_SCHEMA=require("./schema/default_full"),_hasOwnProperty=Object.prototype.hasOwnProperty,CONTEXT_FLOW_IN=1,CONTEXT_FLOW_OUT=2,CONTEXT_BLOCK_IN=3,CONTEXT_BLOCK_OUT=4,CHOMPING_CLIP=1,CHOMPING_STRIP=2,CHOMPING_KEEP=3,PATTERN_NON_PRINTABLE=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,PATTERN_NON_ASCII_LINE_BREAKS=/[\x85\u2028\u2029]/,PATTERN_FLOW_INDICATORS=/[,\[\]\{\}]/,PATTERN_TAG_HANDLE=/^(?:!|!!|![a-z\-]+!)$/i,PATTERN_TAG_URI=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,simpleEscapeCheck=new Array(256),simpleEscapeMap=new Array(256),i=0;256>i;i++)simpleEscapeCheck[i]=simpleEscapeSequence(i)?1:0,simpleEscapeMap[i]=simpleEscapeSequence(i);var directiveHandlers={YAML:function(e,t,n){var i,o,r;null!==e.version&&throwError(e,"duplication of %YAML directive"),1!==n.length&&throwError(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),null===i&&throwError(e,"ill-formed argument of the YAML directive"),o=parseInt(i[1],10),r=parseInt(i[2],10),1!==o&&throwError(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=2>r,1!==r&&2!==r&&throwWarning(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var i,o;2!==n.length&&throwError(e,"TAG directive accepts exactly two arguments"),i=n[0],o=n[1],PATTERN_TAG_HANDLE.test(i)||throwError(e,"ill-formed tag handle (first argument) of the TAG directive"),_hasOwnProperty.call(e.tagMap,i)&&throwError(e,'there is a previously declared suffix for "'+i+'" tag handle'),PATTERN_TAG_URI.test(o)||throwError(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[i]=o}};module.exports.loadAll=loadAll,module.exports.load=load,module.exports.safeLoadAll=safeLoadAll,module.exports.safeLoad=safeLoad;
+
+},{"./common":40,"./exception":42,"./mark":44,"./schema/default_full":47,"./schema/default_safe":48}],44:[function(require,module,exports){
+"use strict";function Mark(t,i,n,e,r){this.name=t,this.buffer=i,this.position=n,this.line=e,this.column=r}var common=require("./common");Mark.prototype.getSnippet=function(t,i){var n,e,r,o,s;if(!this.buffer)return null;for(t=t||4,i=i||75,n="",e=this.position;e>0&&-1==="\x00\r\n\85\u2028\u2029".indexOf(this.buffer.charAt(e-1));)if(e-=1,this.position-e>i/2-1){n=" ... ",e+=5;break}for(r="",o=this.position;o<this.buffer.length&&-1==="\x00\r\n\85\u2028\u2029".indexOf(this.buffer.charAt(o));)if(o+=1,o-this.position>i/2-1){r=" ... ",o-=5;break}return s=this.buffer.slice(e,o),common.repeat(" ",t)+n+s+r+"\n"+common.repeat(" ",t+this.position-e+n.length)+"^"},Mark.prototype.toString=function(t){var i,n="";return this.name&&(n+='in "'+this.name+'" '),n+="at line "+(this.line+1)+", column "+(this.column+1),t||(i=this.getSnippet(),i&&(n+=":\n"+i)),n},module.exports=Mark;
+
+},{"./common":40}],45:[function(require,module,exports){
+"use strict";function compileList(i,e,t){var c=[];return i.include.forEach(function(i){t=compileList(i,e,t)}),i[e].forEach(function(i){t.forEach(function(e,t){e.tag===i.tag&&c.push(t)}),t.push(i)}),t.filter(function(i,e){return-1===c.indexOf(e)})}function compileMap(){function i(i){c[i.tag]=i}var e,t,c={};for(e=0,t=arguments.length;t>e;e+=1)arguments[e].forEach(i);return c}function Schema(i){this.include=i.include||[],this.implicit=i.implicit||[],this.explicit=i.explicit||[],this.implicit.forEach(function(i){if(i.loadKind&&"scalar"!==i.loadKind)throw new YAMLException("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=compileList(this,"implicit",[]),this.compiledExplicit=compileList(this,"explicit",[]),this.compiledTypeMap=compileMap(this.compiledImplicit,this.compiledExplicit)}var common=require("./common"),YAMLException=require("./exception"),Type=require("./type");Schema.DEFAULT=null,Schema.create=function(){var i,e;switch(arguments.length){case 1:i=Schema.DEFAULT,e=arguments[0];break;case 2:i=arguments[0],e=arguments[1];break;default:throw new YAMLException("Wrong number of arguments for Schema.create function")}if(i=common.toArray(i),e=common.toArray(e),!i.every(function(i){return i instanceof Schema}))throw new YAMLException("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!e.every(function(i){return i instanceof Type}))throw new YAMLException("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new Schema({include:i,explicit:e})},module.exports=Schema;
+
+},{"./common":40,"./exception":42,"./type":51}],46:[function(require,module,exports){
+"use strict";var Schema=require("../schema");module.exports=new Schema({include:[require("./json")]});
+
+},{"../schema":45,"./json":50}],47:[function(require,module,exports){
+"use strict";var Schema=require("../schema");module.exports=Schema.DEFAULT=new Schema({include:[require("./default_safe")],explicit:[require("../type/js/undefined"),require("../type/js/regexp"),require("../type/js/function")]});
+
+},{"../schema":45,"../type/js/function":56,"../type/js/regexp":57,"../type/js/undefined":58,"./default_safe":48}],48:[function(require,module,exports){
+"use strict";var Schema=require("../schema");module.exports=new Schema({include:[require("./core")],implicit:[require("../type/timestamp"),require("../type/merge")],explicit:[require("../type/binary"),require("../type/omap"),require("../type/pairs"),require("../type/set")]});
+
+},{"../schema":45,"../type/binary":52,"../type/merge":60,"../type/omap":62,"../type/pairs":63,"../type/set":65,"../type/timestamp":67,"./core":46}],49:[function(require,module,exports){
+"use strict";var Schema=require("../schema");module.exports=new Schema({explicit:[require("../type/str"),require("../type/seq"),require("../type/map")]});
+
+},{"../schema":45,"../type/map":59,"../type/seq":64,"../type/str":66}],50:[function(require,module,exports){
+"use strict";var Schema=require("../schema");module.exports=new Schema({include:[require("./failsafe")],implicit:[require("../type/null"),require("../type/bool"),require("../type/int"),require("../type/float")]});
+
+},{"../schema":45,"../type/bool":53,"../type/float":54,"../type/int":55,"../type/null":61,"./failsafe":49}],51:[function(require,module,exports){
+"use strict";function compileStyleAliases(e){var t={};return null!==e&&Object.keys(e).forEach(function(n){e[n].forEach(function(e){t[String(e)]=n})}),t}function Type(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(-1===TYPE_CONSTRUCTOR_OPTIONS.indexOf(t))throw new YAMLException('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=compileStyleAliases(t.styleAliases||null),-1===YAML_NODE_KINDS.indexOf(this.kind))throw new YAMLException('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var YAMLException=require("./exception"),TYPE_CONSTRUCTOR_OPTIONS=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],YAML_NODE_KINDS=["scalar","sequence","mapping"];module.exports=Type;
+
+},{"./exception":42}],52:[function(require,module,exports){
+"use strict";function resolveYamlBinary(r){if(null===r)return!1;var e,n,u=0,t=r.length,a=BASE64_MAP;for(n=0;t>n;n++)if(e=a.indexOf(r.charAt(n)),!(e>64)){if(0>e)return!1;u+=6}return u%8===0}function constructYamlBinary(r){var e,n,u=r.replace(/[\r\n=]/g,""),t=u.length,a=BASE64_MAP,f=0,i=[];for(e=0;t>e;e++)e%4===0&&e&&(i.push(f>>16&255),i.push(f>>8&255),i.push(255&f)),f=f<<6|a.indexOf(u.charAt(e));return n=t%4*6,0===n?(i.push(f>>16&255),i.push(f>>8&255),i.push(255&f)):18===n?(i.push(f>>10&255),i.push(f>>2&255)):12===n&&i.push(f>>4&255),NodeBuffer?new NodeBuffer(i):i}function representYamlBinary(r){var e,n,u="",t=0,a=r.length,f=BASE64_MAP;for(e=0;a>e;e++)e%3===0&&e&&(u+=f[t>>18&63],u+=f[t>>12&63],u+=f[t>>6&63],u+=f[63&t]),t=(t<<8)+r[e];return n=a%3,0===n?(u+=f[t>>18&63],u+=f[t>>12&63],u+=f[t>>6&63],u+=f[63&t]):2===n?(u+=f[t>>10&63],u+=f[t>>4&63],u+=f[t<<2&63],u+=f[64]):1===n&&(u+=f[t>>2&63],u+=f[t<<4&63],u+=f[64],u+=f[64]),u}function isBinary(r){return NodeBuffer&&NodeBuffer.isBuffer(r)}var NodeBuffer;try{var _require=require;NodeBuffer=_require("buffer").Buffer}catch(__){}var Type=require("../type"),BASE64_MAP="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";module.exports=new Type("tag:yaml.org,2002:binary",{kind:"scalar",resolve:resolveYamlBinary,construct:constructYamlBinary,predicate:isBinary,represent:representYamlBinary});
+
+},{"../type":51}],53:[function(require,module,exports){
+"use strict";function resolveYamlBoolean(e){if(null===e)return!1;var r=e.length;return 4===r&&("true"===e||"True"===e||"TRUE"===e)||5===r&&("false"===e||"False"===e||"FALSE"===e)}function constructYamlBoolean(e){return"true"===e||"True"===e||"TRUE"===e}function isBoolean(e){return"[object Boolean]"===Object.prototype.toString.call(e)}var Type=require("../type");module.exports=new Type("tag:yaml.org,2002:bool",{kind:"scalar",resolve:resolveYamlBoolean,construct:constructYamlBoolean,predicate:isBoolean,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"});
+
+},{"../type":51}],54:[function(require,module,exports){
+"use strict";function resolveYamlFloat(e){return null===e?!1:!!YAML_FLOAT_PATTERN.test(e)}function constructYamlFloat(e){var r,t,a,n;return r=e.replace(/_/g,"").toLowerCase(),t="-"===r[0]?-1:1,n=[],"+-".indexOf(r[0])>=0&&(r=r.slice(1)),".inf"===r?1===t?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===r?NaN:r.indexOf(":")>=0?(r.split(":").forEach(function(e){n.unshift(parseFloat(e,10))}),r=0,a=1,n.forEach(function(e){r+=e*a,a*=60}),t*r):t*parseFloat(r,10)}function representYamlFloat(e,r){var t;if(isNaN(e))switch(r){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(r){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(r){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(common.isNegativeZero(e))return"-0.0";return t=e.toString(10),SCIENTIFIC_WITHOUT_DOT.test(t)?t.replace("e",".e"):t}function isFloat(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!==0||common.isNegativeZero(e))}var common=require("../common"),Type=require("../type"),YAML_FLOAT_PATTERN=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),SCIENTIFIC_WITHOUT_DOT=/^[-+]?[0-9]+e/;module.exports=new Type("tag:yaml.org,2002:float",{kind:"scalar",resolve:resolveYamlFloat,construct:constructYamlFloat,predicate:isFloat,represent:representYamlFloat,defaultStyle:"lowercase"});
+
+},{"../common":40,"../type":51}],55:[function(require,module,exports){
+"use strict";function isHexCode(e){return e>=48&&57>=e||e>=65&&70>=e||e>=97&&102>=e}function isOctCode(e){return e>=48&&55>=e}function isDecCode(e){return e>=48&&57>=e}function resolveYamlInteger(e){if(null===e)return!1;var r,t=e.length,n=0,i=!1;if(!t)return!1;if(r=e[n],"-"!==r&&"+"!==r||(r=e[++n]),"0"===r){if(n+1===t)return!0;if(r=e[++n],"b"===r){for(n++;t>n;n++)if(r=e[n],"_"!==r){if("0"!==r&&"1"!==r)return!1;i=!0}return i}if("x"===r){for(n++;t>n;n++)if(r=e[n],"_"!==r){if(!isHexCode(e.charCodeAt(n)))return!1;i=!0}return i}for(;t>n;n++)if(r=e[n],"_"!==r){if(!isOctCode(e.charCodeAt(n)))return!1;i=!0}return i}for(;t>n;n++)if(r=e[n],"_"!==r){if(":"===r)break;if(!isDecCode(e.charCodeAt(n)))return!1;i=!0}return i?":"!==r?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(n)):!1}function constructYamlInteger(e){var r,t,n=e,i=1,o=[];return-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),r=n[0],"-"!==r&&"+"!==r||("-"===r&&(i=-1),n=n.slice(1),r=n[0]),"0"===n?0:"0"===r?"b"===n[1]?i*parseInt(n.slice(2),2):"x"===n[1]?i*parseInt(n,16):i*parseInt(n,8):-1!==n.indexOf(":")?(n.split(":").forEach(function(e){o.unshift(parseInt(e,10))}),n=0,t=1,o.forEach(function(e){n+=e*t,t*=60}),i*n):i*parseInt(n,10)}function isInteger(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1===0&&!common.isNegativeZero(e)}var common=require("../common"),Type=require("../type");module.exports=new Type("tag:yaml.org,2002:int",{kind:"scalar",resolve:resolveYamlInteger,construct:constructYamlInteger,predicate:isInteger,represent:{binary:function(e){return"0b"+e.toString(2)},octal:function(e){return"0"+e.toString(8)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return"0x"+e.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}});
+
+},{"../common":40,"../type":51}],56:[function(require,module,exports){
+"use strict";function resolveJavascriptFunction(e){if(null===e)return!1;try{var r="("+e+")",n=esprima.parse(r,{range:!0});return"Program"===n.type&&1===n.body.length&&"ExpressionStatement"===n.body[0].type&&"FunctionExpression"===n.body[0].expression.type}catch(t){return!1}}function constructJavascriptFunction(e){var r,n="("+e+")",t=esprima.parse(n,{range:!0}),o=[];if("Program"!==t.type||1!==t.body.length||"ExpressionStatement"!==t.body[0].type||"FunctionExpression"!==t.body[0].expression.type)throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(e){o.push(e.name)}),r=t.body[0].expression.body.range,new Function(o,n.slice(r[0]+1,r[1]-1))}function representJavascriptFunction(e){return e.toString()}function isFunction(e){return"[object Function]"===Object.prototype.toString.call(e)}var esprima;try{var _require=require;esprima=_require("esprima")}catch(_){"undefined"!=typeof window&&(esprima=window.esprima)}var Type=require("../../type");module.exports=new Type("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:resolveJavascriptFunction,construct:constructJavascriptFunction,predicate:isFunction,represent:representJavascriptFunction});
+
+},{"../../type":51}],57:[function(require,module,exports){
+"use strict";function resolveJavascriptRegExp(e){if(null===e)return!1;if(0===e.length)return!1;var r=e,t=/\/([gim]*)$/.exec(e),n="";if("/"===r[0]){if(t&&(n=t[1]),n.length>3)return!1;if("/"!==r[r.length-n.length-1])return!1}return!0}function constructJavascriptRegExp(e){var r=e,t=/\/([gim]*)$/.exec(e),n="";return"/"===r[0]&&(t&&(n=t[1]),r=r.slice(1,r.length-n.length-1)),new RegExp(r,n)}function representJavascriptRegExp(e){var r="/"+e.source+"/";return e.global&&(r+="g"),e.multiline&&(r+="m"),e.ignoreCase&&(r+="i"),r}function isRegExp(e){return"[object RegExp]"===Object.prototype.toString.call(e)}var Type=require("../../type");module.exports=new Type("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:resolveJavascriptRegExp,construct:constructJavascriptRegExp,predicate:isRegExp,represent:representJavascriptRegExp});
+
+},{"../../type":51}],58:[function(require,module,exports){
+"use strict";function resolveJavascriptUndefined(){return!0}function constructJavascriptUndefined(){}function representJavascriptUndefined(){return""}function isUndefined(e){return"undefined"==typeof e}var Type=require("../../type");module.exports=new Type("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:resolveJavascriptUndefined,construct:constructJavascriptUndefined,predicate:isUndefined,represent:representJavascriptUndefined});
+
+},{"../../type":51}],59:[function(require,module,exports){
+"use strict";var Type=require("../type");module.exports=new Type("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}});
+
+},{"../type":51}],60:[function(require,module,exports){
+"use strict";function resolveYamlMerge(e){return"<<"===e||null===e}var Type=require("../type");module.exports=new Type("tag:yaml.org,2002:merge",{kind:"scalar",resolve:resolveYamlMerge});
+
+},{"../type":51}],61:[function(require,module,exports){
+"use strict";function resolveYamlNull(l){if(null===l)return!0;var e=l.length;return 1===e&&"~"===l||4===e&&("null"===l||"Null"===l||"NULL"===l)}function constructYamlNull(){return null}function isNull(l){return null===l}var Type=require("../type");module.exports=new Type("tag:yaml.org,2002:null",{kind:"scalar",resolve:resolveYamlNull,construct:constructYamlNull,predicate:isNull,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"});
+
+},{"../type":51}],62:[function(require,module,exports){
+"use strict";function resolveYamlOmap(r){if(null===r)return!0;var t,e,n,o,u,a=[],l=r;for(t=0,e=l.length;e>t;t+=1){if(n=l[t],u=!1,"[object Object]"!==_toString.call(n))return!1;for(o in n)if(_hasOwnProperty.call(n,o)){if(u)return!1;u=!0}if(!u)return!1;if(-1!==a.indexOf(o))return!1;a.push(o)}return!0}function constructYamlOmap(r){return null!==r?r:[]}var Type=require("../type"),_hasOwnProperty=Object.prototype.hasOwnProperty,_toString=Object.prototype.toString;module.exports=new Type("tag:yaml.org,2002:omap",{kind:"sequence",resolve:resolveYamlOmap,construct:constructYamlOmap});
+
+},{"../type":51}],63:[function(require,module,exports){
+"use strict";function resolveYamlPairs(r){if(null===r)return!0;var e,t,n,l,o,a=r;for(o=new Array(a.length),e=0,t=a.length;t>e;e+=1){if(n=a[e],"[object Object]"!==_toString.call(n))return!1;if(l=Object.keys(n),1!==l.length)return!1;o[e]=[l[0],n[l[0]]]}return!0}function constructYamlPairs(r){if(null===r)return[];var e,t,n,l,o,a=r;for(o=new Array(a.length),e=0,t=a.length;t>e;e+=1)n=a[e],l=Object.keys(n),o[e]=[l[0],n[l[0]]];return o}var Type=require("../type"),_toString=Object.prototype.toString;module.exports=new Type("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:resolveYamlPairs,construct:constructYamlPairs});
+
+},{"../type":51}],64:[function(require,module,exports){
+"use strict";var Type=require("../type");module.exports=new Type("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}});
+
+},{"../type":51}],65:[function(require,module,exports){
+"use strict";function resolveYamlSet(e){if(null===e)return!0;var r,t=e;for(r in t)if(_hasOwnProperty.call(t,r)&&null!==t[r])return!1;return!0}function constructYamlSet(e){return null!==e?e:{}}var Type=require("../type"),_hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=new Type("tag:yaml.org,2002:set",{kind:"mapping",resolve:resolveYamlSet,construct:constructYamlSet});
+
+},{"../type":51}],66:[function(require,module,exports){
+"use strict";var Type=require("../type");module.exports=new Type("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return null!==r?r:""}});
+
+},{"../type":51}],67:[function(require,module,exports){
+"use strict";function resolveYamlTimestamp(e){return null===e?!1:null!==YAML_DATE_REGEXP.exec(e)?!0:null!==YAML_TIMESTAMP_REGEXP.exec(e)}function constructYamlTimestamp(e){var t,r,n,l,a,m,s,T,i,E,u=0,o=null;if(t=YAML_DATE_REGEXP.exec(e),null===t&&(t=YAML_TIMESTAMP_REGEXP.exec(e)),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,l=+t[3],!t[4])return new Date(Date.UTC(r,n,l));if(a=+t[4],m=+t[5],s=+t[6],t[7]){for(u=t[7].slice(0,3);u.length<3;)u+="0";u=+u}return t[9]&&(T=+t[10],i=+(t[11]||0),o=6e4*(60*T+i),"-"===t[9]&&(o=-o)),E=new Date(Date.UTC(r,n,l,a,m,s,u)),o&&E.setTime(E.getTime()-o),E}function representYamlTimestamp(e){return e.toISOString()}var Type=require("../type"),YAML_DATE_REGEXP=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),YAML_TIMESTAMP_REGEXP=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");module.exports=new Type("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:resolveYamlTimestamp,construct:constructYamlTimestamp,instanceOf:Date,represent:representYamlTimestamp});
+
+},{"../type":51}],68:[function(require,module,exports){
+function parse(e){if(e=""+e,!(e.length>1e4)){var a=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(a){var r=parseFloat(a[1]),c=(a[2]||"ms").toLowerCase();switch(c){case"years":case"year":case"yrs":case"yr":case"y":return r*y;case"days":case"day":case"d":return r*d;case"hours":case"hour":case"hrs":case"hr":case"h":return r*h;case"minutes":case"minute":case"mins":case"min":case"m":return r*m;case"seconds":case"second":case"secs":case"sec":case"s":return r*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r}}}}function short(e){return e>=d?Math.round(e/d)+"d":e>=h?Math.round(e/h)+"h":e>=m?Math.round(e/m)+"m":e>=s?Math.round(e/s)+"s":e+"ms"}function long(e){return plural(e,d,"day")||plural(e,h,"hour")||plural(e,m,"minute")||plural(e,s,"second")||e+" ms"}function plural(s,e,a){return e>s?void 0:1.5*e>s?Math.floor(s/e)+" "+a:Math.ceil(s/e)+" "+a+"s"}var s=1e3,m=60*s,h=60*m,d=24*h,y=365.25*d;module.exports=function(s,e){return e=e||{},"string"==typeof s?parse(s):e["long"]?long(s):short(s)};
+
+},{}],69:[function(require,module,exports){
+/**!
+ * Ono v2.2.1
+ *
+ * @link https://github.com/BigstickCarpet/ono
+ * @license MIT
+ */
+"use strict";function create(e){return function(r,t,o,n){var c,a=module.exports.formatter;"string"==typeof r?(c=a.apply(null,arguments),r=t=void 0):c="string"==typeof t?a.apply(null,slice.call(arguments,1)):a.apply(null,slice.call(arguments,2)),r instanceof Error||(t=r,r=void 0),r&&(c+=(c?" \n":"")+r.message);var i=new e(c);return extendError(i,r),extendToJSON(i),extend(i,t),i}}function extendError(e,r){r&&(extendStack(e,r),extend(e,r,!0))}function extendToJSON(e){e.toJSON=errorToJSON,e.inspect=errorToString}function extend(e,r,t){if(r&&"object"==typeof r)for(var o=Object.keys(r),n=0;n<o.length;n++){var c=o[n];if(!(t&&vendorSpecificErrorProperties.indexOf(c)>=0))try{e[c]=r[c]}catch(a){}}}function errorToJSON(){var e={},r=Object.keys(this);r=r.concat(vendorSpecificErrorProperties);for(var t=0;t<r.length;t++){var o=r[t],n=this[o],c=typeof n;"undefined"!==c&&"function"!==c&&(e[o]=n)}return e}function errorToString(){return JSON.stringify(this,null,2).replace(/\\n/g,"\n")}function extendStack(e,r){if(hasLazyStack(r))extendStackProperty(e,r);else{var t=r.stack;t&&(e.stack+=" \n\n"+r.stack)}}function hasLazyStack(e){if(!supportsLazyStack)return!1;var r=Object.getOwnPropertyDescriptor(e,"stack");return r?"function"==typeof r.get:!1}function extendStackProperty(e,r){var t=Object.getOwnPropertyDescriptor(r,"stack");if(t){var o=Object.getOwnPropertyDescriptor(e,"stack");Object.defineProperty(e,"stack",{get:function(){return o.get.apply(e)+" \n\n"+r.stack},enumerable:!1,configurable:!0})}}var util=require("util"),slice=Array.prototype.slice,vendorSpecificErrorProperties=["name","message","description","number","fileName","lineNumber","columnNumber","sourceURL","line","column","stack"];module.exports=create(Error),module.exports.error=create(Error),module.exports.eval=create(EvalError),module.exports.range=create(RangeError),module.exports.reference=create(ReferenceError),module.exports.syntax=create(SyntaxError),module.exports.type=create(TypeError),module.exports.uri=create(URIError),module.exports.formatter=util.format;var supportsLazyStack=function(){return!(!Object.getOwnPropertyDescriptor||!Object.defineProperty||"undefined"!=typeof navigator&&/Android/.test(navigator.userAgent))}();
+
+},{"util":97}],70:[function(require,module,exports){
+(function (process){
+"use strict";function nextTick(e){for(var s=new Array(arguments.length-1),n=0;n<s.length;)s[n++]=arguments[n];process.nextTick(function(){e.apply(null,s)})}!process.version||0===process.version.indexOf("v0.")||0===process.version.indexOf("v1.")&&0!==process.version.indexOf("v1.8.")?module.exports=nextTick:module.exports=process.nextTick;
+
+}).call(this,require('_process'))
+
+},{"_process":71}],71:[function(require,module,exports){
+function cleanUpNextTick(){draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue()}function drainQueue(){if(!draining){var e=setTimeout(cleanUpNextTick);draining=!0;for(var n=queue.length;n;){for(currentQueue=queue,queue=[];++queueIndex<n;)currentQueue&&currentQueue[queueIndex].run();queueIndex=-1,n=queue.length}currentQueue=null,draining=!1,clearTimeout(e)}}function Item(e,n){this.fun=e,this.array=n}function noop(){}var process=module.exports={},queue=[],draining=!1,currentQueue,queueIndex=-1;process.nextTick=function(e){var n=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)n[r-1]=arguments[r];queue.push(new Item(e,n)),1!==queue.length||draining||setTimeout(drainQueue,0)},Item.prototype.run=function(){this.fun.apply(null,this.array)},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.binding=function(e){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(e){throw new Error("process.chdir is not supported")},process.umask=function(){return 0};
+
+},{}],72:[function(require,module,exports){
+(function (global){
+/*! https://mths.be/punycode v1.4.1 by @mathias */
+!function(e){function o(e){throw new RangeError(T[e])}function n(e,o){for(var n=e.length,r=[];n--;)r[n]=o(e[n]);return r}function r(e,o){var r=e.split("@"),t="";r.length>1&&(t=r[0]+"@",e=r[1]),e=e.replace(S,".");var u=e.split("."),i=n(u,o).join(".");return t+i}function t(e){for(var o,n,r=[],t=0,u=e.length;u>t;)o=e.charCodeAt(t++),o>=55296&&56319>=o&&u>t?(n=e.charCodeAt(t++),56320==(64512&n)?r.push(((1023&o)<<10)+(1023&n)+65536):(r.push(o),t--)):r.push(o);return r}function u(e){return n(e,function(e){var o="";return e>65535&&(e-=65536,o+=P(e>>>10&1023|55296),e=56320|1023&e),o+=P(e)}).join("")}function i(e){return 10>e-48?e-22:26>e-65?e-65:26>e-97?e-97:b}function f(e,o){return e+22+75*(26>e)-((0!=o)<<5)}function c(e,o,n){var r=0;for(e=n?M(e/j):e>>1,e+=M(e/o);e>L*C>>1;r+=b)e=M(e/L);return M(r+(L+1)*e/(e+m))}function l(e){var n,r,t,f,l,s,d,a,p,h,v=[],g=e.length,w=0,m=I,j=A;for(r=e.lastIndexOf(E),0>r&&(r=0),t=0;r>t;++t)e.charCodeAt(t)>=128&&o("not-basic"),v.push(e.charCodeAt(t));for(f=r>0?r+1:0;g>f;){for(l=w,s=1,d=b;f>=g&&o("invalid-input"),a=i(e.charCodeAt(f++)),(a>=b||a>M((x-w)/s))&&o("overflow"),w+=a*s,p=j>=d?y:d>=j+C?C:d-j,!(p>a);d+=b)h=b-p,s>M(x/h)&&o("overflow"),s*=h;n=v.length+1,j=c(w-l,n,0==l),M(w/n)>x-m&&o("overflow"),m+=M(w/n),w%=n,v.splice(w++,0,m)}return u(v)}function s(e){var n,r,u,i,l,s,d,a,p,h,v,g,w,m,j,F=[];for(e=t(e),g=e.length,n=I,r=0,l=A,s=0;g>s;++s)v=e[s],128>v&&F.push(P(v));for(u=i=F.length,i&&F.push(E);g>u;){for(d=x,s=0;g>s;++s)v=e[s],v>=n&&d>v&&(d=v);for(w=u+1,d-n>M((x-r)/w)&&o("overflow"),r+=(d-n)*w,n=d,s=0;g>s;++s)if(v=e[s],n>v&&++r>x&&o("overflow"),v==n){for(a=r,p=b;h=l>=p?y:p>=l+C?C:p-l,!(h>a);p+=b)j=a-h,m=b-h,F.push(P(f(h+j%m,0))),a=M(j/m);F.push(P(f(a,0))),l=c(r,w,u==i),r=0,++u}++r,++n}return F.join("")}function d(e){return r(e,function(e){return F.test(e)?l(e.slice(4).toLowerCase()):e})}function a(e){return r(e,function(e){return O.test(e)?"xn--"+s(e):e})}var p="object"==typeof exports&&exports&&!exports.nodeType&&exports,h="object"==typeof module&&module&&!module.nodeType&&module,v="object"==typeof global&&global;v.global!==v&&v.window!==v&&v.self!==v||(e=v);var g,w,x=2147483647,b=36,y=1,C=26,m=38,j=700,A=72,I=128,E="-",F=/^xn--/,O=/[^\x20-\x7E]/,S=/[\x2E\u3002\uFF0E\uFF61]/g,T={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},L=b-y,M=Math.floor,P=String.fromCharCode;if(g={version:"1.4.1",ucs2:{decode:t,encode:u},decode:l,encode:s,toASCII:a,toUnicode:d},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return g});else if(p&&h)if(module.exports==p)h.exports=g;else for(w in g)g.hasOwnProperty(w)&&(p[w]=g[w]);else e.punycode=g}(this);
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{}],73:[function(require,module,exports){
+"use strict";function hasOwnProperty(r,e){return Object.prototype.hasOwnProperty.call(r,e)}module.exports=function(r,e,t,n){e=e||"&",t=t||"=";var o={};if("string"!=typeof r||0===r.length)return o;var a=/\+/g;r=r.split(e);var s=1e3;n&&"number"==typeof n.maxKeys&&(s=n.maxKeys);var p=r.length;s>0&&p>s&&(p=s);for(var y=0;p>y;++y){var u,c,i,l,f=r[y].replace(a,"%20"),v=f.indexOf(t);v>=0?(u=f.substr(0,v),c=f.substr(v+1)):(u=f,c=""),i=decodeURIComponent(u),l=decodeURIComponent(c),hasOwnProperty(o,i)?isArray(o[i])?o[i].push(l):o[i]=[o[i],l]:o[i]=l}return o};var isArray=Array.isArray||function(r){return"[object Array]"===Object.prototype.toString.call(r)};
+
+},{}],74:[function(require,module,exports){
+"use strict";function map(r,e){if(r.map)return r.map(e);for(var t=[],n=0;n<r.length;n++)t.push(e(r[n],n));return t}var stringifyPrimitive=function(r){switch(typeof r){case"string":return r;case"boolean":return r?"true":"false";case"number":return isFinite(r)?r:"";default:return""}};module.exports=function(r,e,t,n){return e=e||"&",t=t||"=",null===r&&(r=void 0),"object"==typeof r?map(objectKeys(r),function(n){var i=encodeURIComponent(stringifyPrimitive(n))+t;return isArray(r[n])?map(r[n],function(r){return i+encodeURIComponent(stringifyPrimitive(r))}).join(e):i+encodeURIComponent(stringifyPrimitive(r[n]))}).join(e):n?encodeURIComponent(stringifyPrimitive(n))+t+encodeURIComponent(stringifyPrimitive(r)):""};var isArray=Array.isArray||function(r){return"[object Array]"===Object.prototype.toString.call(r)},objectKeys=Object.keys||function(r){var e=[];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&e.push(t);return e};
+
+},{}],75:[function(require,module,exports){
+"use strict";exports.decode=exports.parse=require("./decode"),exports.encode=exports.stringify=require("./encode");
+
+},{"./decode":73,"./encode":74}],76:[function(require,module,exports){
+module.exports=require("./lib/_stream_duplex.js");
+
+},{"./lib/_stream_duplex.js":77}],77:[function(require,module,exports){
+"use strict";function Duplex(e){return this instanceof Duplex?(Readable.call(this,e),Writable.call(this,e),e&&e.readable===!1&&(this.readable=!1),e&&e.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,e&&e.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once("end",onend)):new Duplex(e)}function onend(){this.allowHalfOpen||this._writableState.ended||processNextTick(onEndNT,this)}function onEndNT(e){e.end()}function forEach(e,t){for(var r=0,i=e.length;i>r;r++)t(e[r],r)}var objectKeys=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};module.exports=Duplex;var processNextTick=require("process-nextick-args"),util=require("core-util-is");util.inherits=require("inherits");var Readable=require("./_stream_readable"),Writable=require("./_stream_writable");util.inherits(Duplex,Readable);for(var keys=objectKeys(Writable.prototype),v=0;v<keys.length;v++){var method=keys[v];Duplex.prototype[method]||(Duplex.prototype[method]=Writable.prototype[method])}
+
+},{"./_stream_readable":79,"./_stream_writable":81,"core-util-is":28,"inherits":35,"process-nextick-args":70}],78:[function(require,module,exports){
+"use strict";function PassThrough(r){return this instanceof PassThrough?void Transform.call(this,r):new PassThrough(r)}module.exports=PassThrough;var Transform=require("./_stream_transform"),util=require("core-util-is");util.inherits=require("inherits"),util.inherits(PassThrough,Transform),PassThrough.prototype._transform=function(r,s,i){i(null,r)};
+
+},{"./_stream_transform":80,"core-util-is":28,"inherits":35}],79:[function(require,module,exports){
+(function (process){
+"use strict";function ReadableState(e,t){Duplex=Duplex||require("./_stream_duplex"),e=e||{},this.objectMode=!!e.objectMode,t instanceof Duplex&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var r=e.highWaterMark,n=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:n,this.highWaterMark=~~this.highWaterMark,this.buffer=[],this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(StringDecoder||(StringDecoder=require("string_decoder/").StringDecoder),this.decoder=new StringDecoder(e.encoding),this.encoding=e.encoding)}function Readable(e){return Duplex=Duplex||require("./_stream_duplex"),this instanceof Readable?(this._readableState=new ReadableState(e,this),this.readable=!0,e&&"function"==typeof e.read&&(this._read=e.read),void Stream.call(this)):new Readable(e)}function readableAddChunk(e,t,r,n,a){var i=chunkInvalid(t,r);if(i)e.emit("error",i);else if(null===r)t.reading=!1,onEofChunk(e,t);else if(t.objectMode||r&&r.length>0)if(t.ended&&!a){var d=new Error("stream.push() after EOF");e.emit("error",d)}else if(t.endEmitted&&a){var d=new Error("stream.unshift() after end event");e.emit("error",d)}else{var o;!t.decoder||a||n||(r=t.decoder.write(r),o=!t.objectMode&&0===r.length),a||(t.reading=!1),o||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,a?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&emitReadable(e))),maybeReadMore(e,t)}else a||(t.reading=!1);return needMoreData(t)}function needMoreData(e){return!e.ended&&(e.needReadable||e.length<e.highWaterMark||0===e.length)}function computeNewHighWaterMark(e){return e>=MAX_HWM?e=MAX_HWM:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function howMuchToRead(e,t){return 0===t.length&&t.ended?0:t.objectMode?0===e?0:1:null===e||isNaN(e)?t.flowing&&t.buffer.length?t.buffer[0].length:t.length:0>=e?0:(e>t.highWaterMark&&(t.highWaterMark=computeNewHighWaterMark(e)),e>t.length?t.ended?t.length:(t.needReadable=!0,0):e)}function chunkInvalid(e,t){var r=null;return Buffer.isBuffer(t)||"string"==typeof t||null===t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function onEofChunk(e,t){if(!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,emitReadable(e)}}function emitReadable(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(debug("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?processNextTick(emitReadable_,e):emitReadable_(e))}function emitReadable_(e){debug("emit readable"),e.emit("readable"),flow(e)}function maybeReadMore(e,t){t.readingMore||(t.readingMore=!0,processNextTick(maybeReadMore_,e,t))}function maybeReadMore_(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length<t.highWaterMark&&(debug("maybeReadMore read 0"),e.read(0),r!==t.length);)r=t.length;t.readingMore=!1}function pipeOnDrain(e){return function(){var t=e._readableState;debug("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&EElistenerCount(e,"data")&&(t.flowing=!0,flow(e))}}function nReadingNextTick(e){debug("readable nexttick read 0"),e.read(0)}function resume(e,t){t.resumeScheduled||(t.resumeScheduled=!0,processNextTick(resume_,e,t))}function resume_(e,t){t.reading||(debug("resume read 0"),e.read(0)),t.resumeScheduled=!1,e.emit("resume"),flow(e),t.flowing&&!t.reading&&e.read(0)}function flow(e){var t=e._readableState;if(debug("flow",t.flowing),t.flowing)do var r=e.read();while(null!==r&&t.flowing)}function fromList(e,t){var r,n=t.buffer,a=t.length,i=!!t.decoder,d=!!t.objectMode;if(0===n.length)return null;if(0===a)r=null;else if(d)r=n.shift();else if(!e||e>=a)r=i?n.join(""):1===n.length?n[0]:Buffer.concat(n,a),n.length=0;else if(e<n[0].length){var o=n[0];r=o.slice(0,e),n[0]=o.slice(e)}else if(e===n[0].length)r=n.shift();else{r=i?"":new Buffer(e);for(var l=0,u=0,s=n.length;s>u&&e>l;u++){var o=n[0],h=Math.min(e-l,o.length);i?r+=o.slice(0,h):o.copy(r,l,0,h),h<o.length?n[0]=o.slice(h):n.shift(),l+=h}}return r}function endReadable(e){var t=e._readableState;if(t.length>0)throw new Error("endReadable called on non-empty stream");t.endEmitted||(t.ended=!0,processNextTick(endReadableNT,t,e))}function endReadableNT(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function forEach(e,t){for(var r=0,n=e.length;n>r;r++)t(e[r],r)}function indexOf(e,t){for(var r=0,n=e.length;n>r;r++)if(e[r]===t)return r;return-1}module.exports=Readable;var processNextTick=require("process-nextick-args"),isArray=require("isarray"),Buffer=require("buffer").Buffer;Readable.ReadableState=ReadableState;var EE=require("events"),EElistenerCount=function(e,t){return e.listeners(t).length},Stream;!function(){try{Stream=require("stream")}catch(e){}finally{Stream||(Stream=require("events").EventEmitter)}}();var Buffer=require("buffer").Buffer,util=require("core-util-is");util.inherits=require("inherits");var debugUtil=require("util"),debug=void 0;debug=debugUtil&&debugUtil.debuglog?debugUtil.debuglog("stream"):function(){};var StringDecoder;util.inherits(Readable,Stream);var Duplex,Duplex;Readable.prototype.push=function(e,t){var r=this._readableState;return r.objectMode||"string"!=typeof e||(t=t||r.defaultEncoding,t!==r.encoding&&(e=new Buffer(e,t),t="")),readableAddChunk(this,r,e,t,!1)},Readable.prototype.unshift=function(e){var t=this._readableState;return readableAddChunk(this,t,e,"",!0)},Readable.prototype.isPaused=function(){return this._readableState.flowing===!1},Readable.prototype.setEncoding=function(e){return StringDecoder||(StringDecoder=require("string_decoder/").StringDecoder),this._readableState.decoder=new StringDecoder(e),this._readableState.encoding=e,this};var MAX_HWM=8388608;Readable.prototype.read=function(e){debug("read",e);var t=this._readableState,r=e;if(("number"!=typeof e||e>0)&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return debug("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?endReadable(this):emitReadable(this),null;if(e=howMuchToRead(e,t),0===e&&t.ended)return 0===t.length&&endReadable(this),null;var n=t.needReadable;debug("need readable",n),(0===t.length||t.length-e<t.highWaterMark)&&(n=!0,debug("length less than watermark",n)),(t.ended||t.reading)&&(n=!1,debug("reading or ended",n)),n&&(debug("do read"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1),n&&!t.reading&&(e=howMuchToRead(r,t));var a;return a=e>0?fromList(e,t):null,null===a&&(t.needReadable=!0,e=0),t.length-=e,0!==t.length||t.ended||(t.needReadable=!0),r!==e&&t.ended&&0===t.length&&endReadable(this),null!==a&&this.emit("data",a),a},Readable.prototype._read=function(e){this.emit("error",new Error("not implemented"))},Readable.prototype.pipe=function(e,t){function r(e){debug("onunpipe"),e===s&&a()}function n(){debug("onend"),e.end()}function a(){debug("cleanup"),e.removeListener("close",o),e.removeListener("finish",l),e.removeListener("drain",c),e.removeListener("error",d),e.removeListener("unpipe",r),s.removeListener("end",n),s.removeListener("end",a),s.removeListener("data",i),b=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||c()}function i(t){debug("ondata");var r=e.write(t);!1===r&&(1!==h.pipesCount||h.pipes[0]!==e||1!==s.listenerCount("data")||b||(debug("false write response, pause",s._readableState.awaitDrain),s._readableState.awaitDrain++),s.pause())}function d(t){debug("onerror",t),u(),e.removeListener("error",d),0===EElistenerCount(e,"error")&&e.emit("error",t)}function o(){e.removeListener("finish",l),u()}function l(){debug("onfinish"),e.removeListener("close",o),u()}function u(){debug("unpipe"),s.unpipe(e)}var s=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,debug("pipe count=%d opts=%j",h.pipesCount,t);var f=(!t||t.end!==!1)&&e!==process.stdout&&e!==process.stderr,p=f?n:a;h.endEmitted?processNextTick(p):s.once("end",p),e.on("unpipe",r);var c=pipeOnDrain(s);e.on("drain",c);var b=!1;return s.on("data",i),e._events&&e._events.error?isArray(e._events.error)?e._events.error.unshift(d):e._events.error=[d,e._events.error]:e.on("error",d),e.once("close",o),e.once("finish",l),e.emit("pipe",s),h.flowing||(debug("pipe resume"),s.resume()),e},Readable.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this),this);if(!e){var r=t.pipes,n=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var a=0;n>a;a++)r[a].emit("unpipe",this);return this}var i=indexOf(t.pipes,e);return-1===i?this:(t.pipes.splice(i,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this),this)},Readable.prototype.on=function(e,t){var r=Stream.prototype.on.call(this,e,t);if("data"===e&&!1!==this._readableState.flowing&&this.resume(),"readable"===e&&!this._readableState.endEmitted){var n=this._readableState;n.readableListening||(n.readableListening=!0,n.emittedReadable=!1,n.needReadable=!0,n.reading?n.length&&emitReadable(this,n):processNextTick(nReadingNextTick,this))}return r},Readable.prototype.addListener=Readable.prototype.on,Readable.prototype.resume=function(){var e=this._readableState;return e.flowing||(debug("resume"),e.flowing=!0,resume(this,e)),this},Readable.prototype.pause=function(){return debug("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(debug("pause"),this._readableState.flowing=!1,this.emit("pause")),this},Readable.prototype.wrap=function(e){var t=this._readableState,r=!1,n=this;e.on("end",function(){if(debug("wrapped end"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&n.push(e)}n.push(null)}),e.on("data",function(a){if(debug("wrapped data"),t.decoder&&(a=t.decoder.write(a)),(!t.objectMode||null!==a&&void 0!==a)&&(t.objectMode||a&&a.length)){var i=n.push(a);i||(r=!0,e.pause())}});for(var a in e)void 0===this[a]&&"function"==typeof e[a]&&(this[a]=function(t){return function(){return e[t].apply(e,arguments)}}(a));var i=["error","close","destroy","pause","resume"];return forEach(i,function(t){e.on(t,n.emit.bind(n,t))}),n._read=function(t){debug("wrapped _read",t),r&&(r=!1,e.resume())},n},Readable._fromList=fromList;
+
+}).call(this,require('_process'))
+
+},{"./_stream_duplex":77,"_process":71,"buffer":25,"core-util-is":28,"events":32,"inherits":35,"isarray":37,"process-nextick-args":70,"stream":86,"string_decoder/":91,"util":23}],80:[function(require,module,exports){
+"use strict";function TransformState(r){this.afterTransform=function(t,n){return afterTransform(r,t,n)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function afterTransform(r,t,n){var e=r._transformState;e.transforming=!1;var i=e.writecb;if(!i)return r.emit("error",new Error("no writecb in Transform class"));e.writechunk=null,e.writecb=null,null!==n&&void 0!==n&&r.push(n),i(t);var a=r._readableState;a.reading=!1,(a.needReadable||a.length<a.highWaterMark)&&r._read(a.highWaterMark)}function Transform(r){if(!(this instanceof Transform))return new Transform(r);Duplex.call(this,r),this._transformState=new TransformState(this);var t=this;this._readableState.needReadable=!0,this._readableState.sync=!1,r&&("function"==typeof r.transform&&(this._transform=r.transform),"function"==typeof r.flush&&(this._flush=r.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(r){done(t,r)}):done(t)})}function done(r,t){if(t)return r.emit("error",t);var n=r._writableState,e=r._transformState;if(n.length)throw new Error("calling transform done when ws.length != 0");if(e.transforming)throw new Error("calling transform done when still transforming");return r.push(null)}module.exports=Transform;var Duplex=require("./_stream_duplex"),util=require("core-util-is");util.inherits=require("inherits"),util.inherits(Transform,Duplex),Transform.prototype.push=function(r,t){return this._transformState.needTransform=!1,Duplex.prototype.push.call(this,r,t)},Transform.prototype._transform=function(r,t,n){throw new Error("not implemented")},Transform.prototype._write=function(r,t,n){var e=this._transformState;if(e.writecb=n,e.writechunk=r,e.writeencoding=t,!e.transforming){var i=this._readableState;(e.needTransform||i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}},Transform.prototype._read=function(r){var t=this._transformState;null!==t.writechunk&&t.writecb&&!t.transforming?(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform)):t.needTransform=!0};
+
+},{"./_stream_duplex":77,"core-util-is":28,"inherits":35}],81:[function(require,module,exports){
+(function (process){
+"use strict";function nop(){}function WriteReq(e,t,r){this.chunk=e,this.encoding=t,this.callback=r,this.next=null}function WritableState(e,t){Duplex=Duplex||require("./_stream_duplex"),e=e||{},this.objectMode=!!e.objectMode,t instanceof Duplex&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var r=e.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var n=e.decodeStrings===!1;this.decodeStrings=!n,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){onwrite(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new CorkedRequest(this),this.corkedRequestsFree.next=new CorkedRequest(this)}function Writable(e){return Duplex=Duplex||require("./_stream_duplex"),this instanceof Writable||this instanceof Duplex?(this._writableState=new WritableState(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev)),void Stream.call(this)):new Writable(e)}function writeAfterEnd(e,t){var r=new Error("write after end");e.emit("error",r),processNextTick(t,r)}function validChunk(e,t,r,i){var n=!0;if(!Buffer.isBuffer(r)&&"string"!=typeof r&&null!==r&&void 0!==r&&!t.objectMode){var s=new TypeError("Invalid non-string/buffer chunk");e.emit("error",s),processNextTick(i,s),n=!1}return n}function decodeChunk(e,t,r){return e.objectMode||e.decodeStrings===!1||"string"!=typeof t||(t=new Buffer(t,r)),t}function writeOrBuffer(e,t,r,i,n){r=decodeChunk(t,r,i),Buffer.isBuffer(r)&&(i="buffer");var s=t.objectMode?1:r.length;t.length+=s;var f=t.length<t.highWaterMark;if(f||(t.needDrain=!0),t.writing||t.corked){var u=t.lastBufferedRequest;t.lastBufferedRequest=new WriteReq(r,i,n),u?u.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else doWrite(e,t,!1,s,r,i,n);return f}function doWrite(e,t,r,i,n,s,f){t.writelen=i,t.writecb=f,t.writing=!0,t.sync=!0,r?e._writev(n,t.onwrite):e._write(n,s,t.onwrite),t.sync=!1}function onwriteError(e,t,r,i,n){--t.pendingcb,r?processNextTick(n,i):n(i),e._writableState.errorEmitted=!0,e.emit("error",i)}function onwriteStateUpdate(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}function onwrite(e,t){var r=e._writableState,i=r.sync,n=r.writecb;if(onwriteStateUpdate(r),t)onwriteError(e,r,i,t,n);else{var s=needFinish(r);s||r.corked||r.bufferProcessing||!r.bufferedRequest||clearBuffer(e,r),i?asyncWrite(afterWrite,e,r,s,n):afterWrite(e,r,s,n)}}function afterWrite(e,t,r,i){r||onwriteDrain(e,t),t.pendingcb--,i(),finishMaybe(e,t)}function onwriteDrain(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}function clearBuffer(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var i=t.bufferedRequestCount,n=new Array(i),s=t.corkedRequestsFree;s.entry=r;for(var f=0;r;)n[f]=r,r=r.next,f+=1;doWrite(e,t,!0,t.length,n,"",s.finish),t.pendingcb++,t.lastBufferedRequest=null,t.corkedRequestsFree=s.next,s.next=null}else{for(;r;){var u=r.chunk,o=r.encoding,a=r.callback,c=t.objectMode?1:u.length;if(doWrite(e,t,!1,c,u,o,a),r=r.next,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequestCount=0,t.bufferedRequest=r,t.bufferProcessing=!1}function needFinish(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function prefinish(e,t){t.prefinished||(t.prefinished=!0,e.emit("prefinish"))}function finishMaybe(e,t){var r=needFinish(t);return r&&(0===t.pendingcb?(prefinish(e,t),t.finished=!0,e.emit("finish")):prefinish(e,t)),r}function endWritable(e,t,r){t.ending=!0,finishMaybe(e,t),r&&(t.finished?processNextTick(r):e.once("finish",r)),t.ended=!0,e.writable=!1}function CorkedRequest(e){var t=this;this.next=null,this.entry=null,this.finish=function(r){var i=t.entry;for(t.entry=null;i;){var n=i.callback;e.pendingcb--,n(r),i=i.next}e.corkedRequestsFree?e.corkedRequestsFree.next=t:e.corkedRequestsFree=t}}module.exports=Writable;var processNextTick=require("process-nextick-args"),asyncWrite=!process.browser&&["v0.10","v0.9."].indexOf(process.version.slice(0,5))>-1?setImmediate:processNextTick,Buffer=require("buffer").Buffer;Writable.WritableState=WritableState;var util=require("core-util-is");util.inherits=require("inherits");var internalUtil={deprecate:require("util-deprecate")},Stream;!function(){try{Stream=require("stream")}catch(e){}finally{Stream||(Stream=require("events").EventEmitter)}}();var Buffer=require("buffer").Buffer;util.inherits(Writable,Stream);var Duplex;WritableState.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(WritableState.prototype,"buffer",{get:internalUtil.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(e){}}();var Duplex;Writable.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},Writable.prototype.write=function(e,t,r){var i=this._writableState,n=!1;return"function"==typeof t&&(r=t,t=null),Buffer.isBuffer(e)?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=nop),i.ended?writeAfterEnd(this,r):validChunk(this,i,e,r)&&(i.pendingcb++,n=writeOrBuffer(this,i,e,t,r)),n},Writable.prototype.cork=function(){var e=this._writableState;e.corked++},Writable.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||clearBuffer(this,e))},Writable.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);this._writableState.defaultEncoding=e},Writable.prototype._write=function(e,t,r){r(new Error("not implemented"))},Writable.prototype._writev=null,Writable.prototype.end=function(e,t,r){var i=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!==e&&void 0!==e&&this.write(e,t),i.corked&&(i.corked=1,this.uncork()),i.ending||i.finished||endWritable(this,i,r)};
+
+}).call(this,require('_process'))
+
+},{"./_stream_duplex":77,"_process":71,"buffer":25,"core-util-is":28,"events":32,"inherits":35,"process-nextick-args":70,"stream":86,"util-deprecate":95}],82:[function(require,module,exports){
+module.exports=require("./lib/_stream_passthrough.js");
+
+},{"./lib/_stream_passthrough.js":78}],83:[function(require,module,exports){
+var Stream=function(){try{return require("stream")}catch(r){}}();exports=module.exports=require("./lib/_stream_readable.js"),exports.Stream=Stream||exports,exports.Readable=exports,exports.Writable=require("./lib/_stream_writable.js"),exports.Duplex=require("./lib/_stream_duplex.js"),exports.Transform=require("./lib/_stream_transform.js"),exports.PassThrough=require("./lib/_stream_passthrough.js");
+
+},{"./lib/_stream_duplex.js":77,"./lib/_stream_passthrough.js":78,"./lib/_stream_readable.js":79,"./lib/_stream_transform.js":80,"./lib/_stream_writable.js":81,"stream":86}],84:[function(require,module,exports){
+module.exports=require("./lib/_stream_transform.js");
+
+},{"./lib/_stream_transform.js":80}],85:[function(require,module,exports){
+module.exports=require("./lib/_stream_writable.js");
+
+},{"./lib/_stream_writable.js":81}],86:[function(require,module,exports){
+function Stream(){EE.call(this)}module.exports=Stream;var EE=require("events").EventEmitter,inherits=require("inherits");inherits(Stream,EE),Stream.Readable=require("readable-stream/readable.js"),Stream.Writable=require("readable-stream/writable.js"),Stream.Duplex=require("readable-stream/duplex.js"),Stream.Transform=require("readable-stream/transform.js"),Stream.PassThrough=require("readable-stream/passthrough.js"),Stream.Stream=Stream,Stream.prototype.pipe=function(e,r){function t(r){e.writable&&!1===e.write(r)&&m.pause&&m.pause()}function n(){m.readable&&m.resume&&m.resume()}function a(){u||(u=!0,e.end())}function o(){u||(u=!0,"function"==typeof e.destroy&&e.destroy())}function i(e){if(s(),0===EE.listenerCount(this,"error"))throw e}function s(){m.removeListener("data",t),e.removeListener("drain",n),m.removeListener("end",a),m.removeListener("close",o),m.removeListener("error",i),e.removeListener("error",i),m.removeListener("end",s),m.removeListener("close",s),e.removeListener("close",s)}var m=this;m.on("data",t),e.on("drain",n),e._isStdio||r&&r.end===!1||(m.on("end",a),m.on("close",o));var u=!1;return m.on("error",i),e.on("error",i),m.on("end",s),m.on("close",s),e.on("close",s),e.emit("pipe",m),e};
+
+},{"events":32,"inherits":35,"readable-stream/duplex.js":76,"readable-stream/passthrough.js":82,"readable-stream/readable.js":83,"readable-stream/transform.js":84,"readable-stream/writable.js":85}],87:[function(require,module,exports){
+(function (global){
+var ClientRequest=require("./lib/request"),extend=require("xtend"),statusCodes=require("builtin-status-codes"),url=require("url"),http=exports;http.request=function(t,e){t="string"==typeof t?url.parse(t):extend(t);var r=-1===global.location.protocol.search(/^https?:$/)?"http:":"",s=t.protocol||r,o=t.hostname||t.host,n=t.port,u=t.path||"/";o&&-1!==o.indexOf(":")&&(o="["+o+"]"),t.url=(o?s+"//"+o:"")+(n?":"+n:"")+u,t.method=(t.method||"GET").toUpperCase(),t.headers=t.headers||{};var C=new ClientRequest(t);return e&&C.on("response",e),C},http.get=function(t,e){var r=http.request(t,e);return r.end(),r},http.Agent=function(){},http.Agent.defaultMaxSockets=4,http.STATUS_CODES=statusCodes,http.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"];
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{"./lib/request":89,"builtin-status-codes":26,"url":93,"xtend":98}],88:[function(require,module,exports){
+(function (global){
+function checkTypeSupport(e){try{return xhr.responseType=e,xhr.responseType===e}catch(r){}return!1}function isFunction(e){return"function"==typeof e}exports.fetch=isFunction(global.fetch)&&isFunction(global.ReadableByteStream),exports.blobConstructor=!1;try{new Blob([new ArrayBuffer(1)]),exports.blobConstructor=!0}catch(e){}var xhr=new global.XMLHttpRequest;xhr.open("GET",global.location.host?"/":"https://example.com");var haveArrayBuffer="undefined"!=typeof global.ArrayBuffer,haveSlice=haveArrayBuffer&&isFunction(global.ArrayBuffer.prototype.slice);exports.arraybuffer=haveArrayBuffer&&checkTypeSupport("arraybuffer"),exports.msstream=!exports.fetch&&haveSlice&&checkTypeSupport("ms-stream"),exports.mozchunkedarraybuffer=!exports.fetch&&haveArrayBuffer&&checkTypeSupport("moz-chunked-arraybuffer"),exports.overrideMimeType=isFunction(xhr.overrideMimeType),exports.vbArray=isFunction(global.VBArray),xhr=null;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{}],89:[function(require,module,exports){
+(function (process,global,Buffer){
+function decideMode(e){return capability.fetch?"fetch":capability.mozchunkedarraybuffer?"moz-chunked-arraybuffer":capability.msstream?"ms-stream":capability.arraybuffer&&e?"arraybuffer":capability.vbArray&&e?"text:vbarray":"text"}function statusValid(e){try{var t=e.status;return null!==t&&0!==t}catch(r){return!1}}var capability=require("./capability"),inherits=require("inherits"),response=require("./response"),stream=require("stream"),toArrayBuffer=require("to-arraybuffer"),IncomingMessage=response.IncomingMessage,rStates=response.readyStates,ClientRequest=module.exports=function(e){var t=this;stream.Writable.call(t),t._opts=e,t._body=[],t._headers={},e.auth&&t.setHeader("Authorization","Basic "+new Buffer(e.auth).toString("base64")),Object.keys(e.headers).forEach(function(r){t.setHeader(r,e.headers[r])});var r;if("prefer-streaming"===e.mode)r=!1;else if("allow-wrong-content-type"===e.mode)r=!capability.overrideMimeType;else{if(e.mode&&"default"!==e.mode&&"prefer-fast"!==e.mode)throw new Error("Invalid value for opts.mode");r=!0}t._mode=decideMode(r),t.on("finish",function(){t._onFinish()})};inherits(ClientRequest,stream.Writable),ClientRequest.prototype.setHeader=function(e,t){var r=this,o=e.toLowerCase();-1===unsafeHeaders.indexOf(o)&&(r._headers[o]={name:e,value:t})},ClientRequest.prototype.getHeader=function(e){var t=this;return t._headers[e.toLowerCase()].value},ClientRequest.prototype.removeHeader=function(e){var t=this;delete t._headers[e.toLowerCase()]},ClientRequest.prototype._onFinish=function(){var e=this;if(!e._destroyed){var t,r=e._opts,o=e._headers;if("POST"!==r.method&&"PUT"!==r.method&&"PATCH"!==r.method||(t=capability.blobConstructor?new global.Blob(e._body.map(function(e){return toArrayBuffer(e)}),{type:(o["content-type"]||{}).value||""}):Buffer.concat(e._body).toString()),"fetch"===e._mode){var n=Object.keys(o).map(function(e){return[o[e].name,o[e].value]});global.fetch(e._opts.url,{method:e._opts.method,headers:n,body:t,mode:"cors",credentials:r.withCredentials?"include":"same-origin"}).then(function(t){e._fetchResponse=t,e._connect()},function(t){e.emit("error",t)})}else{var s=e._xhr=new global.XMLHttpRequest;try{s.open(e._opts.method,e._opts.url,!0)}catch(i){return void process.nextTick(function(){e.emit("error",i)})}"responseType"in s&&(s.responseType=e._mode.split(":")[0]),"withCredentials"in s&&(s.withCredentials=!!r.withCredentials),"text"===e._mode&&"overrideMimeType"in s&&s.overrideMimeType("text/plain; charset=x-user-defined"),Object.keys(o).forEach(function(e){s.setRequestHeader(o[e].name,o[e].value)}),e._response=null,s.onreadystatechange=function(){switch(s.readyState){case rStates.LOADING:case rStates.DONE:e._onXHRProgress()}},"moz-chunked-arraybuffer"===e._mode&&(s.onprogress=function(){e._onXHRProgress()}),s.onerror=function(){e._destroyed||e.emit("error",new Error("XHR error"))};try{s.send(t)}catch(i){return void process.nextTick(function(){e.emit("error",i)})}}}},ClientRequest.prototype._onXHRProgress=function(){var e=this;statusValid(e._xhr)&&!e._destroyed&&(e._response||e._connect(),e._response._onXHRProgress())},ClientRequest.prototype._connect=function(){var e=this;e._destroyed||(e._response=new IncomingMessage(e._xhr,e._fetchResponse,e._mode),e.emit("response",e._response))},ClientRequest.prototype._write=function(e,t,r){var o=this;o._body.push(e),r()},ClientRequest.prototype.abort=ClientRequest.prototype.destroy=function(){var e=this;e._destroyed=!0,e._response&&(e._response._destroyed=!0),e._xhr&&e._xhr.abort()},ClientRequest.prototype.end=function(e,t,r){var o=this;"function"==typeof e&&(r=e,e=void 0),stream.Writable.prototype.end.call(o,e,t,r)},ClientRequest.prototype.flushHeaders=function(){},ClientRequest.prototype.setTimeout=function(){},ClientRequest.prototype.setNoDelay=function(){},ClientRequest.prototype.setSocketKeepAlive=function(){};var unsafeHeaders=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","date","dnt","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
+
+},{"./capability":88,"./response":90,"_process":71,"buffer":25,"inherits":35,"stream":86,"to-arraybuffer":92}],90:[function(require,module,exports){
+(function (process,global,Buffer){
+var capability=require("./capability"),inherits=require("inherits"),stream=require("stream"),rStates=exports.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},IncomingMessage=exports.IncomingMessage=function(e,r,s){function a(){u.read().then(function(e){if(!t._destroyed){if(e.done)return void t.push(null);t.push(new Buffer(e.value)),a()}})}var t=this;if(stream.Readable.call(t),t._mode=s,t.headers={},t.rawHeaders=[],t.trailers={},t.rawTrailers=[],t.on("end",function(){process.nextTick(function(){t.emit("close")})}),"fetch"===s){t._fetchResponse=r,t.statusCode=r.status,t.statusMessage=r.statusText;for(var n,o,i=r.headers[Symbol.iterator]();n=(o=i.next()).value,!o.done;)t.headers[n[0].toLowerCase()]=n[1],t.rawHeaders.push(n[0],n[1]);var u=r.body.getReader();a()}else{t._xhr=e,t._pos=0,t.statusCode=e.status,t.statusMessage=e.statusText;var h=e.getAllResponseHeaders().split(/\r?\n/);if(h.forEach(function(e){var r=e.match(/^([^:]+):\s*(.*)/);if(r){var s=r[1].toLowerCase();"set-cookie"===s?(void 0===t.headers[s]&&(t.headers[s]=[]),t.headers[s].push(r[2])):void 0!==t.headers[s]?t.headers[s]+=", "+r[2]:t.headers[s]=r[2],t.rawHeaders.push(r[1],r[2])}}),t._charset="x-user-defined",!capability.overrideMimeType){var d=t.rawHeaders["mime-type"];if(d){var f=d.match(/;\s*charset=([^;])(;|$)/);f&&(t._charset=f[1].toLowerCase())}t._charset||(t._charset="utf-8")}}};inherits(IncomingMessage,stream.Readable),IncomingMessage.prototype._read=function(){},IncomingMessage.prototype._onXHRProgress=function(){var e=this,r=e._xhr,s=null;switch(e._mode){case"text:vbarray":if(r.readyState!==rStates.DONE)break;try{s=new global.VBArray(r.responseBody).toArray()}catch(a){}if(null!==s){e.push(new Buffer(s));break}case"text":try{s=r.responseText}catch(a){e._mode="text:vbarray";break}if(s.length>e._pos){var t=s.substr(e._pos);if("x-user-defined"===e._charset){for(var n=new Buffer(t.length),o=0;o<t.length;o++)n[o]=255&t.charCodeAt(o);e.push(n)}else e.push(t,e._charset);e._pos=s.length}break;case"arraybuffer":if(r.readyState!==rStates.DONE)break;s=r.response,e.push(new Buffer(new Uint8Array(s)));break;case"moz-chunked-arraybuffer":if(s=r.response,r.readyState!==rStates.LOADING||!s)break;e.push(new Buffer(new Uint8Array(s)));break;case"ms-stream":if(s=r.response,r.readyState!==rStates.LOADING)break;var i=new global.MSStreamReader;i.onprogress=function(){i.result.byteLength>e._pos&&(e.push(new Buffer(new Uint8Array(i.result.slice(e._pos)))),e._pos=i.result.byteLength)},i.onload=function(){e.push(null)},i.readAsArrayBuffer(s)}e._xhr.readyState===rStates.DONE&&"ms-stream"!==e._mode&&e.push(null)};
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
+
+},{"./capability":88,"_process":71,"buffer":25,"inherits":35,"stream":86}],91:[function(require,module,exports){
+function assertEncoding(e){if(e&&!isBufferEncoding(e))throw new Error("Unknown encoding: "+e)}function passThroughWrite(e){return e.toString(this.encoding)}function utf16DetectIncompleteChar(e){this.charReceived=e.length%2,this.charLength=this.charReceived?2:0}function base64DetectIncompleteChar(e){this.charReceived=e.length%3,this.charLength=this.charReceived?3:0}var Buffer=require("buffer").Buffer,isBufferEncoding=Buffer.isEncoding||function(e){switch(e&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},StringDecoder=exports.StringDecoder=function(e){switch(this.encoding=(e||"utf8").toLowerCase().replace(/[-_]/,""),assertEncoding(e),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=utf16DetectIncompleteChar;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=base64DetectIncompleteChar;break;default:return void(this.write=passThroughWrite)}this.charBuffer=new Buffer(6),this.charReceived=0,this.charLength=0};StringDecoder.prototype.write=function(e){for(var t="";this.charLength;){var r=e.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived<this.charLength)return"";e=e.slice(r,e.length),t=this.charBuffer.slice(0,this.charLength).toString(this.encoding);var h=t.charCodeAt(t.length-1);if(!(h>=55296&&56319>=h)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived),t+=e.toString(this.encoding,0,i);var i=t.length-1,h=t.charCodeAt(i);if(h>=55296&&56319>=h){var c=this.surrogateSize;return this.charLength+=c,this.charReceived+=c,this.charBuffer.copy(this.charBuffer,c,0,c),e.copy(this.charBuffer,0,0,c),t.substring(0,i)}return t},StringDecoder.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t];if(1==t&&r>>5==6){this.charLength=2;break}if(2>=t&&r>>4==14){this.charLength=3;break}if(3>=t&&r>>3==30){this.charLength=4;break}}this.charReceived=t},StringDecoder.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,h=this.charBuffer,i=this.encoding;t+=h.slice(0,r).toString(i)}return t};
+
+},{"buffer":25}],92:[function(require,module,exports){
+var Buffer=require("buffer").Buffer;module.exports=function(e){if(e instanceof Uint8Array){if(0===e.byteOffset&&e.byteLength===e.buffer.byteLength)return e.buffer;if("function"==typeof e.buffer.slice)return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}if(Buffer.isBuffer(e)){for(var f=new Uint8Array(e.length),r=e.length,t=0;r>t;t++)f[t]=e[t];return f.buffer}throw new Error("Argument must be a Buffer")};
+
+},{"buffer":25}],93:[function(require,module,exports){
+"use strict";function Url(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function urlParse(t,s,e){if(t&&util.isObject(t)&&t instanceof Url)return t;var h=new Url;return h.parse(t,s,e),h}function urlFormat(t){return util.isString(t)&&(t=urlParse(t)),t instanceof Url?t.format():Url.prototype.format.call(t)}function urlResolve(t,s){return urlParse(t,!1,!0).resolve(s)}function urlResolveObject(t,s){return t?urlParse(t,!1,!0).resolveObject(s):s}var punycode=require("punycode"),util=require("./util");exports.parse=urlParse,exports.resolve=urlResolve,exports.resolveObject=urlResolveObject,exports.format=urlFormat,exports.Url=Url;var protocolPattern=/^([a-z0-9.+-]+:)/i,portPattern=/:[0-9]*$/,simplePathPattern=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,delims=["<",">",'"',"`"," ","\r","\n","    "],unwise=["{","}","|","\\","^","`"].concat(delims),autoEscape=["'"].concat(unwise),nonHostChars=["%","/","?",";","#"].concat(autoEscape),hostEndingChars=["/","?","#"],hostnameMaxLen=255,hostnamePartPattern=/^[+a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,unsafeProtocol={javascript:!0,"javascript:":!0},hostlessProtocol={javascript:!0,"javascript:":!0},slashedProtocol={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},querystring=require("querystring");Url.prototype.parse=function(t,s,e){if(!util.isString(t))throw new TypeError("Parameter 'url' must be a string, not "+typeof t);var h=t.indexOf("?"),r=-1!==h&&h<t.indexOf("#")?"?":"#",a=t.split(r),o=/\\/g;a[0]=a[0].replace(o,"/"),t=a.join(r);var n=t;if(n=n.trim(),!e&&1===t.split("#").length){var i=simplePathPattern.exec(n);if(i)return this.path=n,this.href=n,this.pathname=i[1],i[2]?(this.search=i[2],s?this.query=querystring.parse(this.search.substr(1)):this.query=this.search.substr(1)):s&&(this.search="",this.query={}),this}var l=protocolPattern.exec(n);if(l){l=l[0];var u=l.toLowerCase();this.protocol=u,n=n.substr(l.length)}if(e||l||n.match(/^\/\/[^@\/]+@[^@\/]+/)){var p="//"===n.substr(0,2);!p||l&&hostlessProtocol[l]||(n=n.substr(2),this.slashes=!0)}if(!hostlessProtocol[l]&&(p||l&&!slashedProtocol[l])){for(var c=-1,f=0;f<hostEndingChars.length;f++){var m=n.indexOf(hostEndingChars[f]);-1!==m&&(-1===c||c>m)&&(c=m)}var v,g;g=-1===c?n.lastIndexOf("@"):n.lastIndexOf("@",c),-1!==g&&(v=n.slice(0,g),n=n.slice(g+1),this.auth=decodeURIComponent(v)),c=-1;for(var f=0;f<nonHostChars.length;f++){var m=n.indexOf(nonHostChars[f]);-1!==m&&(-1===c||c>m)&&(c=m)}-1===c&&(c=n.length),this.host=n.slice(0,c),n=n.slice(c),this.parseHost(),this.hostname=this.hostname||"";var y="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!y)for(var P=this.hostname.split(/\./),f=0,d=P.length;d>f;f++){var q=P[f];if(q&&!q.match(hostnamePartPattern)){for(var b="",O=0,j=q.length;j>O;O++)b+=q.charCodeAt(O)>127?"x":q[O];if(!b.match(hostnamePartPattern)){var x=P.slice(0,f),U=P.slice(f+1),C=q.match(hostnamePartStart);C&&(x.push(C[1]),U.unshift(C[2])),U.length&&(n="/"+U.join(".")+n),this.hostname=x.join(".");break}}}this.hostname.length>hostnameMaxLen?this.hostname="":this.hostname=this.hostname.toLowerCase(),y||(this.hostname=punycode.toASCII(this.hostname));var A=this.port?":"+this.port:"",w=this.hostname||"";this.host=w+A,this.href+=this.host,y&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==n[0]&&(n="/"+n))}if(!unsafeProtocol[u])for(var f=0,d=autoEscape.length;d>f;f++){var E=autoEscape[f];if(-1!==n.indexOf(E)){var I=encodeURIComponent(E);I===E&&(I=escape(E)),n=n.split(E).join(I)}}var R=n.indexOf("#");-1!==R&&(this.hash=n.substr(R),n=n.slice(0,R));var S=n.indexOf("?");if(-1!==S?(this.search=n.substr(S),this.query=n.substr(S+1),s&&(this.query=querystring.parse(this.query)),n=n.slice(0,S)):s&&(this.search="",this.query={}),n&&(this.pathname=n),slashedProtocol[u]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){var A=this.pathname||"",k=this.search||"";this.path=A+k}return this.href=this.format(),this},Url.prototype.format=function(){var t=this.auth||"";t&&(t=encodeURIComponent(t),t=t.replace(/%3A/i,":"),t+="@");var s=this.protocol||"",e=this.pathname||"",h=this.hash||"",r=!1,a="";this.host?r=t+this.host:this.hostname&&(r=t+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(r+=":"+this.port)),this.query&&util.isObject(this.query)&&Object.keys(this.query).length&&(a=querystring.stringify(this.query));var o=this.search||a&&"?"+a||"";return s&&":"!==s.substr(-1)&&(s+=":"),this.slashes||(!s||slashedProtocol[s])&&r!==!1?(r="//"+(r||""),e&&"/"!==e.charAt(0)&&(e="/"+e)):r||(r=""),h&&"#"!==h.charAt(0)&&(h="#"+h),o&&"?"!==o.charAt(0)&&(o="?"+o),e=e.replace(/[?#]/g,function(t){return encodeURIComponent(t)}),o=o.replace("#","%23"),s+r+e+o+h},Url.prototype.resolve=function(t){return this.resolveObject(urlParse(t,!1,!0)).format()},Url.prototype.resolveObject=function(t){if(util.isString(t)){var s=new Url;s.parse(t,!1,!0),t=s}for(var e=new Url,h=Object.keys(this),r=0;r<h.length;r++){var a=h[r];e[a]=this[a]}if(e.hash=t.hash,""===t.href)return e.href=e.format(),e;if(t.slashes&&!t.protocol){for(var o=Object.keys(t),n=0;n<o.length;n++){var i=o[n];"protocol"!==i&&(e[i]=t[i])}return slashedProtocol[e.protocol]&&e.hostname&&!e.pathname&&(e.path=e.pathname="/"),e.href=e.format(),e}if(t.protocol&&t.protocol!==e.protocol){if(!slashedProtocol[t.protocol]){for(var l=Object.keys(t),u=0;u<l.length;u++){var p=l[u];e[p]=t[p]}return e.href=e.format(),e}if(e.protocol=t.protocol,t.host||hostlessProtocol[t.protocol])e.pathname=t.pathname;else{for(var c=(t.pathname||"").split("/");c.length&&!(t.host=c.shift()););t.host||(t.host=""),t.hostname||(t.hostname=""),""!==c[0]&&c.unshift(""),c.length<2&&c.unshift(""),e.pathname=c.join("/")}if(e.search=t.search,e.query=t.query,e.host=t.host||"",e.auth=t.auth,e.hostname=t.hostname||t.host,e.port=t.port,e.pathname||e.search){var f=e.pathname||"",m=e.search||"";e.path=f+m}return e.slashes=e.slashes||t.slashes,e.href=e.format(),e}var v=e.pathname&&"/"===e.pathname.charAt(0),g=t.host||t.pathname&&"/"===t.pathname.charAt(0),y=g||v||e.host&&t.pathname,P=y,d=e.pathname&&e.pathname.split("/")||[],c=t.pathname&&t.pathname.split("/")||[],q=e.protocol&&!slashedProtocol[e.protocol];if(q&&(e.hostname="",e.port=null,e.host&&(""===d[0]?d[0]=e.host:d.unshift(e.host)),e.host="",t.protocol&&(t.hostname=null,t.port=null,t.host&&(""===c[0]?c[0]=t.host:c.unshift(t.host)),t.host=null),y=y&&(""===c[0]||""===d[0])),g)e.host=t.host||""===t.host?t.host:e.host,e.hostname=t.hostname||""===t.hostname?t.hostname:e.hostname,e.search=t.search,e.query=t.query,d=c;else if(c.length)d||(d=[]),d.pop(),d=d.concat(c),e.search=t.search,e.query=t.query;else if(!util.isNullOrUndefined(t.search)){if(q){e.hostname=e.host=d.shift();var b=e.host&&e.host.indexOf("@")>0?e.host.split("@"):!1;b&&(e.auth=b.shift(),e.host=e.hostname=b.shift())}return e.search=t.search,e.query=t.query,util.isNull(e.pathname)&&util.isNull(e.search)||(e.path=(e.pathname?e.pathname:"")+(e.search?e.search:"")),e.href=e.format(),e}if(!d.length)return e.pathname=null,e.search?e.path="/"+e.search:e.path=null,e.href=e.format(),e;for(var O=d.slice(-1)[0],j=(e.host||t.host||d.length>1)&&("."===O||".."===O)||""===O,x=0,U=d.length;U>=0;U--)O=d[U],"."===O?d.splice(U,1):".."===O?(d.splice(U,1),x++):x&&(d.splice(U,1),x--);if(!y&&!P)for(;x--;x)d.unshift("..");!y||""===d[0]||d[0]&&"/"===d[0].charAt(0)||d.unshift(""),j&&"/"!==d.join("/").substr(-1)&&d.push("");var C=""===d[0]||d[0]&&"/"===d[0].charAt(0);if(q){e.hostname=e.host=C?"":d.length?d.shift():"";var b=e.host&&e.host.indexOf("@")>0?e.host.split("@"):!1;b&&(e.auth=b.shift(),e.host=e.hostname=b.shift())}return y=y||e.host&&d.length,y&&!C&&d.unshift(""),d.length?e.pathname=d.join("/"):(e.pathname=null,e.path=null),util.isNull(e.pathname)&&util.isNull(e.search)||(e.path=(e.pathname?e.pathname:"")+(e.search?e.search:"")),e.auth=t.auth||e.auth,e.slashes=e.slashes||t.slashes,e.href=e.format(),e},Url.prototype.parseHost=function(){var t=this.host,s=portPattern.exec(t);s&&(s=s[0],":"!==s&&(this.port=s.substr(1)),t=t.substr(0,t.length-s.length)),t&&(this.hostname=t)};
+
+},{"./util":94,"punycode":72,"querystring":75}],94:[function(require,module,exports){
+"use strict";module.exports={isString:function(n){return"string"==typeof n},isObject:function(n){return"object"==typeof n&&null!==n},isNull:function(n){return null===n},isNullOrUndefined:function(n){return null==n}};
+
+},{}],95:[function(require,module,exports){
+(function (global){
+function deprecate(r,e){function o(){if(!t){if(config("throwDeprecation"))throw new Error(e);config("traceDeprecation")?console.trace(e):console.warn(e),t=!0}return r.apply(this,arguments)}if(config("noDeprecation"))return r;var t=!1;return o}function config(r){try{if(!global.localStorage)return!1}catch(e){return!1}var o=global.localStorage[r];return null==o?!1:"true"===String(o).toLowerCase()}module.exports=deprecate;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{}],96:[function(require,module,exports){
+module.exports=function(o){return o&&"object"==typeof o&&"function"==typeof o.copy&&"function"==typeof o.fill&&"function"==typeof o.readUInt8};
+
+},{}],97:[function(require,module,exports){
+(function (process,global){
+function inspect(e,r){var t={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"\e["+inspect.colors[t][0]+"m"+e+"\e["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var c="",a=!1,l=["{","}"];if(isArray(r)&&(a=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";c=" [Function"+p+"]"}if(isRegExp(r)&&(c=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(c=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(c=" "+formatError(r)),0===o.length&&(!a||0==r.length))return l[0]+c+l[1];if(0>t)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=a?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,a)}),e.seen.pop(),reduceToSingleString(f,c,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;u>s;++s)hasOwnProperty(r,String(s))?o.push(formatProperty(e,r,t,n,String(s),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,r,t,n,i,!0))}),o}function formatProperty(e,r,t,n,i,o){var s,u,c;if(c=Object.getOwnPropertyDescriptor(r,i)||{value:r[i]},c.get?u=c.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):c.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(n,i)||(s="["+i+"]"),u||(e.seen.indexOf(c.value)<0?(u=isNull(t)?formatValue(e,c.value,null):formatValue(e,c.value,t-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return"  "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return"   "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n  ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return 10>e?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t<arguments.length;t++)r.push(inspect(arguments[t]));return r.join(" ")}for(var t=1,n=arguments,i=n.length,o=String(e).replace(formatRegExp,function(e){if("%%"===e)return"%";if(t>=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(r){return"[Circular]"}default:return e}}),s=n[t];i>t;s=n[++t])o+=isNull(s)||!isObject(s)?" "+s:" "+inspect(s);return o},exports.deprecate=function(e,r){function t(){if(!n){if(process.throwDeprecation)throw new Error(r);process.traceDeprecation?console.trace(r):console.error(r),n=!0}return e.apply(this,arguments)}if(isUndefined(global.process))return function(){return exports.deprecate(e,r).apply(this,arguments)};if(process.noDeprecation===!0)return e;var n=!1;return t};var debugs={},debugEnviron;exports.debuglog=function(e){if(isUndefined(debugEnviron)&&(debugEnviron=process.env.NODE_DEBUG||""),e=e.toUpperCase(),!debugs[e])if(new RegExp("\\b"+e+"\\b","i").test(debugEnviron)){var r=process.pid;debugs[e]=function(){var t=exports.format.apply(exports,arguments);console.error("%s %d: %s",e,r,t)}}else debugs[e]=function(){};return debugs[e]},exports.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=require("./support/isBuffer");var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments))},exports.inherits=require("inherits"),exports._extend=function(e,r){if(!r||!isObject(r))return e;for(var t=Object.keys(r),n=t.length;n--;)e[t[n]]=r[t[n]];return e};
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+
+},{"./support/isBuffer":96,"_process":71,"inherits":35}],98:[function(require,module,exports){
+function extend(){for(var r={},e=0;e<arguments.length;e++){var t=arguments[e];for(var n in t)hasOwnProperty.call(t,n)&&(r[n]=t[n])}return r}module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;
+
+},{}]},{},[3])(3)
+});
+</script>
+
+  <script>
+// https://github.com/isaacs/json-stringify-safe v5.0.1
+function stringify(obj, replacer, spaces, cycleReplacer) {
+  return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)
+}
+
+function serializer(replacer, cycleReplacer) {
+  var stack = [], keys = []
+
+  if (cycleReplacer == null) cycleReplacer = function(key, value) {
+    if (stack[0] === value) return "[Circular ~]"
+    return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"
+  }
+
+  return function(key, value) {
+    if (stack.length > 0) {
+      var thisPos = stack.indexOf(this)
+      ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)
+      ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)
+      if (~stack.indexOf(value)) value = cycleReplacer.call(this, key, value)
+    }
+    else stack.push(value)
+
+    return replacer == null ? value : replacer.call(this, key, value)
+  }
+}
+</script>
+
+  <script>
+/* Web Font Loader v1.6.24 - (c) Adobe Systems, Google. License: Apache 2.0 */
+(function(){function aa(a,b,d){return a.call.apply(a.bind,arguments)}function ba(a,b,d){if(!a)throw Error();if(2<arguments.length){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(d,c);return a.apply(b,d)}}return function(){return a.apply(b,arguments)}}function p(a,b,d){p=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?aa:ba;return p.apply(null,arguments)}var q=Date.now||function(){return+new Date};function ca(a,b){this.a=a;this.m=b||a;this.c=this.m.document}var da=!!window.FontFace;function t(a,b,d,c){b=a.c.createElement(b);if(d)for(var e in d)d.hasOwnProperty(e)&&("style"==e?b.style.cssText=d[e]:b.setAttribute(e,d[e]));c&&b.appendChild(a.c.createTextNode(c));return b}function u(a,b,d){a=a.c.getElementsByTagName(b)[0];a||(a=document.documentElement);a.insertBefore(d,a.lastChild)}function v(a){a.parentNode&&a.parentNode.removeChild(a)}
+function w(a,b,d){b=b||[];d=d||[];for(var c=a.className.split(/\s+/),e=0;e<b.length;e+=1){for(var f=!1,g=0;g<c.length;g+=1)if(b[e]===c[g]){f=!0;break}f||c.push(b[e])}b=[];for(e=0;e<c.length;e+=1){f=!1;for(g=0;g<d.length;g+=1)if(c[e]===d[g]){f=!0;break}f||b.push(c[e])}a.className=b.join(" ").replace(/\s+/g," ").replace(/^\s+|\s+$/,"")}function y(a,b){for(var d=a.className.split(/\s+/),c=0,e=d.length;c<e;c++)if(d[c]==b)return!0;return!1}
+function z(a){if("string"===typeof a.f)return a.f;var b=a.m.location.protocol;"about:"==b&&(b=a.a.location.protocol);return"https:"==b?"https:":"http:"}function ea(a){return a.m.location.hostname||a.a.location.hostname}
+function A(a,b,d){function c(){k&&e&&f&&(k(g),k=null)}b=t(a,"link",{rel:"stylesheet",href:b,media:"all"});var e=!1,f=!0,g=null,k=d||null;da?(b.onload=function(){e=!0;c()},b.onerror=function(){e=!0;g=Error("Stylesheet failed to load");c()}):setTimeout(function(){e=!0;c()},0);u(a,"head",b)}
+function B(a,b,d,c){var e=a.c.getElementsByTagName("head")[0];if(e){var f=t(a,"script",{src:b}),g=!1;f.onload=f.onreadystatechange=function(){g||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState||(g=!0,d&&d(null),f.onload=f.onreadystatechange=null,"HEAD"==f.parentNode.tagName&&e.removeChild(f))};e.appendChild(f);setTimeout(function(){g||(g=!0,d&&d(Error("Script load timeout")))},c||5E3);return f}return null};function C(){this.a=0;this.c=null}function D(a){a.a++;return function(){a.a--;E(a)}}function F(a,b){a.c=b;E(a)}function E(a){0==a.a&&a.c&&(a.c(),a.c=null)};function G(a){this.a=a||"-"}G.prototype.c=function(a){for(var b=[],d=0;d<arguments.length;d++)b.push(arguments[d].replace(/[\W_]+/g,"").toLowerCase());return b.join(this.a)};function H(a,b){this.c=a;this.f=4;this.a="n";var d=(b||"n4").match(/^([nio])([1-9])$/i);d&&(this.a=d[1],this.f=parseInt(d[2],10))}function fa(a){return I(a)+" "+(a.f+"00")+" 300px "+J(a.c)}function J(a){var b=[];a=a.split(/,\s*/);for(var d=0;d<a.length;d++){var c=a[d].replace(/['"]/g,"");-1!=c.indexOf(" ")||/^\d/.test(c)?b.push("'"+c+"'"):b.push(c)}return b.join(",")}function K(a){return a.a+a.f}function I(a){var b="normal";"o"===a.a?b="oblique":"i"===a.a&&(b="italic");return b}
+function ga(a){var b=4,d="n",c=null;a&&((c=a.match(/(normal|oblique|italic)/i))&&c[1]&&(d=c[1].substr(0,1).toLowerCase()),(c=a.match(/([1-9]00|normal|bold)/i))&&c[1]&&(/bold/i.test(c[1])?b=7:/[1-9]00/.test(c[1])&&(b=parseInt(c[1].substr(0,1),10))));return d+b};function ha(a,b){this.c=a;this.f=a.m.document.documentElement;this.h=b;this.a=new G("-");this.j=!1!==b.events;this.g=!1!==b.classes}function ia(a){a.g&&w(a.f,[a.a.c("wf","loading")]);L(a,"loading")}function M(a){if(a.g){var b=y(a.f,a.a.c("wf","active")),d=[],c=[a.a.c("wf","loading")];b||d.push(a.a.c("wf","inactive"));w(a.f,d,c)}L(a,"inactive")}function L(a,b,d){if(a.j&&a.h[b])if(d)a.h[b](d.c,K(d));else a.h[b]()};function ja(){this.c={}}function ka(a,b,d){var c=[],e;for(e in b)if(b.hasOwnProperty(e)){var f=a.c[e];f&&c.push(f(b[e],d))}return c};function N(a,b){this.c=a;this.f=b;this.a=t(this.c,"span",{"aria-hidden":"true"},this.f)}function O(a){u(a.c,"body",a.a)}function P(a){return"display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:"+J(a.c)+";"+("font-style:"+I(a)+";font-weight:"+(a.f+"00")+";")};function Q(a,b,d,c,e,f){this.g=a;this.j=b;this.a=c;this.c=d;this.f=e||3E3;this.h=f||void 0}Q.prototype.start=function(){var a=this.c.m.document,b=this,d=q(),c=new Promise(function(c,e){function k(){q()-d>=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?c():setTimeout(k,25)},function(){e()})}k()}),e=new Promise(function(a,c){setTimeout(c,b.f)});Promise.race([e,c]).then(function(){b.g(b.a)},function(){b.j(b.a)})};function R(a,b,d,c,e,f,g){this.v=a;this.B=b;this.c=d;this.a=c;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.o=this.j=this.h=this.g=null;this.g=new N(this.c,this.s);this.h=new N(this.c,this.s);this.j=new N(this.c,this.s);this.o=new N(this.c,this.s);a=new H(this.a.c+",serif",K(this.a));a=P(a);this.g.a.style.cssText=a;a=new H(this.a.c+",sans-serif",K(this.a));a=P(a);this.h.a.style.cssText=a;a=new H("serif",K(this.a));a=P(a);this.j.a.style.cssText=a;a=new H("sans-serif",K(this.a));a=
+P(a);this.o.a.style.cssText=a;O(this.g);O(this.h);O(this.j);O(this.o)}var S={D:"serif",C:"sans-serif"},T=null;function U(){if(null===T){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);T=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return T}R.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.o.a.offsetWidth;this.A=q();la(this)};
+function ma(a,b,d){for(var c in S)if(S.hasOwnProperty(c)&&b===a.f[S[c]]&&d===a.f[S[c]])return!0;return!1}function la(a){var b=a.g.a.offsetWidth,d=a.h.a.offsetWidth,c;(c=b===a.f.serif&&d===a.f["sans-serif"])||(c=U()&&ma(a,b,d));c?q()-a.A>=a.w?U()&&ma(a,b,d)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):na(a):V(a,a.v)}function na(a){setTimeout(p(function(){la(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.o.a);b(this.a)},a),0)};function W(a,b,d){this.c=a;this.a=b;this.f=0;this.o=this.j=!1;this.s=d}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,K(a).toString(),"active")],[b.a.c("wf",a.c,K(a).toString(),"loading"),b.a.c("wf",a.c,K(a).toString(),"inactive")]);L(b,"fontactive",a);this.o=!0;oa(this)};
+W.prototype.h=function(a){var b=this.a;if(b.g){var d=y(b.f,b.a.c("wf",a.c,K(a).toString(),"active")),c=[],e=[b.a.c("wf",a.c,K(a).toString(),"loading")];d||c.push(b.a.c("wf",a.c,K(a).toString(),"inactive"));w(b.f,c,e)}L(b,"fontinactive",a);oa(this)};function oa(a){0==--a.f&&a.j&&(a.o?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),L(a,"active")):M(a.a))};function pa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}pa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;qa(this,new ha(this.c,a),a)};
+function ra(a,b,d,c,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,k=c||null||{};if(0===d.length&&f)M(b.a);else{b.f+=d.length;f&&(b.j=f);var h,m=[];for(h=0;h<d.length;h++){var l=d[h],n=k[l.c],r=b.a,x=l;r.g&&w(r.f,[r.a.c("wf",x.c,K(x).toString(),"loading")]);L(r,"fontloading",x);r=null;null===X&&(X=window.FontFace?(x=/Gecko.*Firefox\/(\d+)/.exec(window.navigator.userAgent))?42<parseInt(x[1],10):!0:!1);X?r=new Q(p(b.g,b),p(b.h,b),b.c,l,b.s,n):r=new R(p(b.g,b),p(b.h,b),b.c,l,b.s,a,
+n);m.push(r)}for(h=0;h<m.length;h++)m[h].start()}},0)}function qa(a,b,d){var c=[],e=d.timeout;ia(b);var c=ka(a.a,d,a.c),f=new W(a.c,b,e);a.h=c.length;b=0;for(d=c.length;b<d;b++)c[b].load(function(b,c,d){ra(a,f,b,c,d)})};function sa(a,b){this.c=a;this.a=b}function ta(a,b,d){var c=z(a.c);a=(a.a.api||"fast.fonts.net/jsapi").replace(/^.*http(s?):(\/\/)?/,"");return c+"//"+a+"/"+b+".js"+(d?"?v="+d:"")}
+sa.prototype.load=function(a){function b(){if(e["__mti_fntLst"+d]){var c=e["__mti_fntLst"+d](),g=[],k;if(c)for(var h=0;h<c.length;h++){var m=c[h].fontfamily;void 0!=c[h].fontStyle&&void 0!=c[h].fontWeight?(k=c[h].fontStyle+c[h].fontWeight,g.push(new H(m,k))):g.push(new H(m))}a(g)}else setTimeout(function(){b()},50)}var d=this.a.projectId,c=this.a.version;if(d){var e=this.c.m;B(this.c,ta(this,d,c),function(c){c?a([]):b()}).id="__MonotypeAPIScript__"+d}else a([])};function ua(a,b){this.c=a;this.a=b}ua.prototype.load=function(a){var b,d,c=this.a.urls||[],e=this.a.families||[],f=this.a.testStrings||{},g=new C;b=0;for(d=c.length;b<d;b++)A(this.c,c[b],D(g));var k=[];b=0;for(d=e.length;b<d;b++)if(c=e[b].split(":"),c[1])for(var h=c[1].split(","),m=0;m<h.length;m+=1)k.push(new H(c[0],h[m]));else k.push(new H(c[0]));F(g,function(){a(k,f)})};function va(a,b,d){a?this.c=a:this.c=b+wa;this.a=[];this.f=[];this.g=d||""}var wa="//fonts.googleapis.com/css";function xa(a,b){for(var d=b.length,c=0;c<d;c++){var e=b[c].split(":");3==e.length&&a.f.push(e.pop());var f="";2==e.length&&""!=e[1]&&(f=":");a.a.push(e.join(f))}}
+function ya(a){if(0==a.a.length)throw Error("No fonts to load!");if(-1!=a.c.indexOf("kit="))return a.c;for(var b=a.a.length,d=[],c=0;c<b;c++)d.push(a.a[c].replace(/ /g,"+"));b=a.c+"?family="+d.join("%7C");0<a.f.length&&(b+="&subset="+a.f.join(","));0<a.g.length&&(b+="&text="+encodeURIComponent(a.g));return b};function za(a){this.f=a;this.a=[];this.c={}}
+var Aa={latin:"BESbswy",cyrillic:"\u0439\u044f\u0416",greek:"\u03b1\u03b2\u03a3",khmer:"\u1780\u1781\u1782",Hanuman:"\u1780\u1781\u1782"},Ba={thin:"1",extralight:"2","extra-light":"2",ultralight:"2","ultra-light":"2",light:"3",regular:"4",book:"4",medium:"5","semi-bold":"6",semibold:"6","demi-bold":"6",demibold:"6",bold:"7","extra-bold":"8",extrabold:"8","ultra-bold":"8",ultrabold:"8",black:"9",heavy:"9",l:"3",r:"4",b:"7"},Ca={i:"i",italic:"i",n:"n",normal:"n"},Da=/^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i|normal|italic)?$/;
+function Ea(a){for(var b=a.f.length,d=0;d<b;d++){var c=a.f[d].split(":"),e=c[0].replace(/\+/g," "),f=["n4"];if(2<=c.length){var g;var k=c[1];g=[];if(k)for(var k=k.split(","),h=k.length,m=0;m<h;m++){var l;l=k[m];if(l.match(/^[\w-]+$/)){var n=Da.exec(l.toLowerCase());if(null==n)l="";else{l=n[2];l=null==l||""==l?"n":Ca[l];n=n[1];if(null==n||""==n)n="4";else var r=Ba[n],n=r?r:isNaN(n)?"4":n.substr(0,1);l=[l,n].join("")}}else l="";l&&g.push(l)}0<g.length&&(f=g);3==c.length&&(c=c[2],g=[],c=c?c.split(","):
+g,0<c.length&&(c=Aa[c[0]])&&(a.c[e]=c))}a.c[e]||(c=Aa[e])&&(a.c[e]=c);for(c=0;c<f.length;c+=1)a.a.push(new H(e,f[c]))}};function Fa(a,b){this.c=a;this.a=b}var Ga={Arimo:!0,Cousine:!0,Tinos:!0};Fa.prototype.load=function(a){var b=new C,d=this.c,c=new va(this.a.api,z(d),this.a.text),e=this.a.families;xa(c,e);var f=new za(e);Ea(f);A(d,ya(c),D(b));F(b,function(){a(f.a,f.c,Ga)})};function Ha(a,b){this.c=a;this.a=b}Ha.prototype.load=function(a){var b=this.a.id,d=this.c.m;b?B(this.c,(this.a.api||"https://use.typekit.net")+"/"+b+".js",function(b){if(b)a([]);else if(d.Typekit&&d.Typekit.config&&d.Typekit.config.fn){b=d.Typekit.config.fn;for(var e=[],f=0;f<b.length;f+=2)for(var g=b[f],k=b[f+1],h=0;h<k.length;h++)e.push(new H(g,k[h]));try{d.Typekit.load({events:!1,classes:!1,async:!0})}catch(m){}a(e)}},2E3):a([])};function Ia(a,b){this.c=a;this.f=b;this.a=[]}Ia.prototype.load=function(a){var b=this.f.id,d=this.c.m,c=this;b?(d.__webfontfontdeckmodule__||(d.__webfontfontdeckmodule__={}),d.__webfontfontdeckmodule__[b]=function(b,d){for(var g=0,k=d.fonts.length;g<k;++g){var h=d.fonts[g];c.a.push(new H(h.name,ga("font-weight:"+h.weight+";font-style:"+h.style)))}a(c.a)},B(this.c,z(this.c)+(this.f.api||"//f.fontdeck.com/s/css/js/")+ea(this.c)+"/"+b+".js",function(b){b&&a([])})):a([])};var Y=new pa(window);Y.a.c.custom=function(a,b){return new ua(b,a)};Y.a.c.fontdeck=function(a,b){return new Ia(b,a)};Y.a.c.monotype=function(a,b){return new sa(b,a)};Y.a.c.typekit=function(a,b){return new Ha(b,a)};Y.a.c.google=function(a,b){return new Fa(b,a)};var Z={load:p(Y.load,Y)};"function"===typeof define&&define.amd?define(function(){return Z}):"undefined"!==typeof module&&module.exports?module.exports=Z:(window.WebFont=Z,window.WebFontConfig&&Y.load(window.WebFontConfig));}());
+</script>
+
+  <script>
+    var schemaWrapper = {};
+    schemaWrapper.definitions = Object.assign({}, defs);
+    defsParser = new $RefParser();
+    defsParser.dereference(schemaWrapper).catch(function(err) {
+      console.log(err);
+    });
+  </script>
+  <script>
+  $(document).ready(function () {
+    $('.nav-tabs-examples').find('a:first').tab('show');
+    $(this).scrollspy({ target: '#scrollingNav', offset: 18 });
+  });
+  </script>
+</body>
+</html>
index 6ca11cd..681e9db 100644 (file)
@@ -5,8 +5,16 @@
 SO - Architecture
 ===============
 
+SO Functional View
+--------------------
+
 .. image:: ../images/SO_Architecture_1.png
 
+SO Deployment View
+--------------------
+
+.. image:: ../images/SO_Architecture_Internal.png
+
 SO Sub-Components
 ------------------
 
@@ -47,7 +55,7 @@ SO Sub-Components
 **Resource Adapters**
 
   Interfaces to lower level controllers and other ONAP components
-   * Platform Orchestrator, SDN-Controller, APP-Controller, VFC-Controllers
+   * Platform Orchestrator, SDN-Controller, APP-Controller, VFC-Controllers, Multi-Cloud
    * Hides the details of complex interfaces (e.g. OpenStack APIs)
    * Expose interfaces to BPMN flows as SOAP or REST APIs
    * Support synchronous and asynchronous operations
index 61be8f0..f6d66b9 100644 (file)
@@ -7,14 +7,13 @@ SO Developer Information
 
 .. toctree::
    :maxdepth: 1
-   
-.. developer_info_Project_Structure.rst
+
    Camunda_Modeler.rst
-.. developer_info_Main_Process_Flows.rst
-.. developer_info_Subprocess_Process_Flows.rst
-.. developer_info_Project_Deployment_Strategy.rst
    Building_SO.rst
    Working_with_SO_Docker.rst
    Camunda_Cockpit_Community_Edition.rst
    Camunda_Cockpit_Enterprise_Edition.rst
-   
\ No newline at end of file
+.. developer_info_Project_Structure.rst
+.. developer_info_Main_Process_Flows.rst
+.. developer_info_Subprocess_Process_Flows.rst
+.. developer_info_Project_Deployment_Strategy.rst
\ No newline at end of file
diff --git a/docs/images/SO_Architecture_Internal.png b/docs/images/SO_Architecture_Internal.png
new file mode 100644 (file)
index 0000000..9c30c4d
Binary files /dev/null and b/docs/images/SO_Architecture_Internal.png differ
index ee558f9..25873d4 100644 (file)
@@ -8,6 +8,13 @@ Service Orchestrator Release Notes
 
 The SO provides the highest level of service orchestration in the ONAP architecture. 
 
+Version: 1.4.0
+--------------
+
+:Release Date: 2018-11-30
+
+New  release over  master branch for Dublin development
+
 Version: 1.3.3
 --------------
 
@@ -45,16 +52,16 @@ Dockers released for SO:
 
 **Known Issues**
 
-There are some issues around the HPA and CCVPN that have been resolved in the patch release of 1.3.4
+There are some issues around the HPA and CCVPN that have been resolved in the patch release of 1.3.5
 - `SO-1249 <https://jira.onap.org/browse/SO-1249>`_
-       
-Below issues will be resolved in the next release:
-
-- `SO-1258 <https://jira.onap.org/browse/SO-1258>`_
 - `SO-1257 <https://jira.onap.org/browse/SO-1257>`_
+- `SO-1258 <https://jira.onap.org/browse/SO-1258>`_
 - `SO-1256 <https://jira.onap.org/browse/SO-1256>`_
+- `SO-1194 <https://jira.onap.org/browse/SO-1256>`_
+       
+Below issues will be resolved in the next release:
 - `SO-1248 <https://jira.onap.org/browse/SO-1248>`_
-
+- `SO-1184 <https://jira.onap.org/browse/SO-1184>`_
 
 **Security Notes**
 
index 0a60bff..7ee8654 100644 (file)
@@ -299,6 +299,11 @@ public class OrchestrationRequests {
                ir.setVolumeGroupInstanceName(iar.getVolumeGroupName());
                if(iar.getRequestorId() != null)
                        ir.setRequestorId(iar.getRequestorId());
+               if(iar.getInstanceGroupId() != null)
+                       ir.setInstanceGroupId(iar.getInstanceGroupId());
+               if(iar.getInstanceGroupName() != null)
+                       ir.setInstanceGroupName(iar.getInstanceGroupName());
+                       
 
 
                request.setInstanceReferences(ir);
@@ -335,21 +340,24 @@ public class OrchestrationRequests {
        }
        if(flowStatusMessage != null){
           if(statusMessages != null){
-                  statusMessages = statusMessages + "/";
+                  statusMessages = statusMessages + " " + "FLOW STATUS: " + flowStatusMessage;
+          }else{
+                  statusMessages = "FLOW STATUS: " + flowStatusMessage;
           }
-          statusMessages = statusMessages + "FLOW STATUS: " + flowStatusMessage;
        }
        if(retryStatusMessage != null){
           if(statusMessages != null){
-                  statusMessages = statusMessages + "/";
+                  statusMessages = statusMessages + " " + "RETRY STATUS: " + retryStatusMessage;
+          }else{
+                  statusMessages = "RETRY STATUS: " + retryStatusMessage;
           }
-          statusMessages = statusMessages + "RETRY STATUS: " + retryStatusMessage;
        }
        if(rollbackStatusMessage != null){
           if(statusMessages != null){
-                  statusMessages = statusMessages + "/";
+                  statusMessages = statusMessages + " " + "ROLLBACK STATUS: " + rollbackStatusMessage;
+          }else{
+                  statusMessages = "ROLLBACK STATUS: " + rollbackStatusMessage;
           }
-          statusMessages = statusMessages + "ROLLBACK STATUS: " + rollbackStatusMessage;
        }
        if(statusMessages != null){
           status.setStatusMessage(statusMessages);
@@ -358,6 +366,10 @@ public class OrchestrationRequests {
           String endTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(iar.getEndTime()) + " GMT";
           status.setFinishTime(endTimeStamp);
        }
+       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){
index 0cd5d8d..676dca1 100644 (file)
@@ -692,7 +692,7 @@ public class ServiceInstances {
                
                sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
                String requestScope = deriveRequestScope(action, sir, requestUri);
-               InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.PENDING, requestJSON, requestScope);
+               InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
                if(sir.getRequestDetails().getRequestParameters() != null){
                        aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
                }
@@ -705,7 +705,6 @@ public class ServiceInstances {
                String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
                String networkType = msoRequest.getNetworkType(sir,requestScope);
                String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
-               String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
                String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
                
                if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
@@ -732,7 +731,7 @@ public class ServiceInstances {
                Boolean isBaseVfModule = false;
 
         RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
-                                                               
+        String serviceInstanceType = getServiceType(requestScope, sir, alaCarteFlag);                                          
                        ModelType modelType;
                        ModelInfo modelInfo =  sir.getRequestDetails().getModelInfo();
                        if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
@@ -820,7 +819,7 @@ public class ServiceInstances {
                     .errorInfo(errorLoggerInfo).build();
         }
                
-               if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
+               if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
                        aLaCarte = true;
                }else if(aLaCarte == null){
                        aLaCarte = false;
@@ -864,7 +863,7 @@ public class ServiceInstances {
                sir.setInstanceGroupId(instanceGroupId);
        
                String requestScope = ModelType.instanceGroup.toString();
-               InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.PENDING, null, requestScope);
+               InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.IN_PROGRESS, null, requestScope);
                setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
                try {
                        validateHeaders(requestContext);
@@ -1018,19 +1017,7 @@ public class ServiceInstances {
                                            .errorInfo(errorLoggerInfo).build();
                                        updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
                                        throw validateException;
-                               }
-                       
-                               currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
-                               setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
-                               
-                               try{
-                                       infraActiveRequestsClient.save(currentActiveReq);
-                               }catch(Exception e){
-                                       ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-                           throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
-                                   .errorInfo(errorLoggerInfo).build();
-                               }
-                               
+                               }       
                                return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
                        } 
                }
@@ -1869,4 +1856,30 @@ public class ServiceInstances {
                        }
                }
        }
+       protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
+               String serviceType = null;
+               if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
+                       String defaultServiceModelName = getDefaultModel(sir);
+                       org.onap.so.db.catalog.beans.Service serviceRecord;
+                       if(aLaCarteFlag){
+                                serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
+                                if(serviceRecord != null){
+                                        serviceType = serviceRecord.getServiceType();
+                                }
+                       }else{
+                               serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
+                               if(serviceRecord != null){
+                                        serviceType = serviceRecord.getServiceType();
+                                }else{
+                                        serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
+                                        if(serviceRecord != null){
+                                                serviceType = serviceRecord.getServiceType();
+                                        }
+                                }
+                       }
+               }else{
+                       serviceType = msoRequest.getServiceInstanceType(sir, requestScope);
+               }
+               return serviceType;
+       }
 }
index f83e707..60a05d7 100644 (file)
@@ -32,15 +32,14 @@ import org.springframework.context.ApplicationContext;
 public class GrmClientPropertiesImpl implements GRMProperties {
 
        private String grmEndpoint;
-       private String grmUsername;
-       private String grmPassword;
+       private String grmAuth;
+       private String grmKey;
        
        public GrmClientPropertiesImpl() {
-               ApplicationContext context = SpringContextHelper.getAppContext();
-               
+               ApplicationContext context = SpringContextHelper.getAppContext();               
                grmEndpoint = context.getEnvironment().getProperty("mso.grm.endpoint");
-               grmUsername = context.getEnvironment().getProperty("mso.grm.username");
-               grmPassword = context.getEnvironment().getProperty("mso.grm.password");
+               grmAuth = context.getEnvironment().getProperty("mso.grm.auth");
+               grmKey = context.getEnvironment().getProperty("mso.msoKey");
        }
        
        @Override
@@ -59,13 +58,13 @@ public class GrmClientPropertiesImpl implements GRMProperties {
        }
 
        @Override
-       public String getUsername() {
-               return grmUsername;
+       public String getAuth() {
+               return grmAuth;
        }
 
        @Override
-       public String getPassword() {
-               return grmPassword;
+       public String getKey() {
+               return grmKey;
        }
 
        @Override
index 8a4d561..4e8e956 100644 (file)
@@ -21,9 +21,6 @@
 package org.onap.so.apihandlerinfra.tenantisolation.helpers;
 
 import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
 
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
@@ -36,6 +33,7 @@ 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.client.HttpClient;
+import org.onap.so.client.HttpClientFactory;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.utils.CryptoUtils;
@@ -53,6 +51,7 @@ public class SDCClientHelper {
 
        private static String MESSAGE_UNDEFINED_ERROR = "Undefined Error Message!";
        private static String MESSAGE_UNEXPECTED_FORMAT = "Unexpected response format from SDC.";
+       private final HttpClientFactory httpClientFactory = new HttpClientFactory();
 
        @Value("${mso.sdc.endpoint}")
        private String sdcEndpoint;
@@ -91,7 +90,7 @@ public class SDCClientHelper {
 
                        URL url = new URL(urlString);
 
-                       HttpClient httpClient = new HttpClient(url, "application/json", TargetEntity.SDC);
+                       HttpClient httpClient = httpClientFactory.newJsonClient(url, TargetEntity.SDC);
                        httpClient.addBasicAuthHeader(sdcClientAuth, msoKey);
 
                        Response apiResponse = setHttpPostResponse(httpClient, jsonPayload);
index c4671ae..a6fdcc9 100644 (file)
@@ -133,7 +133,7 @@ public class RelatedInstancesValidation implements ValidationRule{
                                        if(InstanceDirection.source.equals(relatedInstance.getInstanceDirection()) && relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
                                                isSourceVnfPresent = true;
                                        } else if(InstanceDirection.destination.equals(relatedInstance.getInstanceDirection()) && 
-                                                       (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf) || (relatedInstanceModelInfo.getModelType().equals(ModelType.pnf) && reqVersion == 6))) {
+                                                       (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf) || (relatedInstanceModelInfo.getModelType().equals(ModelType.pnf)))) {
                                                isDestinationVnfPresent = true;
                                        }
                                }
index 58d6b7f..4a6a59b 100644 (file)
@@ -118,13 +118,41 @@ public class OrchestrationRequestsTest extends BaseTest {
 
         assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
         assertThat(response.getBody(),
-                sameBeanAs(testResponse).ignoring("request.startTime").ignoring("request.requestStatus.finishTime"));
+                sameBeanAs(testResponse).ignoring("request.startTime").ignoring("request.requestStatus.finishTime")
+                .ignoring("request.requestStatus.timeStamp"));
         assertEquals("application/json", response.getHeaders().get(HttpHeaders.CONTENT_TYPE).get(0));
         assertEquals("0", response.getHeaders().get("X-MinorVersion").get(0));
         assertEquals("0", response.getHeaders().get("X-PatchVersion").get(0));
         assertEquals("7.0.0", response.getHeaders().get("X-LatestVersion").get(0));
         assertEquals("00032ab7-na18-42e5-965d-8ea592502018", response.getHeaders().get("X-TransactionID").get(0));
     }
+    
+    @Test
+    public void testGetOrchestrationRequestInstanceGroup() throws Exception {
+        setupTestGetOrchestrationRequestInstanceGroup();
+        // TEST VALID REQUEST
+        GetOrchestrationResponse testResponse = new GetOrchestrationResponse();
+
+        Request request = ORCHESTRATION_LIST.getRequestList().get(8).getRequest();
+        testResponse.setRequest(request);
+        String testRequestId = request.getRequestId();
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Accept", MediaType.APPLICATION_JSON);
+        headers.set("Content-Type", MediaType.APPLICATION_JSON);
+        HttpEntity<Request> entity = new HttpEntity<Request>(null, headers);
+
+        UriComponentsBuilder builder = UriComponentsBuilder
+                .fromHttpUrl(createURLWithPort("/onap/so/infra/orchestrationRequests/v7/" + testRequestId));
+
+        ResponseEntity<GetOrchestrationResponse> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET,
+                entity, GetOrchestrationResponse.class);
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
+        assertThat(response.getBody(),
+                sameBeanAs(testResponse).ignoring("request.startTime")
+                .ignoring("request.requestStatus.finishTime")
+                .ignoring("request.requestStatus.timeStamp"));
+    }
 
     @Test
     public void testGetOrchestrationRequestRequestDetails() throws Exception {
@@ -149,7 +177,9 @@ public class OrchestrationRequestsTest extends BaseTest {
 
         assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
         assertThat(response.getBody(),
-                sameBeanAs(testResponse).ignoring("request.startTime").ignoring("request.requestStatus.finishTime"));
+                sameBeanAs(testResponse).ignoring("request.startTime")
+                .ignoring("request.requestStatus.finishTime")
+                .ignoring("request.requestStatus.timeStamp"));
         assertEquals("application/json", response.getHeaders().get(HttpHeaders.CONTENT_TYPE).get(0));
         assertEquals("0", response.getHeaders().get("X-MinorVersion").get(0));
         assertEquals("0", response.getHeaders().get("X-PatchVersion").get(0));
@@ -197,7 +227,9 @@ public class OrchestrationRequestsTest extends BaseTest {
         ResponseEntity<GetOrchestrationListResponse> response = restTemplate.exchange(builder.toUriString(),
                 HttpMethod.GET, entity, GetOrchestrationListResponse.class);
         assertThat(response.getBody(),
-                sameBeanAs(testResponse).ignoring("requestList.request.startTime").ignoring("requestList.request.requestStatus.finishTime"));
+                sameBeanAs(testResponse).ignoring("requestList.request.startTime")
+                .ignoring("requestList.request.requestStatus.finishTime")
+                .ignoring("requestList.request.requestStatus.timeStamp"));
         assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
         assertEquals(requests.size(), response.getBody().getRequestList().size());
         
@@ -401,6 +433,17 @@ public class OrchestrationRequestsTest extends BaseTest {
                 .withBody(new String(Files.readAllBytes(Paths.get("src/test/resources/OrchestrationRequest/getRequestProcessingData.json"))))
                 .withStatus(HttpStatus.SC_OK)));
     }
+    public void setupTestGetOrchestrationRequestInstanceGroup() throws Exception{
+        //For testGetOrchestrationRequest
+        stubFor(any(urlPathEqualTo("/infraActiveRequests/00032ab7-na18-42e5-965d-8ea592502018")).willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                .withBody(new String(Files.readAllBytes(Paths.get("src/test/resources/OrchestrationRequest/getOrchestrationRequestInstanceGroup.json"))))
+                .withStatus(HttpStatus.SC_OK)));
+        stubFor(get(urlPathEqualTo("/requestProcessingData/search/findBySoRequestIdOrderByGroupingIdDesc/"))
+                       .withQueryParam("SO_REQUEST_ID", equalTo("00032ab7-na18-42e5-965d-8ea592502018"))
+                       .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                .withBody(new String(Files.readAllBytes(Paths.get("src/test/resources/OrchestrationRequest/getRequestProcessingData.json"))))
+                .withStatus(HttpStatus.SC_OK)));
+    }
 
     private void setupTestGetOrchestrationRequestRequestDetails(String requestId, String status) throws Exception{
         stubFor(get(urlPathEqualTo(getTestUrl(requestId))).willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
index 8d3649a..168df19 100644 (file)
@@ -55,7 +55,9 @@ import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 import org.onap.so.serviceinstancebeans.ModelInfo;
+import org.onap.so.serviceinstancebeans.RequestDetails;
 import org.onap.so.serviceinstancebeans.RequestError;
+import org.onap.so.serviceinstancebeans.RequestInfo;
 import org.onap.so.serviceinstancebeans.RequestParameters;
 import org.onap.so.serviceinstancebeans.RequestReferences;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
@@ -70,6 +72,7 @@ import org.springframework.util.ResourceUtils;
 import org.springframework.web.util.UriComponentsBuilder;
 
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.tomakehurst.wiremock.http.Fault;
@@ -2582,4 +2585,93 @@ public class ServiceInstancesTest extends BaseTest{
         ServiceInstancesResponse realResponse = mapper.readValue(response.getBody(), ServiceInstancesResponse.class);
         assertThat(realResponse, sameBeanAs(expectedResponse).ignoring("requestReferences.requestId"));        
     }
+    @Test
+    public void setServiceTypeTestALaCarte() throws JsonProcessingException{
+       String requestScope = ModelType.service.toString();
+       Boolean aLaCarteFlag = true;
+       ServiceInstancesRequest sir = new ServiceInstancesRequest();
+       RequestDetails requestDetails = new RequestDetails();
+       RequestInfo requestInfo = new RequestInfo();
+       requestInfo.setSource("VID");
+       requestDetails.setRequestInfo(requestInfo);
+       sir.setRequestDetails(requestDetails);
+               Service defaultService = new Service();
+               defaultService.setServiceType("testServiceTypeALaCarte");
+       
+       stubFor(get(urlMatching(".*/service/search/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(mapper.writeValueAsString(defaultService))
+                        .withStatus(HttpStatus.SC_OK)));
+       
+       String serviceType = servInstances.getServiceType(requestScope, sir, aLaCarteFlag);
+       assertEquals(serviceType, "testServiceTypeALaCarte");
+    }
+    @Test
+    public void setServiceTypeTest() throws JsonProcessingException{
+       String requestScope = ModelType.service.toString();
+       Boolean aLaCarteFlag = false;
+       ServiceInstancesRequest sir = new ServiceInstancesRequest();
+       RequestDetails requestDetails = new RequestDetails();
+       RequestInfo requestInfo = new RequestInfo();
+       ModelInfo modelInfo = new ModelInfo();
+       modelInfo.setModelVersionId("0dd91181-49da-446b-b839-cd959a96f04a");
+       requestInfo.setSource("VID");
+       requestDetails.setModelInfo(modelInfo);
+       requestDetails.setRequestInfo(requestInfo);
+       sir.setRequestDetails(requestDetails);
+               Service defaultService = new Service();
+               defaultService.setServiceType("testServiceType");
+       
+       stubFor(get(urlMatching(".*/service/0dd91181-49da-446b-b839-cd959a96f04a"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(mapper.writeValueAsString(defaultService))
+                        .withStatus(HttpStatus.SC_OK)));
+       
+       String serviceType = servInstances.getServiceType(requestScope, sir, aLaCarteFlag);
+       assertEquals(serviceType, "testServiceType");
+    }
+    @Test
+    public void setServiceTypeTestDefault() throws JsonProcessingException{
+       String requestScope = ModelType.service.toString();
+       Boolean aLaCarteFlag = false;
+       ServiceInstancesRequest sir = new ServiceInstancesRequest();
+       RequestDetails requestDetails = new RequestDetails();
+       RequestInfo requestInfo = new RequestInfo();
+       ModelInfo modelInfo = new ModelInfo();
+       modelInfo.setModelVersionId("0dd91181-49da-446b-b839-cd959a96f04a");
+       requestInfo.setSource("VID");
+       requestDetails.setModelInfo(modelInfo);
+       requestDetails.setRequestInfo(requestInfo);
+       sir.setRequestDetails(requestDetails);
+               Service defaultService = new Service();
+               defaultService.setServiceType("testServiceType");
+       
+       stubFor(get(urlMatching(".*/service/0dd91181-49da-446b-b839-cd959a96f04a"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withStatus(HttpStatus.SC_NOT_FOUND)));
+       stubFor(get(urlMatching(".*/service/search/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(mapper.writeValueAsString(defaultService))
+                        .withStatus(HttpStatus.SC_OK)));
+       
+       String serviceType = servInstances.getServiceType(requestScope, sir, aLaCarteFlag);
+       assertEquals(serviceType, "testServiceType");
+    }
+    @Test
+    public void setServiceTypeTestNetwork() throws JsonProcessingException{
+       String requestScope = ModelType.network.toString();
+       Boolean aLaCarteFlag = null;
+       ServiceInstancesRequest sir = new ServiceInstancesRequest();
+       RequestDetails requestDetails = new RequestDetails();
+       RequestInfo requestInfo = new RequestInfo();
+       ModelInfo modelInfo = new ModelInfo();
+       modelInfo.setModelName("networkModelName");
+       requestInfo.setSource("VID");
+       requestDetails.setModelInfo(modelInfo);
+       requestDetails.setRequestInfo(requestInfo);
+       sir.setRequestDetails(requestDetails);
+       
+       String serviceType = servInstances.getServiceType(requestScope, sir, aLaCarteFlag);
+       assertEquals(serviceType, "networkModelName");
+    }
 }
@@ -1,5 +1,5 @@
 /*-
- * ============LICENSE_START=======================================================
 * ============LICENSE_START=======================================================
  * ONAP - SO
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
@@ -25,10 +25,10 @@ import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
 import static com.github.tomakehurst.wiremock.client.WireMock.matching;
 import static com.github.tomakehurst.wiremock.client.WireMock.post;
 import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
 import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
 import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
 import static com.github.tomakehurst.wiremock.client.WireMock.verify;
-import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
@@ -40,29 +40,26 @@ import java.util.Map;
 
 import javax.ws.rs.core.MediaType;
 
-
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
+import org.onap.so.apihandlerinfra.BaseTest;
+import org.onap.so.apihandlerinfra.TestAppender;
+import org.onap.so.client.grm.GRMClient;
 import org.onap.so.client.grm.beans.ServiceEndPoint;
 import org.onap.so.client.grm.beans.ServiceEndPointList;
 import org.onap.so.client.grm.beans.ServiceEndPointLookupRequest;
 import org.onap.so.client.grm.beans.ServiceEndPointRequest;
 import org.onap.so.client.grm.exceptions.GRMClientCallFailed;
-import org.onap.so.utils.TestAppender;
 import org.slf4j.MDC;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.tomakehurst.wiremock.junit.WireMockRule;
-
 import ch.qos.logback.classic.spi.ILoggingEvent;
 
-public class GRMClientTest {
+
+public class GRMClientTest extends BaseTest{
        
-       @Rule
-       public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(47389));
        
        @Rule
        public ExpectedException thrown = ExpectedException.none();
@@ -78,7 +75,7 @@ public class GRMClientTest {
        public void testFind() throws Exception {
         TestAppender.events.clear();
                String endpoints = getFileContentsAsString("__files/grm/endpoints.json");
-               wireMockRule.stubFor(post(urlPathEqualTo("/GRMLWPService/v1/serviceEndPoint/findRunning"))
+               stubFor(post(urlPathEqualTo("/GRMLWPService/v1/serviceEndPoint/findRunning"))
                        .willReturn(aResponse()
                                .withStatus(200)
                                .withHeader("Content-Type", MediaType.APPLICATION_JSON)
@@ -94,7 +91,7 @@ public class GRMClientTest {
                boolean foundInvokeReturn = false;
         for(ILoggingEvent logEvent : TestAppender.events)
             if(logEvent.getLoggerName().equals("org.onap.so.logging.jaxrs.filter.JaxRsClientLogging") &&
-                    logEvent.getMarker().getName().equals("INVOKE")
+                       logEvent.getMarker() != null && logEvent.getMarker().getName().equals("INVOKE")
                     ){
                 Map<String,String> mdc = logEvent.getMDCPropertyMap();
                 assertNotNull(mdc.get(ONAPLogConstants.MDCs.INVOCATION_ID));
@@ -124,9 +121,8 @@ public class GRMClientTest {
        }
        
        @Test 
-       public void testFindFail() throws Exception {
-               
-               wireMockRule.stubFor(post(urlPathEqualTo("/GRMLWPService/v1/serviceEndPoint/findRunning"))
+       public void testFindFail() throws Exception {           
+               stubFor(post(urlPathEqualTo("/GRMLWPService/v1/serviceEndPoint/findRunning"))
                        .willReturn(aResponse()
                                .withStatus(400)
                                .withHeader("Content-Type", MediaType.APPLICATION_JSON)
@@ -139,7 +135,7 @@ public class GRMClientTest {
        
        @Test
        public void testAddFail() throws Exception {
-               wireMockRule.stubFor(post(urlPathEqualTo("/GRMLWPService/v1/serviceEndPoint/add"))
+               stubFor(post(urlPathEqualTo("/GRMLWPService/v1/serviceEndPoint/add"))
                                .willReturn(aResponse()
                                        .withStatus(404)
                                        .withHeader("Content-Type", MediaType.APPLICATION_JSON)
index 051ac16..5065452 100644 (file)
@@ -29,7 +29,8 @@
           "requestState": "COMPLETE",
           "statusMessage": "STATUS: COMPLETED",
           "percentProgress": 100,
-          "finishTime": "Tue, 02 May 2017 06:33:34 GMT"
+          "finishTime": "Tue, 02 May 2017 06:33:34 GMT",
+          "timeStamp": "Fri, 01 Jul 2016 04:41:42 GMT"
         }
       }
     },
         },
         "requestStatus": {
           "requestState": "COMPLETE",
-          "statusMessage": "STATUS: Vf Module has been deleted successfully./FLOW STATUS: Building blocks 1 of 3 completed./ROLLBACK STATUS: Rollback has been completed successfully.",
+          "statusMessage": "STATUS: Vf Module has been deleted successfully. FLOW STATUS: Building blocks 1 of 3 completed. ROLLBACK STATUS: Rollback has been completed successfully.",
           "percentProgress": 100,
-          "finishTime": "Thu, 22 Dec 2016 08:30:28 GMT"
+          "finishTime": "Thu, 22 Dec 2016 08:30:28 GMT",
+          "timeStamp": "Thu, 22 Dec 2016 08:30:28 GMT"
         }
       }
     },
@@ -97,7 +99,8 @@
           "requestState": "PENDING",
           "statusMessage": "STATUS: Vf Module deletion pending.",
           "percentProgress": 0,
-          "finishTime": "Thu, 22 Dec 2016 08:30:28 GMT"
+          "finishTime": "Thu, 22 Dec 2016 08:30:28 GMT",
+          "timeStamp": "Thu, 22 Dec 2016 08:30:28 GMT"
         }
       }
     },
           "requestState": "UNLOCKED",
           "statusMessage": "STATUS: Vf Module deletion pending.",
           "percentProgress": 0,
-          "finishTime": "Thu, 22 Dec 2016 08:30:28 GMT"
+          "finishTime": "Thu, 22 Dec 2016 08:30:28 GMT",
+          "timeStamp": "Mon, 30 Jul 2018 06:09:01 GMT"
         }
       }
     }
index d24b48b..ecbf7a9 100644 (file)
@@ -27,7 +27,8 @@
             "requestStatus":{
                "requestState":"COMPLETE",
                "statusMessage":"STATUS: Vf Module has been deleted successfully.",
-               "percentProgress":100
+               "percentProgress":100,
+               "timeStamp": "Thu, 22 Dec 2016 08:30:28 GMT"
             }
          }
       },
@@ -57,8 +58,9 @@
             },
             "requestStatus":{
                "requestState":"PENDING",
-               "statusMessage":"STATUS: Vf Module deletion pending./FLOW STATUS: Building blocks 1 of 3 completed./RETRY STATUS: Retry 2/5 will be started in 8 min./ROLLBACK STATUS: Rollback has been completed successfully.",
-               "percentProgress":0
+               "statusMessage":"FLOW STATUS: Building blocks 1 of 3 completed. RETRY STATUS: Retry 2/5 will be started in 8 min. ROLLBACK STATUS: Rollback has been completed successfully.",
+               "percentProgress":0,
+               "timeStamp": "Thu, 22 Dec 2016 08:30:28 GMT"
             }
          }
       },
                "statusMessage":"Error parsing request.\n\tNo valid instanceName is specified"
             }
          }
+      },
+            {
+         "request":{
+            "requestId":"00032ab7-na18-42e5-965d-8ea592502018",
+            "requestScope":"instanceGroup",
+            "requestType":"addMembers",
+            "requestDetails":{
+               "modelInfo":{
+                  "modelType":"vfModule",
+                  "modelName":"test::base::module-0"
+               },
+               "requestInfo":{
+                  "source":"VID",
+                  "suppressRollback":false
+               },
+               "cloudConfiguration":{
+                  "tenantId":"6accefef3cb442ff9e644d589fb04107",
+                  "lcpCloudRegionId":"n6"
+               }
+            },
+            "instanceReferences":{
+               "instanceGroupId": "00032ab7-na18-42e5-965d-8ea592502019",
+                          "instanceGroupName": "testInstanceGroup"
+            },
+            "requestStatus":{
+               "requestState":"PENDING",
+               "statusMessage":"STATUS: Adding members. FLOW STATUS: Building blocks 1 of 3 completed. RETRY STATUS: Retry 2/5 will be started in 8 min. ROLLBACK STATUS: Rollback has been completed successfully.",
+               "percentProgress":0,
+               "timeStamp": "Thu, 22 Dec 2016 08:30:28 GMT"
+            }
+         }
       }
    ]
-}
\ No newline at end of file
+}
index 97132fa..8953dfd 100644 (file)
@@ -2,7 +2,7 @@
   "clientRequestId": "00032ab7-fake-42e5-965d-8ea592502018",
   "action": "deleteInstance",
   "requestStatus": "PENDING",
-  "statusMessage": "Vf Module deletion pending.",
+  "statusMessage": null,
   "progress": 0,
   "startTime": "2016-12-22T13:29:54.000+0000",
   "endTime": "2016-12-22T13:30:28.000+0000",
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getOrchestrationRequestInstanceGroup.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getOrchestrationRequestInstanceGroup.json
new file mode 100644 (file)
index 0000000..e0ea6a8
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "clientRequestId": "00032ab7-fake-42e5-965d-8ea592502018",
+  "action": "addMembers",
+  "requestStatus": "PENDING",
+  "statusMessage": "Adding members.",
+  "progress": 0,
+  "startTime": "2016-12-22T13:29:54.000+0000",
+  "endTime": "2016-12-22T13:30:28.000+0000",
+  "source": "VID",
+  "vnfId": null,
+  "vnfName": null,
+  "vnfType": null,
+  "serviceType": null,
+  "aicNodeClli": null,
+  "tenantId": "6accefef3cb442ff9e644d589fb04107",
+  "provStatus": null,
+  "vnfParams": null,
+  "vnfOutputs": null,
+  "requestBody": "{\"requestDetails\": {\"modelInfo\":{\"modelType\":\"vfModule\",\"modelName\":\"test::base::module-0\"},\"requestInfo\":{\"source\":\"VID\"},\"cloudConfiguration\":{\"tenantId\":\"6accefef3cb442ff9e644d589fb04107\",\"lcpCloudRegionId\":\"n6\"}}}",
+  "responseBody": null,
+  "lastModifiedBy": "BPMN",
+  "modifyTime": "2016-12-22T13:30:28.000+0000",
+  "requestType": null,
+  "volumeGroupId": null,
+  "volumeGroupName": null,
+  "vfModuleId": null,
+  "vfModuleName": null,
+  "vfModuleModelName": "test::base::module-0",
+  "aaiServiceId": null,
+  "aicCloudRegion": "n6",
+  "callBackUrl": null,
+  "correlator": null,
+  "serviceInstanceId": null,
+  "serviceInstanceName": null,
+  "requestScope": "instanceGroup",
+  "requestAction": "addMembers",
+  "networkId": null,
+  "networkName": null,
+  "networkType": null,
+  "requestorId": null,
+  "configurationId": null,
+  "configurationName": null,
+  "operationalEnvId": null,
+  "operationalEnvName": null,
+  "rollbackStatusMessage": "Rollback has been completed successfully.",
+  "flowStatus": "Building blocks 1 of 3 completed.",
+  "retryStatusMessage": "Retry 2/5 will be started in 8 min.",
+  "requestURI": "00032ab7-na18-42e5-965d-8ea592502018",
+  "instanceGroupId": "00032ab7-na18-42e5-965d-8ea592502019",
+  "instanceGroupName": "testInstanceGroup",
+  "_links": {
+    "self": {
+      "href": "http://localhost:8087/infraActiveRequests/00032ab7-na18-42e5-965d-8ea592502018"
+    },
+    "infraActiveRequests": {
+      "href": "http://localhost:8087/infraActiveRequests/00032ab7-na18-42e5-965d-8ea592502018"
+    }
+  }
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/grm/endpoints.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/grm/endpoints.json
new file mode 100644 (file)
index 0000000..7e92c21
--- /dev/null
@@ -0,0 +1,145 @@
+{
+   "serviceEndPointList": [
+      {
+         "name": "dummy.pod.ns.dummy-pod3",
+         "version": {
+            "major": 1,
+            "minor": 0,
+            "patch": "0"
+         },
+         "hostAddress": "192.168.120.218",
+         "listenPort": "32004",
+         "latitude": "37.7022",
+         "longitude": "121.9358",
+         "registrationTime": "2017-07-18T15:39:17.367+0000",
+         "expirationTime": "9999-10-09T15:39:17.368+0000",
+         "contextPath": "/",
+         "routeOffer": "DEFAULT",
+         "statusInfo": {
+            "status": "RUNNING"
+         },
+         "eventStatusInfo": {
+            "status": "RUNNING"
+         },
+         "validatorStatusInfo": {
+            "status": "RUNNING"
+         },
+         "operationalInfo": {
+            "createdBy": "edge",
+            "updatedBy": "edge",
+            "createdTimestamp": "2017-07-18T15:39:17.367+0000",
+            "updatedTimestamp": "2017-07-18T15:39:17.367+0000"
+         },
+         "protocol": "dummypod-port",
+         "properties": [
+            {
+               "name": "Environment",
+               "value": "DEV"
+            },
+            {
+               "name": "Kubernetes Namespace",
+               "value": "dummy-pod-ns"
+            },
+            {
+               "name": "cpfrun_cluster_name",
+               "value": "CI-PDK1-TFINIT-CJ9125401"
+            }
+         ],
+         "disableType": []
+      },
+      {
+         "name": "dummy.pod.ns.dummy-pod3",
+         "version": {
+            "major": 1,
+            "minor": 0,
+            "patch": "0"
+         },
+         "hostAddress": "192.168.120.22",
+         "listenPort": "32004",
+         "latitude": "1.0",
+         "longitude": "1.0",
+         "registrationTime": "2017-07-18T15:39:17.816+0000",
+         "expirationTime": "9999-10-09T15:39:17.817+0000",
+         "contextPath": "/",
+         "routeOffer": "DEFAULT",
+         "statusInfo": {
+            "status": "RUNNING"
+         },
+         "eventStatusInfo": {
+            "status": "RUNNING"
+         },
+         "validatorStatusInfo": {
+            "status": "RUNNING"
+         },
+         "operationalInfo": {
+            "createdBy": "edge",
+            "updatedBy": "edge",
+            "createdTimestamp": "2017-07-18T15:39:17.816+0000",
+            "updatedTimestamp": "2017-07-18T15:39:17.816+0000"
+         },
+         "protocol": "dummypod-port",
+         "properties": [
+            {
+               "name": "Environment",
+               "value": "DEV"
+            },
+            {
+               "name": "Kubernetes Namespace",
+               "value": "dummy-pod-ns"
+            },
+            {
+               "name": "cpfrun_cluster_name",
+               "value": "CI-PDK1-TFINIT-CJ9125401"
+            }
+         ],
+         "disableType": []
+      },
+      {
+         "name": "dummy.pod.ns.dummy-pod1",
+         "version": {
+            "major": 1,
+            "minor": 0,
+            "patch": "0"
+         },
+         "hostAddress": "192.168.120.218",
+         "listenPort": "32002",
+         "latitude": "1.0",
+         "longitude": "1.0",
+         "registrationTime": "2017-07-18T15:39:14.443+0000",
+         "expirationTime": "9999-10-09T15:39:14.453+0000",
+         "contextPath": "/",
+         "routeOffer": "DEFAULT",
+         "statusInfo": {
+            "status": "RUNNING"
+         },
+         "eventStatusInfo": {
+            "status": "RUNNING"
+         },
+         "validatorStatusInfo": {
+            "status": "RUNNING"
+         },
+         "operationalInfo": {
+            "createdBy": "edge",
+            "updatedBy": "edge",
+            "createdTimestamp": "2017-07-18T15:39:14.443+0000",
+            "updatedTimestamp": "2017-07-18T15:39:14.443+0000"
+         },
+         "protocol": "dummypod-port",
+         "properties": [
+            {
+               "name": "Environment",
+               "value": "DEV"
+            },
+            {
+               "name": "Kubernetes Namespace",
+               "value": "dummy-pod-ns"
+            },
+            {
+               "name": "cpfrun_cluster_name",
+               "value": "CI-PDK1-TFINIT-CJ9125401"
+            }
+         ],
+         "disableType": []
+      }
+   ]
+}
\ No newline at end of file
index 6e1d6f3..63eb053 100644 (file)
@@ -70,8 +70,7 @@ mso:
     auth: 5E12ACACBD552A415E081E29F2C4772F9835792A51C766CCFDD7433DB5220B59969CB2798C
   grm:
     endpoint: http://localhost:${wiremock.server.port}
-    username: gmruser
-    password: test
+    auth: 6AAD26000E278148A0B987436D9696A5B2D99BBF0DC545F9E64D6DF05298FFA987A6CF565F6F274EBC085678
   so:
     operational-environment:
       dmaap:
index 0df176c..a7ce2da 100644 (file)
@@ -83,6 +83,10 @@ public class NorthBoundRequest implements Serializable {
        @Column(name = "MAX_API_VERSION")
        private Double maxApiVersion;
 
+       @BusinessKey
+       @Column(name = "CLOUD_OWNER")
+       private String cloudOwner;
+       
        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "northBoundRequest")
        private List<OrchestrationFlow> orchestrationFlowList;
 
@@ -90,7 +94,8 @@ public class NorthBoundRequest implements Serializable {
        public String toString() {
                return new ToStringBuilder(this).append("id", id).append("action", action).append("requestScope", requestScope)
                                .append("isAlacarte", isAlacarte).append("isToplevelflow", isToplevelflow)
-                               .append("minApiVersion", minApiVersion).append("maxApiVersion", maxApiVersion).toString();
+                               .append("minApiVersion", minApiVersion).append("maxApiVersion", maxApiVersion)
+                               .append("cloudOwner",cloudOwner).toString();
        }
 
        @Override
@@ -102,13 +107,14 @@ public class NorthBoundRequest implements Serializable {
                return new EqualsBuilder().append(action, castOther.action).append(requestScope, castOther.requestScope)
                                .append(isAlacarte, castOther.isAlacarte).append(isToplevelflow, castOther.isToplevelflow)
                                .append(minApiVersion, castOther.minApiVersion).append(maxApiVersion, castOther.maxApiVersion)
+                               .append(cloudOwner, castOther.cloudOwner)
                                .isEquals();
        }
 
        @Override
        public int hashCode() {
                return new HashCodeBuilder().append(action).append(requestScope).append(isAlacarte).append(isToplevelflow)
-                               .append(minApiVersion).append(maxApiVersion).toHashCode();
+                               .append(minApiVersion).append(maxApiVersion).append(cloudOwner).toHashCode();
        }
 
        public Integer getId() {
@@ -174,6 +180,14 @@ public class NorthBoundRequest implements Serializable {
        public void setMaxApiVersion(Double maxApiVersion) {
                this.maxApiVersion = maxApiVersion;
        }
+       
+       public String getCloudOwner() {
+               return cloudOwner;
+       }
+
+       public void setCloudOwner(String cloudOwner) {
+               this.cloudOwner = cloudOwner;
+       }
 
        @LinkedResource
        public List<OrchestrationFlow> getOrchestrationFlowList() {
index 4f070e7..51c55bd 100644 (file)
@@ -118,6 +118,7 @@ public class CatalogDbClient {
        private static final String TARGET_ACTION = "targetAction";
        private static final String REQUEST_SCOPE = "requestScope";
        private static final String IS_ALACARTE = "isALaCarte";
+       private static final String CLOUD_OWNER = "cloudOwner";
        private static final String FLOW_NAME = "flowName";
        private static final String SERVICE_TYPE = "serviceType";
        private static final String VNF_TYPE = "vnfType";
@@ -151,6 +152,7 @@ public class CatalogDbClient {
        private String findVnfcInstanceGroupCustomizationByModelCustomizationUUID = "/findByModelCustomizationUUID";
        private String findCollectionResourceInstanceGroupCustomizationByModelCustomizationUUID = "/findByModelCustomizationUUID";
        private String findOneByActionAndRequestScopeAndIsAlacarte = "/findOneByActionAndRequestScopeAndIsAlacarte";
+       private String findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner = "/findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner";
        private String findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep = "/findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep";
        private String findByClliAndCloudVersion = "/findByClliAndCloudVersion";
 
@@ -248,6 +250,7 @@ public class CatalogDbClient {
                findVnfcInstanceGroupCustomizationByModelCustomizationUUID = endpoint + VNFC_INSTANCE_GROUP_CUSTOMIZATION + SEARCH + findVnfcInstanceGroupCustomizationByModelCustomizationUUID;
                findCollectionResourceInstanceGroupCustomizationByModelCustomizationUUID = endpoint + COLLECTION_RESOURCE_INSTANCE_GROUP_CUSTOMIZATION + SEARCH + findCollectionResourceInstanceGroupCustomizationByModelCustomizationUUID;
                findOneByActionAndRequestScopeAndIsAlacarte = endpoint + NORTHBOUND_REQUEST_REF_LOOKUP + SEARCH + findOneByActionAndRequestScopeAndIsAlacarte;
+               findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner = endpoint + NORTHBOUND_REQUEST_REF_LOOKUP + SEARCH + findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner;
                findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep = endpoint + RAINY_DAY_HANDLER_MACRO + SEARCH + findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep;
                findByClliAndCloudVersion = endpoint + CLOUD_SITE + SEARCH + findByClliAndCloudVersion;
 
@@ -477,6 +480,15 @@ public class CatalogDbClient {
                                .queryParam(ACTION, requestAction).queryParam(REQUEST_SCOPE, resourceName)
                                .queryParam(IS_ALACARTE, aLaCarte).build());
        }
+       
+       public NorthBoundRequest getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(String requestAction,
+                       String resourceName, boolean aLaCarte, String cloudOwner) {
+               return this.getSingleResource(northBoundRequestClient, getUri(UriBuilder
+                               .fromUri(findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner)
+                               .queryParam(ACTION, requestAction).queryParam(REQUEST_SCOPE, resourceName)
+                               .queryParam(IS_ALACARTE, aLaCarte)
+                               .queryParam(CLOUD_OWNER, cloudOwner).build().toString()));
+       }
 
        public RainyDayHandlerStatus getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(
                        String flowName, String serviceType, String vnfType, String errorCode, String workStep) {
index 92a46d5..11a2a34 100644 (file)
@@ -27,4 +27,5 @@ import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 @RepositoryRestResource(collectionResourceRel = "northbound_request_ref_lookup", path = "northbound_request_ref_lookup")
 public interface NorthBoundRequestRepository extends JpaRepository<NorthBoundRequest, Integer> {
        NorthBoundRequest findOneByActionAndRequestScopeAndIsAlacarte(String action, String requestScope, Boolean isALaCarte);
+       NorthBoundRequest findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner(String action, String requestScope, Boolean isALaCarte, String cloudOwner);
 }
diff --git a/pom.xml b/pom.xml
index e88d67f..7765156 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -48,7 +48,7 @@
                <jacoco.version>0.7.5.201505241946</jacoco.version>
                <org.apache.maven.user-settings/>
                <!-- TODO: update to version 1.4.0 for Dublin -->
-               <openstack.version>1.3.0</openstack.version>
+               <openstack.version>1.4.0-SNAPSHOT</openstack.version>
                <maven.build.timestamp.format>yyyyMMdd'T'HHmm</maven.build.timestamp.format>            
                <originalClassifier>original</originalClassifier>
                <docker.skip>true</docker.skip>
                <dependency>
                        <groupId>org.assertj</groupId>
                        <artifactId>assertj-core</artifactId>
+                       <version>3.11.1</version>
                        <scope>test</scope>
                </dependency>
                <dependency>