Add properties to model 03/37703/1
authorDeterme, Sebastien (sd378r) <sd378r@intl.att.com>
Thu, 22 Mar 2018 08:17:35 +0000 (09:17 +0100)
committerDeterme, Sebastien (sd378r) <sd378r@intl.att.com>
Thu, 22 Mar 2018 08:23:52 +0000 (09:23 +0100)
Add properties to model created in db + Auto start configuration for
spring

Issue-ID: CLAMP-81
Change-Id: I6598872c6b47963e97c63730a4b6499e2b1a2de2
Signed-off-by: Determe, Sebastien (sd378r) <sd378r@intl.att.com>
src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java
src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java
src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java
src/main/resources/application.properties
src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
src/test/resources/example/dao/template-doc-content.json [new file with mode: 0644]

index f1a9618..f5c658c 100644 (file)
@@ -39,14 +39,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.io.Resource;
-import org.springframework.stereotype.Component;
 
 /**
  * This class maps the SDC config JSON file. This JSON can have multiple
  * sdc-controller config. So the json is loaded in a static way and the instance
  * must specify the controller name that it represents.
  */
-@Component
 public class SdcControllersConfiguration {
 
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcControllersConfiguration.class);
diff --git a/src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java b/src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java
new file mode 100644 (file)
index 0000000..cdba29a
--- /dev/null
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.config.spring;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.onap.clamp.clds.config.sdc.SdcControllersConfiguration;
+import org.onap.clamp.clds.config.sdc.SdcSingleControllerConfiguration;
+import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException;
+import org.onap.clamp.clds.sdc.controller.SdcSingleController;
+import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
+import org.onap.clamp.clds.sdc.controller.installer.CsarInstallerImpl;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+@Configuration
+@Profile("clamp-sdc-controller")
+public class CldsSdcControllerConfiguration {
+
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsSdcControllerConfiguration.class);
+    private List<SdcSingleController> sdcControllersList = new ArrayList<>();
+
+    @PostConstruct
+    public void loadSdcControllers(
+            @Qualifier("sdcControllersConfiguration") SdcControllersConfiguration sdcControllersConfig) {
+        sdcControllersConfig.getAllDefinedControllers().forEach((k, v) -> {
+            SdcSingleController sdcController = getSdcSingleController(v);
+            try {
+                sdcController.initSdc();
+            } catch (SdcControllerException e) {
+                logger.error("Exception caught during initialization of sdc controller", e);
+            }
+            sdcControllersList.add(getSdcSingleController(v));
+        });
+    }
+
+    @PreDestroy
+    public void killSdcControllers() {
+        sdcControllersList.forEach(e -> {
+            try {
+                e.closeSdc();
+            } catch (SdcControllerException e1) {
+                logger.error("Exception caught during initialization of sdc controller", e);
+            }
+        });
+    }
+
+    @Bean(name = "csarInstaller")
+    public CsarInstaller getCsarInstaller() {
+        return new CsarInstallerImpl();
+    }
+
+    @Bean(name = "sdcSingleController")
+    public SdcSingleController getSdcSingleController(SdcSingleControllerConfiguration sdcControllerConfig) {
+        return new SdcSingleController(sdcControllerConfig, true);
+    }
+
+    @Bean(name = "sdcControllersConfiguration")
+    public SdcControllersConfiguration getSdcControllersConfiguration() {
+        return new SdcControllersConfiguration();
+    }
+}
\ No newline at end of file
index 3c87725..387548f 100644 (file)
@@ -50,13 +50,16 @@ import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;
 import org.openecomp.sdc.utils.DistributionActionResultEnum;\r
 import org.openecomp.sdc.utils.DistributionStatusEnum;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.stereotype.Component;\r
 \r
-@Component\r
+/**\r
+ * This class handles one sdc controller defined in the config. It's\r
+ * instantiated by Spring config.\r
+ */\r
 public class SdcSingleController {\r
 \r
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcSingleController.class);\r
     protected boolean isAsdcClientAutoManaged = false;\r
+    @Autowired\r
     protected CsarInstaller resourceInstaller;\r
     @Autowired\r
     protected ClampProperties refProp;\r
