Fix sdc controller 77/44877/1
authorDeterme, Sebastien (sd378r) <sd378r@intl.att.com>
Thu, 26 Apr 2018 12:45:49 +0000 (14:45 +0200)
committerDeterme, Sebastien (sd378r) <sd378r@intl.att.com>
Thu, 26 Apr 2018 12:45:49 +0000 (14:45 +0200)
Support multiple closed loop deployment in the same service
and add test for mutliple closed loops

Issue-ID: CLAMP-151
Change-Id: Ied352ecb10fee4b807fa4bbfebc5934fd62cba3e
Signed-off-by: Determe, Sebastien (sd378r) <sd378r@intl.att.com>
src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java
src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml [new file with mode: 0644]

index e28e8ab..1731244 100644 (file)
@@ -99,12 +99,19 @@ public class CsarInstallerImpl implements CsarInstaller {
 
     @Override
     public boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException {
-        return (CldsModel.retrieve(cldsDao, buildModelName(csar), true).getId() != null) ? true : false;
+        boolean alreadyInstalled = true;
+        for (Entry<String, BlueprintArtifact> blueprint : csar.getMapOfBlueprints().entrySet()) {
+            alreadyInstalled = alreadyInstalled
+                    && (CldsModel.retrieve(cldsDao, buildModelName(csar, blueprint.getKey()), true).getId() != null)
+                            ? true
+                            : false;
+        }
+        return alreadyInstalled;
     }
 
-    public static String buildModelName(CsarHandler csar) {
+    public static String buildModelName(CsarHandler csar, String resourceInstanceName) {
         return MODEL_NAME_PREFIX + csar.getSdcCsarHelper().getServiceMetadata().getValue("name") + "_v"
-                + csar.getSdcNotification().getServiceVersion().replace('.', '_');
+                + csar.getSdcNotification().getServiceVersion().replace('.', '_') + "_" + resourceInstanceName;
     }
 
     @Override
@@ -196,7 +203,8 @@ public class CsarInstallerImpl implements CsarInstaller {
                 "{\"global\":[{\"name\":\"service\",\"value\":[\"" + blueprintArtifact.getDcaeBlueprint() + "\"]}]}");
         template.setImageText(
                 IOUtils.toString(appContext.getResource(configFiles.getSvgXmlFilePath()).getInputStream()));
-        template.setName(TEMPLATE_NAME_PREFIX + buildModelName(csar));
+        template.setName(TEMPLATE_NAME_PREFIX
+                + buildModelName(csar, blueprintArtifact.getResourceAttached().getResourceInstanceName()));
         template.save(cldsDao, null);
         logger.info("Fake Clds Template created for blueprint " + blueprintArtifact.getBlueprintArtifactName()
                 + " with name " + template.getName());
@@ -207,7 +215,7 @@ public class CsarInstallerImpl implements CsarInstaller {
             CldsTemplate cldsTemplate, String serviceTypeId) throws SdcArtifactInstallerException {
         try {
             CldsModel cldsModel = new CldsModel();
-            cldsModel.setName(buildModelName(csar));
+            cldsModel.setName(buildModelName(csar, blueprintArtifact.getResourceAttached().getResourceInstanceName()));
             cldsModel.setBlueprintText(blueprintArtifact.getDcaeBlueprint());
             cldsModel.setTemplateName(cldsTemplate.getName());
             cldsModel.setTemplateId(cldsTemplate.getId());
index 9395df4..f2b9593 100644 (file)
@@ -67,7 +67,9 @@ public class CsarInstallerItCase {
     private static final String CSAR_ARTIFACT_NAME = "testArtifact.csar";
     private static final String INVARIANT_SERVICE_UUID = "4cc5b45a-1f63-4194-8100-cd8e14248c92";
     private static final String INVARIANT_RESOURCE1_UUID = "07e266fc-49ab-4cd7-8378-ca4676f1b9ec";
-    private static final String INSTANCE_NAME_RESOURCE1 = "ResourceInstanceName";
+    private static final String INVARIANT_RESOURCE2_UUID = "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad";
+    private static final String INSTANCE_NAME_RESOURCE1 = "ResourceInstanceName1";
+    private static final String INSTANCE_NAME_RESOURCE2 = "ResourceInstanceName2";
     @Autowired
     private CsarInstaller csarInstaller;
     @Autowired
@@ -88,30 +90,43 @@ public class CsarInstallerItCase {
         fail("Should have raised an SdcArtifactInstallerException");
     }
 
+    private BlueprintArtifact buildFakeBuildprintArtifact(String instanceName, String invariantResourceUuid,
+            String blueprintFilePath, String csarArtifactName, String invariantServiceUuid) throws IOException {
+        IResourceInstance resource = Mockito.mock(IResourceInstance.class);
+        Mockito.when(resource.getResourceInstanceName()).thenReturn(instanceName);
+        Mockito.when(resource.getResourceInvariantUUID()).thenReturn(invariantResourceUuid);
+        BlueprintArtifact blueprintArtifact = Mockito.mock(BlueprintArtifact.class);
+        Mockito.when(blueprintArtifact.getDcaeBlueprint())
+                .thenReturn(ResourceFileUtil.getResourceAsString(blueprintFilePath));
+        Mockito.when(blueprintArtifact.getBlueprintArtifactName()).thenReturn(csarArtifactName);
+        Mockito.when(blueprintArtifact.getBlueprintInvariantServiceUuid()).thenReturn(invariantServiceUuid);
+        Mockito.when(blueprintArtifact.getResourceAttached()).thenReturn(resource);
+        return blueprintArtifact;
+    }
+
     private CsarHandler buildFakeCsarHandler(String generatedName) throws IOException {
         // Create fake notification
         INotificationData notificationData = Mockito.mock(INotificationData.class);
         Mockito.when(notificationData.getServiceVersion()).thenReturn("1.0");
         // Create fake resource in notification
+        CsarHandler csarHandler = Mockito.mock(CsarHandler.class);
         List<IResourceInstance> listResources = new ArrayList<>();
-        IResourceInstance resource = Mockito.mock(IResourceInstance.class);
-        Mockito.when(resource.getResourceInstanceName()).thenReturn(INSTANCE_NAME_RESOURCE1);
-        Mockito.when(resource.getResourceInvariantUUID()).thenReturn(INVARIANT_RESOURCE1_UUID);
-        listResources.add(resource);
         Mockito.when(notificationData.getResources()).thenReturn(listResources);
-        // Create fake blueprint artifact
-        BlueprintArtifact blueprintArtifact = Mockito.mock(BlueprintArtifact.class);
-        Mockito.when(blueprintArtifact.getDcaeBlueprint())
-                .thenReturn(ResourceFileUtil.getResourceAsString("example/sdc/blueprint-dcae/tca.yaml"));
-        Mockito.when(blueprintArtifact.getBlueprintArtifactName()).thenReturn(CSAR_ARTIFACT_NAME);
-        Mockito.when(blueprintArtifact.getBlueprintInvariantServiceUuid()).thenReturn(INVARIANT_SERVICE_UUID);
-        Mockito.when(blueprintArtifact.getResourceAttached()).thenReturn(resource);
         Map<String, BlueprintArtifact> blueprintMap = new HashMap<>();
-        blueprintMap.put("resourceid", blueprintArtifact);
+        Mockito.when(csarHandler.getMapOfBlueprints()).thenReturn(blueprintMap);
+        // Create fake blueprint artifact 1
+        BlueprintArtifact blueprintArtifact = buildFakeBuildprintArtifact(INSTANCE_NAME_RESOURCE1,
+                INVARIANT_RESOURCE1_UUID, "example/sdc/blueprint-dcae/tca.yaml", CSAR_ARTIFACT_NAME,
+                INVARIANT_SERVICE_UUID);
+        listResources.add(blueprintArtifact.getResourceAttached());
+        blueprintMap.put(blueprintArtifact.getResourceAttached().getResourceInstanceName(), blueprintArtifact);
+        // Create fake blueprint artifact 2
+        blueprintArtifact = buildFakeBuildprintArtifact(INSTANCE_NAME_RESOURCE2, INVARIANT_RESOURCE2_UUID,
+                "example/sdc/blueprint-dcae/tca_2.yaml", CSAR_ARTIFACT_NAME, INVARIANT_SERVICE_UUID);
+        listResources.add(blueprintArtifact.getResourceAttached());
+        blueprintMap.put(blueprintArtifact.getResourceAttached().getResourceInstanceName(), blueprintArtifact);
         // Build fake csarhandler
-        CsarHandler csarHandler = Mockito.mock(CsarHandler.class);
         Mockito.when(csarHandler.getSdcNotification()).thenReturn(notificationData);
-        Mockito.when(csarHandler.getMapOfBlueprints()).thenReturn(blueprintMap);
         // Build fake csar Helper
         ISdcCsarHelper csarHelper = Mockito.mock(ISdcCsarHelper.class);
         Metadata data = Mockito.mock(Metadata.class);
@@ -138,23 +153,24 @@ public class CsarInstallerItCase {
         CsarHandler csar = buildFakeCsarHandler(generatedName);
         csarInstaller.installTheCsar(csar);
         // Get the template back from DB
-        CldsTemplate templateFromDb = CldsTemplate.retrieve(cldsDao,
-                CsarInstallerImpl.TEMPLATE_NAME_PREFIX + CsarInstallerImpl.buildModelName(csar), false);
+        CldsTemplate templateFromDb = CldsTemplate.retrieve(cldsDao, CsarInstallerImpl.TEMPLATE_NAME_PREFIX
+                + CsarInstallerImpl.buildModelName(csar, INSTANCE_NAME_RESOURCE1), false);
         assertNotNull(templateFromDb);
         assertNotNull(templateFromDb.getBpmnText());
         assertNotNull(templateFromDb.getImageText());
         assertNotNull(templateFromDb.getPropText());
         assertTrue(templateFromDb.getPropText().contains("global")
                 && templateFromDb.getPropText().contains("node_templates:"));
-        assertEquals(templateFromDb.getName(),
-                CsarInstallerImpl.TEMPLATE_NAME_PREFIX + CsarInstallerImpl.buildModelName(csar));
+        assertEquals(templateFromDb.getName(), CsarInstallerImpl.TEMPLATE_NAME_PREFIX
+                + CsarInstallerImpl.buildModelName(csar, INSTANCE_NAME_RESOURCE1));
         // Get the Model back from DB
-        CldsModel modelFromDb = CldsModel.retrieve(cldsDao, CsarInstallerImpl.buildModelName(csar), true);
+        CldsModel modelFromDb = CldsModel.retrieve(cldsDao,
+                CsarInstallerImpl.buildModelName(csar, INSTANCE_NAME_RESOURCE2), true);
         assertNotNull(modelFromDb);
         assertNotNull(modelFromDb.getBpmnText());
         assertNotNull(modelFromDb.getImageText());
         assertNotNull(modelFromDb.getPropText());
-        assertEquals(CsarInstallerImpl.buildModelName(csar), modelFromDb.getName());
+        assertEquals(CsarInstallerImpl.buildModelName(csar, INSTANCE_NAME_RESOURCE2), modelFromDb.getName());
         assertEquals(CsarInstallerImpl.CONTROL_NAME_PREFIX, modelFromDb.getControlNamePrefix());
     }
 }
diff --git a/src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml b/src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml
new file mode 100644 (file)
index 0000000..f73119f
--- /dev/null
@@ -0,0 +1,169 @@
+tosca_definitions_version: cloudify_dsl_1_3
+imports:
+  - "http://www.getcloudify.org/spec/cloudify/3.4/types.yaml"
+  - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/dockerplugin/3.2.0/dockerplugin_types.yaml
+  - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/relationshipplugin/1.0.0/relationshipplugin_types.yaml
+  - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/dcaepolicyplugin/2.3.0/dcaepolicyplugin_types.yaml
+
+inputs:
+  dh_override:
+    type: string
+    default: "component_dockerhost"
+  dh_location_id:
+    type: string
+    default: "zone1"
+  aaiEnrichmentHost:
+    type: string
+    default: "none"
+  aaiEnrichmentPort:
+    type: string    
+    default: 8443
+  enableAAIEnrichment:
+    type: string
+    default: false
+  dmaap_host:
+    type: string
+    default: dmaap.onap-message-router   
+  dmaap_port:
+    type: string
+    default: 3904    
+  enableRedisCaching:
+    type: string
+    default: false    
+  redisHosts:
+    type: string      
+  tag_version:
+    type: string
+    default: "nexus3.onap.org:10001/onap//onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.0.0"
+  consul_host:
+    type: string
+    default: consul-server.onap-consul
+  consul_port:
+    type: string
+    default: "8500"
+  cbs_host:
+    type: string
+    default: "config-binding-service.dcae"
+  cbs_port:
+    type: string
+    default: "10000"
+  policy_id:
+    type: string
+    default: "none"
+  external_port:
+    type: string
+    description: "Port for CDAPgui to be exposed"
+    default: "32010"
+
+node_templates:
+  docker_service_host:
+    properties:
+      docker_host_override:
+        get_input: dh_override
+      location_id:
+        get_input: dh_location_id
+    type: dcae.nodes.SelectedDockerHost
+  tca_docker:
+    relationships:
+       - type: dcae.relationships.component_contained_in
+         target: docker_service_host
+       - target: tca_policy
+         type: cloudify.relationships.depends_on        
+    type: dcae.nodes.DockerContainerForComponentsUsingDmaap
+    properties:
+        application_config:
+            app_config:
+                appDescription: DCAE Analytics Threshold Crossing Alert Application
+                appName: dcae-tca
+                tcaAlertsAbatementTableName: TCAAlertsAbatementTable
+                tcaAlertsAbatementTableTTLSeconds: '1728000'
+                tcaSubscriberOutputStreamName: TCASubscriberOutputStream
+                tcaVESAlertsTableName: TCAVESAlertsTable
+                tcaVESAlertsTableTTLSeconds: '1728000'
+                tcaVESMessageStatusTableName: TCAVESMessageStatusTable
+                tcaVESMessageStatusTableTTLSeconds: '86400'
+                thresholdCalculatorFlowletInstances: '2'
+            app_preferences:
+                aaiEnrichmentHost: 
+                    get_input: aaiEnrichmentHost
+                aaiEnrichmentIgnoreSSLCertificateErrors: 'true'
+                aaiEnrichmentPortNumber: '8443'
+                aaiEnrichmentProtocol: https
+                aaiEnrichmentUserName: DCAE
+                aaiEnrichmentUserPassword: DCAE
+                aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query
+                aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf
+                enableAAIEnrichment: 
+                    get_input: enableAAIEnrichment
+                enableRedisCaching: 
+                    get_input: enableRedisCaching
+                redisHosts: 
+                    get_input: redisHosts
+                enableAlertCEFFormat: 'false'
+                publisherContentType: application/json
+                publisherHostName: 
+                    get_input: dmaap_host
+                publisherHostPort: 
+                    get_input: dmaap_port                  
+                publisherMaxBatchSize: '1'
+                publisherMaxRecoveryQueueSize: '100000'
+                publisherPollingInterval: '20000'
+                publisherProtocol: http
+                publisherTopicName: unauthenticated.DCAE_CL_OUTPUT
+                subscriberConsumerGroup: OpenDCAE-c12
+                subscriberConsumerId: c12
+                subscriberContentType: application/json
+                subscriberHostName: 
+                    get_input: dmaap_host
+                subscriberHostPort:
+                    get_input: dmaap_port                                  
+                subscriberMessageLimit: '-1'
+                subscriberPollingInterval: '30000'
+                subscriberProtocol: http
+                subscriberTimeoutMS: '-1'
+                subscriberTopicName: unauthenticated.SEC_MEASUREMENT_OUTPUT
+                tca_policy_default: '{"domain":"measurementsForVfScaling","metricsPerEventName":[{"eventName":"vFirewallBroadcastPackets","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"LESS_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ONSET"},{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":700,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"vLoadBalancer","controlLoopSchemaType":"VM","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"Measurement_vGMUX","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"EQUAL","severity":"MAJOR","closedLoopEventStatus":"ABATED"},{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"GREATER","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]}]}'
+        service_component_type: dcaegen2-analytics_tca    
+        docker_config:
+            healthcheck:
+               endpoint: /healthcheck
+               interval: 15s
+               timeout: 1s
+               type: http
+        image:
+            get_input: tag_version        
+    interfaces:
+      cloudify.interfaces.lifecycle:
+        start:
+          inputs:
+            envs:
+                DMAAPHOST: 
+                    { get_input: dmaap_host }
+                DMAAPPORT:
+                    { get_input: dmaap_port }
+                DMAAPPUBTOPIC: "unauthenticated.DCAE_CL_OUTPUT"
+                DMAAPSUBTOPIC: "unauthenticated.SEC_MEASUREMENT_OUTPUT"
+                AAIHOST: 
+                    { get_input: aaiEnrichmentHost }
+                AAIPORT: 
+                    { get_input: aaiEnrichmentPort }
+                CONSUL_HOST: 
+                    { get_input: consul_host }
+                CONSUL_PORT: 
+                    { get_input: consul_port }
+                CBS_HOST: 
+                    { get_input: cbs_host }
+                CBS_PORT: 
+                    { get_input: cbs_port }
+                CONFIG_BINDING_SERVICE: "config_binding_service"                
+            ports:
+              - concat: ["11011:", { get_input: external_port }]        
+        stop:
+          inputs:
+            cleanup_image: true              
+  tca_policy:
+    type: dcae.nodes.policy
+    properties:
+      policy_id:
+           get_input: policy_id
+