aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql29
-rw-r--r--adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/Application.java6
-rw-r--r--adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/SecurityConfiguration.java58
-rw-r--r--adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java12
-rw-r--r--adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml8
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json22
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java12
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java6
-rwxr-xr-xadapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmAdapterApplication.java2
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicWebSecurityConfigurerAdapter.java7
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/VnfPkgInfoConverter.java (renamed from adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.java)28
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java181
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java10
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java32
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java11
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java196
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/AbstractCacheServiceProvider.java47
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheManagerConfiguration.java50
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheNotFoundException.java37
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProvider.java74
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProviderImpl.java119
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java51
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java24
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java154
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java107
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerBadRequestException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/InternalServerErrorException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java24
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionNotFoundException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java257
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java70
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml1
-rw-r--r--bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/L3Network.java20
-rw-r--r--bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java14
-rw-r--r--bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java21
-rw-r--r--bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowProcessor.java3
-rw-r--r--bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListener.java30
-rw-r--r--bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListenerPlugin.java24
-rw-r--r--bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/common/WorkflowTest.java12
-rw-r--r--bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignNetworkBB.bpmn185
-rw-r--r--bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignPnfBB.bpmn41
-rw-r--r--bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java105
-rw-r--r--bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java9
-rw-r--r--bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java20
-rw-r--r--bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java19
-rw-r--r--common/pom.xml2
-rw-r--r--common/src/main/java/org/onap/so/security/SoBasicWebSecurityConfigurerAdapter.java12
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java33
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java11
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml4
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerTest.java5
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerUnitTest.java44
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java4
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/RequestHandlerUtilsTest.java19
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java23
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/ProcessInstanceHistoryResponse.json21
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/Camunda/HistoryCheckResponseCompleted.json21
58 files changed, 1968 insertions, 541 deletions
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
index ede499f9ee..e5daf24d6c 100644
--- 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
@@ -65,16 +65,19 @@ INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FL
('Service-Macro-Create', '5', 'AssignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
('Service-Macro-Create', '6', 'AssignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
('Service-Macro-Create', '7', 'ConfigAssignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '8', 'CreateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '9', 'ActivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '10', 'CreateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '11', 'ActivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '12', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '13', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '14', 'ConfigDeployVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '15', 'ActivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '16', 'ActivateNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Create', '17', 'ActivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '8', 'AssignPnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '9', 'WaitForPnfReadyBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '10', 'ActivatePnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '11', 'CreateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '12', 'ActivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '13', 'CreateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '14', 'ActivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '15', 'CreateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '16', 'ActivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '17', 'ConfigDeployVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '18', 'ActivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '19', 'ActivateNetworkCollectionBB',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Create', '20', 'ActivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Create' and CLOUD_OWNER = 'DEFAULT')),
('Service-Macro-Delete', '1', 'DeactivateVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
('Service-Macro-Delete', '2', 'DeleteVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
('Service-Macro-Delete', '3', 'DeactivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
@@ -249,6 +252,7 @@ VALUES
('AssignVolumeGroupBB', 'VOLUME_GROUP', 'ASSIGN'),
('AssignVfModuleBB', 'VF_MODULE', 'ASSIGN'),
('AssignNetworkBB', 'NETWORK', 'ASSIGN'),
+('AssignPnfBB', 'NO_VALIDATE', 'ASSIGN'),
('UnassignServiceInstanceBB', 'SERVICE', 'UNASSIGN'),
('UnassignVnfBB', 'VNF', 'UNASSIGN'),
@@ -261,6 +265,7 @@ VALUES
('ActivateVfModuleBB', 'VF_MODULE', 'ACTIVATE'),
('ActivateNetworkBB', 'NETWORK', 'ACTIVATE'),
('ActivateNetworkCollectionBB', 'NETWORK', 'ACTIVATE'),
+('ActivatePnfBB', 'NO_VALIDATE', 'ACTIVATE'),
('DeactivateServiceInstanceBB', 'SERVICE', 'DEACTIVATE'),
('DeactivateVnfBB', 'VNF', 'DEACTIVATE'),
@@ -285,7 +290,9 @@ VALUES
('DeleteNetworkCollectionBB', 'NETWORK', 'DELETE'),
('ConfigurationScaleOutBB', 'NO_VALIDATE', 'CUSTOM'),
-('GenericVnfHealthCheckBB', 'NO_VALIDATE', 'CUSTOM');
+('GenericVnfHealthCheckBB', 'NO_VALIDATE', 'CUSTOM'),
+
+('WaitForPnfReadyBB', 'NO_VALIDATE', 'CUSTOM');
INSERT INTO orchestration_status_state_transition_directive (resource_type, orchestration_status, target_action, flow_directive)
VALUES
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/Application.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/Application.java
index e4a6bed300..875fddd7f0 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/Application.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/Application.java
@@ -26,7 +26,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"org.onap.so"})
public class Application {
+ public static final String BASIC_PROFILE = "basic";
+
public static void main(final String... args) {
- SpringApplication.run(Application.class, args);
+ final SpringApplication springApplication = new SpringApplication(Application.class);
+ springApplication.setAdditionalProfiles(BASIC_PROFILE);
+ springApplication.run(args);
}
}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/SecurityConfiguration.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/SecurityConfiguration.java
deleted file mode 100644
index cc56048262..0000000000
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/SecurityConfiguration.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * SO
- * ================================================================================
- * Copyright (C) 2020 Samsung. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.so.adapters.vevnfm.configuration;
-
-import org.onap.so.security.SoBasicWebSecurityConfigurerAdapter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
-@Configuration
-@EnableWebSecurity
-public class SecurityConfiguration extends SoBasicWebSecurityConfigurerAdapter {
-
- @Value("${notification.url}")
- private String notificationUrl;
-
- @Value("${notification.username}")
- private String notificationUsername;
-
- @Value("${notification.password}")
- private String notificationPassword;
-
- @Autowired
- private PasswordEncoder passwordEncoder;
-
- @Override
- protected void configure(final HttpSecurity https) throws Exception {
- https.csrf().disable().authorizeRequests().antMatchers(notificationUrl).authenticated().and().httpBasic();
- }
-
- @Override
- protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
- auth.inMemoryAuthentication().withUser(notificationUsername)
- .password(passwordEncoder.encode(notificationPassword)).authorities("ROLE_USER");
- }
-}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
index aa07ed65a2..c1a56fb452 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
@@ -43,11 +43,11 @@ public class SubscriberService {
@Value("${notification.url}")
private String notificationUrl;
- @Value("${notification.username}")
- private String notificationUsername;
+ @Value("${spring.security.usercredentials[0].username}")
+ private String username;
- @Value("${notification.password}")
- private String notificationPassword;
+ @Value("${spring.security.usercredentials[0].openpass}")
+ private String openpass;
@Autowired
private SubscribeSender sender;
@@ -62,8 +62,8 @@ public class SubscriberService {
request.callbackUri(getCallbackUri());
final SubscriptionsAuthenticationParamsBasic paramsBasic = new SubscriptionsAuthenticationParamsBasic();
final SubscriptionsAuthentication authentication = new SubscriptionsAuthentication();
- paramsBasic.setUserName(notificationUsername);
- paramsBasic.setPassword(notificationPassword);
+ paramsBasic.setUserName(username);
+ paramsBasic.setPassword(openpass);
authentication.setAuthType(Collections.singletonList(SubscriptionsAuthentication.AuthTypeEnum.BASIC));
authentication.setParamsBasic(paramsBasic);
request.authentication(authentication);
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml b/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
index b16fa6348f..f3ad9615ec 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
@@ -22,8 +22,6 @@ system:
notification:
url: /lcm/v1/vnf/instances/notifications
- username: admin
- password: a4b3c2d1
mso:
key: 07a7159d3bf51a0e53be7a8f89699be7
@@ -36,6 +34,12 @@ vnfm:
subscription: /vnflcm/v1/subscriptions
spring:
+ security:
+ usercredentials:
+ - username: admin
+ openpass: a4b3c2d1
+ password: '$2a$10$vU.mWyNTsikAxXIA5c269ewCpAbYTiyMS0m1N.kn4F2CSGEnrKN7K'
+ role: USER
http:
converters:
preferred-json-mapper: gson
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json
index 9827310627..3c5ec49b80 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json
@@ -2350,7 +2350,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"nsdId": {
@@ -2358,7 +2358,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"nsdName": {
@@ -2384,7 +2384,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"vnfPkgIds": {
@@ -2392,7 +2392,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"nestedNsdInfoIds": {
@@ -2400,7 +2400,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"nsdOnboardingState": {
@@ -2432,7 +2432,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"pnfdId": {
@@ -2440,7 +2440,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"pnfdName": {
@@ -2475,7 +2475,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"pnfdOnboardingState": {
@@ -2767,7 +2767,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"vnfPkgId": {
@@ -2775,7 +2775,7 @@
"type": "array",
"items": {
"type": "string",
- "format": "uuid"
+ "minLength": 1
}
},
"operationalState": {
@@ -2804,7 +2804,7 @@
"title": "Id",
"description": "Identifier of this subscription resource.",
"type": "string",
- "format": "uuid"
+ "minLength": 1
},
"callbackUri": {
"title": "Callbackuri",
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java
index 40be4411c8..fb32fb9605 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java
@@ -21,7 +21,10 @@
package org.onap.so.adapters.vnfmadapter;
/**
- * Adapter constants
+ * VNFM Adapter constants
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
*/
public class Constants {
@@ -29,8 +32,15 @@ public class Constants {
public static final String SERVICE_VERSION = "v1";
public static final String BASE_URL = "/so/" + SERVICE_NAME + "/" + SERVICE_VERSION;
public static final String PACKAGE_MANAGEMENT_BASE_URL = BASE_URL + "/vnfpkgm/v1";
+ public static final String ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL = BASE_URL + "/etsicatalogmanager/notification";
+ public static final String ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL = BASE_URL + "/etsicatalogmanager";
public static final String APPLICATION_ZIP = "application/zip";
public static final String OPERATION_NOTIFICATION_ENDPOINT = "/lcn/VnfLcmOperationOccurrenceNotification";
+ /**
+ * Name of the subscription cache
+ */
+ public static final String PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE = "PackageManagementSubscriptionCache";
+
private Constants() {}
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
index 84282e0c7f..61d5adf9d8 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
@@ -23,7 +23,8 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.ArrayList;
import java.util.Collection;
-import org.onap.so.adapters.vnfmadapter.converters.Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter;
+import org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003.VnfPkgInfoConverter;
+import org.onap.so.adapters.vnfmadapter.converters.sol003.etsicatalog.PkgmSubscriptionRequestConverter;
import org.onap.so.adapters.vnfmadapter.oauth.OAuth2AccessTokenAdapter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
@@ -43,7 +44,8 @@ public class MessageConverterConfiguration {
@Bean
public ConversionService conversionService() {
final DefaultConversionService service = new DefaultConversionService();
- service.addConverter(new Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter());
+ service.addConverter(new VnfPkgInfoConverter());
+ service.addConverter(new PkgmSubscriptionRequestConverter());
return service;
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmAdapterApplication.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmAdapterApplication.java
index 62d2f7e2a9..405bf896ef 100755
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmAdapterApplication.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmAdapterApplication.java
@@ -27,6 +27,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
/**
* The spring boot application for the VNFM (Virtual Network Function Manager) Adapter.
@@ -37,6 +38,7 @@ import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
* @see <a href= "https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/003/02.05.01_60/gs_nfv-sol003v020501p.pdf">ETSI
* SOL003 v2.5.1</a>
*/
+@EnableCaching
@SpringBootApplication(scanBasePackages = {"org.onap.so"})
@EnableAutoConfiguration(exclude = {JacksonAutoConfiguration.class})
public class VnfmAdapterApplication {
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicWebSecurityConfigurerAdapter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicWebSecurityConfigurerAdapter.java
index 4f3bbe6c5b..a5404607b4 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicWebSecurityConfigurerAdapter.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicWebSecurityConfigurerAdapter.java
@@ -23,14 +23,16 @@
package org.onap.so.adapters.vnfmadapter;
import org.onap.so.security.SoBasicWebSecurityConfigurerAdapter;
+import org.onap.so.security.SoUserCredentialConfiguration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-
/**
* @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
*
*/
@EnableWebSecurity
@@ -39,6 +41,7 @@ public class VnfmBasicWebSecurityConfigurerAdapter extends SoBasicWebSecurityCon
@Value("${server.ssl.client-auth:none}")
private String clientAuth;
+ SoUserCredentialConfiguration soUserCredentialConfiguration;
@Override
protected void configure(final HttpSecurity http) throws Exception {
@@ -46,8 +49,8 @@ public class VnfmBasicWebSecurityConfigurerAdapter extends SoBasicWebSecurityCon
http.csrf().disable().authorizeRequests().anyRequest().permitAll();
} else {
super.configure(http);
+ http.authorizeRequests().antMatchers(HttpMethod.GET, "/etsi/subscription/notification").permitAll();
}
}
-
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/VnfPkgInfoConverter.java
index de18ecc43e..160b875374 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/VnfPkgInfoConverter.java
@@ -18,28 +18,36 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.so.adapters.vnfmadapter.converters;
+package org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003;
-import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.*;
-import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.*;
+import java.util.ArrayList;
+import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Service;
-import java.util.ArrayList;
-import java.util.List;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfPkgInfo;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesChecksum;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesSoftwareImages;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfPackageSoftwareImageInfo;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesAdditionalArtifacts;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfPackageArtifactInfo;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinks;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VNFPKGMLinkSerializer;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.Checksum;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.UriLink;
/**
- * Converter to convert from an Etsi Catalog Model {@link VnfPkgInfo} Object to a PackageManagement Model
+ * Converter to convert from an Etsi Catalog Manager {@link VnfPkgInfo} Object to its equivalent SOL003 Object
* {@link InlineResponse2001} Object
*
* @author andrew.a.lamb@est.tech
*/
@Service
-public class Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter
- implements Converter<VnfPkgInfo, InlineResponse2001> {
- private static final Logger logger =
- LoggerFactory.getLogger(Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.class);
+public class VnfPkgInfoConverter implements Converter<VnfPkgInfo, InlineResponse2001> {
+ private static final Logger logger = LoggerFactory.getLogger(VnfPkgInfoConverter.class);
/**
* Convert a {@link VnfPkgInfo} Object to an {@link InlineResponse2001} Object
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java
new file mode 100644
index 0000000000..c6d51c99aa
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.converters.sol003.etsicatalog;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import javax.swing.text.html.Option;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.Version;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProducts;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProductsProviders;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter.NotificationTypesEnum;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter.OperationalStateEnum;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVersions;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProducts;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
+import org.slf4j.Logger;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Service;
+
+/**
+ * Converter to convert from an Etsi Catalog Manager {@link PkgmSubscriptionRequest} Object to its equivalent ETSI
+ * Catalog Manager Object
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ *
+ */
+@Service
+public class PkgmSubscriptionRequestConverter implements
+ Converter<PkgmSubscriptionRequest, org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest> {
+
+ private static final Logger logger = getLogger(PkgmSubscriptionRequestConverter.class);
+
+ @Override
+ public org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest convert(
+ PkgmSubscriptionRequest pkgmSubscriptionRequest) {
+ final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest =
+ new org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest();
+
+ etsiCatalogManagerSubscriptionRequest
+ .setFilters(getPkgmNotificationsFilter(pkgmSubscriptionRequest.getFilter()));
+
+ return etsiCatalogManagerSubscriptionRequest;
+ }
+
+
+ private org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter getPkgmNotificationsFilter(
+ final SubscriptionsFilter sol003SubscriptionsFilter) {
+ final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter etsiCatalogManagerFilters =
+ new org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter();
+
+ if (sol003SubscriptionsFilter.getNotificationTypes() != null) {
+ etsiCatalogManagerFilters.setNotificationTypes(
+ getPkgmNotificationsFilterNotificationTypes(sol003SubscriptionsFilter.getNotificationTypes()));
+ }
+
+ etsiCatalogManagerFilters.setVnfProductsFromProviders(
+ getVnfProductsProviders(sol003SubscriptionsFilter.getVnfProductsFromProviders()));
+
+ etsiCatalogManagerFilters.setVnfdId(getVnfdIds(sol003SubscriptionsFilter.getVnfdId()));
+
+ etsiCatalogManagerFilters.setVnfPkgId(getVnfPkgIds(sol003SubscriptionsFilter.getVnfPkgId()));
+
+ etsiCatalogManagerFilters
+ .setOperationalState(getOperationalState(sol003SubscriptionsFilter.getOperationalState()));
+
+ etsiCatalogManagerFilters.setUsageState(null);
+
+ return etsiCatalogManagerFilters;
+ }
+
+ // TODO 'operationalState' in the Sol003 Swagger is type 'OperationalStateEnum'. The ETSI Catalog Manager Swagger
+ // 'operationalState' is type 'List<OperationalStateEnum>'. This method needs to be updated once swagger is updated.
+ private List<org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter.OperationalStateEnum> getOperationalState(
+ final OperationalStateEnum operationalState) {
+ if (operationalState != null) {
+ return Arrays.asList(
+ org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter.OperationalStateEnum
+ .fromValue(operationalState.getValue()));
+ }
+ return Collections.emptyList();
+ }
+
+ private List<String> getVnfPkgIds(final List<String> vnfPkgId) {
+ if (vnfPkgId != null) {
+ final List<String> etsiCatalogManagerVnfPkgId = new ArrayList<>();
+ vnfPkgId.forEach(type -> {
+ etsiCatalogManagerVnfPkgId.add(type);
+ });
+ }
+ return Collections.emptyList();
+ }
+
+ private List<String> getVnfdIds(final List<String> vnfdId) {
+ if (vnfdId != null) {
+ final List<String> etsiCatalogManagerVnfdId = new ArrayList<>();
+ vnfdId.forEach(type -> {
+ etsiCatalogManagerVnfdId.add(type);
+ });
+ }
+ return Collections.emptyList();
+ }
+
+ private List<VnfProductsProviders> getVnfProductsProviders(
+ final List<SubscriptionsFilterVnfProductsFromProviders> filterProductsFromProvider) {
+
+ if (filterProductsFromProvider != null && !filterProductsFromProvider.isEmpty()) {
+ final List<VnfProductsProviders> etsiCatalogManagerVnfProductsProviders = new ArrayList<>();
+ filterProductsFromProvider.forEach(vnfProduct -> {
+ etsiCatalogManagerVnfProductsProviders
+ .add(new VnfProductsProviders().vnfProducts(getVnfProducts(vnfProduct.getVnfProducts())));
+ });
+ return etsiCatalogManagerVnfProductsProviders;
+ }
+ return Collections.emptyList();
+ }
+
+ private List<VnfProducts> getVnfProducts(final List<SubscriptionsFilterVnfProducts> sol003VnfProducts) {
+ if (sol003VnfProducts != null) {
+ final List<VnfProducts> etsiCatalogManagerVnfProductsList = new ArrayList<>();
+ sol003VnfProducts.forEach(vnfProduct -> {
+ etsiCatalogManagerVnfProductsList.add(new VnfProducts().vnfProductName(vnfProduct.getVnfProductName())
+ .versions(getVersion(vnfProduct.getVersions())));
+ });
+ return etsiCatalogManagerVnfProductsList;
+ }
+ return Collections.emptyList();
+ }
+
+ private List<Version> getVersion(final List<SubscriptionsFilterVersions> sol003FilterVersions) {
+ if (sol003FilterVersions != null && !sol003FilterVersions.isEmpty()) {
+ List<Version> etsiCatalogVersionList = new ArrayList<>();
+ sol003FilterVersions.forEach(vnfFilterVersion -> {
+ etsiCatalogVersionList.add(new Version().vnfSoftwareVersion(vnfFilterVersion.getVnfSoftwareVersion())
+ .vnfdVersions(vnfFilterVersion.getVnfdVersions()));
+ });
+ return etsiCatalogVersionList;
+ }
+ return Collections.emptyList();
+ }
+
+ private List<org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter.NotificationTypesEnum> getPkgmNotificationsFilterNotificationTypes(
+ final List<NotificationTypesEnum> notificationTypes) {
+
+ if (notificationTypes != null && !notificationTypes.isEmpty()) {
+ final List<org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter.NotificationTypesEnum> etsiCatalogManagerNotificationTypes =
+ new ArrayList<>();
+ notificationTypes.forEach(type -> etsiCatalogManagerNotificationTypes.add(
+ org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter.NotificationTypesEnum
+ .fromValue(type.getValue())));
+ }
+ return Collections.emptyList();
+ }
+
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
index 34fc2645a2..62b365745c 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
@@ -21,7 +21,9 @@
package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
import java.util.Optional;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
+import org.springframework.http.ResponseEntity;
/**
* Provides methods for invoking REST calls to the ETSI Catalog Manager.
@@ -71,4 +73,12 @@ public interface EtsiCatalogServiceProvider {
*/
Optional<byte[]> getVnfPackageArtifact(final String vnfPkgId, final String artifactPath);
+ /**
+ * Post the SubscriptionRequest Object.
+ *
+ * @return The ResponseEntity containing the ETSI Catalog Manager's PkgmSubscription object.
+ */
+ Optional<PkgmSubscription> postSubscription(
+ final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest);
+
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
index 779cb2a7a6..1a48494e1a 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
@@ -21,6 +21,8 @@
package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
import java.util.Optional;
+import javax.swing.text.html.Option;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfPkgInfo;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
import org.onap.so.adapters.vnfmadapter.rest.exceptions.*;
@@ -102,6 +104,7 @@ public class EtsiCatalogServiceProviderImpl implements EtsiCatalogServiceProvide
if (response.getStatusCode() == HttpStatus.OK) {
if (response.hasBody()) {
final VnfPkgInfo[] vnfPackages = response.getBody();
+ assert (vnfPackages != null);
final InlineResponse2001[] responses = new InlineResponse2001[vnfPackages.length];
for (int index = 0; index < vnfPackages.length; index++) {
if (conversionService.canConvert(vnfPackages[index].getClass(), InlineResponse2001.class)) {
@@ -113,7 +116,7 @@ public class EtsiCatalogServiceProviderImpl implements EtsiCatalogServiceProvide
}
logger.error("Unable to find Converter for response class: {}", vnfPackages[index].getClass());
}
- return Optional.ofNullable(responses);
+ return Optional.of(responses);
}
logger.error("Received response without body ...");
}
@@ -170,6 +173,33 @@ public class EtsiCatalogServiceProviderImpl implements EtsiCatalogServiceProvide
return requestVnfElement(vnfPkgId, vnfRequestUrl, vnfRequestName);
}
+ @Override
+ public Optional<PkgmSubscription> postSubscription(
+ final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest) {
+ try {
+ final ResponseEntity<PkgmSubscription> responseEntity =
+ httpServiceProvider.postHttpRequest(etsiCatalogManagerSubscriptionRequest,
+ etsiCatalogUrlProvider.getSubscriptionUrl(), PkgmSubscription.class);
+ if (responseEntity.getStatusCode() == HttpStatus.OK) {
+ if (responseEntity.hasBody()) {
+ return Optional.of(responseEntity.getBody());
+ }
+ logger.error("Received response without body on postSubscription");
+ }
+ logger.error("Unexpected Status Code Received on postSubscription: {}", responseEntity.getStatusCode());
+ return Optional.empty();
+ } catch (final InvalidRestRequestException invalidRestRequestException) {
+ logger.error("Caught InvalidRestRequestException", invalidRestRequestException);
+ throw new EtsiCatalogManagerBadRequestException("Bad Request Received on postSubscription call.");
+ } catch (final RestProcessingException restProcessingException) {
+ logger.error("Caught RestProcessingException with Status Code: {}", restProcessingException.getStatusCode(),
+ restProcessingException);
+ throw new EtsiCatalogManagerRequestFailureException(
+ "Internal Server Error Occurred. On postSubscription with StatusCode: "
+ + restProcessingException.getStatusCode());
+ }
+ }
+
private Optional<byte[]> requestVnfElement(final String vnfPkgId, final String vnfRequestUrl,
final String vnfRequestName) {
try {
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java
index 8382212d51..3b4c4c3066 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java
@@ -99,4 +99,15 @@ public class EtsiCatalogUrlProvider {
logger.info("getEtsiCatalogVnfPackageVnfd: {}", url);
return url;
}
+
+ /**
+ * Get the URL for posting/retrieving a Subscription
+ *
+ * @return the URL for the operation
+ */
+ public String getSubscriptionUrl() {
+ final String url = etsiCatalogManagerEndpoint + "/subscriptions";
+ logger.info("getSubscriptionNotificationUrl: {}", url);
+ return url;
+ }
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java
new file mode 100644
index 0000000000..30a16f70a8
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java
@@ -0,0 +1,196 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import static org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.SubscriptionAuthentication.AuthTypeEnum.BASIC;
+import static org.slf4j.LoggerFactory.getLogger;
+import java.net.URI;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.onap.so.adapters.vnfmadapter.Constants;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogServiceProvider;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogUrlProvider;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.BasicAuth;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsLinks;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
+import org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache.PackageManagementCacheServiceProvider;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.InternalServerErrorException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.SubscriptionRequestConversionException;
+import org.onap.so.rest.service.HttpRestServiceProvider;
+import org.onap.so.utils.CryptoUtils;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.convert.ConversionException;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.stereotype.Service;
+
+/**
+ * Manages package management subscriptions from the VNFMs
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ *
+ */
+@Service
+public class SubscriptionManager {
+
+ private static final Logger logger = getLogger(SubscriptionManager.class);
+ private final PackageManagementCacheServiceProvider packageManagementCacheServiceProvider;
+ private final EtsiCatalogUrlProvider etsiCatalogUrlProvider;
+ private final HttpRestServiceProvider httpServiceProvider;
+ private final ConversionService conversionService;
+ private final EtsiCatalogServiceProvider etsiCatalogServiceProvider;
+ private final String vnfmAdapterEndpoint;
+ private final String msoKeyString;
+ private final String vnfmAdapterAuth;
+
+
+ @Autowired
+ public SubscriptionManager(final PackageManagementCacheServiceProvider packageManagementCacheServiceProvider,
+ final ConversionService conversionService, final HttpRestServiceProvider httpServiceProvider,
+ final EtsiCatalogUrlProvider etsiCatalogUrlProvider,
+ final EtsiCatalogServiceProvider etsiCatalogServiceProvider,
+ @Value("${vnfmadapter.endpoint}") final String vnfmAdapterEndpoint,
+ @Value("${mso.key}") final String msoKeyString,
+ @Value("${vnfmadapter.auth:D6CFE56451508B75536C5E8A1E7AE06D0346006A693BF29293A6E1C762EFD59C671911DB6E9294E4FE15E4C1C5524B}") final String vnfmAdapterAuth) {
+ this.packageManagementCacheServiceProvider = packageManagementCacheServiceProvider;
+ this.etsiCatalogUrlProvider = etsiCatalogUrlProvider;
+ this.conversionService = conversionService;
+ this.httpServiceProvider = httpServiceProvider;
+ this.etsiCatalogServiceProvider = etsiCatalogServiceProvider;
+ this.vnfmAdapterEndpoint = vnfmAdapterEndpoint;
+ this.vnfmAdapterAuth = vnfmAdapterAuth;
+ this.msoKeyString = msoKeyString;
+ }
+
+ public Optional<InlineResponse2002> createSubscription(final PkgmSubscriptionRequest pkgmSubscriptionRequest)
+ throws GeneralSecurityException {
+
+ final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest =
+ buildEtsiCatalogManagerPkgmSubscriptionRequest(pkgmSubscriptionRequest);
+
+ final Optional<PkgmSubscription> optionalEtsiCatalogManagerSubscription =
+ etsiCatalogServiceProvider.postSubscription(etsiCatalogManagerSubscriptionRequest);
+
+ if (optionalEtsiCatalogManagerSubscription.isPresent()) {
+ PkgmSubscription etsiCatalogManagerSubscription = optionalEtsiCatalogManagerSubscription.get();
+ logger.debug("postPkgmSubscriptionRequest Response SubscriptionId: {}",
+ Objects.requireNonNull(etsiCatalogManagerSubscription.getId().toString()));
+ final String subscriptionId = etsiCatalogManagerSubscription.getId().toString();
+
+ packageManagementCacheServiceProvider.addSubscription(subscriptionId, pkgmSubscriptionRequest);
+
+ final InlineResponse2002 response2002 = new InlineResponse2002();
+ response2002.setId(subscriptionId);
+ response2002.setFilter(pkgmSubscriptionRequest.getFilter());
+ response2002.setCallbackUri(getSubscriptionUri(subscriptionId).toString());
+ response2002.setLinks(new SubscriptionsLinks()
+ .self(new VnfPackagesLinksSelf().href(getSubscriptionUri(subscriptionId).toString())));
+
+ return Optional.of(response2002);
+ }
+ throw new InternalServerErrorException(
+ "Received empty response from POST to ETSI Catalog Manager Subscription Endpoint.");
+ }
+
+
+
+ public Optional<String> getSubscriptionId(final PkgmSubscriptionRequest pkgmSubscriptionRequest) {
+ return packageManagementCacheServiceProvider.getSubscriptionId(pkgmSubscriptionRequest);
+ }
+
+ public Optional<InlineResponse2002> getSubscription(final String subscriptionId) {
+ final Optional<PkgmSubscriptionRequest> optional =
+ packageManagementCacheServiceProvider.getSubscription(subscriptionId);
+ if (optional.isPresent()) {
+ final PkgmSubscriptionRequest subscription = optional.get();
+ return Optional.of(getInlineResponse2002(subscriptionId, subscription));
+ }
+ return Optional.empty();
+ }
+
+ public List<InlineResponse2002> getSubscriptions() {
+ final Map<String, PkgmSubscriptionRequest> subscriptions =
+ packageManagementCacheServiceProvider.getSubscriptions();
+ final List<InlineResponse2002> response = new ArrayList<>();
+ subscriptions.forEach((key, value) -> response.add(getInlineResponse2002(key, value)));
+ return response;
+ }
+
+ public URI getSubscriptionUri(final String subscriptionId) {
+ return URI.create(
+ vnfmAdapterEndpoint + Constants.PACKAGE_MANAGEMENT_BASE_URL + "/subscriptions/" + subscriptionId);
+ }
+
+ private InlineResponse2002 getInlineResponse2002(final String id, final PkgmSubscriptionRequest subscription) {
+ return new InlineResponse2002().id(id).filter(subscription.getFilter())
+ .callbackUri(subscription.getCallbackUri());
+ }
+
+ private org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest buildEtsiCatalogManagerPkgmSubscriptionRequest(
+ PkgmSubscriptionRequest pkgmSubscriptionRequest) throws GeneralSecurityException {
+
+ final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest;
+ try {
+ etsiCatalogManagerSubscriptionRequest = conversionService.convert(pkgmSubscriptionRequest,
+ org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest.class);
+ } catch (ConversionException conversionException) {
+ logger.error(conversionException.getMessage());
+ throw new SubscriptionRequestConversionException(
+ "Could not convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
+ } catch (Exception exception) {
+ logger.error(exception.getMessage());
+ throw new InternalServerErrorException(
+ "Could not convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
+ }
+
+ if (etsiCatalogManagerSubscriptionRequest != null) {
+ etsiCatalogManagerSubscriptionRequest
+ .setCallbackUri(vnfmAdapterEndpoint + Constants.ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL);
+
+ final String[] auth = decryptAuth();
+ final String username = auth[0];
+ final String password = auth[1];
+
+ etsiCatalogManagerSubscriptionRequest.setAuthentication(
+ new org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.SubscriptionAuthentication()
+ .addAuthTypeItem(BASIC).paramsBasic(new BasicAuth().userName(username).password(password)));
+ return etsiCatalogManagerSubscriptionRequest;
+ }
+ throw new SubscriptionRequestConversionException(
+ "Failed to convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
+ }
+
+ private String[] decryptAuth() throws GeneralSecurityException {
+ final String decryptedAuth = CryptoUtils.decrypt(vnfmAdapterAuth, msoKeyString);
+ final String[] auth = decryptedAuth.split(":");
+ return auth;
+ }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/AbstractCacheServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/AbstractCacheServiceProvider.java
new file mode 100644
index 0000000000..e1e9b2307e
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/AbstractCacheServiceProvider.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache;
+
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+
+/**
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ */
+public abstract class AbstractCacheServiceProvider {
+
+ private final CacheManager cacheManager;
+ private final String cacheName;
+
+ public AbstractCacheServiceProvider(final String cacheName, final CacheManager cacheManager) {
+ this.cacheName = cacheName;
+ this.cacheManager = cacheManager;
+ }
+
+ public Cache getCache() {
+ final Cache cache = cacheManager.getCache(cacheName);
+ if (cache == null) {
+ throw new CacheNotFoundException("Unable to find " + cacheName + " cache");
+ }
+ return cache;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheManagerConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheManagerConfiguration.java
new file mode 100644
index 0000000000..830db39888
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheManagerConfiguration.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache;
+
+import java.util.Arrays;
+import org.onap.so.adapters.vnfmadapter.Constants;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.concurrent.ConcurrentMapCache;
+import org.springframework.cache.support.SimpleCacheManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ */
+@Configuration
+public class CacheManagerConfiguration {
+
+ @Bean
+ public CacheManager cacheManager() {
+ final SimpleCacheManager manager = new SimpleCacheManager();
+ manager.setCaches(Arrays.asList(getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE)));
+
+ return manager;
+ }
+
+ private Cache getCache(final String name) {
+ return new ConcurrentMapCache(name);
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheNotFoundException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheNotFoundException.java
new file mode 100644
index 0000000000..edd5982ab1
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/CacheNotFoundException.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache;
+
+/**
+ * Exception for failure to find the cache.
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ *
+ */
+public class CacheNotFoundException extends RuntimeException {
+
+ private static final long serialVersionUID = -372361485260755367L;
+
+ public CacheNotFoundException(final String message) {
+ super(message);
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProvider.java
new file mode 100644
index 0000000000..6042513a50
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProvider.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache;
+
+import java.util.Map;
+import java.util.Optional;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+
+/**
+ * Interface which provides methods for communicating with the cache
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ *
+ */
+public interface PackageManagementCacheServiceProvider {
+
+ /**
+ * Checks cache if subscription request Id is already present. If not, it adds the subscription to the cache.
+ *
+ * @param subscriptionId
+ * @param pkgmSubscriptionRequest
+ */
+ void addSubscription(final String subscriptionId, final PkgmSubscriptionRequest pkgmSubscriptionRequest);
+
+ /**
+ * Gets individual subscription from cache
+ *
+ * @param subscriptionId
+ * @return <AbstractMap.SimpleImmutableEntry<String, PkgmSubscriptionRequest>>
+ */
+ Optional<PkgmSubscriptionRequest> getSubscription(final String subscriptionId);
+
+ /**
+ * Gets Map of subscriptions from cache
+ *
+ * @return Map<String, PkgmSubscriptionRequest>>
+ */
+ Map<String, PkgmSubscriptionRequest> getSubscriptions();
+
+ /**
+ * Delete subscription from cache
+ *
+ * @param subscriptionId
+ * @return true if subscription exists and able to be removed, otherwise returns false
+ */
+ boolean deleteSubscription(final String subscriptionId);
+
+ /**
+ * Checks if subscription exists in cache and return its subscriptionId
+ *
+ * @param pkgmSubscriptionRequest
+ * @return Subscription Id
+ */
+ Optional<String> getSubscriptionId(final PkgmSubscriptionRequest pkgmSubscriptionRequest);
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProviderImpl.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProviderImpl.java
new file mode 100644
index 0000000000..ba57eb5e05
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/cache/PackageManagementCacheServiceProviderImpl.java
@@ -0,0 +1,119 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import org.onap.so.adapters.vnfmadapter.Constants;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.stereotype.Service;
+
+/**
+ * Implementation which provides methods for communicating with the cache
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ */
+@Service
+public class PackageManagementCacheServiceProviderImpl extends AbstractCacheServiceProvider
+ implements PackageManagementCacheServiceProvider {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(PackageManagementCacheServiceProviderImpl.class);
+
+ @Autowired
+ public PackageManagementCacheServiceProviderImpl(final CacheManager cacheManager) {
+ super(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE, cacheManager);
+ }
+
+ @Override
+ public void addSubscription(final String subscriptionId, final PkgmSubscriptionRequest pkgmSubscriptionRequest) {
+ LOGGER.debug("Adding {} to cache with subscription id: {}", pkgmSubscriptionRequest, subscriptionId);
+ getCache().put(subscriptionId, pkgmSubscriptionRequest);
+ }
+
+ @Override
+ public Optional<PkgmSubscriptionRequest> getSubscription(final String subscriptionId) {
+ LOGGER.debug("Getting subscription from cache using Id: {}", subscriptionId);
+ final Cache cache = getCache();
+ final PkgmSubscriptionRequest cacheValue = cache.get(subscriptionId, PkgmSubscriptionRequest.class);
+ if (cacheValue != null) {
+ return Optional.of(cacheValue);
+ }
+ LOGGER.error("Unable to find Subscription in cache using Id: {}", subscriptionId);
+ return Optional.empty();
+ }
+
+ @Override
+ public Map<String, PkgmSubscriptionRequest> getSubscriptions() {
+ LOGGER.info("Getting all subscriptions from cache");
+ final Cache cache = getCache();
+
+ final Object nativeCache = cache.getNativeCache();
+ if (nativeCache instanceof ConcurrentHashMap) {
+ @SuppressWarnings("unchecked")
+ final ConcurrentHashMap<Object, Object> concurrentHashMap = (ConcurrentHashMap<Object, Object>) nativeCache;
+ final Map<String, PkgmSubscriptionRequest> result = new HashMap<>();
+ concurrentHashMap.keySet().forEach(key -> {
+ final Optional<PkgmSubscriptionRequest> optional = getSubscription(key.toString());
+ optional.ifPresent(pkgmSubscriptionRequest -> result.put(key.toString(), pkgmSubscriptionRequest));
+ });
+ return result;
+ }
+ LOGGER.error("Unable to find Subscriptions in cache");
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public boolean deleteSubscription(final String subscriptionId) {
+ final Cache cache = getCache();
+ final Optional<PkgmSubscriptionRequest> optional = getSubscription(subscriptionId);
+ if (optional.isPresent()) {
+ cache.evict(subscriptionId);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public Optional<String> getSubscriptionId(final PkgmSubscriptionRequest pkgmSubscriptionRequest) {
+ final Cache cache = getCache();
+ final Object nativeCache = cache.getNativeCache();
+ if (nativeCache instanceof ConcurrentHashMap) {
+ @SuppressWarnings("unchecked")
+ final ConcurrentHashMap<Object, Object> concurrentHashMap = (ConcurrentHashMap<Object, Object>) nativeCache;
+ final Optional<Entry<Object, Object>> optional = concurrentHashMap.entrySet().stream()
+ .filter(entry -> entry.getValue().equals(pkgmSubscriptionRequest)).findAny();
+ if (optional.isPresent()) {
+ return Optional.of(optional.get().getKey().toString());
+ }
+ }
+ return Optional.empty();
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java
new file mode 100644
index 0000000000..c5bd5bc14e
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.rest;
+
+import static org.onap.so.adapters.vnfmadapter.Constants.ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL;
+import static org.slf4j.LoggerFactory.getLogger;
+import javax.ws.rs.core.MediaType;
+import org.slf4j.Logger;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * This controller handles the ETSI Subscription Notification Endpoints.
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ */
+@Controller
+@RequestMapping(value = ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL,
+ produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML},
+ consumes = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+public class EtsiSubscriptionNotificationController {
+
+ private static final Logger logger = getLogger(EtsiSubscriptionNotificationController.class);
+
+ @GetMapping(value = "/notification")
+ public ResponseEntity<Void> testSubscriptionNotificationEndPoint() {
+ logger.debug("Testing Notification Endpoint");
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
index 9d8e29b3f9..cce7241757 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
@@ -75,7 +75,7 @@ public class Sol003PackageManagementController {
+ " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"vnf_packages\" \n"
+ "endpoint.";
logger.error(errorMessage);
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(buildProblemDetails(errorMessage));
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
}
/**
@@ -97,7 +97,7 @@ public class Sol003PackageManagementController {
+ " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"vnf_packages\" by vnfPkgId: \""
+ vnfPkgId + "\" \n" + "endpoint.";
logger.error(errorMessage);
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(buildProblemDetails(errorMessage));
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
}
/**
@@ -121,7 +121,7 @@ public class Sol003PackageManagementController {
+ "endpoint.";
logger.error(errorMessage);
- return new ResponseEntity(buildProblemDetails(errorMessage), HttpStatus.INTERNAL_SERVER_ERROR);
+ return new ResponseEntity(new ProblemDetails().detail(errorMessage), HttpStatus.INTERNAL_SERVER_ERROR);
}
/**
@@ -144,7 +144,7 @@ public class Sol003PackageManagementController {
+ " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"package_content\" \n"
+ "endpoint.";
logger.error(errorMessage);
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(buildProblemDetails(errorMessage));
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
}
/**
@@ -170,19 +170,9 @@ public class Sol003PackageManagementController {
+ " Sol003PackageManagementController from the EtsiCatalogManager using the\n GET \"vnf_packages\" by vnfPkgId: \""
+ vnfPkgId + "\" for artifactPath: \"" + artifactPath + "\"\n" + "endpoint.";
logger.error(errorMessage);
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(buildProblemDetails(errorMessage));
- }
-
- /**
- * Builds the ProblemDetails Object, using the provided error message.
- *
- * @param detail The error message retrieved from the exception thrown.
- * @return ProblemDetails Object, containing error information.
- */
- private ProblemDetails buildProblemDetails(final String detail) {
- final ProblemDetails problemDetails = new ProblemDetails();
- problemDetails.setDetail(detail);
- return problemDetails;
+ // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new
+ // ProblemDetails().detail(errorMessage));
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
}
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java
new file mode 100644
index 0000000000..cbad564210
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java
@@ -0,0 +1,154 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.rest;
+
+import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
+import static org.slf4j.LoggerFactory.getLogger;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.GeneralSecurityException;
+import java.util.List;
+import java.util.Optional;
+import javax.ws.rs.core.MediaType;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.ProblemDetails;
+import org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.SubscriptionManager;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * Controller for handling the Subscription Management. The client can use this resource to subscribe to notifications
+ * related to the VNF package management, and to query its subscriptions. For further information please read:
+ * https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/003/02.05.01_60/gs_nfv-sol003v020501p.pdf Use the section number
+ * above each endpoint to find the corresponding section in the above document.
+ *
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ */
+@Controller
+@RequestMapping(value = PACKAGE_MANAGEMENT_BASE_URL, produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML},
+ consumes = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+public class Sol003PackageManagementSubscriptionController {
+
+ private static final String LOG_REQUEST_RECEIVED = "Subscription Management Controller: {} {}";
+ private static final Logger logger = getLogger(Sol003PackageManagementSubscriptionController.class);
+ private final SubscriptionManager subscriptionManager;
+
+ @Autowired
+ public Sol003PackageManagementSubscriptionController(final SubscriptionManager subscriptionManager) {
+ this.subscriptionManager = subscriptionManager;
+ }
+
+ /**
+ * POST Subscribe request. Will send request and respond with the subscription that you subscribed to, if
+ * successful. Section Number: 10.4.7
+ *
+ * @param pkgmSubscriptionRequest This includes the details of the subscription to be created.
+ * @return The subscription requested, if successful. Object: InlineRespone2002 Response Code: 201 Created Response
+ * Code: 303 Duplicate Subscription
+ * @throws GeneralSecurityException
+ */
+ @PostMapping(value = "/subscriptions")
+ public ResponseEntity<?> postSubscriptionRequest(@RequestBody final PkgmSubscriptionRequest pkgmSubscriptionRequest)
+ throws GeneralSecurityException {
+ logger.info(LOG_REQUEST_RECEIVED, " postSubscriptionRequest Endpoint Called");
+
+ // Check if subscription exists already.
+ final Optional<String> exists = subscriptionManager.getSubscriptionId(pkgmSubscriptionRequest);
+
+ if (exists.isPresent()) {
+ final URI subscriptionUri = subscriptionManager.getSubscriptionUri(exists.get());
+ final HttpHeaders headers = createLocationHeader(subscriptionUri);
+ logger.info("PkgmSubscriptionRequest already exists with uri {} ", subscriptionUri);
+ return new ResponseEntity<>(headers, HttpStatus.SEE_OTHER);
+ }
+
+ logger.debug("No duplicate Subscription exists, continuing with POST.");
+ final Optional<InlineResponse2002> optionalInlineResponse2002 =
+ subscriptionManager.createSubscription(pkgmSubscriptionRequest);
+
+ if (optionalInlineResponse2002.isPresent()) {
+ InlineResponse2002 inlineResponse2002 = optionalInlineResponse2002.get();
+ final URI subscriptionUri = subscriptionManager.getSubscriptionUri(inlineResponse2002.getId());
+ final HttpHeaders headers = createLocationHeader(subscriptionUri);
+ logger.debug("Sending response with uri {} ", subscriptionUri);
+ return new ResponseEntity<>(inlineResponse2002, headers, HttpStatus.CREATED);
+ }
+ final String errorMessage = "A null response was received during the postSubscriptionRequest call.";
+ logger.error(errorMessage);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
+ }
+
+ /**
+ * GET all subscriptions. Will return a list of all subscriptions currently active. Section Number: 10.4.7
+ *
+ * @return All of the current active subscriptions. Object: List<InlineResponse2002> Response Code: 200 OK
+ */
+ @GetMapping(value = "/subscriptions")
+ public ResponseEntity<List<InlineResponse2002>> getSubscriptions() {
+ logger.info(LOG_REQUEST_RECEIVED, " getSubscriptions.");
+ List<InlineResponse2002> subscriptionsList = subscriptionManager.getSubscriptions();
+ return new ResponseEntity<>(subscriptionsList, HttpStatus.OK);
+ }
+
+ /**
+ * GET a specific subscription, by subscriptionId. Section Number: 10.4.8
+ *
+ * @param subscriptionId The ID of the subscription that you wish to retrieve.
+ * @return A subscription based on subscriptionId. Object: InlineResponse2002 Response Code: 200 OK
+ */
+ @GetMapping(value = "/subscriptions/{subscriptionId}")
+ public ResponseEntity<?> getSubscription(@PathVariable("subscriptionId") final String subscriptionId) {
+ logger.info(LOG_REQUEST_RECEIVED, " Getting Subscription: ", subscriptionId);
+ final Optional<InlineResponse2002> optional = subscriptionManager.getSubscription(subscriptionId);
+ if (optional.isPresent()) {
+ logger.debug("Return subscription with id {} and body {}", subscriptionId, optional);
+ return new ResponseEntity<>(optional.get(), HttpStatus.OK);
+ }
+ final String errorMessage =
+ "The requested subscription: " + subscriptionId + " was not found on call getSubscription";
+ logger.error(errorMessage);
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ProblemDetails().detail(errorMessage));
+ }
+
+ /**
+ * Method to set the Location in the header with the URI parameter
+ *
+ * @param subscriptionUri
+ * @return header with callbackUri in Location
+ */
+ private HttpHeaders createLocationHeader(final URI subscriptionUri) {
+ final HttpHeaders headers = new HttpHeaders();
+ headers.setLocation(subscriptionUri);
+ return headers;
+ }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java
deleted file mode 100644
index 16650d4a3d..0000000000
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * Copyright (C) 2019 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.so.adapters.vnfmadapter.rest;
-
-import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
-import static org.slf4j.LoggerFactory.getLogger;
-import java.util.List;
-import javax.ws.rs.core.MediaType;
-import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
-import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
-import org.slf4j.Logger;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-/**
- * Controller for handling the Subscription Management. For further information please read:
- * https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/003/02.05.01_60/gs_nfv-sol003v020501p.pdf Use the section number
- * above each endpoint to find the corresponding section in the above document.
- *
- * @author gareth.roper@est.tech
- */
-@Controller
-@RequestMapping(value = PACKAGE_MANAGEMENT_BASE_URL, produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML},
- consumes = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
-public class Sol003SubscriptionManagementController {
-
- private static final String LOG_REQUEST_RECEIVED = "Subscription Management Controller: {} {}";
- private static final Logger logger = getLogger(Sol003SubscriptionManagementController.class);
-
- /**
- * POST Subscribe request. Will send request and respond with the subscription that you subscribed to, if
- * successful. Section Number: 10.4.7
- *
- * @param pkgmSubscriptionRequest This includes the details of the subscription to be created.
- * @return The subscription requested, if successful. Object: InlineRespone2002 Response Code: 201 Created Response
- * Code: 303 Duplicate Subscription
- */
- @PostMapping(value = "/subscriptions")
- public ResponseEntity<InlineResponse2002> postSubscriptionRequest(
- @RequestBody final PkgmSubscriptionRequest pkgmSubscriptionRequest) {
- logger.info(LOG_REQUEST_RECEIVED, " postSubscriptionRequest: ", pkgmSubscriptionRequest);
- return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
- }
-
- /**
- * GET all subscriptions. Will return a list of all subscriptions currently active. Section Number: 10.4.7
- *
- * @return All of the current active subscriptions. Object: List<InlineResponse2002> Response Code: 200 OK
- */
- @GetMapping(value = "/subscriptions")
- public ResponseEntity<List<InlineResponse2002>> getSubscriptions() {
- logger.info(LOG_REQUEST_RECEIVED, " getSubscriptions.");
- return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
- }
-
- /**
- * GET a specific subscription, by subscriptionId. Section Number: 10.4.8
- *
- * @param subscriptionId The ID of the subscription that you wish to retrieve.
- * @return A subscription based on subscriptionId. Object: InlineResponse2002 Response Code: 200 OK
- */
- @GetMapping(value = "/subscriptions/{subscriptionId}")
- public ResponseEntity<InlineResponse2002> getSubscription(
- @PathVariable("subscriptionId") final String subscriptionId) {
- logger.info(LOG_REQUEST_RECEIVED, " Getting Subscription: ", subscriptionId);
- return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
- }
-
- /**
- * DELETE a specific subscription, by subscriptionId. Section Number: 10.4.7
- *
- * @param subscriptionId The ID of the subscription that you wish to delete.
- * @return Empty response if successful. Object: Void Response Code: 204 No Content
- */
- @DeleteMapping(value = "/subscriptions/{subscriptionId}")
- public ResponseEntity<Void> deleteSubscription(@PathVariable("subscriptionId") final String subscriptionId) {
- logger.info(LOG_REQUEST_RECEIVED, " Deleting Subscription: ", subscriptionId);
- return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
- }
-
-
-}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerBadRequestException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerBadRequestException.java
new file mode 100644
index 0000000000..dbd098f7cd
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerBadRequestException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for an ETSI Catalog Manager Bad Request Exception.
+ *
+ * @author Gareth Roper (gareth.roper@est.tech
+ */
+@ResponseStatus(code = HttpStatus.BAD_REQUEST)
+public class EtsiCatalogManagerBadRequestException extends RuntimeException {
+
+ private static final long serialVersionUID = 6571317418914258768L;
+
+ public EtsiCatalogManagerBadRequestException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/InternalServerErrorException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/InternalServerErrorException.java
new file mode 100644
index 0000000000..9b547d3c5a
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/InternalServerErrorException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for an ETSI Catalog Manager Request Failure
+ *
+ * @author gareth.roper@est.tech
+ */
+@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
+public class InternalServerErrorException extends RuntimeException {
+
+ private static final long serialVersionUID = 66864561537194516L;
+
+ public InternalServerErrorException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java
index a49063a72f..da8b0cbff2 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java
@@ -48,6 +48,30 @@ public class Sol003PackageManagementControllerExceptionHandler {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(problemDetails);
}
+ @ExceptionHandler(EtsiCatalogManagerBadRequestException.class)
+ public ResponseEntity<ProblemDetails> handleEtsiCatalogManagerBadRequestFailureException(
+ final EtsiCatalogManagerBadRequestException etsiCatalogManagerBadRequestException) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(etsiCatalogManagerBadRequestException.getMessage());
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(problemDetails);
+ }
+
+ @ExceptionHandler(SubscriptionNotFoundException.class)
+ public ResponseEntity<ProblemDetails> handleSubscriptionNotFoundException(
+ final SubscriptionNotFoundException subscriptionNotFoundException) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(subscriptionNotFoundException.getMessage());
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(problemDetails);
+ }
+
+ @ExceptionHandler(SubscriptionRequestConversionException.class)
+ public ResponseEntity<ProblemDetails> handleSubscriptionRequestConversionException(
+ final SubscriptionRequestConversionException subscriptionRequestConversionException) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(subscriptionRequestConversionException.getMessage());
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(problemDetails);
+ }
+
@ExceptionHandler(VnfPkgConflictException.class)
public ResponseEntity<ProblemDetails> handleVnfPkgConflictException(
final VnfPkgConflictException vnfPkgConflictException) {
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionNotFoundException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionNotFoundException.java
new file mode 100644
index 0000000000..58c2ef050d
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionNotFoundException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for an ETSI Catalog Manager Request Failure
+ *
+ * @author gareth.roper@est.tech
+ */
+@ResponseStatus(code = HttpStatus.NOT_FOUND)
+public class SubscriptionNotFoundException extends RuntimeException {
+
+ private static final long serialVersionUID = 85268561453194516L;
+
+ public SubscriptionNotFoundException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
new file mode 100644
index 0000000000..daa544f928
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for an ETSI Catalog Manager Request Failure
+ *
+ * @author gareth.roper@est.tech
+ */
+@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
+public class SubscriptionRequestConversionException extends RuntimeException {
+
+ private static final long serialVersionUID = 45898561453196895L;
+
+ public SubscriptionRequestConversionException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java
new file mode 100644
index 0000000000..f90978e0d5
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java
@@ -0,0 +1,257 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
+import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
+import java.security.GeneralSecurityException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import com.google.gson.Gson;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.so.adapters.vnfmadapter.Constants;
+import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.LinkSelf;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter.NotificationTypesEnum;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsLinks;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
+import org.onap.so.utils.CryptoUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.client.MockRestServiceServer;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.http.HttpMethod;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
+import static org.hamcrest.Matchers.is;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
+
+/**
+ * @author Ronan Kenny (ronan.kenny@est.tech)
+ * @author Gareth Roper (gareth.roper@est.tech)
+ *
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("test")
+@SuppressWarnings("unchecked")
+public class Sol003PackageManagementSubscriptionControllerTest {
+
+ private static String subscriptionId;
+ private final Gson gson = new Gson();
+
+ @Autowired
+ @Qualifier(CONFIGURABLE_REST_TEMPLATE)
+ private RestTemplate testRestTemplate;
+
+ private MockRestServiceServer mockRestServer;
+
+ @Autowired
+ private CacheManager cacheServiceProvider;
+ private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
+
+ @Autowired
+ private Sol003PackageManagementSubscriptionController sol003PackageManagementSubscriptionController;
+
+ @Before
+ public void setUp() {
+ mockRestServer = MockRestServiceServer.bindTo(testRestTemplate).build();
+ final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
+ cache.clear();
+ }
+
+ @Test
+ public void testSuccessPostSubscription() throws GeneralSecurityException, URISyntaxException {
+ final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
+ final ResponseEntity<InlineResponse2002> response =
+ (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
+ .postSubscriptionRequest(pkgmSubscriptionRequest);
+
+ final HttpHeaders headers = buildHttpHeaders(Objects.requireNonNull(response.getBody()).getCallbackUri());
+
+ SubscriptionsLinks subscriptionsLinks = new SubscriptionsLinks();
+ VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
+ vnfPackagesLinksSelf.setHref("https://so-vnfm-adapter.onap:30406" + PACKAGE_MANAGEMENT_BASE_URL
+ + "/subscriptions/" + response.getBody().getId());
+ subscriptionsLinks.setSelf(vnfPackagesLinksSelf);
+
+ assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
+ assertEquals(subscriptionsLinks, response.getBody().getLinks());
+ assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
+ assert (response.getHeaders().equals(headers));
+ assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
+ assertNotNull(response.getBody().getCallbackUri());
+ }
+
+ @Test
+ public void testFailPostSubscriptionAlreadyExists() throws GeneralSecurityException {
+ final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
+
+ final ResponseEntity<InlineResponse2002> response =
+ (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
+ .postSubscriptionRequest(pkgmSubscriptionRequest);
+ subscriptionId = Objects.requireNonNull(response.getBody()).getId();
+
+ // Create duplicate entry
+ final PkgmSubscriptionRequest pkgmSubscriptionRequest2 = buildPkgmSubscriptionRequest();
+
+ final ResponseEntity<InlineResponse2002> response2002 =
+ (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
+ .postSubscriptionRequest(pkgmSubscriptionRequest2);
+
+ assertEquals(HttpStatus.SEE_OTHER, response2002.getStatusCode());
+ }
+
+ @Test
+ public void testSuccessGetSubscriptionWithSubscriptionId() throws GeneralSecurityException, URISyntaxException {
+ final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
+
+ final ResponseEntity<InlineResponse2002> response =
+ (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
+ .postSubscriptionRequest(pkgmSubscriptionRequest);
+ subscriptionId = Objects.requireNonNull(response.getBody()).getId();
+
+ final ResponseEntity<InlineResponse2002> response2002 =
+ (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
+ .getSubscription(subscriptionId);
+
+ final HttpHeaders headers = buildHttpHeaders(response.getBody().getCallbackUri());
+
+
+ assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
+ assert (response.getHeaders().equals(headers));
+ assertEquals(HttpStatus.OK, response2002.getStatusCode());
+ assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
+ // Ensure CallBackUri is set to new URI
+ assertNotEquals(pkgmSubscriptionRequest.getCallbackUri(), response.getBody().getCallbackUri());
+ }
+
+ @Test
+ public void testFailGetSubscriptionWithInvalidSubscriptionId() {
+ final ResponseEntity<InlineResponse2002> response =
+ (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
+ .getSubscription("invalidSubscriptionId");
+ assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
+ }
+
+ @Test
+ public void testSuccessGetSubscriptions() throws GeneralSecurityException {
+ final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
+ final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
+
+ mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
+ .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
+
+ sol003PackageManagementSubscriptionController.postSubscriptionRequest(pkgmSubscriptionRequest);
+ ResponseEntity<List<InlineResponse2002>> response =
+ sol003PackageManagementSubscriptionController.getSubscriptions();
+
+ List<InlineResponse2002> subscriptionsList = response.getBody();
+
+ assertEquals(Objects.requireNonNull(response.getBody()).get(0).getFilter(),
+ pkgmSubscriptionRequest.getFilter());
+ assert (subscriptionsList != null);
+ assertNotEquals('0', subscriptionsList.size());
+ assertEquals(HttpStatus.OK, response.getStatusCode());
+ }
+
+ private PkgmSubscriptionRequest buildPkgmSubscriptionRequest() {
+ final PkgmSubscriptionRequest pkgmSubscriptionRequest = new PkgmSubscriptionRequest();
+ final SubscriptionsFilter sub = buildSubscriptionsFilter();
+ final SubscriptionsAuthentication auth = new SubscriptionsAuthentication();
+ pkgmSubscriptionRequest.setFilter(sub);
+ pkgmSubscriptionRequest.setCallbackUri(msbEndpoint.toString());
+ pkgmSubscriptionRequest.setAuthentication(auth);
+ return pkgmSubscriptionRequest;
+ }
+
+ private SubscriptionsFilter buildSubscriptionsFilter() {
+ final SubscriptionsFilter sub = new SubscriptionsFilter();
+ final List<String> vnfdIdList = new ArrayList();
+ final List<String> vnfPkgIdList = new ArrayList();
+ final List<NotificationTypesEnum> notificationTypes = new ArrayList<>();
+ final SubscriptionsFilterVnfProductsFromProviders subscriptionsFilterVnfProductsFromProviders =
+ new SubscriptionsFilterVnfProductsFromProviders();
+ final List<SubscriptionsFilterVnfProductsFromProviders> vnfProductsFromProviders = new ArrayList<>();
+
+ vnfProductsFromProviders.add(subscriptionsFilterVnfProductsFromProviders);
+ sub.setVnfdId(vnfdIdList);
+ sub.setNotificationTypes(notificationTypes);
+ sub.setVnfPkgId(vnfPkgIdList);
+ sub.setVnfProductsFromProviders(vnfProductsFromProviders);
+ return sub;
+ }
+
+ private PkgmSubscription buildPkgmSubscription() {
+ PkgmSubscription pkgmSubscription = new PkgmSubscription();
+ PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
+ LinkSelf linkSelf = new LinkSelf();
+ String id = UUID.randomUUID().toString();
+ pkgmSubscription.setId(id);
+ pkgmSubscription.setCallbackUri(msbEndpoint + "/" + pkgmSubscription.getId().toString());
+ pkgmSubscription.setFilter(pkgmNotificationsFilter);
+ pkgmSubscription.setLinks(linkSelf);
+ return pkgmSubscription;
+ }
+
+ private PkgmSubscriptionRequest postSubscriptionForTest() {
+ final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
+ final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
+
+ mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
+ .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
+ return pkgmSubscriptionRequest;
+ }
+
+ private HttpHeaders buildHttpHeaders(String uri) throws URISyntaxException {
+ final HttpHeaders headers = new HttpHeaders();
+ URI myUri = new URI(uri);
+ headers.setLocation(myUri);
+ return headers;
+ }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java
deleted file mode 100644
index ed1880035a..0000000000
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.onap.so.adapters.vnfmadapter.rest;
-
-import static org.junit.Assert.assertEquals;
-import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
-import java.net.URISyntaxException;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
-import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
-import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.web.client.MockRestServiceServer;
-import org.springframework.web.client.RestTemplate;
-
-/**
- * @author gareth.roper@est.tech
- */
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-@ActiveProfiles("test")
-public class Sol003SubscriptionManagementControllerTest {
-
- private static final String subscriptionId = "mySubscriptionId";
-
- @Autowired
- @Qualifier(CONFIGURABLE_REST_TEMPLATE)
- private RestTemplate testRestTemplate;
-
- @Autowired
- private Sol003SubscriptionManagementController controller;
-
- @Before
- public void setUp() throws Exception {
- MockRestServiceServer.bindTo(testRestTemplate).build();
- }
-
- @Test
- public void postSubscriptionRequest() throws URISyntaxException, InterruptedException {
- final PkgmSubscriptionRequest pkgmSubscriptionRequest = new PkgmSubscriptionRequest();
- final ResponseEntity<InlineResponse2002> response = controller.postSubscriptionRequest(pkgmSubscriptionRequest);
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
- }
-
- @Test
- public void getSubscriptions() throws URISyntaxException, InterruptedException {
- final ResponseEntity<List<InlineResponse2002>> response = controller.getSubscriptions();
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
- }
-
- @Test
- public void deleteSubscription() throws URISyntaxException, InterruptedException {
- final ResponseEntity<Void> response = controller.deleteSubscription(subscriptionId);
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
- }
-
- @Test
- public void getSubscription() throws URISyntaxException, InterruptedException {
- final ResponseEntity<InlineResponse2002> response = controller.getSubscription(subscriptionId);
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
- }
-}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml
index ae66464f29..cdb6662191 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml
@@ -40,6 +40,7 @@ sdc:
vnfmadapter:
endpoint: https://so-vnfm-adapter.onap:30406
+
#Actuator
management:
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/L3Network.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/L3Network.java
index 6b3ad1d528..554e987fc8 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/L3Network.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/L3Network.java
@@ -100,6 +100,10 @@ public class L3Network implements Serializable, ShallowCopy<L3Network> {
private List<AggregateRoute> aggregateRoutes = new ArrayList<>();
@JsonProperty("vpn-binding")
private List<VpnBinding> vpnBindings = new ArrayList<>();
+ @JsonProperty("line-of-business")
+ private LineOfBusiness lineOfBusiness;
+ @JsonProperty("platform")
+ private Platform platform;
public ModelInfoNetwork getModelInfoNetwork() {
return modelInfoNetwork;
@@ -313,6 +317,22 @@ public class L3Network implements Serializable, ShallowCopy<L3Network> {
return vpnBindings;
}
+ public LineOfBusiness getLineOfBusiness() {
+ return lineOfBusiness;
+ }
+
+ public void setLineOfBusiness(LineOfBusiness lineOfBusiness) {
+ this.lineOfBusiness = lineOfBusiness;
+ }
+
+ public Platform getPlatform() {
+ return platform;
+ }
+
+ public void setPlatform(Platform platform) {
+ this.platform = platform;
+ }
+
@Override
public boolean equals(final Object other) {
if (!(other instanceof L3Network)) {
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
index a4793476e4..145d4c83a7 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
@@ -915,7 +915,7 @@ public class BBInputSetup implements JavaDelegate {
if (network == null && (parameter.getBbName().equalsIgnoreCase(AssignFlows.NETWORK_A_LA_CARTE.toString())
|| parameter.getBbName().equalsIgnoreCase(AssignFlows.NETWORK_MACRO.toString()))) {
network = createNetwork(parameter.getLookupKeyMap(), parameter.getInstanceName(), parameter.getResourceId(),
- parameter.getInstanceParams());
+ parameter.getInstanceParams(), parameter);
parameter.getServiceInstance().getNetworks().add(network);
}
if (network != null) {
@@ -924,12 +924,20 @@ public class BBInputSetup implements JavaDelegate {
}
protected L3Network createNetwork(Map<ResourceKey, String> lookupKeyMap, String instanceName, String networkId,
- List<Map<String, String>> instanceParams) {
+ List<Map<String, String>> instanceParams, BBInputSetupParameter parameter) {
lookupKeyMap.put(ResourceKey.NETWORK_ID, networkId);
L3Network network = new L3Network();
network.setNetworkId(networkId);
network.setNetworkName(instanceName);
network.setOrchestrationStatus(OrchestrationStatus.PRECREATED);
+ if (parameter != null) {
+ if (parameter.getLineOfBusiness() != null) {
+ network.setLineOfBusiness(this.mapperLayer.mapRequestLineOfBusiness(parameter.getLineOfBusiness()));
+ }
+ if (parameter.getLineOfBusiness() != null) {
+ network.setPlatform(this.mapperLayer.mapRequestPlatform(parameter.getPlatform()));
+ }
+ }
if (instanceParams != null) {
for (Map<String, String> params : instanceParams) {
network.getCloudParams().putAll(params);
@@ -1284,7 +1292,7 @@ public class BBInputSetup implements JavaDelegate {
if (collectionNetworkResourceCust != null) {
if ((bbName.equalsIgnoreCase(AssignFlows.NETWORK_A_LA_CARTE.toString())
|| bbName.equalsIgnoreCase(AssignFlows.NETWORK_MACRO.toString()))) {
- L3Network network = createNetwork(lookupKeyMap, null, networkId, null);
+ L3Network network = createNetwork(lookupKeyMap, null, networkId, null, null);
serviceInstance.getNetworks().add(network);
return network;
} else {
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java
index a45e803cf0..1acf4edb4a 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java
@@ -1262,7 +1262,7 @@ public class BBInputSetupTest {
verify(SPY_bbInputSetup, times(1)).mapCatalogNetwork(network, modelInfo, service);
instanceName = "networkName2";
- L3Network network2 = SPY_bbInputSetup.createNetwork(lookupKeyMap, instanceName, resourceId, null);
+ L3Network network2 = SPY_bbInputSetup.createNetwork(lookupKeyMap, instanceName, resourceId, null, parameter);
SPY_bbInputSetup.populateL3Network(parameter);
verify(SPY_bbInputSetup, times(2)).mapCatalogNetwork(network2, modelInfo, service);
}
@@ -2832,17 +2832,32 @@ public class BBInputSetupTest {
expected.setNetworkId(networkId);
expected.setNetworkName(instanceName);
expected.setCloudParams(cloudParams);
+ Platform platform = new Platform();
+ platform.setPlatformName("platformName");
+ expected.setPlatform(platform);
+ LineOfBusiness lineOfBusiness = new LineOfBusiness();
+ lineOfBusiness.setLineOfBusinessName("lineOfBusiness");
+ expected.setLineOfBusiness(lineOfBusiness);
expected.setOrchestrationStatus(OrchestrationStatus.PRECREATED);
Map<ResourceKey, String> lookupKeyMap = new HashMap<>();
List<Map<String, String>> instanceParams = new ArrayList<>();
instanceParams.add(cloudParams);
- L3Network actual = SPY_bbInputSetup.createNetwork(lookupKeyMap, instanceName, networkId, instanceParams);
+ org.onap.so.serviceinstancebeans.Platform platformRequest = new org.onap.so.serviceinstancebeans.Platform();
+ org.onap.so.serviceinstancebeans.LineOfBusiness lineOfBusinessRequest =
+ new org.onap.so.serviceinstancebeans.LineOfBusiness();
+ lineOfBusinessRequest.setLineOfBusinessName("lineOfBusiness");
+ platformRequest.setPlatformName("platformName");
+ BBInputSetupParameter parameter = new BBInputSetupParameter.Builder().setRequestId(REQUEST_ID)
+ .setPlatform(platformRequest).setLineOfBusiness(lineOfBusinessRequest).build();
+ L3Network actual =
+ SPY_bbInputSetup.createNetwork(lookupKeyMap, instanceName, networkId, instanceParams, parameter);
assertThat(actual, sameBeanAs(expected));
assertEquals("LookupKeyMap is populated", networkId, lookupKeyMap.get(ResourceKey.NETWORK_ID));
expected.getCloudParams().clear();
- actual = SPY_bbInputSetup.createNetwork(lookupKeyMap, instanceName, networkId, null);
+
+ actual = SPY_bbInputSetup.createNetwork(lookupKeyMap, instanceName, networkId, null, parameter);
assertThat(actual, sameBeanAs(expected));
}
diff --git a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowProcessor.java b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowProcessor.java
index 70365b744c..25f7c4b93f 100644
--- a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowProcessor.java
+++ b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowProcessor.java
@@ -75,9 +75,8 @@ public class WorkflowProcessor extends ProcessEngineAwareService {
}
}
- // Note: the business key is used to identify the process in unit tests
protected static String getBusinessKey(Map<String, Object> inputVariables) {
- return getOrCreate(inputVariables, "mso-business-key");
+ return getOrCreate(inputVariables, "mso-request-id");
}
diff --git a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListener.java b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListener.java
new file mode 100644
index 0000000000..80d86ad009
--- /dev/null
+++ b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListener.java
@@ -0,0 +1,30 @@
+package org.onap.so.bpmn.core.plugins;
+
+import org.camunda.bpm.engine.impl.bpmn.behavior.CallableElementActivityBehavior;
+import org.camunda.bpm.engine.impl.bpmn.parser.AbstractBpmnParseListener;
+import org.camunda.bpm.engine.impl.context.Context;
+import org.camunda.bpm.engine.impl.core.model.CallableElement;
+import org.camunda.bpm.engine.impl.el.ElValueProvider;
+import org.camunda.bpm.engine.impl.el.Expression;
+import org.camunda.bpm.engine.impl.el.ExpressionManager;
+import org.camunda.bpm.engine.impl.pvm.process.ActivityImpl;
+import org.camunda.bpm.engine.impl.pvm.process.ScopeImpl;
+import org.camunda.bpm.engine.impl.util.xml.Element;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class CallActivityBusinessKeyParseListener extends AbstractBpmnParseListener {
+
+ @Override
+ public void parseCallActivity(Element callActivityElement, ScopeImpl scope, ActivityImpl activity) {
+ ExpressionManager expressionManager = Context.getProcessEngineConfiguration().getExpressionManager();
+ Expression expression = expressionManager.createExpression("#{execution.processBusinessKey}");
+ ElValueProvider p = new ElValueProvider(expression);
+ CallableElementActivityBehavior callableElementActivityBehavior =
+ (CallableElementActivityBehavior) activity.getActivityBehavior();
+ CallableElement callableElement = (CallableElement) callableElementActivityBehavior.getCallableElement();
+ callableElement.setBusinessKeyValueProvider(p);
+ callableElementActivityBehavior.setCallableElement(callableElement);
+ }
+}
diff --git a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListenerPlugin.java b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListenerPlugin.java
new file mode 100644
index 0000000000..a2d897e367
--- /dev/null
+++ b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/CallActivityBusinessKeyParseListenerPlugin.java
@@ -0,0 +1,24 @@
+package org.onap.so.bpmn.core.plugins;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.camunda.bpm.engine.impl.bpmn.parser.BpmnParseListener;
+import org.camunda.bpm.engine.impl.cfg.AbstractProcessEnginePlugin;
+import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class CallActivityBusinessKeyParseListenerPlugin extends AbstractProcessEnginePlugin {
+
+ @Override
+ public void preInit(ProcessEngineConfigurationImpl processEngineConfiguration) {
+ List<BpmnParseListener> preParseListeners = processEngineConfiguration.getCustomPreBPMNParseListeners();
+ if (preParseListeners == null) {
+ preParseListeners = new ArrayList<>();
+ processEngineConfiguration.setCustomPreBPMNParseListeners(preParseListeners);
+ }
+ preParseListeners.add(new CallActivityBusinessKeyParseListener());
+ }
+
+}
diff --git a/bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/common/WorkflowTest.java b/bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/common/WorkflowTest.java
index 93f98a34a6..0161422b64 100644
--- a/bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/common/WorkflowTest.java
+++ b/bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/common/WorkflowTest.java
@@ -1534,6 +1534,18 @@ public abstract class WorkflowTest {
}
}
+ protected Object getVariableFromHistoryByProcessInstanceId(String processInstanceId, String variableName) {
+ try {
+ HistoricVariableInstance v = historyService.createHistoricVariableInstanceQuery()
+ .processInstanceId(processInstanceId).variableName(variableName).singleResult();
+ return v == null ? null : v.getValue();
+ } catch (Exception e) {
+ logger.debug("Error retrieving variable {} from historical process with processInstanceId {}: ",
+ variableName, processInstanceId, e);
+ return null;
+ }
+ }
+
/**
* Gets a variable value from a process instance based on businessKey and process name. Must be used when multiple
* instances exist with the same business key such as when business key is passed to subflows or shared across
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignNetworkBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignNetworkBB.bpmn
index 7c86e964ec..c48f8b4d10 100644
--- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignNetworkBB.bpmn
+++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignNetworkBB.bpmn
@@ -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.8.2" 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="3.1.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>
@@ -21,7 +21,7 @@
<bpmn2:outgoing>SequenceFlow_0988gld</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:sequenceFlow id="SequenceFlow_017131q" name="Yes" sourceRef="networkFoundByName_ExclusiveGateway" targetRef="ExclusiveGateway_0vtj8n8">
- <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{AssignNetwork.networkFoundByName(execution.getVariable("gBuildingBlockExecution")) == true}]]></bpmn2:conditionExpression>
+ <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">#{AssignNetwork.networkFoundByName(execution.getVariable("gBuildingBlockExecution")) == true}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="SequenceFlow_0gkr871" name="No" sourceRef="networkFoundByName_ExclusiveGateway" targetRef="ServiceTask_put_network_in_AAI" />
<bpmn2:endEvent id="AssignNetworkBB_end">
@@ -36,11 +36,11 @@
<bpmn2:incoming>SequenceFlow_0e08b9t</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0mxc4ri</bpmn2:outgoing>
</bpmn2:serviceTask>
- <bpmn2:sequenceFlow id="SequenceFlow_1ctpnpe" sourceRef="ServiceTask_put_network_in_AAI" targetRef="ServiceTask_connect_to_Tenant" />
+ <bpmn2:sequenceFlow id="SequenceFlow_1ctpnpe" sourceRef="ServiceTask_put_network_in_AAI" targetRef="ExclusiveGateway_0g85lk7" />
<bpmn2:sequenceFlow id="SequenceFlow_0e08b9t" sourceRef="ServiceTask_connect_to_NCIG" targetRef="ServiceTask_connect_to_NCSI" />
<bpmn2:sequenceFlow id="SequenceFlow_0mxc4ri" sourceRef="ServiceTask_connect_to_NCSI" targetRef="ExclusiveGateway_0vtj8n8" />
<bpmn2:serviceTask id="ServiceTask_connect_to_Tenant" name="&#10;AAI&#10;Connect&#10;(tenant)&#10;" camunda:expression="${AAICreateTasks.connectNetworkToTenant(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
- <bpmn2:incoming>SequenceFlow_1ctpnpe</bpmn2:incoming>
+ <bpmn2:incoming>SequenceFlow_0lj5jj1</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0fwcvep</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:serviceTask id="ServiceTask_connect_to_CloudRegion" name="&#10;AAI&#10;Connect&#10;(cloud region)&#10;" camunda:expression="${AAICreateTasks.connectNetworkToCloudRegion(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
@@ -54,11 +54,6 @@
<bpmn2:outgoing>SequenceFlow_017131q</bpmn2:outgoing>
<bpmn2:outgoing>SequenceFlow_0gkr871</bpmn2:outgoing>
</bpmn2:inclusiveGateway>
- <bpmn2:inclusiveGateway id="ExclusiveGateway_0vtj8n8">
- <bpmn2:incoming>SequenceFlow_017131q</bpmn2:incoming>
- <bpmn2:incoming>SequenceFlow_0mxc4ri</bpmn2:incoming>
- <bpmn2:outgoing>SequenceFlow_0jm95hf</bpmn2:outgoing>
- </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_0988gld" sourceRef="ServiceTask_assign_network_aai" targetRef="AssignNetworkBB_end" />
@@ -74,11 +69,36 @@
</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:serviceTask id="Task_0mu8391" name="Create Platform" camunda:expression="${AAICreateTasks.createPlatformForNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+ <bpmn2:incoming>SequenceFlow_1kslfgw</bpmn2:incoming>
+ <bpmn2:outgoing>SequenceFlow_0j7rpm9</bpmn2:outgoing>
+ </bpmn2:serviceTask>
+ <bpmn2:serviceTask id="ServiceTask_0e2crgd" name="Create Lob" camunda:expression="${AAICreateTasks.createLineOfBusinessForNetwork(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+ <bpmn2:incoming>SequenceFlow_0j7rpm9</bpmn2:incoming>
+ <bpmn2:outgoing>SequenceFlow_0ugp99e</bpmn2:outgoing>
+ </bpmn2:serviceTask>
+ <bpmn2:sequenceFlow id="SequenceFlow_0lj5jj1" sourceRef="ExclusiveGateway_0g85lk7" targetRef="ServiceTask_connect_to_Tenant" />
+ <bpmn2:sequenceFlow id="SequenceFlow_1kslfgw" sourceRef="ExclusiveGateway_0g85lk7" targetRef="Task_0mu8391" />
+ <bpmn2:sequenceFlow id="SequenceFlow_0j7rpm9" sourceRef="Task_0mu8391" targetRef="ServiceTask_0e2crgd" />
+ <bpmn2:sequenceFlow id="SequenceFlow_0ugp99e" sourceRef="ServiceTask_0e2crgd" targetRef="ExclusiveGateway_0vtj8n8" />
+ <bpmn2:parallelGateway id="ExclusiveGateway_0g85lk7">
+ <bpmn2:incoming>SequenceFlow_1ctpnpe</bpmn2:incoming>
+ <bpmn2:outgoing>SequenceFlow_0lj5jj1</bpmn2:outgoing>
+ <bpmn2:outgoing>SequenceFlow_1kslfgw</bpmn2:outgoing>
+ </bpmn2:parallelGateway>
+ <bpmn2:inclusiveGateway id="ExclusiveGateway_0vtj8n8">
+ <bpmn2:incoming>SequenceFlow_017131q</bpmn2:incoming>
+ <bpmn2:incoming>SequenceFlow_0mxc4ri</bpmn2:incoming>
+ <bpmn2:incoming>SequenceFlow_0ugp99e</bpmn2:incoming>
+ <bpmn2:outgoing>SequenceFlow_0jm95hf</bpmn2:outgoing>
+ </bpmn2:inclusiveGateway>
+ <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" />
- <bpmn2:textAnnotation id="TextAnnotation_17jb2vn"> <bpmn2:text>conditionally executed if Network Collection Instance Group exists</bpmn2:text>
-</bpmn2:textAnnotation>
+ <bpmn2:textAnnotation id="TextAnnotation_17jb2vn">
+ <bpmn2:text>conditionally executed if Network Collection Instance Group exists</bpmn2:text>
+ </bpmn2:textAnnotation>
<bpmn2:association id="Association_15ppe1t" sourceRef="ServiceTask_connect_to_NCIG" targetRef="TextAnnotation_17jb2vn" />
</bpmn2:process>
<bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
@@ -86,165 +106,190 @@
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="AssignNetworkBB">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_47" bpmnElement="AssignNetworkBB_start">
- <dc:Bounds x="746" y="-105" width="36" height="36" />
+ <dc:Bounds x="156" y="137" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="739" y="-64" width="50" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ServiceTask_1wo7ke9_di" bpmnElement="ServiceTask_get_cloud_region">
- <dc:Bounds x="1632" y="-127" width="100" height="80" />
+ <dc:Bounds x="1042" y="115" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ServiceTask_1ofnl0p_di" bpmnElement="ServiceTask_assign_network_sdnc">
- <dc:Bounds x="1769" y="-127" width="100" height="80" />
+ <dc:Bounds x="1179" y="115" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="TextAnnotation_0dnksb2_di" bpmnElement="TextAnnotation_0dnksb2">
- <dc:Bounds x="1576" y="35" width="212" height="30" />
+ <dc:Bounds x="986" y="242" width="212" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Association_1rsqd3z_di" bpmnElement="Association_1rsqd3z">
- <di:waypoint xsi:type="dc:Point" x="1682" y="-47" />
- <di:waypoint xsi:type="dc:Point" x="1682" y="35" />
+ <di:waypoint x="1092" y="195" />
+ <di:waypoint x="1092" y="242" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="ServiceTask_1dm3ngd_di" bpmnElement="ServiceTask_put_network_in_AAI">
- <dc:Bounds x="906" y="-49" width="100" height="80" />
+ <dc:Bounds x="316" y="193" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ServiceTask_18yks1p_di" bpmnElement="ServiceTask_assign_network_aai">
- <dc:Bounds x="2106" y="-127" width="100" height="80" />
+ <dc:Bounds x="1516" y="115" 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" />
- <di:waypoint xsi:type="dc:Point" x="863" y="-161" />
- <di:waypoint xsi:type="dc:Point" x="1562" y="-161" />
- <di:waypoint xsi:type="dc:Point" x="1562" y="-112" />
+ <di:waypoint x="273" y="130" />
+ <di:waypoint x="273" y="81" />
+ <di:waypoint x="972" y="81" />
+ <di:waypoint x="972" y="130" />
<bpmndi:BPMNLabel>
- <dc:Bounds x="871.5" y="-151.96931534232883" width="19" height="12" />
+ <dc:Bounds x="282" y="90" width="18" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0gkr871_di" bpmnElement="SequenceFlow_0gkr871">
- <di:waypoint xsi:type="dc:Point" x="863" y="-62" />
- <di:waypoint xsi:type="dc:Point" x="863" y="-9" />
- <di:waypoint xsi:type="dc:Point" x="906" y="-9" />
+ <di:waypoint x="273" y="180" />
+ <di:waypoint x="273" y="233" />
+ <di:waypoint x="316" y="233" />
<bpmndi:BPMNLabel>
- <dc:Bounds x="872.125" y="-36.06410256410257" width="14" height="12" />
+ <dc:Bounds x="282" y="206" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="EndEvent_083u1a5_di" bpmnElement="AssignNetworkBB_end">
- <dc:Bounds x="2241" y="-105" width="36" height="36" />
+ <dc:Bounds x="1651" y="137" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2214" y="-65" width="90" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_11op1ih_di" bpmnElement="SequenceFlow_11op1ih">
- <di:waypoint xsi:type="dc:Point" x="782" y="-87" />
- <di:waypoint xsi:type="dc:Point" x="838" y="-87" />
+ <di:waypoint x="192" y="155" />
+ <di:waypoint x="248" y="155" />
<bpmndi:BPMNLabel>
<dc:Bounds x="765" y="-102" width="90" height="0" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="ServiceTask_0a96yhg_di" bpmnElement="ServiceTask_connect_to_NCIG">
- <dc:Bounds x="1286" y="-49" width="100" height="80" />
+ <dc:Bounds x="743" y="193" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ServiceTask_0mauyto_di" bpmnElement="ServiceTask_connect_to_NCSI">
- <dc:Bounds x="1422" y="-49" width="100" height="80" />
+ <dc:Bounds x="867" y="193" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_1ctpnpe_di" bpmnElement="SequenceFlow_1ctpnpe">
- <di:waypoint xsi:type="dc:Point" x="1006" y="-9" />
- <di:waypoint xsi:type="dc:Point" x="1036" y="-9" />
+ <di:waypoint x="416" y="232" />
+ <di:waypoint x="421" y="232" />
<bpmndi:BPMNLabel>
<dc:Bounds x="976" y="-24" width="90" height="0" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0e08b9t_di" bpmnElement="SequenceFlow_0e08b9t">
- <di:waypoint xsi:type="dc:Point" x="1386" y="-9" />
- <di:waypoint xsi:type="dc:Point" x="1422" y="-9" />
+ <di:waypoint x="843" y="233" />
+ <di:waypoint x="867" y="233" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1359" y="-24" width="90" height="0" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0mxc4ri_di" bpmnElement="SequenceFlow_0mxc4ri">
- <di:waypoint xsi:type="dc:Point" x="1522" y="-9" />
- <di:waypoint xsi:type="dc:Point" x="1562" y="-9" />
- <di:waypoint xsi:type="dc:Point" x="1562" y="-62" />
+ <di:waypoint x="917" y="193" />
+ <di:waypoint x="956" y="164" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1497" y="-24" width="90" height="0" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="ServiceTask_019bzpc_di" bpmnElement="ServiceTask_connect_to_Tenant">
- <dc:Bounds x="1036" y="-49" width="100" height="80" />
+ <dc:Bounds x="515" y="193" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ServiceTask_1alvmym_di" bpmnElement="ServiceTask_connect_to_CloudRegion">
- <dc:Bounds x="1162" y="-49" width="100" height="80" />
+ <dc:Bounds x="622" y="193" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0fwcvep_di" bpmnElement="SequenceFlow_0fwcvep">
- <di:waypoint xsi:type="dc:Point" x="1136" y="-9" />
- <di:waypoint xsi:type="dc:Point" x="1162" y="-9" />
+ <di:waypoint x="565" y="193" />
+ <di:waypoint x="565" y="173" />
+ <di:waypoint x="672" y="173" />
+ <di:waypoint x="672" y="193" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1104" y="-24" width="90" height="0" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_07z7hcu_di" bpmnElement="SequenceFlow_07z7hcu">
- <di:waypoint xsi:type="dc:Point" x="1262" y="-9" />
- <di:waypoint xsi:type="dc:Point" x="1286" y="-9" />
+ <di:waypoint x="722" y="233" />
+ <di:waypoint x="743" y="233" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1229" y="-24" width="90" height="0" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="TextAnnotation_17jb2vn_di" bpmnElement="TextAnnotation_17jb2vn">
- <dc:Bounds x="1232" y="86" width="158" height="54" />
+ <dc:Bounds x="777" y="288" width="158" height="54" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Association_15ppe1t_di" bpmnElement="Association_15ppe1t">
- <di:waypoint xsi:type="dc:Point" x="1306" y="31" />
- <di:waypoint xsi:type="dc:Point" x="1267" y="86" />
+ <di:waypoint x="793" y="273" />
+ <di:waypoint x="793" y="288" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="InclusiveGateway_0kiphfm_di" bpmnElement="networkFoundByName_ExclusiveGateway">
- <dc:Bounds x="838" y="-112" width="50" height="50" />
- <bpmndi:BPMNLabel>
- <dc:Bounds x="898" y="-104" width="73" height="24" />
- </bpmndi:BPMNLabel>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNShape id="InclusiveGateway_0pxktc3_di" bpmnElement="ExclusiveGateway_0vtj8n8">
- <dc:Bounds x="1537" y="-112" width="50" height="50" />
+ <dc:Bounds x="248" y="130" width="50" height="50" />
<bpmndi:BPMNLabel>
- <dc:Bounds x="1562" y="-58" width="0" height="12" />
+ <dc:Bounds x="308" y="138" width="73" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0jm95hf_di" bpmnElement="SequenceFlow_0jm95hf">
- <di:waypoint xsi:type="dc:Point" x="1587" y="-87" />
- <di:waypoint xsi:type="dc:Point" x="1632" y="-87" />
+ <di:waypoint x="997" y="155" />
+ <di:waypoint x="1042" y="155" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1609.5" y="-108" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_16hhbw3_di" bpmnElement="SequenceFlow_16hhbw3">
- <di:waypoint xsi:type="dc:Point" x="1732" y="-87" />
- <di:waypoint xsi:type="dc:Point" x="1769" y="-87" />
+ <di:waypoint x="1142" y="155" />
+ <di:waypoint x="1179" y="155" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1750.5" 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="2206" y="-87" />
- <di:waypoint xsi:type="dc:Point" x="2241" y="-87" />
+ <di:waypoint x="1616" y="155" />
+ <di:waypoint x="1651" y="155" />
<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" />
+ <dc:Bounds x="1337" y="115" 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="1927" y="-87" />
+ <di:waypoint x="1279" y="155" />
+ <di:waypoint x="1337" y="155" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1898" y="-108" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<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" />
+ <di:waypoint x="1437" y="155" />
+ <di:waypoint x="1516" y="155" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2066.5" y="-108" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
+ <bpmndi:BPMNShape id="ServiceTask_0z9uk3m_di" bpmnElement="Task_0mu8391">
+ <dc:Bounds x="471" y="305" width="100" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="ServiceTask_0e2crgd_di" bpmnElement="ServiceTask_0e2crgd">
+ <dc:Bounds x="631" y="305" width="100" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNEdge id="SequenceFlow_0lj5jj1_di" bpmnElement="SequenceFlow_0lj5jj1">
+ <di:waypoint x="471" y="232" />
+ <di:waypoint x="515" y="233" />
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_1kslfgw_di" bpmnElement="SequenceFlow_1kslfgw">
+ <di:waypoint x="446" y="257" />
+ <di:waypoint x="446" y="345" />
+ <di:waypoint x="471" y="345" />
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_0j7rpm9_di" bpmnElement="SequenceFlow_0j7rpm9">
+ <di:waypoint x="571" y="343" />
+ <di:waypoint x="631" y="341" />
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_0ugp99e_di" bpmnElement="SequenceFlow_0ugp99e">
+ <di:waypoint x="731" y="345" />
+ <di:waypoint x="972" y="345" />
+ <di:waypoint x="972" y="180" />
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNShape id="ParallelGateway_02lmom2_di" bpmnElement="ExclusiveGateway_0g85lk7">
+ <dc:Bounds x="421" y="207" width="50" height="50" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="InclusiveGateway_1cof7a3_di" bpmnElement="ExclusiveGateway_0vtj8n8">
+ <dc:Bounds x="947" y="130" width="50" height="50" />
+ </bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignPnfBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignPnfBB.bpmn
index c8600586ce..1b4470b545 100644
--- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignPnfBB.bpmn
+++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AssignPnfBB.bpmn
@@ -1,34 +1,38 @@
<?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: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" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1a52v2f" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.0.3">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/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" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1a52v2f" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.5.0">
<bpmn:collaboration id="Collaboration_0go8wi3">
<bpmn:participant id="Participant_1dwc5st" name="SO&#10;Assign PNF" processRef="AssignPnfBB" />
<bpmn:participant id="Participant_0gycee4" name="AAI" />
<bpmn:messageFlow id="MessageFlow_0xh6bkn" sourceRef="CreatePnfEntryInAai" targetRef="Participant_0gycee4" />
</bpmn:collaboration>
<bpmn:process id="AssignPnfBB" name="AssignPnfBB" isExecutable="true">
- <bpmn:sequenceFlow id="SequenceFlow_0l6rtzy" sourceRef="CreatePnfEntryInAai" targetRef="AaiEntryExists" />
<bpmn:sequenceFlow id="SequenceFlow_1fu9o4x" sourceRef="AssignPnf_StartEvent" targetRef="CreatePnfEntryInAai" />
- <bpmn:endEvent id="AaiEntryExists" name="AAI entry exists">
- <bpmn:incoming>SequenceFlow_0l6rtzy</bpmn:incoming>
- </bpmn:endEvent>
<bpmn:serviceTask id="CreatePnfEntryInAai" name="Create Pnf entry in AAI" camunda:expression="${AAICreateTasks.createPnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
<bpmn:incoming>SequenceFlow_1fu9o4x</bpmn:incoming>
- <bpmn:outgoing>SequenceFlow_0l6rtzy</bpmn:outgoing>
+ <bpmn:outgoing>SequenceFlow_0yrabnf</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:startEvent id="AssignPnf_StartEvent">
<bpmn:outgoing>SequenceFlow_1fu9o4x</bpmn:outgoing>
</bpmn:startEvent>
+ <bpmn:sequenceFlow id="SequenceFlow_0yrabnf" sourceRef="CreatePnfEntryInAai" targetRef="Task_UpdatePnfOrchestrationStatusAssigned" />
+ <bpmn:sequenceFlow id="SequenceFlow_1yb16sd" sourceRef="Task_UpdatePnfOrchestrationStatusAssigned" targetRef="AaiEntryExists" />
+ <bpmn:serviceTask id="Task_UpdatePnfOrchestrationStatusAssigned" name="Update Pnf Orchestration Status to Assigned" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusAssignedPnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+ <bpmn:incoming>SequenceFlow_0yrabnf</bpmn:incoming>
+ <bpmn:outgoing>SequenceFlow_1yb16sd</bpmn:outgoing>
+ </bpmn:serviceTask>
+ <bpmn:endEvent id="AaiEntryExists" name="AAI entry exists">
+ <bpmn:incoming>SequenceFlow_1yb16sd</bpmn:incoming>
+ </bpmn:endEvent>
<bpmn:association id="Association_1le3nwi" sourceRef="AssignPnf_StartEvent" targetRef="TextAnnotation_184cxp4" />
<bpmn:textAnnotation id="TextAnnotation_184cxp4">
<bpmn:text>Inputs:
- - pnfName - String
-</bpmn:text>
+ - pnfName - String</bpmn:text>
</bpmn:textAnnotation>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_0go8wi3">
<bpmndi:BPMNShape id="Participant_1dwc5st_di" bpmnElement="Participant_1dwc5st" isHorizontal="true">
- <dc:Bounds x="160" y="80" width="646" height="391" />
+ <dc:Bounds x="160" y="80" width="738" height="391" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Participant_0gycee4_di" bpmnElement="Participant_0gycee4" isHorizontal="true">
<dc:Bounds x="260" y="567" width="502" height="60" />
@@ -51,19 +55,26 @@
<di:waypoint x="237" y="203" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="EndEvent_1wfgsdz_di" bpmnElement="AaiEntryExists">
- <dc:Bounds x="722" y="269" width="36" height="36" />
+ <dc:Bounds x="772" y="269" width="36" height="36" />
<bpmndi:BPMNLabel>
- <dc:Bounds x="703" y="312" width="77" height="14" />
+ <dc:Bounds x="753" y="312" width="77" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
- <bpmndi:BPMNEdge id="SequenceFlow_0l6rtzy_di" bpmnElement="SequenceFlow_0l6rtzy">
- <di:waypoint x="561" y="287" />
- <di:waypoint x="722" y="287" />
- </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1fu9o4x_di" bpmnElement="SequenceFlow_1fu9o4x">
<di:waypoint x="255" y="287" />
<di:waypoint x="461" y="287" />
</bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_0yrabnf_di" bpmnElement="SequenceFlow_0yrabnf">
+ <di:waypoint x="561" y="287" />
+ <di:waypoint x="620" y="287" />
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNShape id="ServiceTask_1kmas9h_di" bpmnElement="Task_UpdatePnfOrchestrationStatusAssigned">
+ <dc:Bounds x="620" y="247" width="100" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNEdge id="SequenceFlow_1yb16sd_di" bpmnElement="SequenceFlow_1yb16sd">
+ <di:waypoint x="720" y="287" />
+ <di:waypoint x="772" y="287" />
+ </bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
index 22089dae1f..dab5102efd 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
@@ -31,8 +31,6 @@ import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.onap.so.client.orchestration.AAIPnfResources;
-import org.onap.so.logger.LoggingAnchor;
import org.camunda.bpm.engine.delegate.BpmnError;
import org.onap.so.bpmn.common.BuildingBlockExecution;
import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
@@ -62,12 +60,14 @@ import org.onap.so.client.exception.ExceptionBuilder;
import org.onap.so.client.orchestration.AAIConfigurationResources;
import org.onap.so.client.orchestration.AAIInstanceGroupResources;
import org.onap.so.client.orchestration.AAINetworkResources;
+import org.onap.so.client.orchestration.AAIPnfResources;
import org.onap.so.client.orchestration.AAIServiceInstanceResources;
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.logger.ErrorCode;
+import org.onap.so.logger.LoggingAnchor;
import org.onap.so.logger.MessageEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -274,18 +274,28 @@ public class AAICreateTasks {
* @param str
* @throws @return
*/
+ public void createPlatformForNetwork(BuildingBlockExecution execution) {
+ try {
+ L3Network network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID);
+ if (network != null) {
+ createPlatformNetwork(network);
+ }
+ } catch (Exception ex) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+ }
+ }
+
+ /**
+ * This method is used for separating (,) from the string.
+ *
+ * @param str
+ * @throws @return
+ */
public void createPlatform(BuildingBlockExecution execution) {
try {
GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
- Platform platform = vnf.getPlatform();
- if (platform != null) {
- if (platform.getPlatformName() == null || "".equals(platform.getPlatformName())) {
- logger.debug("PlatformName is null in input. Skipping create platform...");
- } else {
- List<String> platforms = splitCDL(platform.getPlatformName());
- platforms.stream().forEach(platformName -> aaiVnfResources
- .createPlatformandConnectVnf(new Platform(platformName), vnf));
- }
+ if (vnf != null) {
+ createPlatformVnf(vnf);
}
} catch (Exception ex) {
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
@@ -293,6 +303,30 @@ public class AAICreateTasks {
}
+ protected void createPlatformVnf(GenericVnf vnf) {
+ Platform platform = vnf.getPlatform();
+ if (Strings.isNullOrEmpty(platform.getPlatformName())) {
+ logger.debug("PlatformName is null in input. Skipping create platform...");
+ } else {
+ List<String> platforms = splitCDL(platform.getPlatformName());
+ platforms.stream().forEach(
+ platformName -> aaiVnfResources.createPlatformandConnectVnf(new Platform(platformName), vnf));
+ }
+ }
+
+ protected void createPlatformNetwork(L3Network network) {
+ Platform platform = network.getPlatform();
+ if (platform != null) {
+ if (Strings.isNullOrEmpty(platform.getPlatformName())) {
+ logger.debug("PlatformName is null in input. Skipping create platform...");
+ } else {
+ List<String> platforms = splitCDL(platform.getPlatformName());
+ platforms.stream().forEach(
+ platformName -> aaiNetworkResources.createPlatformAndConnectNetwork(platform, network));
+ }
+ }
+ }
+
/**
* This method is used for separating (,) from the string.
*
@@ -312,22 +346,51 @@ public class AAICreateTasks {
public void createLineOfBusiness(BuildingBlockExecution execution) {
try {
GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
- LineOfBusiness lineOfBusiness = vnf.getLineOfBusiness();
- if (lineOfBusiness != null) {
- if (lineOfBusiness.getLineOfBusinessName() == null
- || "".equals(lineOfBusiness.getLineOfBusinessName())) {
- logger.info("lineOfBusiness is null in input. Skipping create lineOfBusiness...");
- } else {
- List<String> lineOfBussinesses = splitCDL(lineOfBusiness.getLineOfBusinessName());
- lineOfBussinesses.stream().forEach(lobName -> aaiVnfResources
- .createLineOfBusinessandConnectVnf(new LineOfBusiness(lobName), vnf));
- }
+ if (vnf != null) {
+ createLineOfBusinessVnf(vnf);
}
} catch (Exception ex) {
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
}
}
+ public void createLineOfBusinessForNetwork(BuildingBlockExecution execution) {
+ try {
+ L3Network network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID);
+ if (network != null) {
+ createLineOfBusinessNetwork(network);
+ }
+ } catch (Exception ex) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+ }
+ }
+
+ protected void createLineOfBusinessVnf(GenericVnf vnf) {
+ LineOfBusiness lineOfBusiness = vnf.getLineOfBusiness();
+ if (lineOfBusiness != null) {
+ if (Strings.isNullOrEmpty(lineOfBusiness.getLineOfBusinessName())) {
+ logger.info("lineOfBusiness is null in input. Skipping create lineOfBusiness...");
+ } else {
+ List<String> lineOfBussinesses = splitCDL(lineOfBusiness.getLineOfBusinessName());
+ lineOfBussinesses.stream().forEach(
+ lobName -> aaiVnfResources.createLineOfBusinessandConnectVnf(new LineOfBusiness(lobName), vnf));
+ }
+ }
+ }
+
+ protected void createLineOfBusinessNetwork(L3Network network) {
+ LineOfBusiness lineOfBusiness = network.getLineOfBusiness();
+ if (lineOfBusiness != null) {
+ if (Strings.isNullOrEmpty(lineOfBusiness.getLineOfBusinessName())) {
+ logger.info("lineOfBusiness is null in input. Skipping create lineOfBusiness...");
+ } else {
+ List<String> lineOfBussinesses = splitCDL(lineOfBusiness.getLineOfBusinessName());
+ lineOfBussinesses.stream().forEach(lobName -> aaiNetworkResources
+ .createLineOfBusinessAndConnectNetwork(new LineOfBusiness(lobName), network));
+ }
+ }
+ }
+
/**
* This method is used for creating the volume group in A&AI.
*
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java
index dab35931f2..4d5494d18c 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java
@@ -119,6 +119,15 @@ public class AAIUpdateTasks {
}
/**
+ * BPMN access method to update status of Pnf to Assigned in AAI
+ *
+ * @param execution
+ */
+ public void updateOrchestrationStatusAssignedPnf(BuildingBlockExecution execution) {
+ updateOrchestrationStatusForPnf(execution, OrchestrationStatus.ASSIGNED);
+ }
+
+ /**
* BPMN access method to update status of Pnf to Active in AAI
*
* @param execution
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java
index bc702c9fb4..3af65815a6 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java
@@ -30,6 +30,8 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection;
import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
+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.bpmn.servicedecomposition.bbobjects.Subnet;
import org.onap.so.client.aai.AAIObjectPlurals;
@@ -38,8 +40,8 @@ import org.onap.so.client.aai.entities.AAIEdgeLabel;
import org.onap.so.client.aai.entities.AAIResultWrapper;
import org.onap.so.client.aai.entities.uri.AAIResourceUri;
import org.onap.so.client.aai.entities.uri.AAIUriFactory;
-import org.onap.so.client.graphinventory.entities.uri.Depth;
import org.onap.so.client.aai.mapper.AAIObjectMapper;
+import org.onap.so.client.graphinventory.entities.uri.Depth;
import org.onap.so.db.catalog.beans.OrchestrationStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -76,6 +78,22 @@ public class AAINetworkResources {
serviceInstanceURI);
}
+ public void createLineOfBusinessAndConnectNetwork(LineOfBusiness lineOfBusiness, L3Network network) {
+ AAIResourceUri lineOfBusinessURI =
+ AAIUriFactory.createResourceUri(AAIObjectType.LINE_OF_BUSINESS, lineOfBusiness.getLineOfBusinessName());
+ AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId());
+ injectionHelper.getAaiClient().createIfNotExists(lineOfBusinessURI, Optional.of(lineOfBusiness))
+ .connect(networkURI, lineOfBusinessURI);
+ }
+
+ public void createPlatformAndConnectNetwork(Platform platform, L3Network network) {
+ AAIResourceUri platformURI =
+ AAIUriFactory.createResourceUri(AAIObjectType.PLATFORM, platform.getPlatformName());
+ AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId());
+ injectionHelper.getAaiClient().createIfNotExists(platformURI, Optional.of(platform)).connect(networkURI,
+ platformURI);
+ }
+
public void deleteNetwork(L3Network network) {
AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId());
injectionHelper.getAaiClient().delete(networkURI);
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java
index 19877aae16..e26009a1de 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java
@@ -139,6 +139,25 @@ public class AAIUpdateTasksTest extends BaseTaskTest {
aaiUpdateTasks.updateOrchestrationStatusActiveService(execution);
}
+ @Test
+ public void updateOrchestrationStatusAssignedPnfTest() throws Exception {
+ Pnf pnf = preparePnfAndExtractForPnf();
+ doNothing().when(aaiPnfResources).updateOrchestrationStatusPnf(pnf, OrchestrationStatus.ASSIGNED);
+
+ aaiUpdateTasks.updateOrchestrationStatusAssignedPnf(execution);
+
+ verify(aaiPnfResources, times(1)).updateOrchestrationStatusPnf(pnf, OrchestrationStatus.ASSIGNED);
+ }
+
+ @Test
+ public void updateOrchestrationStatusAssignedPnfExceptionTest() throws Exception {
+ Pnf pnf = preparePnfAndExtractForPnf();
+ doThrow(RuntimeException.class).when(aaiPnfResources).updateOrchestrationStatusPnf(pnf,
+ OrchestrationStatus.ASSIGNED);
+
+ expectedException.expect(BpmnError.class);
+ aaiUpdateTasks.updateOrchestrationStatusAssignedPnf(execution);
+ }
@Test
public void updateOrchestrationStatusActivePnfTest() throws Exception {
diff --git a/common/pom.xml b/common/pom.xml
index 51415af446..529841da72 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -59,7 +59,7 @@
<dependency>
<groupId>org.onap.aai.schema-service</groupId>
<artifactId>aai-schema</artifactId>
- <version>1.6.3-SNAPSHOT</version>
+ <version>1.6.3</version>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
diff --git a/common/src/main/java/org/onap/so/security/SoBasicWebSecurityConfigurerAdapter.java b/common/src/main/java/org/onap/so/security/SoBasicWebSecurityConfigurerAdapter.java
index c778dde9af..21176e0d5d 100644
--- a/common/src/main/java/org/onap/so/security/SoBasicWebSecurityConfigurerAdapter.java
+++ b/common/src/main/java/org/onap/so/security/SoBasicWebSecurityConfigurerAdapter.java
@@ -28,6 +28,8 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.firewall.StrictHttpFirewall;
import org.springframework.util.StringUtils;
@@ -44,6 +46,12 @@ public class SoBasicWebSecurityConfigurerAdapter extends WebSecurityConfigurerAd
@Autowired
private SoUserCredentialConfiguration soUserCredentialConfiguration;
+ @Autowired
+ private UserDetailsService userDetailsService;
+
+ @Autowired
+ private BCryptPasswordEncoder passwordEncoder;
+
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests().antMatchers("/manage/health", "/manage/info").permitAll()
@@ -61,8 +69,6 @@ public class SoBasicWebSecurityConfigurerAdapter extends WebSecurityConfigurerAd
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
- auth.userDetailsService(soUserCredentialConfiguration.userDetailsService())
- .passwordEncoder(soUserCredentialConfiguration.passwordEncoder());
+ auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
-
}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java
index e9f17c42d0..17377d881a 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java
@@ -2,10 +2,10 @@ package org.onap.so.apihandlerinfra;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.ws.rs.core.UriBuilder;
import javax.xml.bind.DatatypeConverter;
import org.camunda.bpm.engine.impl.persistence.entity.HistoricActivityInstanceEntity;
import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
@@ -42,10 +42,29 @@ public class CamundaRequestHandler {
@Autowired
private Environment env;
+ private String buildCamundaUrlString(boolean historyLookup, boolean sort, boolean active, String lookupId) {
+ UriBuilder uriBuilder = UriBuilder.fromUri(env.getProperty("mso.camundaURL"));
+ if (historyLookup) {
+ uriBuilder.path(env.getProperty("mso.camunda.rest.history.uri"));
+ uriBuilder.queryParam("processInstanceBusinessKey", lookupId);
+ if (active) {
+ uriBuilder.queryParam("active", true);
+ }
+ if (sort) {
+ uriBuilder.queryParam("sortBy", "startTime");
+ uriBuilder.queryParam("sortOrder", "desc");
+ }
+ } else {
+ uriBuilder.path(env.getProperty("mso.camunda.rest.activity.uri"));
+ uriBuilder.queryParam("processInstanceId", lookupId);
+ }
+ uriBuilder.queryParam("maxResults", 1);
+ return uriBuilder.build().toString();
+ }
+
public ResponseEntity<List<HistoricProcessInstanceEntity>> getCamundaProcessInstanceHistory(String requestId,
- boolean retry) {
- String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
- String targetUrl = env.getProperty("mso.camundaURL") + path;
+ boolean retry, boolean activeOnly, boolean sort) {
+ String targetUrl = buildCamundaUrlString(true, sort, activeOnly, requestId);
HttpHeaders headers =
setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
@@ -77,8 +96,7 @@ public class CamundaRequestHandler {
protected ResponseEntity<List<HistoricActivityInstanceEntity>> getCamundaActivityHistory(String processInstanceId) {
RestTemplate restTemplate = getRestTemplate(false);
- String path = env.getProperty("mso.camunda.rest.activity.uri") + processInstanceId;
- String targetUrl = env.getProperty("mso.camundaURL") + path;
+ String targetUrl = buildCamundaUrlString(false, false, false, processInstanceId);
HttpHeaders headers =
setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
@@ -92,7 +110,7 @@ public class CamundaRequestHandler {
String taskInformation = null;
try {
- response = getCamundaProcessInstanceHistory(requestId, false);
+ response = getCamundaProcessInstanceHistory(requestId, false, false, true);
} catch (RestClientException e) {
logger.warn("Error querying Camunda for process-instance history for requestId: {}, exception: {}",
requestId, e.getMessage());
@@ -112,7 +130,6 @@ public class CamundaRequestHandler {
String taskInformation = null;
if (historicProcessInstanceList != null && !historicProcessInstanceList.isEmpty()) {
- Collections.reverse(historicProcessInstanceList);
processInstanceId = historicProcessInstanceList.get(0).getId();
} else {
logger.warn("No processInstances returned for requestId: {} to get TaskInformation", requestId);
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
index 0c6ad0ba22..75b7e74d49 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
@@ -356,7 +356,7 @@ public class RequestHandlerUtils extends AbstractRestHandler {
String requestId = duplicateRecord.getRequestId();
ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
try {
- response = camundaRequestHandler.getCamundaProcessInstanceHistory(requestId, true);
+ response = camundaRequestHandler.getCamundaProcessInstanceHistory(requestId, true, true, false);
} catch (RestClientException e) {
logger.error("Error querying Camunda for process-instance history for requestId: {}, exception: {}",
requestId, e.getMessage());
@@ -370,13 +370,8 @@ public class RequestHandlerUtils extends AbstractRestHandler {
if (response.getBody().isEmpty()) {
updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
- }
- for (HistoricProcessInstance instance : response.getBody()) {
- if (("ACTIVE").equals(instance.getState())) {
- return true;
- } else {
- updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
- }
+ } else {
+ return true;
}
return false;
}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
index babefd9478..baa7af77a5 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
@@ -25,9 +25,9 @@ mso:
task:
uri: /sobpmnengine/task
history:
- uri: /sobpmnengine/history/process-instance?variables=mso-request-id_eq_
+ uri: /sobpmnengine/history/process-instance
activity:
- uri: /sobpmnengine/history/activity-instance?processInstanceId=
+ uri: /sobpmnengine/history/activity-instance
camundaURL: http://localhost:8089
camundaAuth: E8E19DD16CC90D2E458E8FF9A884CC0452F8F3EB8E321F96038DE38D5C1B0B02DFAE00B88E2CF6E2A4101AB2C011FC161212EE
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerTest.java
index 4dc281b3fc..5f41257808 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerTest.java
@@ -44,12 +44,13 @@ public class CamundaRequestHandlerTest extends BaseTest {
@Test
public void timeoutTest() {
wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_6718de35-b9a5-4670-b19f-a0f4ac22bfaf"))
+ ("/sobpmnengine/history/process-instance?processInstanceBusinessKey=6718de35-b9a5-4670-b19f-a0f4ac22bfaf&active=true&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withBodyFile("Camunda/HistoryCheckResponse.json")
.withStatus(org.apache.http.HttpStatus.SC_OK).withFixedDelay(40000)));
thrown.expect(ResourceAccessException.class);
- camundaRequestHandler.getCamundaProcessInstanceHistory("6718de35-b9a5-4670-b19f-a0f4ac22bfaf", false);
+ camundaRequestHandler.getCamundaProcessInstanceHistory("6718de35-b9a5-4670-b19f-a0f4ac22bfaf", false, true,
+ false);
}
}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerUnitTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerUnitTest.java
index 261b64f2e6..53b9207337 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerUnitTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/CamundaRequestHandlerUnitTest.java
@@ -105,10 +105,8 @@ public class CamundaRequestHandlerUnitTest {
activityInstanceResponse =
new ResponseEntity<List<HistoricActivityInstanceEntity>>(activityInstanceList, HttpStatus.ACCEPTED);
- doReturn("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_").when(env)
- .getProperty("mso.camunda.rest.history.uri");
- doReturn("/sobpmnengine/history/activity-instance?processInstanceId=").when(env)
- .getProperty("mso.camunda.rest.activity.uri");
+ doReturn("/sobpmnengine/history/process-instance").when(env).getProperty("mso.camunda.rest.history.uri");
+ doReturn("/sobpmnengine/history/activity-instance").when(env).getProperty("mso.camunda.rest.activity.uri");
doReturn("auth").when(env).getRequiredProperty("mso.camundaAuth");
doReturn("key").when(env).getRequiredProperty("mso.msoKey");
doReturn("http://localhost:8089").when(env).getProperty("mso.camundaURL");
@@ -208,9 +206,9 @@ public class CamundaRequestHandlerUnitTest {
@Test
public void getTaskName() throws IOException, ContactCamundaException {
doReturn(processInstanceResponse).when(camundaRequestHandler).getCamundaProcessInstanceHistory(REQUEST_ID,
- false);
+ false, false, true);
doReturn(activityInstanceResponse).when(camundaRequestHandler)
- .getCamundaActivityHistory("c4c6b647-a26e-11e9-b144-0242ac14000b");
+ .getCamundaActivityHistory("c2fd4066-a26e-11e9-b144-0242ac14000b");
doReturn("Last task executed: BB to Execute").when(camundaRequestHandler).getActivityName(activityInstanceList);
String expectedTaskName = "Last task executed: BB to Execute";
@@ -255,7 +253,7 @@ public class CamundaRequestHandlerUnitTest {
@Test
public void getTaskNameProcessInstanceLookupFailureTest() throws IOException, ContactCamundaException {
doThrow(HttpClientErrorException.class).when(camundaRequestHandler).getCamundaProcessInstanceHistory(REQUEST_ID,
- false);
+ false, false, true);
String result = camundaRequestHandler.getTaskName(REQUEST_ID);
assertNull(result);
@@ -265,8 +263,8 @@ public class CamundaRequestHandlerUnitTest {
public void getCamundaActivityHistoryTest() throws IOException, ContactCamundaException {
HttpHeaders headers = setHeaders();
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
- String targetUrl = "http://localhost:8089/sobpmnengine/history/activity-instance?processInstanceId="
- + "c4c6b647-a26e-11e9-b144-0242ac14000b";
+ String targetUrl =
+ "http://localhost:8089/sobpmnengine/history/activity-instance?processInstanceId=c4c6b647-a26e-11e9-b144-0242ac14000b&maxResults=1";
doReturn(activityInstanceResponse).when(restTemplate).exchange(targetUrl, HttpMethod.GET, requestEntity,
new ParameterizedTypeReference<List<HistoricActivityInstanceEntity>>() {});
doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
@@ -279,8 +277,8 @@ public class CamundaRequestHandlerUnitTest {
public void getCamundaActivityHistoryErrorTest() {
HttpHeaders headers = setHeaders();
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
- String targetUrl = "http://localhost:8089/sobpmnengine/history/activity-instance?processInstanceId="
- + "c4c6b647-a26e-11e9-b144-0242ac14000b";
+ String targetUrl =
+ "http://localhost:8089/sobpmnengine/history/activity-instance?processInstanceId=c4c6b647-a26e-11e9-b144-0242ac14000b&maxResults=1";
doThrow(new ResourceAccessException("IOException")).when(restTemplate).exchange(targetUrl, HttpMethod.GET,
requestEntity, new ParameterizedTypeReference<List<HistoricActivityInstanceEntity>>() {});
doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
@@ -296,14 +294,14 @@ public class CamundaRequestHandlerUnitTest {
public void getCamundaProccesInstanceHistoryTest() throws IOException, ContactCamundaException {
HttpHeaders headers = setHeaders();
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
- String targetUrl =
- "http://localhost:8089/sobpmnengine/history/process-instance?variables=mso-request-id_eq_" + REQUEST_ID;
+ String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
+ + REQUEST_ID + "&active=true&maxResults=1";
doReturn(processInstanceResponse).when(restTemplate).exchange(targetUrl, HttpMethod.GET, requestEntity,
new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
ResponseEntity<List<HistoricProcessInstanceEntity>> actualResponse =
- camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, false);
+ camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, false, true, false);
assertEquals(processInstanceResponse, actualResponse);
}
@@ -311,14 +309,14 @@ public class CamundaRequestHandlerUnitTest {
public void getCamundaProccesInstanceHistoryRetryTest() {
HttpHeaders headers = setHeaders();
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
- String targetUrl =
- "http://localhost:8089/sobpmnengine/history/process-instance?variables=mso-request-id_eq_" + REQUEST_ID;
+ String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
+ + REQUEST_ID + "&active=true&maxResults=1";
doThrow(new ResourceAccessException("I/O error")).when(restTemplateRetry).exchange(targetUrl, HttpMethod.GET,
requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
thrown.expect(ResourceAccessException.class);
- camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, true);
+ camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, true, true, false);
verify(restTemplateRetry, times(2)).exchange(targetUrl, HttpMethod.GET, requestEntity,
new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
@@ -328,14 +326,14 @@ public class CamundaRequestHandlerUnitTest {
public void getCamundaProccesInstanceHistoryNoRetryTest() {
HttpHeaders headers = setHeaders();
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
- String targetUrl =
- "http://localhost:8089/sobpmnengine/history/process-instance?variables=mso-request-id_eq_" + REQUEST_ID;
+ String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
+ + REQUEST_ID + "&sortBy=startTime&sortOrder=desc&maxResults=1";
doThrow(HttpClientErrorException.class).when(restTemplate).exchange(targetUrl, HttpMethod.GET, requestEntity,
new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
thrown.expect(HttpStatusCodeException.class);
- camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, false);
+ camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, false, false, true);
verify(restTemplate, times(1)).exchange(targetUrl, HttpMethod.GET, requestEntity,
new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {});
@@ -345,15 +343,15 @@ public class CamundaRequestHandlerUnitTest {
public void getCamundaProccesInstanceHistoryFailThenSuccessTest() throws IOException, ContactCamundaException {
HttpHeaders headers = setHeaders();
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
- String targetUrl =
- "http://localhost:8089/sobpmnengine/history/process-instance?variables=mso-request-id_eq_" + REQUEST_ID;
+ String targetUrl = "http://localhost:8089/sobpmnengine/history/process-instance?processInstanceBusinessKey="
+ + REQUEST_ID + "&sortBy=startTime&sortOrder=desc&maxResults=1";
when(restTemplateRetry.exchange(targetUrl, HttpMethod.GET, requestEntity,
new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>() {}))
.thenThrow(new ResourceAccessException("I/O Exception")).thenReturn(processInstanceResponse);
doReturn(headers).when(camundaRequestHandler).setCamundaHeaders("auth", "key");
ResponseEntity<List<HistoricProcessInstanceEntity>> actualResponse =
- camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, true);
+ camundaRequestHandler.getCamundaProcessInstanceHistory(REQUEST_ID, true, false, true);
assertEquals(processInstanceResponse, actualResponse);
verify(restTemplateRetry, times(2)).exchange(targetUrl, HttpMethod.GET, requestEntity,
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
index aa6a3836c1..46fd2f9025 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
@@ -101,8 +101,8 @@ public class OrchestrationRequestsTest extends BaseTest {
.withBody(new String(Files.readAllBytes(
Paths.get("src/test/resources/OrchestrationRequest/ProcessInstanceHistoryResponse.json"))))
.withStatus(org.apache.http.HttpStatus.SC_OK)));
- wireMockServer.stubFor(
- get(("/sobpmnengine/history/activity-instance?processInstanceId=c4c6b647-a26e-11e9-b144-0242ac14000b"))
+ wireMockServer.stubFor(get(
+ ("/sobpmnengine/history/activity-instance?processInstanceId=c2fd4066-a26e-11e9-b144-0242ac14000b&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withBody(new String(Files.readAllBytes(Paths.get(
"src/test/resources/OrchestrationRequest/ActivityInstanceHistoryResponse.json"))))
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/RequestHandlerUtilsTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/RequestHandlerUtilsTest.java
index abdf38dfa6..7f9ff98b19 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/RequestHandlerUtilsTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/RequestHandlerUtilsTest.java
@@ -299,7 +299,7 @@ public class RequestHandlerUtilsTest extends BaseTest {
@Test
public void camundaHistoryCheckTest() throws ContactCamundaException, RequestDbFailureException {
wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+ ("/sobpmnengine/history/process-instance?processInstanceBusinessKey=f0a35706-efc4-4e27-80ea-a995d7a2a40f&active=true&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withBodyFile("Camunda/HistoryCheckResponse.json")
.withStatus(org.apache.http.HttpStatus.SC_OK)));
@@ -314,7 +314,7 @@ public class RequestHandlerUtilsTest extends BaseTest {
@Test
public void camundaHistoryCheckNoneFoundTest() throws ContactCamundaException, RequestDbFailureException {
wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+ ("/sobpmnengine/history/process-instance?processInstanceBusinessKey=f0a35706-efc4-4e27-80ea-a995d7a2a40f&active=true&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withBody("[]").withStatus(org.apache.http.HttpStatus.SC_OK)));
@@ -326,21 +326,6 @@ public class RequestHandlerUtilsTest extends BaseTest {
}
@Test
- public void camundaHistoryCheckNotInProgressTest() throws ContactCamundaException, RequestDbFailureException {
- wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
- .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
- .withBodyFile("Camunda/HistoryCheckResponseCompleted.json")
- .withStatus(org.apache.http.HttpStatus.SC_OK)));
-
- InfraActiveRequests duplicateRecord = new InfraActiveRequests();
- duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
- boolean inProgress = false;
- inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
- assertFalse(inProgress);
- }
-
- @Test
public void setCamundaHeadersTest() throws ContactCamundaException, RequestDbFailureException {
String encryptedAuth = "015E7ACF706C6BBF85F2079378BDD2896E226E09D13DC2784BA309E27D59AB9FAD3A5E039DF0BB8408"; // user:password
String key = "07a7159d3bf51a0e53be7a8f89699be7";
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
index 006b82ac58..f566628ee3 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
@@ -2440,7 +2440,7 @@ public class ServiceInstancesTest extends BaseTest {
.withBodyFile("InfraActiveRequests/createInfraActiveRequests.json")
.withStatus(HttpStatus.SC_ACCEPTED)));
wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+ ("/sobpmnengine/history/process-instance?processInstanceBusinessKey=f0a35706-efc4-4e27-80ea-a995d7a2a40f&active=true&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withBodyFile("Camunda/HistoryCheckResponse.json")
.withStatus(org.apache.http.HttpStatus.SC_OK)));
@@ -2463,7 +2463,7 @@ public class ServiceInstancesTest extends BaseTest {
.withBodyFile("InfraActiveRequests/createInfraActiveRequests.json")
.withStatus(HttpStatus.SC_ACCEPTED)));
wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+ ("/sobpmnengine/history/process-instance?processInstanceBusinessKey=f0a35706-efc4-4e27-80ea-a995d7a2a40f&active=true&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withStatus(org.apache.http.HttpStatus.SC_INTERNAL_SERVER_ERROR)));
@@ -2897,7 +2897,7 @@ public class ServiceInstancesTest extends BaseTest {
@Test
public void camundaHistoryCheckTest() throws ContactCamundaException, RequestDbFailureException {
wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+ ("/sobpmnengine/history/process-instance?processInstanceBusinessKey=f0a35706-efc4-4e27-80ea-a995d7a2a40f&active=true&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withBodyFile("Camunda/HistoryCheckResponse.json")
.withStatus(org.apache.http.HttpStatus.SC_OK)));
@@ -2912,7 +2912,7 @@ public class ServiceInstancesTest extends BaseTest {
@Test
public void camundaHistoryCheckNoneFoundTest() throws ContactCamundaException, RequestDbFailureException {
wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+ ("/sobpmnengine/history/process-instance?processInstanceBusinessKey=f0a35706-efc4-4e27-80ea-a995d7a2a40f&active=true&maxResults=1"))
.willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.withBody("[]").withStatus(org.apache.http.HttpStatus.SC_OK)));
@@ -2924,21 +2924,6 @@ public class ServiceInstancesTest extends BaseTest {
}
@Test
- public void camundaHistoryCheckNotInProgressTest() throws ContactCamundaException, RequestDbFailureException {
- wireMockServer.stubFor(get(
- ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
- .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
- .withBodyFile("Camunda/HistoryCheckResponseCompleted.json")
- .withStatus(org.apache.http.HttpStatus.SC_OK)));
-
- InfraActiveRequests duplicateRecord = new InfraActiveRequests();
- duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
- boolean inProgress = false;
- inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
- assertFalse(inProgress);
- }
-
- @Test
public void handleReplaceInstance_Test() throws JsonParseException, JsonMappingException, IOException {
String replaceVfModule = inputStream("/ReplaceVfModule.json");
ObjectMapper mapper = new ObjectMapper();
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/ProcessInstanceHistoryResponse.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/ProcessInstanceHistoryResponse.json
index faa283463b..4ff2663145 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/ProcessInstanceHistoryResponse.json
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/ProcessInstanceHistoryResponse.json
@@ -19,26 +19,5 @@
"caseInstanceId":null,
"tenantId":null,
"state":"COMPLETED"
- },
- {
- "id":"c4c6b647-a26e-11e9-b144-0242ac14000b",
- "businessKey":null,
- "processDefinitionId":"ExecuteBuildingBlock:1:a46566de-a26b-11e9-b144-0242ac14000b",
- "processDefinitionKey":"ExecuteBuildingBlock",
- "processDefinitionName":"ExecuteBuildingBlock",
- "processDefinitionVersion":1,
- "startTime":"2019-07-09T17:27:04.298+0000",
- "endTime":"2019-07-09T17:27:05.690+0000",
- "removalTime":null,
- "durationInMillis":1392,
- "startUserId":null,
- "startActivityId":"Start_ExecuteBuildingBlock",
- "deleteReason":null,
- "rootProcessInstanceId":"c2fd4066-a26e-11e9-b144-0242ac14000b",
- "superProcessInstanceId":"c2fd4066-a26e-11e9-b144-0242ac14000b",
- "superCaseInstanceId":null,
- "caseInstanceId":null,
- "tenantId":null,
- "state":"COMPLETED"
}
] \ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/Camunda/HistoryCheckResponseCompleted.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/Camunda/HistoryCheckResponseCompleted.json
deleted file mode 100644
index fdf0e9a286..0000000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/Camunda/HistoryCheckResponseCompleted.json
+++ /dev/null
@@ -1,21 +0,0 @@
-[
- {
- "id":"d1a0456e-1458-11e9-8afb-0242ac190006",
- "businessKey":null,
- "processDefinitionId":"86cfa113-141a-11e9-8afb-0242ac190006",
- "processDefinitionKey":"UnassignServiceInstanceATTBB",
- "processDefinitionName":"UnassignServiceInstanceATTBB",
- "processDefinitionVersion":1,
- "startTime":"2019-01-09T21:52:11.813+0000",
- "endTime":"2019-01-09T21:52:12.353+0000",
- "durationInMillis":540,
- "startUserId":null,
- "startActivityId":"Start_UnassignServiceInstanceBB",
- "deleteReason":null,
- "superProcessInstanceId":"d15f6c9e-1458-11e9-8afb-0242ac190006",
- "superCaseInstanceId":null,
- "caseInstanceId":null,
- "tenantId":null,
- "state":"COMPLETED"
- }
-] \ No newline at end of file