From db8e8d530dd37d395ac060f0900330ed67b068d8 Mon Sep 17 00:00:00 2001 From: "Determe, Sebastien (sd378r)" Date: Thu, 22 Mar 2018 09:17:35 +0100 Subject: Add properties to model 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) --- .../config/sdc/SdcControllersConfiguration.java | 2 - .../spring/CldsSdcControllerConfiguration.java | 92 ++++++++++++++++++++++ .../clds/sdc/controller/SdcSingleController.java | 12 ++- .../controller/installer/CsarInstallerImpl.java | 35 +++++--- src/main/resources/application.properties | 2 +- .../controller/installer/CsarInstallerItCase.java | 17 ++-- .../example/dao/template-doc-content.json | 1 + 7 files changed, 137 insertions(+), 24 deletions(-) create mode 100644 src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java create mode 100644 src/test/resources/example/dao/template-doc-content.json (limited to 'src') diff --git a/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java b/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java index f1a96184..f5c658cf 100644 --- a/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java +++ b/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java @@ -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 index 00000000..cdba29ae --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java @@ -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 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 diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java b/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java index 3c877254..387548ff 100644 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java +++ b/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java @@ -50,13 +50,16 @@ import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException; import org.openecomp.sdc.utils.DistributionActionResultEnum; import org.openecomp.sdc.utils.DistributionStatusEnum; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -@Component +/** + * This class handles one sdc controller defined in the config. It's + * instantiated by Spring config. + */ public class SdcSingleController { private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcSingleController.class); protected boolean isAsdcClientAutoManaged = false; + @Autowired protected CsarInstaller resourceInstaller; @Autowired protected ClampProperties refProp; @@ -126,6 +129,11 @@ public class SdcSingleController { protected SdcSingleControllerConfiguration sdcConfig; private IDistributionClient distributionClient; + public SdcSingleController(SdcSingleControllerConfiguration sdcSingleConfig, boolean isClientAutoManaged) { + this.isAsdcClientAutoManaged = isClientAutoManaged; + sdcConfig = sdcSingleConfig; + } + /** * This method initializes the SDC Controller and the SDC Client. * diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java index 3a6bef8d..cb100725 100644 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java +++ b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java @@ -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 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); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 17f85817..5f6a0d65 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -62,7 +62,7 @@ server.port=8080 server.contextPath=/ #Modified engine-rest applicationpath -spring.profiles.active=clamp-default,clamp-spring-authentication +spring.profiles.active=clamp-default,clamp-spring-authentication,clamp-sdc-controller #The max number of active threads in this pool server.tomcat.max-threads=200 diff --git a/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java index 6ae64ef7..b64e6a0d 100644 --- a/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java +++ b/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java @@ -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 index 00000000..3b7e2df9 --- /dev/null +++ b/src/test/resources/example/dao/template-doc-content.json @@ -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 -- cgit 1.2.3-korg