@@ -126,6 +129,11 @@ public class SdcSingleController {
     protected SdcSingleControllerConfiguration sdcConfig;\r
     private IDistributionClient distributionClient;\r
 \r
+    public SdcSingleController(SdcSingleControllerConfiguration sdcSingleConfig, boolean isClientAutoManaged) {\r
+        this.isAsdcClientAutoManaged = isClientAutoManaged;\r
+        sdcConfig = sdcSingleConfig;\r
+    }\r
+\r
     /**\r
      * This method initializes the SDC Controller and the SDC Client.\r
      *\r
index 3a6bef8..cb10072 100644 (file)
@@ -48,16 +48,19 @@ import org.onap.clamp.clds.service.CldsTemplateService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
-import org.springframework.stereotype.Component;
 import org.yaml.snakeyaml.Yaml;
 
-@Component
+/**
+ * This class will be instantiated by spring config, and used by Sdc Controller.
+ * There is no state kept by the bean. It's used to deploy the csar/notification
+ * received from SDC in DB.
+ */
 public class CsarInstallerImpl implements CsarInstaller {
 
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarInstallerImpl.class);
     private Map<String, BlueprintParserFilesConfiguration> bpmnMapping = new HashMap<>();
     public static final String TEMPLATE_NAME_PREFIX = "DCAE-Designer-ClosedLoopTemplate-";
-    public static final String MODEL_NAME_PREFIX = "DCAE-Designer-ClosedLoopInstance-";
+    public static final String MODEL_NAME_PREFIX = "ClosedLoop-";
     /**
      * The file name that will be loaded by Spring.
      */
@@ -83,16 +86,14 @@ public class CsarInstallerImpl implements CsarInstaller {
 
     @Override
     public boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException {
-        return false;
+        return (CldsModel.retrieve(cldsDao, csar.getSdcCsarHelper().getServiceMetadata().getValue("name"),
+                false) != null) ? true : false;
     }
 
     @Override
     public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException {
         try {
             String serviceTypeId = queryDcaeToGetServiceTypeId(csar);
-            String policyName = searchForPolicyName(csar);
-            if (policyName.contains("*")) {
-            }
             createFakeCldsModel(csar, createFakeCldsTemplate(csar, this.searchForRightMapping(csar)), serviceTypeId);
         } catch (IOException e) {
             throw new SdcArtifactInstallerException("Exception caught during the Csar installation in database", e);
@@ -161,7 +162,7 @@ public class CsarInstallerImpl implements CsarInstaller {
         template.setBpmnId("Sdc-Generated");
         template.setBpmnText(
                 IOUtils.toString(appContext.getResource(configFiles.getBpmnXmlFilePath()).getInputStream()));
-        template.setPropText(csar.getDcaeBlueprint());
+        template.setPropText("{\"global\":[{\"name\":\"service\",\"value\":[\"" + csar.getDcaeBlueprint() + "\"]}]}");
         template.setImageText(
                 IOUtils.toString(appContext.getResource(configFiles.getSvgXmlFilePath()).getInputStream()));
         template.setName(TEMPLATE_NAME_PREFIX + csar.getSdcCsarHelper().getServiceMetadata().getValue("name"));
@@ -169,15 +170,25 @@ public class CsarInstallerImpl implements CsarInstaller {
         return template;
     }
 
-    private CldsModel createFakeCldsModel(CsarHandler csar, CldsTemplate cldsTemplate, String serviceTypeId) {
+    private CldsModel createFakeCldsModel(CsarHandler csar, CldsTemplate cldsTemplate, String serviceTypeId)
+            throws SdcArtifactInstallerException {
         CldsModel cldsModel = new CldsModel();
-        cldsModel.setControlNamePrefix(MODEL_NAME_PREFIX);
+        String policyName = searchForPolicyName(csar);
+        if (policyName.contains("*")) {
+            // It's a filter must add a specific prefix
+            cldsModel.setControlNamePrefix(policyName);
+        } else {
+            cldsModel.setControlNamePrefix(MODEL_NAME_PREFIX);
+        }
         cldsModel.setName(csar.getSdcCsarHelper().getServiceMetadata().getValue("name"));
         cldsModel.setBlueprintText(csar.getDcaeBlueprint());
         cldsModel.setTemplateName(cldsTemplate.getName());
         cldsModel.setTemplateId(cldsTemplate.getId());
-        cldsModel.setDocText(cldsTemplate.getPropText());
-        cldsModel.setPropText("{}");
+        // cldsModel.setDocText(cldsTemplate.getPropText());
+        cldsModel.setPropText("{\"global\":[{\"name\":\"service\",\"value\":[\""
+                + csar.getSdcNotification().getServiceInvariantUUID() + "\"]},{\"name\":\"vf\",\"value\":[\""
+                + csar.getBlueprintInvariantResourceUuid()
+                + "\"]},{\"name\":\"actionSet\",\"value\":[\"vnfRecipe\"]},{\"name\":\"location\",\"value\":[\"DC1\"]}]}");
         cldsModel.setBpmnText(cldsTemplate.getBpmnText());
         cldsModel.setTypeId(serviceTypeId);
         cldsModel.save(cldsDao, null);
index 17f8581..5f6a0d6 100644 (file)
@@ -62,7 +62,7 @@ server.port=8080
 \r
 server.contextPath=/\r
 #Modified engine-rest applicationpath\r
-spring.profiles.active=clamp-default,clamp-spring-authentication\r
+spring.profiles.active=clamp-default,clamp-spring-authentication,clamp-sdc-controller\r
 \r
 #The max number of active threads in this pool\r
 server.tomcat.max-threads=200\r
index 6ae64ef..b64e6a0 100644 (file)
@@ -47,6 +47,7 @@ import org.onap.clamp.clds.util.ResourceFileUtil;
 import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;
 import org.openecomp.sdc.toscaparser.api.elements.Metadata;
+import org.skyscreamer.jsonassert.JSONAssert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
@@ -78,13 +79,13 @@ public class CsarInstallerItCase {
         fail("Should have raised an SdcArtifactInstallerException");
     }
 
-    @Test()
+    @Test(expected = SdcArtifactInstallerException.class)
     public void testInstallTheCsarTca()
             throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException {
         String generatedName = RandomStringUtils.randomAlphanumeric(5);
         CsarHandler csarHandler = Mockito.mock(CsarHandler.class);
-        Mockito.when(csarHandler.getDcaeBlueprint()).thenReturn(
-                IOUtils.toString(ResourceFileUtil.getResourceAsStream("example/sdc/blueprint-dcae/tca.yaml")));
+        Mockito.when(csarHandler.getDcaeBlueprint())
+                .thenReturn(ResourceFileUtil.getResourceAsString("example/sdc/blueprint-dcae/tca.yaml"));
         ISdcCsarHelper csarHelper = Mockito.mock(ISdcCsarHelper.class);
         Metadata data = Mockito.mock(Metadata.class);
         Mockito.when(data.getValue("name")).thenReturn(generatedName);
@@ -93,18 +94,20 @@ public class CsarInstallerItCase {
         csarInstaller.installTheCsar(csarHandler);
         // Get the template back from DB
         CldsTemplate templateFromDB = CldsTemplate.retrieve(cldsDao,
-                generatedName + CsarInstallerImpl.TEMPLATE_NAME_SUFFIX, false);
+                CsarInstallerImpl.TEMPLATE_NAME_PREFIX + generatedName, false);
         assertNotNull(templateFromDB);
         assertNotNull(templateFromDB.getBpmnText());
         assertNotNull(templateFromDB.getImageText());
         assertNotNull(templateFromDB.getPropText());
-        assertEquals(templateFromDB.getName(), generatedName + CsarInstallerImpl.TEMPLATE_NAME_SUFFIX);
+        assertEquals(templateFromDB.getName(), CsarInstallerImpl.TEMPLATE_NAME_PREFIX + generatedName);
+        JSONAssert.assertEquals(templateFromDB.getPropText(),
+                ResourceFileUtil.getResourceAsString("example/dao/template-doc-content.json"), true);
         // Get the Model back from DB
-        CldsModel modelFromDB = CldsModel.retrieve(cldsDao, generatedName + CsarInstallerImpl.MODEL_NAME_SUFFIX, false);
+        CldsModel modelFromDB = CldsModel.retrieve(cldsDao, generatedName, false);
         assertNotNull(modelFromDB);
         assertNotNull(modelFromDB.getBpmnText());
         assertNotNull(modelFromDB.getImageText());
         assertNotNull(modelFromDB.getPropText());
-        assertEquals(modelFromDB.getName(), generatedName + CsarInstallerImpl.MODEL_NAME_SUFFIX);
+        assertEquals(modelFromDB.getName(), generatedName);
     }
 }
diff --git a/src/test/resources/example/dao/template-doc-content.json b/src/test/resources/example/dao/template-doc-content.json
new file mode 100644 (file)
index 0000000..3b7e2df
--- /dev/null
@@ -0,0 +1 @@
+{"global":[{"name":"service","value":["tosca_definitions_version: cloudify_dsl_1_3\r\nimports:\r\n- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\r\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/docker/2.2.0/node-type.yaml\r\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml\r\n- http://onap.org:8081/repository/solutioning01-mte2-raw/type_files/dmaap/dmaap_mr.yaml\r\ninputs:\r\n  location_id:\r\n    type: string\r\n  service_id:\r\n    type: string\r\n  policy_id:\r\n    type: string\r\nnode_templates:\r\n  policy_0:\r\n    type: dcae.nodes.policy\r\n    properties:\r\n      policy_id: \r\n        get_input: policy_id\r\n  cdap_host_host:\r\n    type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure\r\n    properties:\r\n      location_id:\r\n        get_input: location_id\r\n      scn_override: cdap_broker.solutioning-central.dcae.onap.org\r\n    interfaces:\r\n      cloudify.interfaces.lifecycle: {\r\n        }\r\n  tca_tca:\r\n    type: dcae.nodes.MicroService.cdap\r\n    properties:\r\n      app_config:\r\n        appDescription: DCAE Analytics Threshold Crossing Alert Application\r\n        appName: dcae-tca\r\n        tcaSubscriberOutputStreamName: TCASubscriberOutputStream\r\n        tcaVESAlertsTableName: TCAVESAlertsTable\r\n        tcaVESAlertsTableTTLSeconds: '1728000'\r\n        tcaVESMessageStatusTableName: TCAVESMessageStatusTable\r\n        tcaVESMessageStatusTableTTLSeconds: '86400'\r\n        thresholdCalculatorFlowletInstances: '2'\r\n      app_preferences:\r\n        publisherContentType: application/json\r\n        publisherHostName: mrlocal-mtnjftle01.onap.org\r\n        publisherHostPort: '3905'\r\n        publisherMaxBatchSize: '10'\r\n        publisherMaxRecoveryQueueSize: '100000'\r\n        publisherPollingInterval: '20000'\r\n        publisherProtocol: https\r\n        publisherTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESPub\r\n        publisherUserName: m00502@tca.af.dcae.onap.org\r\n        publisherUserPassword: Te5021abc\r\n        subscriberConsumerGroup: OpenDCAE-c12\r\n        subscriberConsumerId: c12\r\n        subscriberContentType: application/json\r\n        subscriberHostName: mrlocal-mtnjftle01.onap.org\r\n        subscriberHostPort: '3905'\r\n        subscriberMessageLimit: '-1'\r\n        subscriberPollingInterval: '20000'\r\n        subscriberProtocol: https\r\n        subscriberTimeoutMS: '-1'\r\n        subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub\r\n        subscriberUserName: m00502@tca.af.dcae.onap.org\r\n        subscriberUserPassword: Te5021abc\r\n        tca_policy: null\r\n      artifact_name: dcae-analytics-tca\r\n      artifact_version: 1.0.0\r\n      connections:\r\n        streams_publishes: [\r\n          ]\r\n        streams_subscribes: [\r\n          ]\r\n      jar_url: http://somejar\r\n      location_id:\r\n        get_input: location_id\r\n      namespace: cdap_tca_hi_lo\r\n      programs:\r\n      - program_id: TCAVESCollectorFlow\r\n        program_type: flows\r\n      - program_id: TCADMaaPMRSubscriberWorker\r\n        program_type: workers\r\n      - program_id: TCADMaaPMRPublisherWorker\r\n        program_type: workers\r\n      service_component_type: cdap_app_tca\r\n      service_id:\r\n        get_input: service_id\r\n      streamname: TCASubscriberOutputStream\r\n    relationships:\r\n    - target: topic0\r\n      type: dcae.relationships.subscribe_to_events\r\n    - target: topic1\r\n      type: dcae.relationships.publish_events\r\n    - target: cdap_host_host\r\n      type: dcae.relationships.component_contained_in\r\n    - target: policy_0\r\n      type: dcae.relationships.depends_on\r\n  topic0:\r\n    type: dcae.nodes.Topic\r\n    properties:\r\n      topic_name: ''\r\n  topic1:\r\n    type: dcae.nodes.Topic\r\n    properties:\r\n      topic_name: ''\r\n"]}]}
\ No newline at end of file