From 91ff401b0ade08b58f186e80fd7853527ff15c77 Mon Sep 17 00:00:00 2001 From: sebdet Date: Fri, 11 Dec 2020 13:11:18 +0100 Subject: Change the java package name Rename java package name to org.onap.policy.clamp instead of org.onap.clamp Issue-ID: POLICY-2922 Signed-off-by: sebdet Change-Id: Ic3255b90fd52a7b2689ae7a55f55ee7841abebac Signed-off-by: sebdet --- docs/swagger/swagger.json | 474 ++--- docs/swagger/swagger.pdf | 2204 ++++++++++---------- extra/sql/dump/test-data.sql | 60 +- .../authorization/AuthorizationController.java | 189 -- .../org/onap/clamp/authorization/CldsUser.java | 97 - .../authorization/SecureServicePermission.java | 203 -- .../SecureServicePermissionDeserializer.java | 46 - .../org/onap/clamp/authorization/UserService.java | 47 - src/main/java/org/onap/clamp/clds/Application.java | 182 -- .../onap/clamp/clds/ClampInUserAuditorAware.java | 40 - .../java/org/onap/clamp/clds/ClampServlet.java | 139 -- ...EmbeddedServletContainerFactoryRedirection.java | 53 - .../org/onap/clamp/clds/client/CdsServices.java | 227 -- .../clamp/clds/client/DcaeInventoryServices.java | 139 -- .../clamp/clds/client/PolicyEngineServices.java | 227 -- .../onap/clamp/clds/config/AafConfiguration.java | 66 - .../onap/clamp/clds/config/CamelConfiguration.java | 134 -- .../onap/clamp/clds/config/ClampProperties.java | 105 - .../clamp/clds/config/CldsUserJsonDecoder.java | 74 - .../clds/config/DefaultDictionaryElements.java | 167 -- .../clds/config/DefaultUserConfiguration.java | 138 -- .../java/org/onap/clamp/clds/config/SslConfig.java | 93 - .../clamp/clds/config/SystemPropertiesLoader.java | 46 - .../config/sdc/SdcControllersConfiguration.java | 97 - .../sdc/SdcSingleControllerConfiguration.java | 290 --- .../clds/config/spring/CldsConfiguration.java | 55 - .../config/spring/SdcControllerConfiguration.java | 110 - .../clamp/clds/exception/CldsConfigException.java | 61 - .../clamp/clds/exception/CldsUsersException.java | 61 - .../clds/exception/NotAuthorizedException.java | 61 - .../clds/exception/cds/CdsParametersException.java | 53 - .../exception/dcae/DcaeDeploymentException.java | 61 - .../sdc/controller/BlueprintParserException.java | 54 - .../sdc/controller/CsarHandlerException.java | 54 - .../controller/SdcArtifactInstallerException.java | 54 - .../sdc/controller/SdcControllerException.java | 54 - .../sdc/controller/SdcDownloadException.java | 54 - .../sdc/controller/SdcParametersException.java | 54 - .../onap/clamp/clds/filter/ClampCadiFilter.java | 190 -- .../onap/clamp/clds/model/ClampInformation.java | 62 - .../org/onap/clamp/clds/model/CldsHealthCheck.java | 60 - .../clds/model/cds/CdsBpWorkFlowListResponse.java | 66 - .../clamp/clds/model/dcae/DcaeInventoryCache.java | 62 - .../clds/model/dcae/DcaeInventoryResponse.java | 102 - .../org/onap/clamp/clds/model/dcae/DcaeLinks.java | 60 - .../model/dcae/DcaeOperationStatusResponse.java | 88 - .../sdc/controller/DistributionStatusMessage.java | 84 - .../clds/sdc/controller/SdcSingleController.java | 433 ---- .../sdc/controller/SdcSingleControllerStatus.java | 28 - .../controller/installer/BlueprintArtifact.java | 70 - .../installer/BlueprintMicroService.java | 93 - .../sdc/controller/installer/BlueprintParser.java | 220 -- .../sdc/controller/installer/ChainGenerator.java | 90 - .../clds/sdc/controller/installer/CsarHandler.java | 219 -- .../clamp/clds/service/CldsHealthcheckService.java | 81 - .../clds/tosca/JsonEditorSchemaConstants.java | 86 - .../clamp/clds/tosca/ToscaSchemaConstants.java | 83 - .../clamp/clds/tosca/ToscaYamlToJsonConvertor.java | 780 ------- .../ToscaConverterWithDictionarySupport.java | 98 - .../tosca/update/UnknownComponentException.java | 34 - .../clds/tosca/update/elements/ArrayField.java | 72 - .../clds/tosca/update/elements/Constraint.java | 222 -- .../clds/tosca/update/elements/ToscaElement.java | 121 -- .../update/elements/ToscaElementProperty.java | 135 -- .../update/execution/ToscaMetadataExecutor.java | 76 - .../update/execution/ToscaMetadataProcess.java | 43 - .../execution/cds/ToscaMetadataCdsProcess.java | 220 -- .../target/ToscaMetadataTargetProcess.java | 40 - .../update/parser/ToscaConverterToJsonSchema.java | 343 --- .../tosca/update/parser/ToscaElementParser.java | 103 - .../parser/metadata/ToscaMetadataParser.java | 32 - .../ToscaMetadataParserWithDictionarySupport.java | 211 -- .../clds/tosca/update/templates/JsonTemplate.java | 223 -- .../tosca/update/templates/JsonTemplateField.java | 149 -- .../update/templates/JsonTemplateManager.java | 185 -- .../org/onap/clamp/clds/util/ClampVersioning.java | 61 - .../java/org/onap/clamp/clds/util/CryptoUtils.java | 168 -- .../java/org/onap/clamp/clds/util/JsonUtils.java | 53 - .../java/org/onap/clamp/clds/util/LogMessages.java | 36 - .../org/onap/clamp/clds/util/LoggingUtils.java | 414 ---- .../org/onap/clamp/clds/util/OnapLogConstants.java | 304 --- .../onap/clamp/clds/util/ResourceFileUtils.java | 89 - .../clamp/configuration/ClampGsonDataFormat.java | 170 -- .../model/gson/converter/InstantDeserializer.java | 46 - .../model/gson/converter/InstantSerializer.java | 40 - .../jsontype/JsonStringSqlTypeDescriptor.java | 108 - .../dao/model/jsontype/JsonTypeDescriptor.java | 105 - .../dao/model/jsontype/StringJsonUserType.java | 51 - .../org/onap/clamp/flow/log/FlowLogOperation.java | 101 - .../java/org/onap/clamp/loop/CsarInstaller.java | 210 -- src/main/java/org/onap/clamp/loop/Loop.java | 389 ---- .../java/org/onap/clamp/loop/LoopController.java | 204 -- src/main/java/org/onap/clamp/loop/LoopService.java | 190 -- src/main/java/org/onap/clamp/loop/LoopState.java | 28 - .../java/org/onap/clamp/loop/LoopsRepository.java | 36 - .../org/onap/clamp/loop/cds/CdsDataInstaller.java | 172 -- .../org/onap/clamp/loop/common/AuditEntity.java | 146 -- .../loop/components/external/DcaeComponent.java | 266 --- .../components/external/ExternalComponent.java | 58 - .../external/ExternalComponentState.java | 128 -- .../loop/components/external/PolicyComponent.java | 196 -- .../clamp/loop/deploy/DcaeDeployParameters.java | 113 - src/main/java/org/onap/clamp/loop/log/LogType.java | 28 - src/main/java/org/onap/clamp/loop/log/LoopLog.java | 193 -- .../org/onap/clamp/loop/log/LoopLogRepository.java | 32 - .../org/onap/clamp/loop/log/LoopLogService.java | 51 - .../clamp/loop/service/CsarServiceInstaller.java | 129 -- .../java/org/onap/clamp/loop/service/Service.java | 169 -- .../clamp/loop/service/ServicesRepository.java | 31 - .../onap/clamp/loop/template/LoopElementModel.java | 295 --- .../loop/template/LoopElementModelsRepository.java | 31 - .../org/onap/clamp/loop/template/LoopTemplate.java | 341 --- .../template/LoopTemplateLoopElementModel.java | 192 -- .../template/LoopTemplateLoopElementModelId.java | 100 - .../loop/template/LoopTemplatesRepository.java | 36 - .../clamp/loop/template/LoopTemplatesService.java | 67 - .../org/onap/clamp/loop/template/LoopType.java | 42 - .../clamp/loop/template/LoopTypeConvertor.java | 52 - .../org/onap/clamp/loop/template/PolicyModel.java | 282 --- .../onap/clamp/loop/template/PolicyModelId.java | 92 - .../loop/template/PolicyModelsRepository.java | 37 - .../clamp/loop/template/PolicyModelsService.java | 173 -- src/main/java/org/onap/clamp/policy/Policy.java | 287 --- .../java/org/onap/clamp/policy/PolicyService.java | 35 - .../policy/downloader/PolicyEngineController.java | 76 - .../policy/microservice/MicroServicePolicy.java | 275 --- .../microservice/MicroServicePolicyRepository.java | 32 - .../microservice/MicroServicePolicyService.java | 112 - .../policy/operational/OperationalPolicy.java | 218 -- .../operational/OperationalPolicyRepository.java | 32 - .../OperationalPolicyRepresentationBuilder.java | 350 ---- .../operational/OperationalPolicyService.java | 94 - .../org/onap/clamp/policy/pdpgroup/PdpGroup.java | 92 - .../onap/clamp/policy/pdpgroup/PdpSubgroup.java | 56 - .../onap/clamp/policy/pdpgroup/PolicyModelKey.java | 125 -- src/main/java/org/onap/clamp/tosca/Dictionary.java | 219 -- .../org/onap/clamp/tosca/DictionaryElement.java | 254 --- .../clamp/tosca/DictionaryElementsRepository.java | 32 - .../org/onap/clamp/tosca/DictionaryRepository.java | 40 - .../org/onap/clamp/tosca/DictionaryService.java | 141 -- src/main/java/org/onap/clamp/util/PassDecoder.java | 65 - .../org/onap/clamp/util/SemanticVersioning.java | 91 - .../authorization/AuthorizationController.java | 189 ++ .../onap/policy/clamp/authorization/CldsUser.java | 97 + .../authorization/SecureServicePermission.java | 203 ++ .../SecureServicePermissionDeserializer.java | 46 + .../policy/clamp/authorization/UserService.java | 47 + .../org/onap/policy/clamp/clds/Application.java | 182 ++ .../policy/clamp/clds/ClampInUserAuditorAware.java | 40 + .../org/onap/policy/clamp/clds/ClampServlet.java | 137 ++ ...EmbeddedServletContainerFactoryRedirection.java | 53 + .../onap/policy/clamp/clds/client/CdsServices.java | 227 ++ .../clamp/clds/client/DcaeInventoryServices.java | 139 ++ .../clamp/clds/client/PolicyEngineServices.java | 226 ++ .../policy/clamp/clds/config/AafConfiguration.java | 66 + .../clamp/clds/config/CamelConfiguration.java | 134 ++ .../policy/clamp/clds/config/ClampProperties.java | 105 + .../clamp/clds/config/CldsUserJsonDecoder.java | 74 + .../clds/config/DefaultDictionaryElements.java | 167 ++ .../clds/config/DefaultUserConfiguration.java | 138 ++ .../onap/policy/clamp/clds/config/SslConfig.java | 92 + .../clamp/clds/config/SystemPropertiesLoader.java | 46 + .../config/sdc/SdcControllersConfiguration.java | 97 + .../sdc/SdcSingleControllerConfiguration.java | 290 +++ .../clds/config/spring/CldsConfiguration.java | 55 + .../config/spring/SdcControllerConfiguration.java | 110 + .../clamp/clds/exception/CldsConfigException.java | 61 + .../clamp/clds/exception/CldsUsersException.java | 61 + .../clds/exception/NotAuthorizedException.java | 61 + .../clds/exception/cds/CdsParametersException.java | 53 + .../exception/dcae/DcaeDeploymentException.java | 61 + .../sdc/controller/BlueprintParserException.java | 54 + .../sdc/controller/CsarHandlerException.java | 54 + .../controller/SdcArtifactInstallerException.java | 54 + .../sdc/controller/SdcControllerException.java | 54 + .../sdc/controller/SdcDownloadException.java | 54 + .../sdc/controller/SdcParametersException.java | 54 + .../policy/clamp/clds/filter/ClampCadiFilter.java | 190 ++ .../policy/clamp/clds/model/ClampInformation.java | 62 + .../policy/clamp/clds/model/CldsHealthCheck.java | 60 + .../clds/model/cds/CdsBpWorkFlowListResponse.java | 66 + .../clamp/clds/model/dcae/DcaeInventoryCache.java | 62 + .../clds/model/dcae/DcaeInventoryResponse.java | 102 + .../policy/clamp/clds/model/dcae/DcaeLinks.java | 60 + .../model/dcae/DcaeOperationStatusResponse.java | 88 + .../sdc/controller/DistributionStatusMessage.java | 84 + .../clds/sdc/controller/SdcSingleController.java | 433 ++++ .../sdc/controller/SdcSingleControllerStatus.java | 28 + .../controller/installer/BlueprintArtifact.java | 70 + .../installer/BlueprintMicroService.java | 93 + .../sdc/controller/installer/BlueprintParser.java | 220 ++ .../sdc/controller/installer/ChainGenerator.java | 90 + .../clds/sdc/controller/installer/CsarHandler.java | 219 ++ .../clamp/clds/service/CldsHealthcheckService.java | 81 + .../clds/tosca/JsonEditorSchemaConstants.java | 86 + .../clamp/clds/tosca/ToscaSchemaConstants.java | 83 + .../clamp/clds/tosca/ToscaYamlToJsonConvertor.java | 780 +++++++ .../ToscaConverterWithDictionarySupport.java | 98 + .../tosca/update/UnknownComponentException.java | 34 + .../clds/tosca/update/elements/ArrayField.java | 72 + .../clds/tosca/update/elements/Constraint.java | 222 ++ .../clds/tosca/update/elements/ToscaElement.java | 121 ++ .../update/elements/ToscaElementProperty.java | 135 ++ .../update/execution/ToscaMetadataExecutor.java | 76 + .../update/execution/ToscaMetadataProcess.java | 43 + .../execution/cds/ToscaMetadataCdsProcess.java | 221 ++ .../target/ToscaMetadataTargetProcess.java | 40 + .../update/parser/ToscaConverterToJsonSchema.java | 343 +++ .../tosca/update/parser/ToscaElementParser.java | 103 + .../parser/metadata/ToscaMetadataParser.java | 32 + .../ToscaMetadataParserWithDictionarySupport.java | 211 ++ .../clds/tosca/update/templates/JsonTemplate.java | 223 ++ .../tosca/update/templates/JsonTemplateField.java | 149 ++ .../update/templates/JsonTemplateManager.java | 185 ++ .../policy/clamp/clds/util/ClampVersioning.java | 61 + .../onap/policy/clamp/clds/util/CryptoUtils.java | 168 ++ .../org/onap/policy/clamp/clds/util/JsonUtils.java | 53 + .../onap/policy/clamp/clds/util/LogMessages.java | 36 + .../onap/policy/clamp/clds/util/LoggingUtils.java | 414 ++++ .../policy/clamp/clds/util/OnapLogConstants.java | 304 +++ .../policy/clamp/clds/util/ResourceFileUtils.java | 89 + .../clamp/configuration/ClampGsonDataFormat.java | 170 ++ .../model/gson/converter/InstantDeserializer.java | 46 + .../model/gson/converter/InstantSerializer.java | 40 + .../jsontype/JsonStringSqlTypeDescriptor.java | 108 + .../dao/model/jsontype/JsonTypeDescriptor.java | 105 + .../dao/model/jsontype/StringJsonUserType.java | 51 + .../policy/clamp/flow/log/FlowLogOperation.java | 101 + .../org/onap/policy/clamp/loop/CsarInstaller.java | 209 ++ src/main/java/org/onap/policy/clamp/loop/Loop.java | 389 ++++ .../org/onap/policy/clamp/loop/LoopController.java | 204 ++ .../org/onap/policy/clamp/loop/LoopService.java | 190 ++ .../java/org/onap/policy/clamp/loop/LoopState.java | 28 + .../onap/policy/clamp/loop/LoopsRepository.java | 36 + .../policy/clamp/loop/cds/CdsDataInstaller.java | 172 ++ .../onap/policy/clamp/loop/common/AuditEntity.java | 146 ++ .../loop/components/external/DcaeComponent.java | 266 +++ .../components/external/ExternalComponent.java | 58 + .../external/ExternalComponentState.java | 128 ++ .../loop/components/external/PolicyComponent.java | 196 ++ .../clamp/loop/deploy/DcaeDeployParameters.java | 113 + .../org/onap/policy/clamp/loop/log/LogType.java | 28 + .../org/onap/policy/clamp/loop/log/LoopLog.java | 193 ++ .../policy/clamp/loop/log/LoopLogRepository.java | 32 + .../onap/policy/clamp/loop/log/LoopLogService.java | 51 + .../clamp/loop/service/CsarServiceInstaller.java | 129 ++ .../onap/policy/clamp/loop/service/Service.java | 169 ++ .../clamp/loop/service/ServicesRepository.java | 31 + .../clamp/loop/template/LoopElementModel.java | 295 +++ .../loop/template/LoopElementModelsRepository.java | 31 + .../policy/clamp/loop/template/LoopTemplate.java | 341 +++ .../template/LoopTemplateLoopElementModel.java | 192 ++ .../template/LoopTemplateLoopElementModelId.java | 100 + .../loop/template/LoopTemplatesRepository.java | 36 + .../clamp/loop/template/LoopTemplatesService.java | 67 + .../onap/policy/clamp/loop/template/LoopType.java | 42 + .../clamp/loop/template/LoopTypeConvertor.java | 52 + .../policy/clamp/loop/template/PolicyModel.java | 282 +++ .../policy/clamp/loop/template/PolicyModelId.java | 92 + .../loop/template/PolicyModelsRepository.java | 37 + .../clamp/loop/template/PolicyModelsService.java | 173 ++ .../java/org/onap/policy/clamp/policy/Policy.java | 287 +++ .../onap/policy/clamp/policy/PolicyService.java | 35 + .../policy/downloader/PolicyEngineController.java | 76 + .../policy/microservice/MicroServicePolicy.java | 275 +++ .../microservice/MicroServicePolicyRepository.java | 32 + .../microservice/MicroServicePolicyService.java | 112 + .../policy/operational/OperationalPolicy.java | 218 ++ .../operational/OperationalPolicyRepository.java | 32 + .../OperationalPolicyRepresentationBuilder.java | 350 ++++ .../operational/OperationalPolicyService.java | 94 + .../policy/clamp/policy/pdpgroup/PdpGroup.java | 92 + .../policy/clamp/policy/pdpgroup/PdpSubgroup.java | 56 + .../clamp/policy/pdpgroup/PolicyModelKey.java | 125 ++ .../org/onap/policy/clamp/tosca/Dictionary.java | 219 ++ .../onap/policy/clamp/tosca/DictionaryElement.java | 254 +++ .../clamp/tosca/DictionaryElementsRepository.java | 32 + .../policy/clamp/tosca/DictionaryRepository.java | 40 + .../onap/policy/clamp/tosca/DictionaryService.java | 141 ++ .../org/onap/policy/clamp/util/PassDecoder.java | 62 + .../onap/policy/clamp/util/SemanticVersioning.java | 91 + src/main/resources/META-INF/resources/swagger.html | 146 +- .../org/apache/camel/dataformat/clamp-gson | 2 +- .../resources/clds/camel/rest/clamp-api-v2.xml | 452 ++-- .../resources/clds/camel/rest/clds-services.xml | 6 +- src/main/resources/clds/camel/routes/cds-flows.xml | 8 +- .../resources/clds/camel/routes/dcae-flows.xml | 80 +- .../resources/clds/camel/routes/loop-flows.xml | 30 +- .../resources/clds/camel/routes/policy-flows.xml | 44 +- .../resources/clds/camel/routes/utils-flows.xml | 4 +- src/main/resources/clds/key.properties | 2 +- src/main/script/SelectNpmRepo.groovy | 2 +- src/main/script/TagVersion.groovy | 2 +- .../onap/clamp/clds/client/CdsServicesTest.java | 56 - .../clamp/clds/config/CldsUserJsonDecoderTest.java | 99 - .../sdc/SdcSingleControllerConfigurationTest.java | 107 - .../clds/it/AuthorizationControllerItCase.java | 137 -- .../clds/it/CldsHealthcheckServiceItCase.java | 55 - .../java/org/onap/clamp/clds/it/HttpsItCase.java | 159 -- .../java/org/onap/clamp/clds/it/RobotItCase.java | 116 -- .../it/config/CldsReferencePropertiesItCase.java | 67 - .../config/SdcControllersConfigurationItCase.java | 88 - .../sdc/controller/SdcSingleControllerItCase.java | 152 -- .../dcae/DcaeInventoryResponseCacheTestItCase.java | 125 -- .../clds/model/dcae/DcaeInventoryResponseTest.java | 59 - .../model/jsontype/JsonTypeDescriptorTest.java | 95 - .../controller/installer/BlueprintParserTest.java | 208 -- .../controller/installer/ChainGeneratorTest.java | 77 - .../sdc/controller/installer/CsarHandlerTest.java | 199 -- .../tosca/DictionaryRepositoriesTestItCase.java | 88 - .../tosca/ToscaYamlToJsonConvertorTestItCase.java | 201 -- .../clamp/clds/tosca/update/ArrayFieldTest.java | 55 - .../clamp/clds/tosca/update/ConstraintTest.java | 106 - .../clds/tosca/update/JsonTemplateFieldTest.java | 69 - .../clds/tosca/update/JsonTemplateManagerTest.java | 203 -- .../clamp/clds/tosca/update/JsonTemplateTest.java | 69 - .../ToscaConverterWithDictionarySupportItCase.java | 147 -- .../tosca/update/ToscaElementPropertyTest.java | 79 - .../clamp/clds/tosca/update/ToscaElementTest.java | 52 - .../org/onap/clamp/clds/util/CryptoUtilsTest.java | 99 - .../org/onap/clamp/clds/util/JsonUtilsTest.java | 76 - .../org/onap/clamp/clds/util/LoggingUtilsTest.java | 138 -- .../java/org/onap/clamp/clds/util/TestObject.java | 45 - .../java/org/onap/clamp/clds/util/TestObject2.java | 44 - .../org/onap/clamp/flow/FlowLogOperationTest.java | 100 - .../org/onap/clamp/loop/CsarInstallerItCase.java | 311 --- .../org/onap/clamp/loop/DcaeComponentTest.java | 214 -- .../org/onap/clamp/loop/DeployFlowTestItCase.java | 321 --- .../clamp/loop/ExternalComponentStateTest.java | 82 - .../onap/clamp/loop/LoopControllerTestItCase.java | 174 -- .../onap/clamp/loop/LoopLogServiceTestItCase.java | 95 - .../onap/clamp/loop/LoopRepositoriesItCase.java | 253 --- .../org/onap/clamp/loop/LoopServiceTestItCase.java | 380 ---- .../loop/LoopTemplateLoopElementModelTest.java | 105 - .../clamp/loop/LoopTemplatesServiceItCase.java | 146 -- .../java/org/onap/clamp/loop/LoopToJsonTest.java | 173 -- .../org/onap/clamp/loop/PolicyComponentTest.java | 297 --- .../onap/clamp/loop/PolicyModelServiceItCase.java | 311 --- src/test/java/org/onap/clamp/loop/ServiceTest.java | 54 - .../loop/deploy/BlueprintInputParametersTest.java | 125 -- .../PolicyEngineControllerTestItCase.java | 117 -- .../microservice/MicroServicePayloadTest.java | 47 - ...OperationalPolicyRepresentationBuilderTest.java | 67 - .../onap/clamp/policy/pdpgroup/PdpGroupTest.java | 86 - .../clamp/policy/pdpgroup/PolicyModelKeyTest.java | 55 - .../onap/clamp/tosca/DictionaryServiceItCase.java | 247 --- .../java/org/onap/clamp/util/PassDecoderTest.java | 52 - .../onap/clamp/util/SemanticVersioningTest.java | 91 - .../policy/clamp/clds/client/CdsServicesTest.java | 56 + .../clamp/clds/config/CldsUserJsonDecoderTest.java | 99 + .../sdc/SdcSingleControllerConfigurationTest.java | 107 + .../clds/it/AuthorizationControllerItCase.java | 137 ++ .../clds/it/CldsHealthcheckServiceItCase.java | 55 + .../org/onap/policy/clamp/clds/it/HttpsItCase.java | 159 ++ .../org/onap/policy/clamp/clds/it/RobotItCase.java | 116 ++ .../it/config/CldsReferencePropertiesItCase.java | 64 + .../config/SdcControllersConfigurationItCase.java | 88 + .../sdc/controller/SdcSingleControllerItCase.java | 152 ++ .../dcae/DcaeInventoryResponseCacheTestItCase.java | 125 ++ .../clds/model/dcae/DcaeInventoryResponseTest.java | 59 + .../model/jsontype/JsonTypeDescriptorTest.java | 95 + .../controller/installer/BlueprintParserTest.java | 208 ++ .../controller/installer/ChainGeneratorTest.java | 77 + .../sdc/controller/installer/CsarHandlerTest.java | 199 ++ .../tosca/DictionaryRepositoriesTestItCase.java | 88 + .../tosca/ToscaYamlToJsonConvertorTestItCase.java | 201 ++ .../clamp/clds/tosca/update/ArrayFieldTest.java | 55 + .../clamp/clds/tosca/update/ConstraintTest.java | 106 + .../clds/tosca/update/JsonTemplateFieldTest.java | 69 + .../clds/tosca/update/JsonTemplateManagerTest.java | 203 ++ .../clamp/clds/tosca/update/JsonTemplateTest.java | 69 + .../ToscaConverterWithDictionarySupportItCase.java | 147 ++ .../tosca/update/ToscaElementPropertyTest.java | 79 + .../clamp/clds/tosca/update/ToscaElementTest.java | 52 + .../policy/clamp/clds/util/CryptoUtilsTest.java | 99 + .../onap/policy/clamp/clds/util/JsonUtilsTest.java | 77 + .../policy/clamp/clds/util/LoggingUtilsTest.java | 138 ++ .../onap/policy/clamp/clds/util/TestObject.java | 45 + .../onap/policy/clamp/clds/util/TestObject2.java | 44 + .../policy/clamp/flow/FlowLogOperationTest.java | 100 + .../policy/clamp/loop/CsarInstallerItCase.java | 313 +++ .../onap/policy/clamp/loop/DcaeComponentTest.java | 214 ++ .../policy/clamp/loop/DeployFlowTestItCase.java | 321 +++ .../clamp/loop/ExternalComponentStateTest.java | 82 + .../clamp/loop/LoopControllerTestItCase.java | 175 ++ .../clamp/loop/LoopLogServiceTestItCase.java | 96 + .../policy/clamp/loop/LoopRepositoriesItCase.java | 258 +++ .../policy/clamp/loop/LoopServiceTestItCase.java | 381 ++++ .../loop/LoopTemplateLoopElementModelTest.java | 105 + .../clamp/loop/LoopTemplatesServiceItCase.java | 146 ++ .../org/onap/policy/clamp/loop/LoopToJsonTest.java | 173 ++ .../policy/clamp/loop/PolicyComponentTest.java | 297 +++ .../clamp/loop/PolicyModelServiceItCase.java | 312 +++ .../org/onap/policy/clamp/loop/ServiceTest.java | 54 + .../loop/deploy/BlueprintInputParametersTest.java | 125 ++ .../PolicyEngineControllerTestItCase.java | 117 ++ .../microservice/MicroServicePayloadTest.java | 47 + ...OperationalPolicyRepresentationBuilderTest.java | 67 + .../policy/clamp/policy/pdpgroup/PdpGroupTest.java | 86 + .../clamp/policy/pdpgroup/PolicyModelKeyTest.java | 55 + .../clamp/tosca/DictionaryServiceItCase.java | 247 +++ .../onap/policy/clamp/util/PassDecoderTest.java | 52 + .../policy/clamp/util/SemanticVersioningTest.java | 91 + 403 files changed, 26663 insertions(+), 26661 deletions(-) delete mode 100644 src/main/java/org/onap/clamp/authorization/AuthorizationController.java delete mode 100644 src/main/java/org/onap/clamp/authorization/CldsUser.java delete mode 100644 src/main/java/org/onap/clamp/authorization/SecureServicePermission.java delete mode 100644 src/main/java/org/onap/clamp/authorization/SecureServicePermissionDeserializer.java delete mode 100644 src/main/java/org/onap/clamp/authorization/UserService.java delete mode 100644 src/main/java/org/onap/clamp/clds/Application.java delete mode 100644 src/main/java/org/onap/clamp/clds/ClampInUserAuditorAware.java delete mode 100644 src/main/java/org/onap/clamp/clds/ClampServlet.java delete mode 100644 src/main/java/org/onap/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java delete mode 100644 src/main/java/org/onap/clamp/clds/client/CdsServices.java delete mode 100644 src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java delete mode 100644 src/main/java/org/onap/clamp/clds/client/PolicyEngineServices.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/AafConfiguration.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/ClampProperties.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/DefaultDictionaryElements.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/DefaultUserConfiguration.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/SslConfig.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/SystemPropertiesLoader.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java delete mode 100644 src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/CldsConfigException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/CldsUsersException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/NotAuthorizedException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/cds/CdsParametersException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/dcae/DcaeDeploymentException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/sdc/controller/BlueprintParserException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/sdc/controller/CsarHandlerException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcControllerException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcDownloadException.java delete mode 100644 src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcParametersException.java delete mode 100644 src/main/java/org/onap/clamp/clds/filter/ClampCadiFilter.java delete mode 100644 src/main/java/org/onap/clamp/clds/model/ClampInformation.java delete mode 100644 src/main/java/org/onap/clamp/clds/model/CldsHealthCheck.java delete mode 100644 src/main/java/org/onap/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java delete mode 100644 src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java delete mode 100644 src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java delete mode 100644 src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java delete mode 100644 src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/DistributionStatusMessage.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleControllerStatus.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintArtifact.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintMicroService.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/installer/ChainGenerator.java delete mode 100644 src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java delete mode 100644 src/main/java/org/onap/clamp/clds/service/CldsHealthcheckService.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/JsonEditorSchemaConstants.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/ToscaSchemaConstants.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertor.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/elements/ArrayField.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/elements/Constraint.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElement.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElementProperty.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaElementParser.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplate.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateField.java delete mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateManager.java delete mode 100644 src/main/java/org/onap/clamp/clds/util/ClampVersioning.java delete mode 100644 src/main/java/org/onap/clamp/clds/util/CryptoUtils.java delete mode 100644 src/main/java/org/onap/clamp/clds/util/JsonUtils.java delete mode 100644 src/main/java/org/onap/clamp/clds/util/LogMessages.java delete mode 100644 src/main/java/org/onap/clamp/clds/util/LoggingUtils.java delete mode 100644 src/main/java/org/onap/clamp/clds/util/OnapLogConstants.java delete mode 100644 src/main/java/org/onap/clamp/clds/util/ResourceFileUtils.java delete mode 100644 src/main/java/org/onap/clamp/configuration/ClampGsonDataFormat.java delete mode 100644 src/main/java/org/onap/clamp/dao/model/gson/converter/InstantDeserializer.java delete mode 100644 src/main/java/org/onap/clamp/dao/model/gson/converter/InstantSerializer.java delete mode 100644 src/main/java/org/onap/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java delete mode 100644 src/main/java/org/onap/clamp/dao/model/jsontype/JsonTypeDescriptor.java delete mode 100644 src/main/java/org/onap/clamp/dao/model/jsontype/StringJsonUserType.java delete mode 100644 src/main/java/org/onap/clamp/flow/log/FlowLogOperation.java delete mode 100644 src/main/java/org/onap/clamp/loop/CsarInstaller.java delete mode 100644 src/main/java/org/onap/clamp/loop/Loop.java delete mode 100644 src/main/java/org/onap/clamp/loop/LoopController.java delete mode 100644 src/main/java/org/onap/clamp/loop/LoopService.java delete mode 100644 src/main/java/org/onap/clamp/loop/LoopState.java delete mode 100644 src/main/java/org/onap/clamp/loop/LoopsRepository.java delete mode 100644 src/main/java/org/onap/clamp/loop/cds/CdsDataInstaller.java delete mode 100644 src/main/java/org/onap/clamp/loop/common/AuditEntity.java delete mode 100644 src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java delete mode 100644 src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java delete mode 100644 src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java delete mode 100644 src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java delete mode 100644 src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java delete mode 100644 src/main/java/org/onap/clamp/loop/log/LogType.java delete mode 100644 src/main/java/org/onap/clamp/loop/log/LoopLog.java delete mode 100644 src/main/java/org/onap/clamp/loop/log/LoopLogRepository.java delete mode 100644 src/main/java/org/onap/clamp/loop/log/LoopLogService.java delete mode 100644 src/main/java/org/onap/clamp/loop/service/CsarServiceInstaller.java delete mode 100644 src/main/java/org/onap/clamp/loop/service/Service.java delete mode 100644 src/main/java/org/onap/clamp/loop/service/ServicesRepository.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopElementModel.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopElementModelsRepository.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopTemplate.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModel.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModelId.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopTemplatesRepository.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopTemplatesService.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopType.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/LoopTypeConvertor.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/PolicyModel.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/PolicyModelId.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/PolicyModelsRepository.java delete mode 100644 src/main/java/org/onap/clamp/loop/template/PolicyModelsService.java delete mode 100644 src/main/java/org/onap/clamp/policy/Policy.java delete mode 100644 src/main/java/org/onap/clamp/policy/PolicyService.java delete mode 100644 src/main/java/org/onap/clamp/policy/downloader/PolicyEngineController.java delete mode 100644 src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java delete mode 100644 src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyRepository.java delete mode 100644 src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java delete mode 100644 src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java delete mode 100644 src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepository.java delete mode 100644 src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java delete mode 100644 src/main/java/org/onap/clamp/policy/operational/OperationalPolicyService.java delete mode 100644 src/main/java/org/onap/clamp/policy/pdpgroup/PdpGroup.java delete mode 100644 src/main/java/org/onap/clamp/policy/pdpgroup/PdpSubgroup.java delete mode 100644 src/main/java/org/onap/clamp/policy/pdpgroup/PolicyModelKey.java delete mode 100644 src/main/java/org/onap/clamp/tosca/Dictionary.java delete mode 100644 src/main/java/org/onap/clamp/tosca/DictionaryElement.java delete mode 100644 src/main/java/org/onap/clamp/tosca/DictionaryElementsRepository.java delete mode 100644 src/main/java/org/onap/clamp/tosca/DictionaryRepository.java delete mode 100644 src/main/java/org/onap/clamp/tosca/DictionaryService.java delete mode 100644 src/main/java/org/onap/clamp/util/PassDecoder.java delete mode 100644 src/main/java/org/onap/clamp/util/SemanticVersioning.java create mode 100644 src/main/java/org/onap/policy/clamp/authorization/AuthorizationController.java create mode 100644 src/main/java/org/onap/policy/clamp/authorization/CldsUser.java create mode 100644 src/main/java/org/onap/policy/clamp/authorization/SecureServicePermission.java create mode 100644 src/main/java/org/onap/policy/clamp/authorization/SecureServicePermissionDeserializer.java create mode 100644 src/main/java/org/onap/policy/clamp/authorization/UserService.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/Application.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/ClampInUserAuditorAware.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/ClampServlet.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/client/CdsServices.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/client/DcaeInventoryServices.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/client/PolicyEngineServices.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/AafConfiguration.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/CamelConfiguration.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/ClampProperties.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoder.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/DefaultDictionaryElements.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/DefaultUserConfiguration.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/SslConfig.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/SystemPropertiesLoader.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcControllersConfiguration.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/spring/CldsConfiguration.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/config/spring/SdcControllerConfiguration.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/CldsConfigException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/CldsUsersException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/NotAuthorizedException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/cds/CdsParametersException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/dcae/DcaeDeploymentException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/BlueprintParserException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/CsarHandlerException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcControllerException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcDownloadException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcParametersException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/filter/ClampCadiFilter.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/model/ClampInformation.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/model/CldsHealthCheck.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryCache.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponse.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeLinks.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeOperationStatusResponse.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/DistributionStatusMessage.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleController.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleControllerStatus.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintArtifact.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintMicroService.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParser.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGenerator.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandler.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/service/CldsHealthcheckService.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/JsonEditorSchemaConstants.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/ToscaSchemaConstants.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertor.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/UnknownComponentException.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ArrayField.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/Constraint.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElement.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElementProperty.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaElementParser.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplate.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateField.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateManager.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/util/ClampVersioning.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/util/CryptoUtils.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/util/JsonUtils.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/util/LogMessages.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/util/OnapLogConstants.java create mode 100644 src/main/java/org/onap/policy/clamp/clds/util/ResourceFileUtils.java create mode 100644 src/main/java/org/onap/policy/clamp/configuration/ClampGsonDataFormat.java create mode 100644 src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantDeserializer.java create mode 100644 src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantSerializer.java create mode 100644 src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java create mode 100644 src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonTypeDescriptor.java create mode 100644 src/main/java/org/onap/policy/clamp/dao/model/jsontype/StringJsonUserType.java create mode 100644 src/main/java/org/onap/policy/clamp/flow/log/FlowLogOperation.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/CsarInstaller.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/Loop.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/LoopController.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/LoopService.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/LoopState.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/LoopsRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/cds/CdsDataInstaller.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/common/AuditEntity.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/components/external/DcaeComponent.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponent.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponentState.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/components/external/PolicyComponent.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/deploy/DcaeDeployParameters.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/log/LogType.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/log/LoopLog.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/log/LoopLogRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/log/LoopLogService.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/service/CsarServiceInstaller.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/service/Service.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/service/ServicesRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopElementModel.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopElementModelsRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopTemplate.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModel.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModelId.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesService.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopType.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/LoopTypeConvertor.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/PolicyModel.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/PolicyModelId.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsService.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/Policy.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/PolicyService.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/downloader/PolicyEngineController.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicy.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyService.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicy.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyService.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroup.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpSubgroup.java create mode 100644 src/main/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKey.java create mode 100644 src/main/java/org/onap/policy/clamp/tosca/Dictionary.java create mode 100644 src/main/java/org/onap/policy/clamp/tosca/DictionaryElement.java create mode 100644 src/main/java/org/onap/policy/clamp/tosca/DictionaryElementsRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/tosca/DictionaryRepository.java create mode 100644 src/main/java/org/onap/policy/clamp/tosca/DictionaryService.java create mode 100644 src/main/java/org/onap/policy/clamp/util/PassDecoder.java create mode 100644 src/main/java/org/onap/policy/clamp/util/SemanticVersioning.java delete mode 100644 src/test/java/org/onap/clamp/clds/client/CdsServicesTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/it/AuthorizationControllerItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/it/CldsHealthcheckServiceItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/it/HttpsItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/it/RobotItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateFieldTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateManagerTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementPropertyTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/util/CryptoUtilsTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/util/LoggingUtilsTest.java delete mode 100644 src/test/java/org/onap/clamp/clds/util/TestObject.java delete mode 100644 src/test/java/org/onap/clamp/clds/util/TestObject2.java delete mode 100644 src/test/java/org/onap/clamp/flow/FlowLogOperationTest.java delete mode 100644 src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/DcaeComponentTest.java delete mode 100644 src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/ExternalComponentStateTest.java delete mode 100644 src/test/java/org/onap/clamp/loop/LoopControllerTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/LoopLogServiceTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/LoopTemplateLoopElementModelTest.java delete mode 100644 src/test/java/org/onap/clamp/loop/LoopTemplatesServiceItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/LoopToJsonTest.java delete mode 100644 src/test/java/org/onap/clamp/loop/PolicyComponentTest.java delete mode 100644 src/test/java/org/onap/clamp/loop/PolicyModelServiceItCase.java delete mode 100644 src/test/java/org/onap/clamp/loop/ServiceTest.java delete mode 100644 src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java delete mode 100644 src/test/java/org/onap/clamp/policy/downloader/PolicyEngineControllerTestItCase.java delete mode 100644 src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java delete mode 100644 src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java delete mode 100644 src/test/java/org/onap/clamp/policy/pdpgroup/PdpGroupTest.java delete mode 100644 src/test/java/org/onap/clamp/policy/pdpgroup/PolicyModelKeyTest.java delete mode 100644 src/test/java/org/onap/clamp/tosca/DictionaryServiceItCase.java delete mode 100644 src/test/java/org/onap/clamp/util/PassDecoderTest.java delete mode 100644 src/test/java/org/onap/clamp/util/SemanticVersioningTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/client/CdsServicesTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoderTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/it/AuthorizationControllerItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/it/CldsHealthcheckServiceItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/it/HttpsItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/it/RobotItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/it/config/CldsReferencePropertiesItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/it/config/SdcControllersConfigurationItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParserTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandlerTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/ArrayFieldTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/ConstraintTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateFieldTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateManagerTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementPropertyTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/util/CryptoUtilsTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/util/JsonUtilsTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/util/LoggingUtilsTest.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/util/TestObject.java create mode 100644 src/test/java/org/onap/policy/clamp/clds/util/TestObject2.java create mode 100644 src/test/java/org/onap/policy/clamp/flow/FlowLogOperationTest.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/CsarInstallerItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/DcaeComponentTest.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/DeployFlowTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/ExternalComponentStateTest.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/LoopControllerTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/LoopLogServiceTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/LoopRepositoriesItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/LoopServiceTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/LoopTemplateLoopElementModelTest.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/LoopTemplatesServiceItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/LoopToJsonTest.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/PolicyComponentTest.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/ServiceTest.java create mode 100644 src/test/java/org/onap/policy/clamp/loop/deploy/BlueprintInputParametersTest.java create mode 100644 src/test/java/org/onap/policy/clamp/policy/downloader/PolicyEngineControllerTestItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/policy/microservice/MicroServicePayloadTest.java create mode 100644 src/test/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java create mode 100644 src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupTest.java create mode 100644 src/test/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKeyTest.java create mode 100644 src/test/java/org/onap/policy/clamp/tosca/DictionaryServiceItCase.java create mode 100644 src/test/java/org/onap/policy/clamp/util/PassDecoderTest.java create mode 100644 src/test/java/org/onap/policy/clamp/util/SemanticVersioningTest.java diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json index 1c6dde16b..b5e43be92 100644 --- a/docs/swagger/swagger.json +++ b/docs/swagger/swagger.json @@ -1,16 +1,16 @@ { "swagger" : "2.0", "info" : { - "version" : "5.1.3-SNAPSHOT", + "version" : "5.1.5-SNAPSHOT", "title" : "Clamp Rest API" }, - "host" : "localhost:8443", + "host" : "localhost:38837", "basePath" : "/restservices/clds/", "schemes" : [ "http" ], "paths" : { "/v2/clampInformation" : { "get" : { - "operationId" : "route34", + "operationId" : "route106", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -20,13 +20,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route34" + "x-camelContextId" : "camel-3", + "x-routeId" : "route106" } }, "/v2/dictionary" : { "get" : { - "operationId" : "route19", + "operationId" : "route91", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -36,11 +36,11 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route19" + "x-camelContextId" : "camel-3", + "x-routeId" : "route91" }, "put" : { - "operationId" : "route22", + "operationId" : "route94", "consumes" : [ "application/json" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -59,13 +59,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route22" + "x-camelContextId" : "camel-3", + "x-routeId" : "route94" } }, "/v2/dictionary/{dictionaryName}" : { "get" : { - "operationId" : "route21", + "operationId" : "route93", "produces" : [ "application/json" ], "parameters" : [ { "name" : "dictionaryName", @@ -81,13 +81,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route21" + "x-camelContextId" : "camel-3", + "x-routeId" : "route93" } }, "/v2/dictionary/{name}" : { "put" : { - "operationId" : "route23", + "operationId" : "route95", "consumes" : [ "application/json" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -111,11 +111,11 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route23" + "x-camelContextId" : "camel-3", + "x-routeId" : "route95" }, "delete" : { - "operationId" : "route24", + "operationId" : "route96", "produces" : [ "application/json" ], "parameters" : [ { "name" : "name", @@ -126,13 +126,13 @@ "responses" : { "200" : { } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route24" + "x-camelContextId" : "camel-3", + "x-routeId" : "route96" } }, "/v2/dictionary/{name}/elements/{shortName}" : { "delete" : { - "operationId" : "route25", + "operationId" : "route97", "produces" : [ "application/json" ], "parameters" : [ { "name" : "name", @@ -148,13 +148,13 @@ "responses" : { "200" : { } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route25" + "x-camelContextId" : "camel-3", + "x-routeId" : "route97" } }, "/v2/dictionary/secondary/names" : { "get" : { - "operationId" : "route20", + "operationId" : "route92", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -167,13 +167,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route20" + "x-camelContextId" : "camel-3", + "x-routeId" : "route92" } }, "/v2/loop/{loopName}" : { "get" : { - "operationId" : "route3", + "operationId" : "route75", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -189,13 +189,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route3" + "x-camelContextId" : "camel-3", + "x-routeId" : "route75" } }, "/v2/loop/addOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion}" : { "put" : { - "operationId" : "route16", + "operationId" : "route88", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -221,13 +221,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route16" + "x-camelContextId" : "camel-3", + "x-routeId" : "route88" } }, "/v2/loop/create/{loopName}?templateName={templateName}" : { "post" : { - "operationId" : "route18", + "operationId" : "route90", "consumes" : [ "application/json" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -244,13 +244,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route18" + "x-camelContextId" : "camel-3", + "x-routeId" : "route90" } }, "/v2/loop/delete/{loopName}" : { "put" : { - "operationId" : "route14", + "operationId" : "route86", "parameters" : [ { "name" : "loopName", "in" : "path", @@ -260,13 +260,13 @@ "responses" : { "200" : { } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route14" + "x-camelContextId" : "camel-3", + "x-routeId" : "route86" } }, "/v2/loop/deploy/{loopName}" : { "put" : { - "operationId" : "route7", + "operationId" : "route79", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -282,13 +282,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route7" + "x-camelContextId" : "camel-3", + "x-routeId" : "route79" } }, "/v2/loop/getAllNames" : { "get" : { - "operationId" : "route2", + "operationId" : "route74", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -301,13 +301,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route2" + "x-camelContextId" : "camel-3", + "x-routeId" : "route74" } }, "/v2/loop/getstatus/{loopName}" : { "get" : { - "operationId" : "route15", + "operationId" : "route87", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -323,13 +323,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route15" + "x-camelContextId" : "camel-3", + "x-routeId" : "route87" } }, "/v2/loop/refreshMicroServicePolicyJsonSchema/{loopName}/{microServicePolicyName}" : { "put" : { - "operationId" : "route8", + "operationId" : "route80", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -350,13 +350,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route8" + "x-camelContextId" : "camel-3", + "x-routeId" : "route80" } }, "/v2/loop/refreshOperationalPolicyJsonSchema/{loopName}/{operationalPolicyName}" : { "put" : { - "operationId" : "route9", + "operationId" : "route81", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -377,13 +377,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route9" + "x-camelContextId" : "camel-3", + "x-routeId" : "route81" } }, "/v2/loop/removeOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion}/{policyName}" : { "put" : { - "operationId" : "route17", + "operationId" : "route89", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -414,13 +414,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route17" + "x-camelContextId" : "camel-3", + "x-routeId" : "route89" } }, "/v2/loop/restart/{loopName}" : { "put" : { - "operationId" : "route12", + "operationId" : "route84", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -436,13 +436,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route12" + "x-camelContextId" : "camel-3", + "x-routeId" : "route84" } }, "/v2/loop/stop/{loopName}" : { "put" : { - "operationId" : "route11", + "operationId" : "route83", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -458,13 +458,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route11" + "x-camelContextId" : "camel-3", + "x-routeId" : "route83" } }, "/v2/loop/submit/{loopName}" : { "put" : { - "operationId" : "route13", + "operationId" : "route85", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -480,13 +480,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route13" + "x-camelContextId" : "camel-3", + "x-routeId" : "route85" } }, "/v2/loop/undeploy/{loopName}" : { "put" : { - "operationId" : "route10", + "operationId" : "route82", "produces" : [ "application/json" ], "parameters" : [ { "name" : "loopName", @@ -502,13 +502,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route10" + "x-camelContextId" : "camel-3", + "x-routeId" : "route82" } }, "/v2/loop/updateGlobalProperties/{loopName}" : { "post" : { - "operationId" : "route4", + "operationId" : "route76", "consumes" : [ "application/json" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -532,13 +532,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route4" + "x-camelContextId" : "camel-3", + "x-routeId" : "route76" } }, "/v2/loop/updateMicroservicePolicy/{loopName}" : { "post" : { - "operationId" : "route6", + "operationId" : "route78", "consumes" : [ "application/json" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -562,13 +562,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route6" + "x-camelContextId" : "camel-3", + "x-routeId" : "route78" } }, "/v2/loop/updateOperationalPolicies/{loopName}" : { "post" : { - "operationId" : "route5", + "operationId" : "route77", "consumes" : [ "application/json" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -592,13 +592,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route5" + "x-camelContextId" : "camel-3", + "x-routeId" : "route77" } }, "/v2/policyToscaModels" : { "get" : { - "operationId" : "route26", + "operationId" : "route98", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -608,11 +608,11 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route26" + "x-camelContextId" : "camel-3", + "x-routeId" : "route98" }, "post" : { - "operationId" : "route29", + "operationId" : "route101", "consumes" : [ "plain/text" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -631,13 +631,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route29" + "x-camelContextId" : "camel-3", + "x-routeId" : "route101" } }, "/v2/policyToscaModels/{policyModelType}/{policyModelVersion}" : { "get" : { - "operationId" : "route27", + "operationId" : "route99", "produces" : [ "application/json" ], "parameters" : [ { "name" : "policyModelType", @@ -658,11 +658,11 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route27" + "x-camelContextId" : "camel-3", + "x-routeId" : "route99" }, "put" : { - "operationId" : "route30", + "operationId" : "route102", "consumes" : [ "plain/text" ], "produces" : [ "application/json" ], "parameters" : [ { @@ -691,13 +691,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route30" + "x-camelContextId" : "camel-3", + "x-routeId" : "route102" } }, "/v2/policyToscaModels/yaml/{policyModelType}/{policyModelVersion}" : { "get" : { - "operationId" : "route28", + "operationId" : "route100", "produces" : [ "application/json" ], "parameters" : [ { "name" : "policyModelType", @@ -718,13 +718,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route28" + "x-camelContextId" : "camel-3", + "x-routeId" : "route100" } }, "/v2/templates" : { "get" : { - "operationId" : "route31", + "operationId" : "route103", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -734,13 +734,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route31" + "x-camelContextId" : "camel-3", + "x-routeId" : "route103" } }, "/v2/templates/{templateName}" : { "get" : { - "operationId" : "route32", + "operationId" : "route104", "produces" : [ "application/json" ], "parameters" : [ { "name" : "templateName", @@ -756,13 +756,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route32" + "x-camelContextId" : "camel-3", + "x-routeId" : "route104" } }, "/v2/templates/names" : { "get" : { - "operationId" : "route33", + "operationId" : "route105", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -775,13 +775,13 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route33" + "x-camelContextId" : "camel-3", + "x-routeId" : "route105" } }, "/v1/healthcheck" : { "get" : { - "operationId" : "route35", + "operationId" : "route107", "produces" : [ "application/json" ], "responses" : { "200" : { @@ -791,19 +791,19 @@ } } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route35" + "x-camelContextId" : "camel-3", + "x-routeId" : "route107" } }, "/v1/user/getUser" : { "get" : { - "operationId" : "route36", + "operationId" : "route108", "produces" : [ "text/plain" ], "responses" : { "200" : { } }, - "x-camelContextId" : "camel-1", - "x-routeId" : "route36" + "x-camelContextId" : "camel-3", + "x-routeId" : "route108" } } }, @@ -826,7 +826,7 @@ }, "x-className" : { "type" : "string", - "format" : "org.onap.clamp.clds.model.ClampInformation" + "format" : "org.onap.policy.clamp.clds.model.ClampInformation" } }, "Dictionary" : { @@ -866,7 +866,7 @@ }, "x-className" : { "type" : "string", - "format" : "org.onap.clamp.tosca.Dictionary" + "format" : "org.onap.policy.clamp.tosca.Dictionary" } }, "DictionaryElement" : { @@ -979,7 +979,7 @@ }, "x-className" : { "type" : "string", - "format" : "org.onap.clamp.loop.Loop" + "format" : "org.onap.policy.clamp.loop.Loop" } }, "JsonPrimitive" : { @@ -988,18 +988,6 @@ "asBoolean" : { "type" : "boolean" }, - "asInt" : { - "type" : "integer", - "format" : "int32" - }, - "asDouble" : { - "type" : "number", - "format" : "double" - }, - "asLong" : { - "type" : "integer", - "format" : "int64" - }, "boolean" : { "type" : "boolean" }, @@ -1009,22 +997,24 @@ "asString" : { "type" : "string" }, - "asBigDecimal" : { - "type" : "number" + "asFloat" : { + "type" : "number", + "format" : "float" }, - "asBigInteger" : { - "type" : "integer" + "asLong" : { + "type" : "integer", + "format" : "int64" }, - "asShort" : { + "asInt" : { "type" : "integer", "format" : "int32" }, "asNumber" : { "$ref" : "#/definitions/Number" }, - "asFloat" : { + "asDouble" : { "type" : "number", - "format" : "float" + "format" : "double" }, "asByte" : { "type" : "string", @@ -1033,32 +1023,42 @@ "asCharacter" : { "type" : "string" }, - "string" : { - "type" : "boolean" + "asBigDecimal" : { + "type" : "number" }, - "asJsonObject" : { - "$ref" : "#/definitions/JsonObject" + "asBigInteger" : { + "type" : "integer" }, - "jsonObject" : { + "asShort" : { + "type" : "integer", + "format" : "int32" + }, + "string" : { "type" : "boolean" }, + "asJsonPrimitive" : { + "$ref" : "#/definitions/JsonPrimitive" + }, "asJsonArray" : { "$ref" : "#/definitions/JsonArray" }, - "jsonArray" : { - "type" : "boolean" + "asJsonObject" : { + "$ref" : "#/definitions/JsonObject" }, "jsonNull" : { "type" : "boolean" }, - "asJsonPrimitive" : { - "$ref" : "#/definitions/JsonPrimitive" + "jsonArray" : { + "type" : "boolean" }, "asJsonNull" : { "$ref" : "#/definitions/JsonNull" }, "jsonPrimitive" : { "type" : "boolean" + }, + "jsonObject" : { + "type" : "boolean" } } }, @@ -1128,7 +1128,7 @@ }, "x-className" : { "type" : "string", - "format" : "org.onap.clamp.policy.microservice.MicroServicePolicy" + "format" : "org.onap.policy.clamp.policy.microservice.MicroServicePolicy" } }, "JsonObject" : { @@ -1137,46 +1137,51 @@ "asBoolean" : { "type" : "boolean" }, - "asInt" : { - "type" : "integer", - "format" : "int32" + "asJsonPrimitive" : { + "$ref" : "#/definitions/JsonPrimitive" }, - "asDouble" : { - "type" : "number", - "format" : "double" + "asString" : { + "type" : "string" }, - "asLong" : { - "type" : "integer", - "format" : "int64" + "asJsonArray" : { + "$ref" : "#/definitions/JsonArray" }, "asJsonObject" : { "$ref" : "#/definitions/JsonObject" }, - "asString" : { - "type" : "string" - }, - "jsonObject" : { + "jsonNull" : { "type" : "boolean" }, - "asJsonArray" : { - "$ref" : "#/definitions/JsonArray" - }, - "asBigDecimal" : { - "type" : "number" + "asFloat" : { + "type" : "number", + "format" : "float" }, - "asBigInteger" : { - "type" : "integer" + "asLong" : { + "type" : "integer", + "format" : "int64" }, - "asShort" : { + "asInt" : { "type" : "integer", "format" : "int32" }, + "jsonArray" : { + "type" : "boolean" + }, + "asJsonNull" : { + "$ref" : "#/definitions/JsonNull" + }, + "jsonPrimitive" : { + "type" : "boolean" + }, "asNumber" : { "$ref" : "#/definitions/Number" }, - "asFloat" : { + "asDouble" : { "type" : "number", - "format" : "float" + "format" : "double" + }, + "jsonObject" : { + "type" : "boolean" }, "asByte" : { "type" : "string", @@ -1185,20 +1190,15 @@ "asCharacter" : { "type" : "string" }, - "jsonArray" : { - "type" : "boolean" - }, - "jsonNull" : { - "type" : "boolean" - }, - "asJsonPrimitive" : { - "$ref" : "#/definitions/JsonPrimitive" + "asBigDecimal" : { + "type" : "number" }, - "asJsonNull" : { - "$ref" : "#/definitions/JsonNull" + "asBigInteger" : { + "type" : "integer" }, - "jsonPrimitive" : { - "type" : "boolean" + "asShort" : { + "type" : "integer", + "format" : "int32" } }, "x-className" : { @@ -1248,7 +1248,7 @@ }, "x-className" : { "type" : "string", - "format" : "org.onap.clamp.loop.template.PolicyModel" + "format" : "org.onap.policy.clamp.loop.template.PolicyModel" } }, "Service" : { @@ -1335,46 +1335,51 @@ "asBoolean" : { "type" : "boolean" }, - "asInt" : { - "type" : "integer", - "format" : "int32" + "asJsonPrimitive" : { + "$ref" : "#/definitions/JsonPrimitive" }, - "asDouble" : { - "type" : "number", - "format" : "double" + "asString" : { + "type" : "string" }, - "asLong" : { - "type" : "integer", - "format" : "int64" + "asJsonArray" : { + "$ref" : "#/definitions/JsonArray" }, "asJsonObject" : { "$ref" : "#/definitions/JsonObject" }, - "asString" : { - "type" : "string" - }, - "jsonObject" : { + "jsonNull" : { "type" : "boolean" }, - "asJsonArray" : { - "$ref" : "#/definitions/JsonArray" - }, - "asBigDecimal" : { - "type" : "number" + "asFloat" : { + "type" : "number", + "format" : "float" }, - "asBigInteger" : { - "type" : "integer" + "asLong" : { + "type" : "integer", + "format" : "int64" }, - "asShort" : { + "asInt" : { "type" : "integer", "format" : "int32" }, + "jsonArray" : { + "type" : "boolean" + }, + "asJsonNull" : { + "$ref" : "#/definitions/JsonNull" + }, + "jsonPrimitive" : { + "type" : "boolean" + }, "asNumber" : { "$ref" : "#/definitions/Number" }, - "asFloat" : { + "asDouble" : { "type" : "number", - "format" : "float" + "format" : "double" + }, + "jsonObject" : { + "type" : "boolean" }, "asByte" : { "type" : "string", @@ -1383,20 +1388,15 @@ "asCharacter" : { "type" : "string" }, - "jsonArray" : { - "type" : "boolean" - }, - "jsonNull" : { - "type" : "boolean" - }, - "asJsonPrimitive" : { - "$ref" : "#/definitions/JsonPrimitive" + "asBigDecimal" : { + "type" : "number" }, - "asJsonNull" : { - "$ref" : "#/definitions/JsonNull" + "asBigInteger" : { + "type" : "integer" }, - "jsonPrimitive" : { - "type" : "boolean" + "asShort" : { + "type" : "integer", + "format" : "int32" } } }, @@ -1406,37 +1406,27 @@ "asBoolean" : { "type" : "boolean" }, - "asInt" : { - "type" : "integer", - "format" : "int32" + "asString" : { + "type" : "string" }, - "asDouble" : { + "asFloat" : { "type" : "number", - "format" : "double" + "format" : "float" }, "asLong" : { "type" : "integer", "format" : "int64" }, - "asString" : { - "type" : "string" - }, - "asBigDecimal" : { - "type" : "number" - }, - "asBigInteger" : { - "type" : "integer" - }, - "asShort" : { + "asInt" : { "type" : "integer", "format" : "int32" }, "asNumber" : { "$ref" : "#/definitions/Number" }, - "asFloat" : { + "asDouble" : { "type" : "number", - "format" : "float" + "format" : "double" }, "asByte" : { "type" : "string", @@ -1445,29 +1435,39 @@ "asCharacter" : { "type" : "string" }, - "asJsonObject" : { - "$ref" : "#/definitions/JsonObject" + "asBigDecimal" : { + "type" : "number" }, - "jsonObject" : { - "type" : "boolean" + "asBigInteger" : { + "type" : "integer" + }, + "asShort" : { + "type" : "integer", + "format" : "int32" + }, + "asJsonPrimitive" : { + "$ref" : "#/definitions/JsonPrimitive" }, "asJsonArray" : { "$ref" : "#/definitions/JsonArray" }, - "jsonArray" : { - "type" : "boolean" + "asJsonObject" : { + "$ref" : "#/definitions/JsonObject" }, "jsonNull" : { "type" : "boolean" }, - "asJsonPrimitive" : { - "$ref" : "#/definitions/JsonPrimitive" + "jsonArray" : { + "type" : "boolean" }, "asJsonNull" : { "$ref" : "#/definitions/JsonNull" }, "jsonPrimitive" : { "type" : "boolean" + }, + "jsonObject" : { + "type" : "boolean" } }, "x-className" : { @@ -1565,7 +1565,7 @@ }, "x-className" : { "type" : "string", - "format" : "org.onap.clamp.loop.template.LoopTemplate" + "format" : "org.onap.policy.clamp.loop.template.LoopTemplate" } }, "ExternalComponentState" : { @@ -1646,7 +1646,7 @@ }, "x-className" : { "type" : "string", - "format" : "org.onap.clamp.clds.model.CldsHealthCheck" + "format" : "org.onap.policy.clamp.clds.model.CldsHealthCheck" } } } diff --git a/docs/swagger/swagger.pdf b/docs/swagger/swagger.pdf index 02b3dc4cc..2502cf1e8 100644 --- a/docs/swagger/swagger.pdf +++ b/docs/swagger/swagger.pdf @@ -4,8 +4,8 @@ << /Title (Clamp Rest API) /Creator (Asciidoctor PDF 1.5.0.alpha.10, based on Prawn 1.3.0) /Producer (Asciidoctor PDF 1.5.0.alpha.10, based on Prawn 1.3.0) -/CreationDate (D:20201009181937+02'00') -/ModDate (D:20201009181937+02'00') +/CreationDate (D:20201211130920+01'00') +/ModDate (D:20201211130920+01'00') >> endobj 2 0 obj @@ -23,7 +23,7 @@ endobj 3 0 obj << /Type /Pages /Count 38 -/Kids [7 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 29 0 R 45 0 R 61 0 R 75 0 R 87 0 R 98 0 R 110 0 R 123 0 R 134 0 R 144 0 R 159 0 R 173 0 R 186 0 R 199 0 R 214 0 R 225 0 R 238 0 R 247 0 R 254 0 R 260 0 R 267 0 R 273 0 R 281 0 R 288 0 R 296 0 R 304 0 R 311 0 R 318 0 R 326 0 R 336 0 R 343 0 R] +/Kids [7 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 29 0 R 45 0 R 61 0 R 75 0 R 87 0 R 98 0 R 110 0 R 123 0 R 133 0 R 144 0 R 160 0 R 174 0 R 187 0 R 200 0 R 214 0 R 225 0 R 237 0 R 247 0 R 254 0 R 260 0 R 267 0 R 273 0 R 281 0 R 288 0 R 296 0 R 304 0 R 311 0 R 318 0 R 326 0 R 336 0 R 343 0 R] >> endobj 4 0 obj @@ -6746,7 +6746,7 @@ endobj >> endobj 19 0 obj -<< /Length 2377 +<< /Length 2379 >> stream q @@ -6791,7 +6791,7 @@ ET BT 85.136384765625 660.036 Td /F1.0 10.5 Tf -[<203a20352e312e332d534e415053484f> 20.01953125 <54>] TJ +[<203a20352e312e352d534e415053484f> 20.01953125 <54>] TJ ET 0.000 0.000 0.000 SCN @@ -6824,7 +6824,7 @@ ET BT 71.30850000000001 592.176 Td /F1.0 10.5 Tf -<203a206c6f63616c686f73743a38343433> Tj +<203a206c6f63616c686f73743a3338383337> Tj ET 0.000 0.000 0.000 SCN @@ -6939,7 +6939,7 @@ endobj >> endobj 23 0 obj -<< /Kids [56 0 R 258 0 R 320 0 R 155 0 R 242 0 R 90 0 R 152 0 R 221 0 R 57 0 R 201 0 R 125 0 R 236 0 R 84 0 R 206 0 R] +<< /Kids [56 0 R 258 0 R 320 0 R 156 0 R 241 0 R 90 0 R 153 0 R 221 0 R 57 0 R 150 0 R 210 0 R 243 0 R 84 0 R 140 0 R] >> endobj 24 0 obj @@ -9195,12 +9195,12 @@ endobj endobj 56 0 obj << /Limits [(_clampinformation) (_consumes_8)] -/Names [(_clampinformation) 249 0 R (_cldshealthcheck) 250 0 R (_consumes) 54 0 R (_consumes_2) 73 0 R (_consumes_3) 100 0 R (_consumes_4) 171 0 R (_consumes_5) 180 0 R (_consumes_6) 189 0 R (_consumes_7) 203 0 R (_consumes_8) 228 0 R] +/Names [(_clampinformation) 249 0 R (_cldshealthcheck) 250 0 R (_consumes) 54 0 R (_consumes_2) 73 0 R (_consumes_3) 100 0 R (_consumes_4) 172 0 R (_consumes_5) 181 0 R (_consumes_6) 190 0 R (_consumes_7) 203 0 R (_consumes_8) 228 0 R] >> endobj 57 0 obj << /Limits [(_responses_10) (_responses_19)] -/Names [(_responses_10) 83 0 R (_responses_11) 91 0 R (_responses_12) 96 0 R (_responses_13) 104 0 R (_responses_14) 107 0 R (_responses_15) 113 0 R (_responses_16) 117 0 R (_responses_17) 124 0 R (_responses_18) 130 0 R (_responses_19) 137 0 R] +/Names [(_responses_10) 83 0 R (_responses_11) 91 0 R (_responses_12) 96 0 R (_responses_13) 104 0 R (_responses_14) 107 0 R (_responses_15) 113 0 R (_responses_16) 117 0 R (_responses_17) 124 0 R (_responses_18) 129 0 R (_responses_19) 136 0 R] >> endobj 58 0 obj @@ -11805,8 +11805,8 @@ endobj [75 0 R /XYZ 0 198.9600000000004 null] endobj 84 0 obj -<< /Limits [(_route2) (_route3)] -/Names [(_route2) 112 0 R (_route20) 58 0 R (_route21) 63 0 R (_route22) 49 0 R (_route23) 68 0 R (_route24) 77 0 R (_route25) 81 0 R (_route26) 205 0 R (_route27) 216 0 R (_route28) 210 0 R (_route29) 196 0 R (_route3) 191 0 R] +<< /Limits [(_route107) (_route88)] +/Names [(_route107) 31 0 R (_route108) 36 0 R (_route74) 112 0 R (_route75) 192 0 R (_route76) 167 0 R (_route77) 183 0 R (_route78) 176 0 R (_route79) 105 0 R (_route80) 120 0 R (_route81) 127 0 R (_route82) 162 0 R (_route83) 147 0 R (_route84) 139 0 R (_route85) 154 0 R (_route86) 102 0 R (_route87) 115 0 R (_route88) 88 0 R] >> endobj 85 0 obj @@ -13021,7 +13021,7 @@ endobj endobj 90 0 obj << /Limits [(_policymodel) (_produces_18)] -/Names [(_policymodel) 340 0 R (_produces) 34 0 R (_produces_10) 85 0 R (_produces_11) 93 0 R (_produces_12) 101 0 R (_produces_13) 111 0 R (_produces_14) 114 0 R (_produces_15) 119 0 R (_produces_16) 127 0 R (_produces_17) 132 0 R (_produces_18) 139 0 R] +/Names [(_policymodel) 340 0 R (_produces) 34 0 R (_produces_10) 85 0 R (_produces_11) 93 0 R (_produces_12) 101 0 R (_produces_13) 111 0 R (_produces_14) 114 0 R (_produces_15) 119 0 R (_produces_16) 126 0 R (_produces_17) 131 0 R (_produces_18) 138 0 R] >> endobj 91 0 obj @@ -16886,18 +16886,13 @@ endobj /XObject << /Stamp1 676 0 R >> >> -/Annots [126 0 R 131 0 R] +/Annots [125 0 R 130 0 R] >> endobj 124 0 obj [123 0 R /XYZ 0 645.5999999999999 null] endobj 125 0 obj -<< /Limits [(_responses_30) (_responses_8)] -/Names [(_responses_30) 212 0 R (_responses_31) 218 0 R (_responses_32) 226 0 R (_responses_33) 231 0 R (_responses_34) 235 0 R (_responses_35) 243 0 R (_responses_4) 46 0 R (_responses_5) 52 0 R (_responses_6) 59 0 R (_responses_7) 65 0 R (_responses_8) 71 0 R] ->> -endobj -126 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -16905,19 +16900,19 @@ endobj /Type /Annot >> endobj -127 0 obj +126 0 obj [123 0 R /XYZ 0 540.48 null] endobj -128 0 obj +127 0 obj [123 0 R /XYZ 0 484.20000000000016 null] endobj -129 0 obj +128 0 obj [123 0 R /XYZ 0 387.96000000000015 null] endobj -130 0 obj +129 0 obj [123 0 R /XYZ 0 245.28000000000014 null] endobj -131 0 obj +130 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -16925,10 +16920,10 @@ endobj /Type /Annot >> endobj -132 0 obj +131 0 obj [123 0 R /XYZ 0 140.1600000000001 null] endobj -133 0 obj +132 0 obj << /Length 17251 >> stream @@ -18212,11 +18207,11 @@ Q endstream endobj -134 0 obj +133 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612.0 792.0] -/Contents 133 0 R +/Contents 132 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 24 0 R /F3.0 26 0 R @@ -18226,19 +18221,19 @@ endobj /XObject << /Stamp1 676 0 R >> >> -/Annots [138 0 R] +/Annots [137 0 R] >> endobj +134 0 obj +[133 0 R /XYZ 0 792.0 null] +endobj 135 0 obj -[134 0 R /XYZ 0 792.0 null] +[133 0 R /XYZ 0 662.1600000000001 null] endobj 136 0 obj -[134 0 R /XYZ 0 662.1600000000001 null] +[133 0 R /XYZ 0 444.3600000000002 null] endobj 137 0 obj -[134 0 R /XYZ 0 444.3600000000002 null] -endobj -138 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -18246,17 +18241,22 @@ endobj /Type /Annot >> endobj +138 0 obj +[133 0 R /XYZ 0 339.2400000000001 null] +endobj 139 0 obj -[134 0 R /XYZ 0 339.2400000000001 null] +[133 0 R /XYZ 0 282.9600000000001 null] endobj 140 0 obj -[134 0 R /XYZ 0 282.9600000000001 null] +<< /Limits [(_route89) (_version_information)] +/Names [(_route89) 134 0 R (_route90) 94 0 R (_route91) 43 0 R (_route92) 58 0 R (_route93) 63 0 R (_route94) 49 0 R (_route95) 68 0 R (_route96) 77 0 R (_route97) 81 0 R (_route98) 205 0 R (_route99) 216 0 R (_service) 345 0 R (_uri_scheme) 27 0 R (_version_information) 25 0 R] +>> endobj 141 0 obj -[134 0 R /XYZ 0 242.8800000000001 null] +[133 0 R /XYZ 0 242.8800000000001 null] endobj 142 0 obj -[134 0 R /XYZ 0 137.76000000000008 null] +[133 0 R /XYZ 0 137.76000000000008 null] endobj 143 0 obj << /Length 19073 @@ -19682,7 +19682,7 @@ endobj /XObject << /Stamp1 676 0 R >> >> -/Annots [145 0 R 150 0 R 157 0 R] +/Annots [145 0 R 151 0 R 158 0 R] >> endobj 145 0 obj @@ -19706,6 +19706,11 @@ endobj [144 0 R /XYZ 0 481.68000000000046 null] endobj 150 0 obj +<< /Limits [(_responses_2) (_responses_28)] +/Names [(_responses_2) 37 0 R (_responses_20) 142 0 R (_responses_21) 149 0 R (_responses_22) 157 0 R (_responses_23) 164 0 R (_responses_24) 170 0 R (_responses_25) 179 0 R (_responses_26) 188 0 R (_responses_27) 194 0 R (_responses_28) 201 0 R] +>> +endobj +151 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -19713,29 +19718,29 @@ endobj /Type /Annot >> endobj -151 0 obj +152 0 obj [144 0 R /XYZ 0 376.5600000000004 null] endobj -152 0 obj +153 0 obj << /Limits [(_produces_19) (_produces_27)] -/Names [(_produces_19) 146 0 R (_produces_2) 38 0 R (_produces_20) 151 0 R (_produces_21) 160 0 R (_produces_22) 165 0 R (_produces_23) 174 0 R (_produces_24) 181 0 R (_produces_25) 190 0 R (_produces_26) 195 0 R (_produces_27) 204 0 R] +/Names [(_produces_19) 146 0 R (_produces_2) 38 0 R (_produces_20) 152 0 R (_produces_21) 161 0 R (_produces_22) 166 0 R (_produces_23) 175 0 R (_produces_24) 182 0 R (_produces_25) 191 0 R (_produces_26) 196 0 R (_produces_27) 204 0 R] >> endobj -153 0 obj +154 0 obj [144 0 R /XYZ 0 320.28000000000037 null] endobj -154 0 obj +155 0 obj [144 0 R /XYZ 0 280.20000000000033 null] endobj -155 0 obj +156 0 obj << /Limits [(_parameters_15) (_parameters_23)] -/Names [(_parameters_15) 148 0 R (_parameters_16) 154 0 R (_parameters_17) 162 0 R (_parameters_18) 167 0 R (_parameters_19) 176 0 R (_parameters_2) 64 0 R (_parameters_20) 183 0 R (_parameters_21) 192 0 R (_parameters_22) 197 0 R (_parameters_23) 211 0 R] +/Names [(_parameters_15) 148 0 R (_parameters_16) 155 0 R (_parameters_17) 163 0 R (_parameters_18) 168 0 R (_parameters_19) 177 0 R (_parameters_2) 64 0 R (_parameters_20) 184 0 R (_parameters_21) 193 0 R (_parameters_22) 198 0 R (_parameters_23) 211 0 R] >> endobj -156 0 obj +157 0 obj [144 0 R /XYZ 0 175.08000000000033 null] endobj -157 0 obj +158 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -19743,7 +19748,7 @@ endobj /Type /Annot >> endobj -158 0 obj +159 0 obj << /Length 18295 >> stream @@ -21078,11 +21083,11 @@ Q endstream endobj -159 0 obj +160 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612.0 792.0] -/Contents 158 0 R +/Contents 159 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 24 0 R /F1.0 8 0 R @@ -21092,22 +21097,22 @@ endobj /XObject << /Stamp1 676 0 R >> >> -/Annots [164 0 R 168 0 R 170 0 R] +/Annots [165 0 R 169 0 R 171 0 R] >> endobj -160 0 obj -[159 0 R /XYZ 0 792.0 null] -endobj 161 0 obj -[159 0 R /XYZ 0 702.1200000000001 null] +[160 0 R /XYZ 0 792.0 null] endobj 162 0 obj -[159 0 R /XYZ 0 662.0400000000002 null] +[160 0 R /XYZ 0 702.1200000000001 null] endobj 163 0 obj -[159 0 R /XYZ 0 556.9200000000003 null] +[160 0 R /XYZ 0 662.0400000000002 null] endobj 164 0 obj +[160 0 R /XYZ 0 556.9200000000003 null] +endobj +165 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -21115,16 +21120,16 @@ endobj /Type /Annot >> endobj -165 0 obj -[159 0 R /XYZ 0 451.8000000000004 null] -endobj 166 0 obj -[159 0 R /XYZ 0 395.5200000000004 null] +[160 0 R /XYZ 0 451.8000000000004 null] endobj 167 0 obj -[159 0 R /XYZ 0 355.44000000000034 null] +[160 0 R /XYZ 0 395.5200000000004 null] endobj 168 0 obj +[160 0 R /XYZ 0 355.44000000000034 null] +endobj +169 0 obj << /Border [0 0 0] /Dest (_jsonobject) /Subtype /Link @@ -21132,10 +21137,10 @@ endobj /Type /Annot >> endobj -169 0 obj -[159 0 R /XYZ 0 212.76000000000028 null] -endobj 170 0 obj +[160 0 R /XYZ 0 212.76000000000028 null] +endobj +171 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -21143,10 +21148,10 @@ endobj /Type /Annot >> endobj -171 0 obj -[159 0 R /XYZ 0 107.64000000000024 null] -endobj 172 0 obj +[160 0 R /XYZ 0 107.64000000000024 null] +endobj +173 0 obj << /Length 17036 >> stream @@ -22380,11 +22385,11 @@ Q endstream endobj -173 0 obj +174 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612.0 792.0] -/Contents 172 0 R +/Contents 173 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 24 0 R /F1.0 8 0 R @@ -22394,19 +22399,19 @@ endobj /XObject << /Stamp1 676 0 R >> >> -/Annots [177 0 R 179 0 R 184 0 R] +/Annots [178 0 R 180 0 R 185 0 R] >> endobj -174 0 obj -[173 0 R /XYZ 0 792.0 null] -endobj 175 0 obj -[173 0 R /XYZ 0 702.1200000000001 null] +[174 0 R /XYZ 0 792.0 null] endobj 176 0 obj -[173 0 R /XYZ 0 633.9600000000002 null] +[174 0 R /XYZ 0 702.1200000000001 null] endobj 177 0 obj +[174 0 R /XYZ 0 633.9600000000002 null] +endobj +178 0 obj << /Border [0 0 0] /Dest (_microservicepolicy) /Subtype /Link @@ -22414,10 +22419,10 @@ endobj /Type /Annot >> endobj -178 0 obj -[173 0 R /XYZ 0 491.28000000000026 null] -endobj 179 0 obj +[174 0 R /XYZ 0 491.28000000000026 null] +endobj +180 0 obj << /Border [0 0 0] /Dest (_microservicepolicy) /Subtype /Link @@ -22425,19 +22430,19 @@ endobj /Type /Annot >> endobj -180 0 obj -[173 0 R /XYZ 0 386.1600000000002 null] -endobj 181 0 obj -[173 0 R /XYZ 0 329.88000000000017 null] +[174 0 R /XYZ 0 386.1600000000002 null] endobj 182 0 obj -[173 0 R /XYZ 0 273.60000000000014 null] +[174 0 R /XYZ 0 329.88000000000017 null] endobj 183 0 obj -[173 0 R /XYZ 0 205.44000000000014 null] +[174 0 R /XYZ 0 273.60000000000014 null] endobj 184 0 obj +[174 0 R /XYZ 0 205.44000000000014 null] +endobj +185 0 obj << /Border [0 0 0] /Dest (_jsonarray) /Subtype /Link @@ -22445,7 +22450,7 @@ endobj /Type /Annot >> endobj -185 0 obj +186 0 obj << /Length 16279 >> stream @@ -23643,11 +23648,11 @@ Q endstream endobj -186 0 obj +187 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612.0 792.0] -/Contents 185 0 R +/Contents 186 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 24 0 R /F1.0 8 0 R @@ -23657,13 +23662,13 @@ endobj /XObject << /Stamp1 676 0 R >> >> -/Annots [188 0 R 194 0 R] +/Annots [189 0 R 195 0 R] >> endobj -187 0 obj -[186 0 R /XYZ 0 792.0 null] -endobj 188 0 obj +[187 0 R /XYZ 0 792.0 null] +endobj +189 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -23671,22 +23676,22 @@ endobj /Type /Annot >> endobj -189 0 obj -[186 0 R /XYZ 0 653.2800000000002 null] -endobj 190 0 obj -[186 0 R /XYZ 0 597.0000000000003 null] +[187 0 R /XYZ 0 653.2800000000002 null] endobj 191 0 obj -[186 0 R /XYZ 0 540.7200000000005 null] +[187 0 R /XYZ 0 597.0000000000003 null] endobj 192 0 obj -[186 0 R /XYZ 0 500.6400000000005 null] +[187 0 R /XYZ 0 540.7200000000005 null] endobj 193 0 obj -[186 0 R /XYZ 0 395.5200000000005 null] +[187 0 R /XYZ 0 500.6400000000005 null] endobj 194 0 obj +[187 0 R /XYZ 0 395.5200000000005 null] +endobj +195 0 obj << /Border [0 0 0] /Dest (_loop) /Subtype /Link @@ -23694,16 +23699,16 @@ endobj /Type /Annot >> endobj -195 0 obj -[186 0 R /XYZ 0 290.40000000000043 null] -endobj 196 0 obj -[186 0 R /XYZ 0 234.1200000000004 null] +[187 0 R /XYZ 0 290.40000000000043 null] endobj 197 0 obj -[186 0 R /XYZ 0 194.0400000000004 null] +[187 0 R /XYZ 0 234.1200000000004 null] endobj 198 0 obj +[187 0 R /XYZ 0 194.0400000000004 null] +endobj +199 0 obj << /Length 15184 >> stream @@ -24806,11 +24811,11 @@ Q endstream endobj -199 0 obj +200 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612.0 792.0] -/Contents 198 0 R +/Contents 199 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 24 0 R /F1.0 8 0 R @@ -24820,16 +24825,11 @@ endobj /XObject << /Stamp1 676 0 R >> >> -/Annots [202 0 R 208 0 R] +/Annots [202 0 R 207 0 R] >> endobj -200 0 obj -[199 0 R /XYZ 0 792.0 null] -endobj 201 0 obj -<< /Limits [(_responses_2) (_responses_3)] -/Names [(_responses_2) 37 0 R (_responses_20) 142 0 R (_responses_21) 149 0 R (_responses_22) 156 0 R (_responses_23) 163 0 R (_responses_24) 169 0 R (_responses_25) 178 0 R (_responses_26) 187 0 R (_responses_27) 193 0 R (_responses_28) 200 0 R (_responses_29) 207 0 R (_responses_3) 40 0 R] ->> +[200 0 R /XYZ 0 792.0 null] endobj 202 0 obj << /Border [0 0 0] @@ -24840,23 +24840,18 @@ endobj >> endobj 203 0 obj -[199 0 R /XYZ 0 653.2800000000002 null] +[200 0 R /XYZ 0 653.2800000000002 null] endobj 204 0 obj -[199 0 R /XYZ 0 597.0000000000003 null] +[200 0 R /XYZ 0 597.0000000000003 null] endobj 205 0 obj -[199 0 R /XYZ 0 540.7200000000005 null] +[200 0 R /XYZ 0 540.7200000000005 null] endobj 206 0 obj -<< /Limits [(_route30) (_version_information)] -/Names [(_route30) 222 0 R (_route31) 230 0 R (_route32) 240 0 R (_route33) 234 0 R (_route34) 39 0 R (_route35) 31 0 R (_route36) 36 0 R (_route4) 166 0 R (_route5) 182 0 R (_route6) 175 0 R (_route7) 105 0 R (_route8) 120 0 R (_route9) 128 0 R (_service) 345 0 R (_uri_scheme) 27 0 R (_version_information) 25 0 R] ->> +[200 0 R /XYZ 0 500.6400000000005 null] endobj 207 0 obj -[199 0 R /XYZ 0 500.6400000000005 null] -endobj -208 0 obj << /Border [0 0 0] /Dest (_policymodel) /Subtype /Link @@ -24864,17 +24859,22 @@ endobj /Type /Annot >> endobj +208 0 obj +[200 0 R /XYZ 0 395.52000000000044 null] +endobj 209 0 obj -[199 0 R /XYZ 0 395.52000000000044 null] +[200 0 R /XYZ 0 339.2400000000004 null] endobj 210 0 obj -[199 0 R /XYZ 0 339.2400000000004 null] +<< /Limits [(_responses_29) (_responses_5)] +/Names [(_responses_29) 206 0 R (_responses_3) 40 0 R (_responses_30) 212 0 R (_responses_31) 218 0 R (_responses_32) 226 0 R (_responses_33) 231 0 R (_responses_34) 235 0 R (_responses_35) 242 0 R (_responses_4) 46 0 R (_responses_5) 52 0 R] +>> endobj 211 0 obj -[199 0 R /XYZ 0 243.00000000000043 null] +[200 0 R /XYZ 0 243.00000000000043 null] endobj 212 0 obj -[199 0 R /XYZ 0 100.32000000000039 null] +[200 0 R /XYZ 0 100.32000000000039 null] endobj 213 0 obj << /Length 14693 @@ -25987,7 +25987,7 @@ endobj endobj 221 0 obj << /Limits [(_produces_28) (_responses)] -/Names [(_produces_28) 209 0 R (_produces_29) 215 0 R (_produces_3) 42 0 R (_produces_30) 220 0 R (_produces_31) 229 0 R (_produces_32) 233 0 R (_produces_33) 239 0 R (_produces_34) 245 0 R (_produces_4) 48 0 R (_produces_5) 55 0 R (_produces_6) 62 0 R (_produces_7) 67 0 R (_produces_8) 76 0 R (_produces_9) 80 0 R (_responses) 32 0 R] +/Names [(_produces_28) 208 0 R (_produces_29) 215 0 R (_produces_3) 42 0 R (_produces_30) 220 0 R (_produces_31) 229 0 R (_produces_32) 233 0 R (_produces_33) 238 0 R (_produces_34) 245 0 R (_produces_4) 48 0 R (_produces_5) 55 0 R (_produces_6) 62 0 R (_produces_7) 67 0 R (_produces_8) 76 0 R (_produces_9) 80 0 R (_responses) 32 0 R] >> endobj 222 0 obj @@ -27494,11 +27494,6 @@ endobj [225 0 R /XYZ 0 148.79999999999993 null] endobj 236 0 obj -<< /Limits [(_responses_9) (_route19)] -/Names [(_responses_9) 79 0 R (_route10) 161 0 R (_route11) 147 0 R (_route12) 140 0 R (_route13) 153 0 R (_route14) 102 0 R (_route15) 115 0 R (_route16) 88 0 R (_route17) 135 0 R (_route18) 94 0 R (_route19) 43 0 R] ->> -endobj -237 0 obj << /Length 8598 >> stream @@ -28131,11 +28126,11 @@ Q endstream endobj -238 0 obj +237 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612.0 792.0] -/Contents 237 0 R +/Contents 236 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 24 0 R /F1.0 8 0 R @@ -28148,22 +28143,27 @@ endobj /Annots [244 0 R] >> endobj +238 0 obj +[237 0 R /XYZ 0 792.0 null] +endobj 239 0 obj -[238 0 R /XYZ 0 792.0 null] +[237 0 R /XYZ 0 702.1200000000001 null] endobj 240 0 obj -[238 0 R /XYZ 0 702.1200000000001 null] +[237 0 R /XYZ 0 662.0400000000002 null] endobj 241 0 obj -[238 0 R /XYZ 0 662.0400000000002 null] -endobj -242 0 obj << /Limits [(_parameters_24) (_paths)] -/Names [(_parameters_24) 217 0 R (_parameters_25) 223 0 R (_parameters_26) 241 0 R (_parameters_3) 69 0 R (_parameters_4) 78 0 R (_parameters_5) 82 0 R (_parameters_6) 89 0 R (_parameters_7) 95 0 R (_parameters_8) 103 0 R (_parameters_9) 106 0 R (_paths) 30 0 R] +/Names [(_parameters_24) 217 0 R (_parameters_25) 223 0 R (_parameters_26) 240 0 R (_parameters_3) 69 0 R (_parameters_4) 78 0 R (_parameters_5) 82 0 R (_parameters_6) 89 0 R (_parameters_7) 95 0 R (_parameters_8) 103 0 R (_parameters_9) 106 0 R (_paths) 30 0 R] >> endobj +242 0 obj +[237 0 R /XYZ 0 556.9200000000003 null] +endobj 243 0 obj -[238 0 R /XYZ 0 556.9200000000003 null] +<< /Limits [(_responses_6) (_route106)] +/Names [(_responses_6) 59 0 R (_responses_7) 65 0 R (_responses_8) 71 0 R (_responses_9) 79 0 R (_route100) 209 0 R (_route101) 197 0 R (_route102) 222 0 R (_route103) 230 0 R (_route104) 239 0 R (_route105) 234 0 R (_route106) 39 0 R] +>> endobj 244 0 obj << /Border [0 0 0] @@ -28174,7 +28174,7 @@ endobj >> endobj 245 0 obj -[238 0 R /XYZ 0 451.8000000000004 null] +[237 0 R /XYZ 0 451.8000000000004 null] endobj 246 0 obj << /Length 17145 @@ -46554,7 +46554,7 @@ endobj endobj 320 0 obj << /Limits [(_loopelementmodel) (_parameters_14)] -/Names [(_loopelementmodel) 307 0 R (_looplog) 312 0 R (_looptemplate) 314 0 R (_looptemplateloopelementmodel) 319 0 R (_microservicepolicy) 323 0 R (_number) 331 0 R (_operationalpolicy) 332 0 R (_overview) 21 0 R (_parameters) 50 0 R (_parameters_10) 116 0 R (_parameters_11) 121 0 R (_parameters_12) 129 0 R (_parameters_13) 136 0 R (_parameters_14) 141 0 R] +/Names [(_loopelementmodel) 307 0 R (_looplog) 312 0 R (_looptemplate) 314 0 R (_looptemplateloopelementmodel) 319 0 R (_microservicepolicy) 323 0 R (_number) 331 0 R (_operationalpolicy) 332 0 R (_overview) 21 0 R (_parameters) 50 0 R (_parameters_10) 116 0 R (_parameters_11) 121 0 R (_parameters_12) 128 0 R (_parameters_13) 135 0 R (_parameters_14) 141 0 R] >> endobj 321 0 obj @@ -50903,7 +50903,7 @@ endobj endobj 356 0 obj << /Border [0 0 0] -/Dest (_route35) +/Dest (_route107) /Subtype /Link /Rect [60.24000000000001 621.7799999999997 181.64100000000002 636.0599999999998] /Type /Annot @@ -50911,7 +50911,7 @@ endobj endobj 357 0 obj << /Border [0 0 0] -/Dest (_route35) +/Dest (_route107) /Subtype /Link /Rect [557.8905 621.7799999999997 563.76 636.0599999999998] /Type /Annot @@ -50951,7 +50951,7 @@ endobj endobj 362 0 obj << /Border [0 0 0] -/Dest (_route36) +/Dest (_route108) /Subtype /Link /Rect [60.24000000000001 566.3399999999997 183.8775 580.6199999999998] /Type /Annot @@ -50959,7 +50959,7 @@ endobj endobj 363 0 obj << /Border [0 0 0] -/Dest (_route36) +/Dest (_route108) /Subtype /Link /Rect [557.8905 566.3399999999997 563.76 580.6199999999998] /Type /Annot @@ -50999,7 +50999,7 @@ endobj endobj 368 0 obj << /Border [0 0 0] -/Dest (_route34) +/Dest (_route106) /Subtype /Link /Rect [60.24000000000001 510.89999999999975 212.98350000000002 525.1799999999997] /Type /Annot @@ -51007,7 +51007,7 @@ endobj endobj 369 0 obj << /Border [0 0 0] -/Dest (_route34) +/Dest (_route106) /Subtype /Link /Rect [557.8905 510.89999999999975 563.76 525.1799999999997] /Type /Annot @@ -51047,7 +51047,7 @@ endobj endobj 374 0 obj << /Border [0 0 0] -/Dest (_route19) +/Dest (_route91) /Subtype /Link /Rect [60.24000000000001 455.4599999999997 172.716 469.73999999999967] /Type /Annot @@ -51055,7 +51055,7 @@ endobj endobj 375 0 obj << /Border [0 0 0] -/Dest (_route19) +/Dest (_route91) /Subtype /Link /Rect [557.8905 455.4599999999997 563.76 469.73999999999967] /Type /Annot @@ -51095,7 +51095,7 @@ endobj endobj 380 0 obj << /Border [0 0 0] -/Dest (_route22) +/Dest (_route94) /Subtype /Link /Rect [60.24000000000001 400.01999999999964 172.548 414.2999999999996] /Type /Annot @@ -51103,7 +51103,7 @@ endobj endobj 381 0 obj << /Border [0 0 0] -/Dest (_route22) +/Dest (_route94) /Subtype /Link /Rect [557.8905 400.01999999999964 563.76 414.2999999999996] /Type /Annot @@ -51175,7 +51175,7 @@ endobj endobj 390 0 obj << /Border [0 0 0] -/Dest (_route20) +/Dest (_route92) /Subtype /Link /Rect [60.24000000000001 307.61999999999955 263.25750000000005 321.8999999999995] /Type /Annot @@ -51183,7 +51183,7 @@ endobj endobj 391 0 obj << /Border [0 0 0] -/Dest (_route20) +/Dest (_route92) /Subtype /Link /Rect [557.8905 307.61999999999955 563.76 321.8999999999995] /Type /Annot @@ -51223,7 +51223,7 @@ endobj endobj 396 0 obj << /Border [0 0 0] -/Dest (_route21) +/Dest (_route93) /Subtype /Link /Rect [60.24000000000001 252.17999999999947 265.76700000000005 266.45999999999947] /Type /Annot @@ -51231,7 +51231,7 @@ endobj endobj 397 0 obj << /Border [0 0 0] -/Dest (_route21) +/Dest (_route93) /Subtype /Link /Rect [557.8905 252.17999999999947 563.76 266.45999999999947] /Type /Annot @@ -51287,7 +51287,7 @@ endobj endobj 404 0 obj << /Border [0 0 0] -/Dest (_route23) +/Dest (_route95) /Subtype /Link /Rect [60.24000000000001 178.2599999999995 212.763 192.5399999999995] /Type /Annot @@ -51295,7 +51295,7 @@ endobj endobj 405 0 obj << /Border [0 0 0] -/Dest (_route23) +/Dest (_route95) /Subtype /Link /Rect [557.8905 178.2599999999995 563.76 192.5399999999995] /Type /Annot @@ -51367,7 +51367,7 @@ endobj endobj 414 0 obj << /Border [0 0 0] -/Dest (_route24) +/Dest (_route96) /Subtype /Link /Rect [60.24000000000001 85.85999999999956 232.70250000000001 100.13999999999956] /Type /Annot @@ -51375,7 +51375,7 @@ endobj endobj 415 0 obj << /Border [0 0 0] -/Dest (_route24) +/Dest (_route96) /Subtype /Link /Rect [557.8905 85.85999999999956 563.76 100.13999999999956] /Type /Annot @@ -51431,7 +51431,7 @@ endobj endobj 422 0 obj << /Border [0 0 0] -/Dest (_route25) +/Dest (_route97) /Subtype /Link /Rect [60.24000000000001 723.2399999999999 354.36600000000004 737.52] /Type /Annot @@ -51439,7 +51439,7 @@ endobj endobj 423 0 obj << /Border [0 0 0] -/Dest (_route25) +/Dest (_route97) /Subtype /Link /Rect [557.8905 723.2399999999999 563.76 737.52] /Type /Annot @@ -51495,7 +51495,7 @@ endobj endobj 430 0 obj << /Border [0 0 0] -/Dest (_route16) +/Dest (_route88) /Subtype /Link /Rect [60.24000000000001 649.3199999999998 531.1851796875001 663.5999999999999] /Type /Annot @@ -51503,7 +51503,7 @@ endobj endobj 431 0 obj << /Border [0 0 0] -/Dest (_route16) +/Dest (_route88) /Subtype /Link /Rect [557.8905 649.3199999999998 563.76 663.5999999999999] /Type /Annot @@ -51559,7 +51559,7 @@ endobj endobj 438 0 obj << /Border [0 0 0] -/Dest (_route18) +/Dest (_route90) /Subtype /Link /Rect [60.24000000000001 575.3999999999997 418.877794921875 589.6799999999998] /Type /Annot @@ -51567,7 +51567,7 @@ endobj endobj 439 0 obj << /Border [0 0 0] -/Dest (_route18) +/Dest (_route90) /Subtype /Link /Rect [557.8905 575.3999999999997 563.76 589.6799999999998] /Type /Annot @@ -51639,7 +51639,7 @@ endobj endobj 448 0 obj << /Border [0 0 0] -/Dest (_route14) +/Dest (_route86) /Subtype /Link /Rect [60.24000000000001 482.9999999999998 245.15550000000002 497.27999999999975] /Type /Annot @@ -51647,7 +51647,7 @@ endobj endobj 449 0 obj << /Border [0 0 0] -/Dest (_route14) +/Dest (_route86) /Subtype /Link /Rect [557.8905 482.9999999999998 563.76 497.27999999999975] /Type /Annot @@ -51687,7 +51687,7 @@ endobj endobj 454 0 obj << /Border [0 0 0] -/Dest (_route7) +/Dest (_route79) /Subtype /Link /Rect [60.24000000000001 427.5599999999997 248.431294921875 441.8399999999997] /Type /Annot @@ -51695,7 +51695,7 @@ endobj endobj 455 0 obj << /Border [0 0 0] -/Dest (_route7) +/Dest (_route79) /Subtype /Link /Rect [557.8905 427.5599999999997 563.76 441.8399999999997] /Type /Annot @@ -51751,7 +51751,7 @@ endobj endobj 462 0 obj << /Border [0 0 0] -/Dest (_route2) +/Dest (_route74) /Subtype /Link /Rect [60.24000000000001 353.63999999999965 214.8735 367.9199999999996] /Type /Annot @@ -51759,7 +51759,7 @@ endobj endobj 463 0 obj << /Border [0 0 0] -/Dest (_route2) +/Dest (_route74) /Subtype /Link /Rect [557.8905 353.63999999999965 563.76 367.9199999999996] /Type /Annot @@ -51799,7 +51799,7 @@ endobj endobj 468 0 obj << /Border [0 0 0] -/Dest (_route15) +/Dest (_route87) /Subtype /Link /Rect [60.24000000000001 298.1999999999996 259.467 312.47999999999956] /Type /Annot @@ -51807,7 +51807,7 @@ endobj endobj 469 0 obj << /Border [0 0 0] -/Dest (_route15) +/Dest (_route87) /Subtype /Link /Rect [557.8905 298.1999999999996 563.76 312.47999999999956] /Type /Annot @@ -51863,7 +51863,7 @@ endobj endobj 476 0 obj << /Border [0 0 0] -/Dest (_route8) +/Dest (_route80) /Subtype /Link /Rect [60.24000000000001 224.27999999999952 544.9515000000001 238.55999999999952] /Type /Annot @@ -51871,7 +51871,7 @@ endobj endobj 477 0 obj << /Border [0 0 0] -/Dest (_route8) +/Dest (_route80) /Subtype /Link /Rect [557.8905 224.27999999999952 563.76 238.55999999999952] /Type /Annot @@ -51927,7 +51927,7 @@ endobj endobj 484 0 obj << /Border [0 0 0] -/Dest (_route9) +/Dest (_route81) /Subtype /Link /Rect [60.24000000000001 150.35999999999956 530.5030898437501 164.63999999999956] /Type /Annot @@ -51935,7 +51935,7 @@ endobj endobj 485 0 obj << /Border [0 0 0] -/Dest (_route9) +/Dest (_route81) /Subtype /Link /Rect [557.8905 150.35999999999956 563.76 164.63999999999956] /Type /Annot @@ -51991,7 +51991,7 @@ endobj endobj 492 0 obj << /Border [0 0 0] -/Dest (_route17) +/Dest (_route89) /Subtype /Link /Rect [60.24000000000001 76.4399999999996 106.10400000000001 90.7199999999996] /Type /Annot @@ -51999,7 +51999,7 @@ endobj endobj 493 0 obj << /Border [0 0 0] -/Dest (_route17) +/Dest (_route89) /Subtype /Link /Rect [60.24000000000001 57.959999999999596 553.6761796875 72.2399999999996] /Type /Annot @@ -52007,7 +52007,7 @@ endobj endobj 494 0 obj << /Border [0 0 0] -/Dest (_route17) +/Dest (_route89) /Subtype /Link /Rect [60.24 741.7199999999999 80.26350000000001 756.0] /Type /Annot @@ -52015,7 +52015,7 @@ endobj endobj 495 0 obj << /Border [0 0 0] -/Dest (_route17) +/Dest (_route89) /Subtype /Link /Rect [552.021 76.4399999999996 563.76 90.7199999999996] /Type /Annot @@ -52071,7 +52071,7 @@ endobj endobj 502 0 obj << /Border [0 0 0] -/Dest (_route12) +/Dest (_route84) /Subtype /Link /Rect [60.24000000000001 667.7999999999998 248.45250000000001 682.0799999999999] /Type /Annot @@ -52079,7 +52079,7 @@ endobj endobj 503 0 obj << /Border [0 0 0] -/Dest (_route12) +/Dest (_route84) /Subtype /Link /Rect [552.021 667.7999999999998 563.76 682.0799999999999] /Type /Annot @@ -52135,7 +52135,7 @@ endobj endobj 510 0 obj << /Border [0 0 0] -/Dest (_route11) +/Dest (_route83) /Subtype /Link /Rect [60.24000000000001 593.8799999999998 235.842 608.1599999999999] /Type /Annot @@ -52143,7 +52143,7 @@ endobj endobj 511 0 obj << /Border [0 0 0] -/Dest (_route11) +/Dest (_route83) /Subtype /Link /Rect [552.021 593.8799999999998 563.76 608.1599999999999] /Type /Annot @@ -52199,7 +52199,7 @@ endobj endobj 518 0 obj << /Border [0 0 0] -/Dest (_route13) +/Dest (_route85) /Subtype /Link /Rect [60.24000000000001 519.9599999999998 249.70200000000003 534.2399999999998] /Type /Annot @@ -52207,7 +52207,7 @@ endobj endobj 519 0 obj << /Border [0 0 0] -/Dest (_route13) +/Dest (_route85) /Subtype /Link /Rect [552.021 519.9599999999998 563.76 534.2399999999998] /Type /Annot @@ -52263,7 +52263,7 @@ endobj endobj 526 0 obj << /Border [0 0 0] -/Dest (_route10) +/Dest (_route82) /Subtype /Link /Rect [60.24000000000001 446.03999999999974 261.860794921875 460.3199999999997] /Type /Annot @@ -52271,7 +52271,7 @@ endobj endobj 527 0 obj << /Border [0 0 0] -/Dest (_route10) +/Dest (_route82) /Subtype /Link /Rect [552.021 446.03999999999974 563.76 460.3199999999997] /Type /Annot @@ -52327,7 +52327,7 @@ endobj endobj 534 0 obj << /Border [0 0 0] -/Dest (_route4) +/Dest (_route76) /Subtype /Link /Rect [60.24000000000001 372.11999999999966 339.560794921875 386.39999999999964] /Type /Annot @@ -52335,7 +52335,7 @@ endobj endobj 535 0 obj << /Border [0 0 0] -/Dest (_route4) +/Dest (_route76) /Subtype /Link /Rect [552.021 372.11999999999966 563.76 386.39999999999964] /Type /Annot @@ -52407,7 +52407,7 @@ endobj endobj 544 0 obj << /Border [0 0 0] -/Dest (_route6) +/Dest (_route78) /Subtype /Link /Rect [60.24000000000001 279.7199999999996 350.38629492187505 293.99999999999955] /Type /Annot @@ -52415,7 +52415,7 @@ endobj endobj 545 0 obj << /Border [0 0 0] -/Dest (_route6) +/Dest (_route78) /Subtype /Link /Rect [552.021 279.7199999999996 563.76 293.99999999999955] /Type /Annot @@ -52487,7 +52487,7 @@ endobj endobj 554 0 obj << /Border [0 0 0] -/Dest (_route5) +/Dest (_route77) /Subtype /Link /Rect [60.24000000000001 187.31999999999954 352.81158984375 201.59999999999954] /Type /Annot @@ -52495,7 +52495,7 @@ endobj endobj 555 0 obj << /Border [0 0 0] -/Dest (_route5) +/Dest (_route77) /Subtype /Link /Rect [552.021 187.31999999999954 563.76 201.59999999999954] /Type /Annot @@ -52567,7 +52567,7 @@ endobj endobj 564 0 obj << /Border [0 0 0] -/Dest (_route3) +/Dest (_route75) /Subtype /Link /Rect [60.24000000000001 94.91999999999959 212.0595 109.19999999999959] /Type /Annot @@ -52575,7 +52575,7 @@ endobj endobj 565 0 obj << /Border [0 0 0] -/Dest (_route3) +/Dest (_route75) /Subtype /Link /Rect [552.021 94.91999999999959 563.76 109.19999999999959] /Type /Annot @@ -52631,7 +52631,7 @@ endobj endobj 572 0 obj << /Border [0 0 0] -/Dest (_route29) +/Dest (_route101) /Subtype /Link /Rect [60.24000000000001 723.2399999999999 226.68805078125 737.52] /Type /Annot @@ -52639,7 +52639,7 @@ endobj endobj 573 0 obj << /Border [0 0 0] -/Dest (_route29) +/Dest (_route101) /Subtype /Link /Rect [552.021 723.2399999999999 563.76 737.52] /Type /Annot @@ -52711,7 +52711,7 @@ endobj endobj 582 0 obj << /Border [0 0 0] -/Dest (_route26) +/Dest (_route98) /Subtype /Link /Rect [60.24000000000001 630.8399999999998 221.091755859375 645.1199999999999] /Type /Annot @@ -52719,7 +52719,7 @@ endobj endobj 583 0 obj << /Border [0 0 0] -/Dest (_route26) +/Dest (_route98) /Subtype /Link /Rect [552.021 630.8399999999998 563.76 645.1199999999999] /Type /Annot @@ -52759,7 +52759,7 @@ endobj endobj 588 0 obj << /Border [0 0 0] -/Dest (_route28) +/Dest (_route100) /Subtype /Link /Rect [60.24000000000001 575.3999999999997 458.24414062500006 589.6799999999998] /Type /Annot @@ -52767,7 +52767,7 @@ endobj endobj 589 0 obj << /Border [0 0 0] -/Dest (_route28) +/Dest (_route100) /Subtype /Link /Rect [552.021 575.3999999999997 563.76 589.6799999999998] /Type /Annot @@ -52823,7 +52823,7 @@ endobj endobj 596 0 obj << /Border [0 0 0] -/Dest (_route27) +/Dest (_route99) /Subtype /Link /Rect [60.24000000000001 501.4799999999998 430.23014062500005 515.7599999999998] /Type /Annot @@ -52831,7 +52831,7 @@ endobj endobj 597 0 obj << /Border [0 0 0] -/Dest (_route27) +/Dest (_route99) /Subtype /Link /Rect [552.021 501.4799999999998 563.76 515.7599999999998] /Type /Annot @@ -52887,7 +52887,7 @@ endobj endobj 604 0 obj << /Border [0 0 0] -/Dest (_route30) +/Dest (_route102) /Subtype /Link /Rect [60.24000000000001 427.5599999999997 430.06214062500004 441.8399999999997] /Type /Annot @@ -52895,7 +52895,7 @@ endobj endobj 605 0 obj << /Border [0 0 0] -/Dest (_route30) +/Dest (_route102) /Subtype /Link /Rect [552.021 427.5599999999997 563.76 441.8399999999997] /Type /Annot @@ -52967,7 +52967,7 @@ endobj endobj 614 0 obj << /Border [0 0 0] -/Dest (_route31) +/Dest (_route103) /Subtype /Link /Rect [60.24000000000001 335.1599999999996 175.8555 349.4399999999996] /Type /Annot @@ -52975,7 +52975,7 @@ endobj endobj 615 0 obj << /Border [0 0 0] -/Dest (_route31) +/Dest (_route103) /Subtype /Link /Rect [552.021 335.1599999999996 563.76 349.4399999999996] /Type /Annot @@ -53015,7 +53015,7 @@ endobj endobj 620 0 obj << /Border [0 0 0] -/Dest (_route33) +/Dest (_route105) /Subtype /Link /Rect [60.24000000000001 279.7199999999996 211.818 293.99999999999955] /Type /Annot @@ -53023,7 +53023,7 @@ endobj endobj 621 0 obj << /Border [0 0 0] -/Dest (_route33) +/Dest (_route105) /Subtype /Link /Rect [552.021 279.7199999999996 563.76 293.99999999999955] /Type /Annot @@ -53063,7 +53063,7 @@ endobj endobj 626 0 obj << /Border [0 0 0] -/Dest (_route32) +/Dest (_route104) /Subtype /Link /Rect [60.24000000000001 224.27999999999952 261.44100000000003 238.55999999999952] /Type /Annot @@ -53071,7 +53071,7 @@ endobj endobj 627 0 obj << /Border [0 0 0] -/Dest (_route32) +/Dest (_route104) /Subtype /Link /Rect [552.021 224.27999999999952 563.76 238.55999999999952] /Type /Annot @@ -54170,7 +54170,7 @@ endobj /Last 755 0 R /Next 756 0 R /Prev 748 0 R -/Dest [134 0 R /XYZ 0 792.0 null] +/Dest [133 0 R /XYZ 0 792.0 null] >> endobj 753 0 obj @@ -54178,7 +54178,7 @@ endobj /Parent 752 0 R /Count 0 /Next 754 0 R -/Dest [134 0 R /XYZ 0 662.1600000000001 null] +/Dest [133 0 R /XYZ 0 662.1600000000001 null] >> endobj 754 0 obj @@ -54187,7 +54187,7 @@ endobj /Count 0 /Next 755 0 R /Prev 753 0 R -/Dest [134 0 R /XYZ 0 444.3600000000002 null] +/Dest [133 0 R /XYZ 0 444.3600000000002 null] >> endobj 755 0 obj @@ -54195,7 +54195,7 @@ endobj /Parent 752 0 R /Count 0 /Prev 754 0 R -/Dest [134 0 R /XYZ 0 339.2400000000001 null] +/Dest [133 0 R /XYZ 0 339.2400000000001 null] >> endobj 756 0 obj @@ -54206,7 +54206,7 @@ endobj /Last 759 0 R /Next 760 0 R /Prev 752 0 R -/Dest [134 0 R /XYZ 0 282.9600000000001 null] +/Dest [133 0 R /XYZ 0 282.9600000000001 null] >> endobj 757 0 obj @@ -54214,7 +54214,7 @@ endobj /Parent 756 0 R /Count 0 /Next 758 0 R -/Dest [134 0 R /XYZ 0 242.8800000000001 null] +/Dest [133 0 R /XYZ 0 242.8800000000001 null] >> endobj 758 0 obj @@ -54223,7 +54223,7 @@ endobj /Count 0 /Next 759 0 R /Prev 757 0 R -/Dest [134 0 R /XYZ 0 137.76000000000008 null] +/Dest [133 0 R /XYZ 0 137.76000000000008 null] >> endobj 759 0 obj @@ -54303,7 +54303,7 @@ endobj /Parent 764 0 R /Count 0 /Prev 766 0 R -/Dest [159 0 R /XYZ 0 792.0 null] +/Dest [160 0 R /XYZ 0 792.0 null] >> endobj 768 0 obj @@ -54314,7 +54314,7 @@ endobj /Last 771 0 R /Next 772 0 R /Prev 764 0 R -/Dest [159 0 R /XYZ 0 702.1200000000001 null] +/Dest [160 0 R /XYZ 0 702.1200000000001 null] >> endobj 769 0 obj @@ -54322,7 +54322,7 @@ endobj /Parent 768 0 R /Count 0 /Next 770 0 R -/Dest [159 0 R /XYZ 0 662.0400000000002 null] +/Dest [160 0 R /XYZ 0 662.0400000000002 null] >> endobj 770 0 obj @@ -54331,7 +54331,7 @@ endobj /Count 0 /Next 771 0 R /Prev 769 0 R -/Dest [159 0 R /XYZ 0 556.9200000000003 null] +/Dest [160 0 R /XYZ 0 556.9200000000003 null] >> endobj 771 0 obj @@ -54339,7 +54339,7 @@ endobj /Parent 768 0 R /Count 0 /Prev 770 0 R -/Dest [159 0 R /XYZ 0 451.8000000000004 null] +/Dest [160 0 R /XYZ 0 451.8000000000004 null] >> endobj 772 0 obj @@ -54350,7 +54350,7 @@ endobj /Last 776 0 R /Next 777 0 R /Prev 768 0 R -/Dest [159 0 R /XYZ 0 395.5200000000004 null] +/Dest [160 0 R /XYZ 0 395.5200000000004 null] >> endobj 773 0 obj @@ -54358,7 +54358,7 @@ endobj /Parent 772 0 R /Count 0 /Next 774 0 R -/Dest [159 0 R /XYZ 0 355.44000000000034 null] +/Dest [160 0 R /XYZ 0 355.44000000000034 null] >> endobj 774 0 obj @@ -54367,7 +54367,7 @@ endobj /Count 0 /Next 775 0 R /Prev 773 0 R -/Dest [159 0 R /XYZ 0 212.76000000000028 null] +/Dest [160 0 R /XYZ 0 212.76000000000028 null] >> endobj 775 0 obj @@ -54376,7 +54376,7 @@ endobj /Count 0 /Next 776 0 R /Prev 774 0 R -/Dest [159 0 R /XYZ 0 107.64000000000024 null] +/Dest [160 0 R /XYZ 0 107.64000000000024 null] >> endobj 776 0 obj @@ -54384,7 +54384,7 @@ endobj /Parent 772 0 R /Count 0 /Prev 775 0 R -/Dest [173 0 R /XYZ 0 792.0 null] +/Dest [174 0 R /XYZ 0 792.0 null] >> endobj 777 0 obj @@ -54395,7 +54395,7 @@ endobj /Last 781 0 R /Next 782 0 R /Prev 772 0 R -/Dest [173 0 R /XYZ 0 702.1200000000001 null] +/Dest [174 0 R /XYZ 0 702.1200000000001 null] >> endobj 778 0 obj @@ -54403,7 +54403,7 @@ endobj /Parent 777 0 R /Count 0 /Next 779 0 R -/Dest [173 0 R /XYZ 0 633.9600000000002 null] +/Dest [174 0 R /XYZ 0 633.9600000000002 null] >> endobj 779 0 obj @@ -54412,7 +54412,7 @@ endobj /Count 0 /Next 780 0 R /Prev 778 0 R -/Dest [173 0 R /XYZ 0 491.28000000000026 null] +/Dest [174 0 R /XYZ 0 491.28000000000026 null] >> endobj 780 0 obj @@ -54421,7 +54421,7 @@ endobj /Count 0 /Next 781 0 R /Prev 779 0 R -/Dest [173 0 R /XYZ 0 386.1600000000002 null] +/Dest [174 0 R /XYZ 0 386.1600000000002 null] >> endobj 781 0 obj @@ -54429,7 +54429,7 @@ endobj /Parent 777 0 R /Count 0 /Prev 780 0 R -/Dest [173 0 R /XYZ 0 329.88000000000017 null] +/Dest [174 0 R /XYZ 0 329.88000000000017 null] >> endobj 782 0 obj @@ -54440,7 +54440,7 @@ endobj /Last 786 0 R /Next 787 0 R /Prev 777 0 R -/Dest [173 0 R /XYZ 0 273.60000000000014 null] +/Dest [174 0 R /XYZ 0 273.60000000000014 null] >> endobj 783 0 obj @@ -54448,7 +54448,7 @@ endobj /Parent 782 0 R /Count 0 /Next 784 0 R -/Dest [173 0 R /XYZ 0 205.44000000000014 null] +/Dest [174 0 R /XYZ 0 205.44000000000014 null] >> endobj 784 0 obj @@ -54457,7 +54457,7 @@ endobj /Count 0 /Next 785 0 R /Prev 783 0 R -/Dest [186 0 R /XYZ 0 792.0 null] +/Dest [187 0 R /XYZ 0 792.0 null] >> endobj 785 0 obj @@ -54466,7 +54466,7 @@ endobj /Count 0 /Next 786 0 R /Prev 784 0 R -/Dest [186 0 R /XYZ 0 653.2800000000002 null] +/Dest [187 0 R /XYZ 0 653.2800000000002 null] >> endobj 786 0 obj @@ -54474,7 +54474,7 @@ endobj /Parent 782 0 R /Count 0 /Prev 785 0 R -/Dest [186 0 R /XYZ 0 597.0000000000003 null] +/Dest [187 0 R /XYZ 0 597.0000000000003 null] >> endobj 787 0 obj @@ -54485,7 +54485,7 @@ endobj /Last 790 0 R /Next 791 0 R /Prev 782 0 R -/Dest [186 0 R /XYZ 0 540.7200000000005 null] +/Dest [187 0 R /XYZ 0 540.7200000000005 null] >> endobj 788 0 obj @@ -54493,7 +54493,7 @@ endobj /Parent 787 0 R /Count 0 /Next 789 0 R -/Dest [186 0 R /XYZ 0 500.6400000000005 null] +/Dest [187 0 R /XYZ 0 500.6400000000005 null] >> endobj 789 0 obj @@ -54502,7 +54502,7 @@ endobj /Count 0 /Next 790 0 R /Prev 788 0 R -/Dest [186 0 R /XYZ 0 395.5200000000005 null] +/Dest [187 0 R /XYZ 0 395.5200000000005 null] >> endobj 790 0 obj @@ -54510,7 +54510,7 @@ endobj /Parent 787 0 R /Count 0 /Prev 789 0 R -/Dest [186 0 R /XYZ 0 290.40000000000043 null] +/Dest [187 0 R /XYZ 0 290.40000000000043 null] >> endobj 791 0 obj @@ -54521,7 +54521,7 @@ endobj /Last 795 0 R /Next 796 0 R /Prev 787 0 R -/Dest [186 0 R /XYZ 0 234.1200000000004 null] +/Dest [187 0 R /XYZ 0 234.1200000000004 null] >> endobj 792 0 obj @@ -54529,7 +54529,7 @@ endobj /Parent 791 0 R /Count 0 /Next 793 0 R -/Dest [186 0 R /XYZ 0 194.0400000000004 null] +/Dest [187 0 R /XYZ 0 194.0400000000004 null] >> endobj 793 0 obj @@ -54538,7 +54538,7 @@ endobj /Count 0 /Next 794 0 R /Prev 792 0 R -/Dest [199 0 R /XYZ 0 792.0 null] +/Dest [200 0 R /XYZ 0 792.0 null] >> endobj 794 0 obj @@ -54547,7 +54547,7 @@ endobj /Count 0 /Next 795 0 R /Prev 793 0 R -/Dest [199 0 R /XYZ 0 653.2800000000002 null] +/Dest [200 0 R /XYZ 0 653.2800000000002 null] >> endobj 795 0 obj @@ -54555,7 +54555,7 @@ endobj /Parent 791 0 R /Count 0 /Prev 794 0 R -/Dest [199 0 R /XYZ 0 597.0000000000003 null] +/Dest [200 0 R /XYZ 0 597.0000000000003 null] >> endobj 796 0 obj @@ -54566,7 +54566,7 @@ endobj /Last 798 0 R /Next 799 0 R /Prev 791 0 R -/Dest [199 0 R /XYZ 0 540.7200000000005 null] +/Dest [200 0 R /XYZ 0 540.7200000000005 null] >> endobj 797 0 obj @@ -54574,7 +54574,7 @@ endobj /Parent 796 0 R /Count 0 /Next 798 0 R -/Dest [199 0 R /XYZ 0 500.6400000000005 null] +/Dest [200 0 R /XYZ 0 500.6400000000005 null] >> endobj 798 0 obj @@ -54582,7 +54582,7 @@ endobj /Parent 796 0 R /Count 0 /Prev 797 0 R -/Dest [199 0 R /XYZ 0 395.52000000000044 null] +/Dest [200 0 R /XYZ 0 395.52000000000044 null] >> endobj 799 0 obj @@ -54593,7 +54593,7 @@ endobj /Last 802 0 R /Next 803 0 R /Prev 796 0 R -/Dest [199 0 R /XYZ 0 339.2400000000004 null] +/Dest [200 0 R /XYZ 0 339.2400000000004 null] >> endobj 800 0 obj @@ -54601,7 +54601,7 @@ endobj /Parent 799 0 R /Count 0 /Next 801 0 R -/Dest [199 0 R /XYZ 0 243.00000000000043 null] +/Dest [200 0 R /XYZ 0 243.00000000000043 null] >> endobj 801 0 obj @@ -54610,7 +54610,7 @@ endobj /Count 0 /Next 802 0 R /Prev 800 0 R -/Dest [199 0 R /XYZ 0 100.32000000000039 null] +/Dest [200 0 R /XYZ 0 100.32000000000039 null] >> endobj 802 0 obj @@ -54753,7 +54753,7 @@ endobj /Parent 815 0 R /Count 0 /Prev 816 0 R -/Dest [238 0 R /XYZ 0 792.0 null] +/Dest [237 0 R /XYZ 0 792.0 null] >> endobj 818 0 obj @@ -54763,7 +54763,7 @@ endobj /First 819 0 R /Last 821 0 R /Prev 815 0 R -/Dest [238 0 R /XYZ 0 702.1200000000001 null] +/Dest [237 0 R /XYZ 0 702.1200000000001 null] >> endobj 819 0 obj @@ -54771,7 +54771,7 @@ endobj /Parent 818 0 R /Count 0 /Next 820 0 R -/Dest [238 0 R /XYZ 0 662.0400000000002 null] +/Dest [237 0 R /XYZ 0 662.0400000000002 null] >> endobj 820 0 obj @@ -54780,7 +54780,7 @@ endobj /Count 0 /Next 821 0 R /Prev 819 0 R -/Dest [238 0 R /XYZ 0 556.9200000000003 null] +/Dest [237 0 R /XYZ 0 556.9200000000003 null] >> endobj 821 0 obj @@ -54788,7 +54788,7 @@ endobj /Parent 818 0 R /Count 0 /Prev 820 0 R -/Dest [238 0 R /XYZ 0 451.8000000000004 null] +/Dest [237 0 R /XYZ 0 451.8000000000004 null] >> endobj 822 0 obj @@ -55267,851 +55267,851 @@ xref 0000130796 00000 n 0000143652 00000 n 0000144082 00000 n -0000146512 00000 n -0000146749 00000 n -0000146792 00000 n -0000146841 00000 n -0000146979 00000 n -0000147152 00000 n -0000147207 00000 n -0000147382 00000 n -0000147426 00000 n -0000159631 00000 n -0000159892 00000 n -0000159935 00000 n -0000159990 00000 n -0000160033 00000 n -0000160205 00000 n -0000160260 00000 n -0000160435 00000 n -0000160491 00000 n -0000160546 00000 n -0000160601 00000 n -0000160657 00000 n -0000160712 00000 n -0000160877 00000 n -0000160932 00000 n -0000160988 00000 n -0000177463 00000 n -0000177744 00000 n -0000177787 00000 n -0000177943 00000 n -0000177998 00000 n -0000178053 00000 n -0000178108 00000 n -0000178263 00000 n -0000178318 00000 n -0000178476 00000 n -0000178531 00000 n -0000178586 00000 n -0000178888 00000 n -0000179198 00000 n -0000179254 00000 n -0000179310 00000 n -0000197595 00000 n -0000197876 00000 n -0000197919 00000 n -0000197974 00000 n -0000198029 00000 n -0000198084 00000 n -0000198241 00000 n -0000198296 00000 n -0000198351 00000 n -0000198407 00000 n -0000198563 00000 n -0000198619 00000 n -0000198777 00000 n -0000198833 00000 n -0000214561 00000 n -0000214811 00000 n -0000214854 00000 n -0000214909 00000 n -0000214964 00000 n -0000215019 00000 n -0000215074 00000 n -0000215130 00000 n -0000215186 00000 n -0000215241 00000 n -0000215522 00000 n -0000215578 00000 n -0000231681 00000 n -0000231948 00000 n -0000231991 00000 n -0000232046 00000 n -0000232364 00000 n -0000232420 00000 n -0000232581 00000 n -0000232636 00000 n -0000232692 00000 n -0000232748 00000 n -0000232804 00000 n -0000250700 00000 n -0000250975 00000 n -0000251126 00000 n -0000251182 00000 n -0000251238 00000 n -0000251294 00000 n -0000251350 00000 n -0000251406 00000 n -0000251462 00000 n -0000251518 00000 n -0000251575 00000 n -0000251737 00000 n -0000265394 00000 n -0000265664 00000 n -0000265709 00000 n -0000265766 00000 n -0000265823 00000 n -0000265880 00000 n -0000265938 00000 n -0000265995 00000 n -0000266053 00000 n -0000266215 00000 n -0000266273 00000 n -0000266331 00000 n -0000266388 00000 n -0000285535 00000 n -0000285813 00000 n -0000285870 00000 n -0000286197 00000 n +0000146514 00000 n +0000146751 00000 n +0000146794 00000 n +0000146843 00000 n +0000146981 00000 n +0000147154 00000 n +0000147209 00000 n +0000147384 00000 n +0000147428 00000 n +0000159633 00000 n +0000159894 00000 n +0000159937 00000 n +0000159992 00000 n +0000160035 00000 n +0000160207 00000 n +0000160262 00000 n +0000160437 00000 n +0000160493 00000 n +0000160548 00000 n +0000160603 00000 n +0000160659 00000 n +0000160714 00000 n +0000160879 00000 n +0000160934 00000 n +0000160990 00000 n +0000177465 00000 n +0000177746 00000 n +0000177789 00000 n +0000177945 00000 n +0000178000 00000 n +0000178055 00000 n +0000178110 00000 n +0000178265 00000 n +0000178320 00000 n +0000178478 00000 n +0000178533 00000 n +0000178588 00000 n +0000178890 00000 n +0000179200 00000 n +0000179256 00000 n +0000179312 00000 n +0000197597 00000 n +0000197878 00000 n +0000197921 00000 n +0000197976 00000 n +0000198031 00000 n +0000198086 00000 n +0000198243 00000 n +0000198298 00000 n +0000198353 00000 n +0000198409 00000 n +0000198565 00000 n +0000198621 00000 n +0000198779 00000 n +0000198835 00000 n +0000214563 00000 n +0000214813 00000 n +0000214856 00000 n +0000214911 00000 n +0000214966 00000 n +0000215021 00000 n +0000215076 00000 n +0000215132 00000 n +0000215188 00000 n +0000215243 00000 n +0000215629 00000 n +0000215685 00000 n +0000231788 00000 n +0000232055 00000 n +0000232098 00000 n +0000232153 00000 n +0000232471 00000 n +0000232527 00000 n +0000232688 00000 n +0000232743 00000 n +0000232799 00000 n +0000232855 00000 n +0000232911 00000 n +0000250807 00000 n +0000251082 00000 n +0000251233 00000 n +0000251289 00000 n +0000251345 00000 n +0000251401 00000 n +0000251457 00000 n +0000251513 00000 n +0000251569 00000 n +0000251625 00000 n +0000251682 00000 n +0000251844 00000 n +0000265501 00000 n +0000265771 00000 n +0000265816 00000 n +0000265873 00000 n +0000265930 00000 n +0000265987 00000 n +0000266045 00000 n +0000266102 00000 n +0000266160 00000 n +0000266322 00000 n +0000266380 00000 n +0000266438 00000 n +0000266495 00000 n +0000285642 00000 n +0000285920 00000 n +0000285977 00000 n +0000286119 00000 n +0000286165 00000 n +0000286223 00000 n +0000286281 00000 n 0000286339 00000 n -0000286385 00000 n -0000286443 00000 n -0000286501 00000 n -0000286559 00000 n -0000286723 00000 n -0000286780 00000 n -0000304086 00000 n -0000304356 00000 n -0000304401 00000 n -0000304458 00000 n -0000304515 00000 n -0000304679 00000 n -0000304736 00000 n -0000304793 00000 n -0000304850 00000 n -0000304908 00000 n -0000324036 00000 n -0000324322 00000 n -0000324474 00000 n -0000324531 00000 n -0000324588 00000 n -0000324645 00000 n -0000324703 00000 n -0000324866 00000 n -0000324923 00000 n -0000325223 00000 n -0000325281 00000 n -0000325339 00000 n -0000325663 00000 n -0000325721 00000 n -0000325884 00000 n -0000344234 00000 n -0000344520 00000 n -0000344565 00000 n -0000344622 00000 n -0000344679 00000 n -0000344736 00000 n -0000344899 00000 n -0000344956 00000 n -0000345013 00000 n -0000345071 00000 n -0000345228 00000 n -0000345286 00000 n -0000345450 00000 n -0000345508 00000 n -0000362599 00000 n -0000362885 00000 n -0000362930 00000 n -0000362987 00000 n -0000363044 00000 n -0000363207 00000 n -0000363265 00000 n -0000363442 00000 n -0000363499 00000 n -0000363557 00000 n -0000363615 00000 n -0000363673 00000 n -0000363830 00000 n -0000380164 00000 n -0000380442 00000 n -0000380487 00000 n -0000380649 00000 n -0000380706 00000 n -0000380763 00000 n -0000380820 00000 n -0000380877 00000 n -0000380934 00000 n -0000381097 00000 n -0000381155 00000 n -0000381212 00000 n -0000381269 00000 n -0000396508 00000 n -0000396786 00000 n -0000396831 00000 n -0000397187 00000 n -0000397346 00000 n -0000397403 00000 n -0000397460 00000 n -0000397517 00000 n -0000397901 00000 n -0000397958 00000 n -0000398118 00000 n -0000398176 00000 n -0000398233 00000 n -0000398291 00000 n -0000398349 00000 n -0000413097 00000 n -0000413367 00000 n -0000413424 00000 n -0000413481 00000 n -0000413538 00000 n -0000413595 00000 n -0000413754 00000 n -0000413812 00000 n -0000414210 00000 n -0000414268 00000 n -0000414326 00000 n -0000433587 00000 n -0000433865 00000 n -0000433911 00000 n -0000434060 00000 n -0000434117 00000 n -0000434175 00000 n -0000434221 00000 n -0000434267 00000 n -0000434438 00000 n -0000434496 00000 n -0000434554 00000 n -0000434612 00000 n -0000434889 00000 n -0000443541 00000 n -0000443811 00000 n -0000443856 00000 n -0000443913 00000 n -0000443970 00000 n -0000444292 00000 n -0000444349 00000 n -0000444520 00000 n -0000444577 00000 n -0000461777 00000 n -0000462034 00000 n -0000462079 00000 n -0000462136 00000 n -0000462182 00000 n -0000462240 00000 n -0000462418 00000 n -0000482324 00000 n -0000482581 00000 n -0000482627 00000 n -0000482781 00000 n -0000482839 00000 n -0000483145 00000 n -0000503693 00000 n -0000503966 00000 n -0000504127 00000 n -0000504184 00000 n -0000504241 00000 n -0000504411 00000 n -0000504578 00000 n -0000525981 00000 n -0000526254 00000 n -0000526403 00000 n -0000526574 00000 n -0000526733 00000 n -0000526790 00000 n -0000548621 00000 n -0000548910 00000 n -0000549078 00000 n -0000549225 00000 n -0000549374 00000 n -0000549525 00000 n -0000549685 00000 n -0000549743 00000 n -0000572703 00000 n -0000572992 00000 n -0000573161 00000 n -0000573329 00000 n -0000573499 00000 n -0000573671 00000 n -0000573831 00000 n -0000595480 00000 n -0000595769 00000 n -0000595814 00000 n -0000595973 00000 n -0000596131 00000 n -0000596291 00000 n -0000596442 00000 n -0000596592 00000 n -0000619390 00000 n -0000619679 00000 n -0000619736 00000 n -0000619906 00000 n -0000620077 00000 n -0000620244 00000 n -0000620416 00000 n -0000620591 00000 n -0000642864 00000 n -0000643145 00000 n -0000643285 00000 n -0000643461 00000 n -0000643518 00000 n -0000643687 00000 n -0000643874 00000 n -0000664547 00000 n -0000664820 00000 n -0000664865 00000 n -0000665028 00000 n -0000665074 00000 n -0000665263 00000 n -0000665425 00000 n -0000686091 00000 n -0000686364 00000 n -0000686421 00000 n -0000686853 00000 n -0000687029 00000 n -0000687201 00000 n -0000687258 00000 n -0000687427 00000 n -0000707761 00000 n -0000708058 00000 n -0000708207 00000 n -0000708362 00000 n -0000708506 00000 n -0000708671 00000 n -0000708729 00000 n -0000708775 00000 n -0000708946 00000 n -0000709093 00000 n -0000730766 00000 n -0000731047 00000 n -0000731190 00000 n -0000731345 00000 n -0000731489 00000 n -0000731547 00000 n -0000731718 00000 n -0000742919 00000 n -0000743192 00000 n -0000743347 00000 n -0000743404 00000 n -0000743553 00000 n -0000743702 00000 n -0000743846 00000 n -0000743991 00000 n -0000744156 00000 n -0000744312 00000 n -0000744470 00000 n -0000744617 00000 n -0000744779 00000 n -0000744921 00000 n -0000745086 00000 n -0000745230 00000 n -0000745387 00000 n -0000745533 00000 n -0000745689 00000 n -0000745834 00000 n -0000745989 00000 n -0000746133 00000 n -0000746292 00000 n -0000746440 00000 n -0000746598 00000 n -0000746745 00000 n -0000746911 00000 n -0000747056 00000 n -0000747216 00000 n -0000747365 00000 n -0000747523 00000 n -0000747670 00000 n -0000747825 00000 n -0000747970 00000 n -0000748130 00000 n -0000748279 00000 n -0000748439 00000 n -0000748588 00000 n -0000748743 00000 n -0000748888 00000 n -0000749056 00000 n -0000749203 00000 n -0000749362 00000 n -0000749510 00000 n -0000749666 00000 n -0000749812 00000 n -0000749972 00000 n -0000750121 00000 n -0000750287 00000 n -0000750432 00000 n -0000750592 00000 n -0000750741 00000 n -0000750899 00000 n -0000751046 00000 n -0000751213 00000 n -0000751359 00000 n -0000751531 00000 n -0000751682 00000 n -0000751841 00000 n -0000751989 00000 n -0000752147 00000 n -0000752294 00000 n -0000752448 00000 n -0000752592 00000 n -0000752764 00000 n -0000752915 00000 n -0000753076 00000 n -0000753226 00000 n -0000753385 00000 n -0000753534 00000 n -0000753694 00000 n -0000753843 00000 n -0000754009 00000 n -0000754154 00000 n -0000754324 00000 n -0000754473 00000 n -0000754632 00000 n -0000754780 00000 n -0000754926 00000 n -0000755061 00000 n -0000755215 00000 n -0000755348 00000 n -0000755507 00000 n -0000755645 00000 n -0000755793 00000 n -0000755931 00000 n -0000756100 00000 n -0000756248 00000 n -0000756412 00000 n -0000756556 00000 n -0000756726 00000 n -0000756875 00000 n -0000757034 00000 n -0000757183 00000 n -0000757352 00000 n -0000757500 00000 n -0000757663 00000 n -0000757807 00000 n -0000757977 00000 n -0000758126 00000 n -0000758285 00000 n -0000758434 00000 n -0000758592 00000 n -0000758739 00000 n -0000758908 00000 n -0000759056 00000 n -0000759222 00000 n -0000759367 00000 n -0000759538 00000 n -0000759688 00000 n -0000759848 00000 n -0000759998 00000 n -0000760160 00000 n -0000760303 00000 n -0000760473 00000 n -0000760622 00000 n -0000760782 00000 n -0000760932 00000 n -0000761103 00000 n -0000761253 00000 n -0000761408 00000 n -0000761552 00000 n -0000761711 00000 n -0000761860 00000 n -0000762029 00000 n -0000762177 00000 n -0000762332 00000 n -0000762477 00000 n -0000762649 00000 n -0000762800 00000 n -0000762960 00000 n -0000763110 00000 n -0000763279 00000 n -0000763427 00000 n -0000763592 00000 n -0000763737 00000 n -0000763910 00000 n -0000764062 00000 n -0000764223 00000 n -0000764374 00000 n -0000764545 00000 n -0000764695 00000 n -0000764860 00000 n -0000765005 00000 n -0000765178 00000 n -0000765330 00000 n -0000765491 00000 n -0000765642 00000 n -0000765812 00000 n -0000765961 00000 n -0000766124 00000 n -0000766285 00000 n -0000766425 00000 n -0000766566 00000 n -0000766726 00000 n -0000766864 00000 n -0000767012 00000 n -0000767149 00000 n -0000767307 00000 n -0000767443 00000 n -0000767608 00000 n -0000767751 00000 n -0000767922 00000 n -0000768071 00000 n -0000768230 00000 n -0000768378 00000 n -0000768547 00000 n -0000768694 00000 n -0000768848 00000 n -0000768991 00000 n -0000769162 00000 n -0000769311 00000 n -0000769470 00000 n -0000769618 00000 n -0000769787 00000 n -0000769934 00000 n -0000770099 00000 n -0000770242 00000 n -0000770413 00000 n -0000770562 00000 n -0000770722 00000 n -0000770871 00000 n -0000771041 00000 n -0000771189 00000 n -0000771353 00000 n -0000771497 00000 n -0000771668 00000 n -0000771817 00000 n -0000771976 00000 n -0000772124 00000 n -0000772294 00000 n -0000772442 00000 n -0000772606 00000 n -0000772750 00000 n -0000772922 00000 n -0000773072 00000 n -0000773231 00000 n -0000773379 00000 n -0000773537 00000 n -0000773683 00000 n -0000773853 00000 n -0000774001 00000 n -0000774166 00000 n -0000774309 00000 n -0000774481 00000 n -0000774631 00000 n -0000774790 00000 n -0000774938 00000 n -0000775098 00000 n -0000775246 00000 n -0000775417 00000 n -0000775566 00000 n -0000775729 00000 n -0000775873 00000 n -0000776046 00000 n -0000776197 00000 n -0000776358 00000 n -0000776508 00000 n -0000776668 00000 n -0000776816 00000 n -0000776987 00000 n -0000777136 00000 n -0000777291 00000 n -0000777434 00000 n -0000777603 00000 n -0000777750 00000 n -0000777909 00000 n -0000778057 00000 n -0000778214 00000 n -0000778349 00000 n -0000778500 00000 n -0000778632 00000 n -0000778792 00000 n -0000778930 00000 n -0000779078 00000 n -0000779215 00000 n -0000779373 00000 n -0000779519 00000 n -0000779688 00000 n -0000779835 00000 n -0000779998 00000 n -0000780141 00000 n -0000780300 00000 n -0000780448 00000 n -0000780617 00000 n -0000780764 00000 n -0000780929 00000 n -0000781072 00000 n -0000781243 00000 n -0000781392 00000 n -0000781551 00000 n -0000781699 00000 n -0000781868 00000 n -0000782015 00000 n -0000782180 00000 n -0000782323 00000 n -0000782495 00000 n -0000782645 00000 n -0000782805 00000 n -0000782954 00000 n -0000783124 00000 n -0000783272 00000 n -0000783437 00000 n -0000783580 00000 n -0000783751 00000 n -0000783900 00000 n -0000784060 00000 n -0000784209 00000 n -0000784369 00000 n -0000784517 00000 n -0000784687 00000 n -0000784835 00000 n -0000784990 00000 n -0000785133 00000 n -0000785292 00000 n -0000785440 00000 n -0000785610 00000 n -0000785758 00000 n -0000785913 00000 n -0000786057 00000 n -0000786217 00000 n -0000786366 00000 n -0000786535 00000 n -0000786682 00000 n -0000786849 00000 n -0000786994 00000 n -0000787167 00000 n -0000787318 00000 n -0000787479 00000 n -0000787629 00000 n -0000787800 00000 n -0000787949 00000 n -0000788120 00000 n -0000788269 00000 n -0000788445 00000 n -0000788599 00000 n -0000788774 00000 n -0000788927 00000 n -0000789086 00000 n -0000789233 00000 n -0000789396 00000 n -0000789547 00000 n -0000789711 00000 n -0000789864 00000 n -0000790020 00000 n -0000790166 00000 n -0000790322 00000 n -0000790456 00000 n -0000790611 00000 n -0000790744 00000 n -0000790901 00000 n -0000791036 00000 n -0000791207 00000 n -0000791356 00000 n -0000791518 00000 n -0000791658 00000 n -0000791821 00000 n -0000791973 00000 n -0000792138 00000 n -0000792281 00000 n -0000792451 00000 n -0000792599 00000 n -0000792783 00000 n -0000792947 00000 n -0000793123 00000 n -0000793277 00000 n -0000793441 00000 n -0000793583 00000 n -0000793758 00000 n -0000793911 00000 n -0000794080 00000 n -0000794227 00000 n -0000794393 00000 n -0000794537 00000 n -0000794822 00000 n -0000794901 00000 n -0000795065 00000 n -0000795256 00000 n -0000795484 00000 n -0000795701 00000 n -0000795871 00000 n -0000796089 00000 n -0000796335 00000 n -0000796508 00000 n -0000796689 00000 n -0000796954 00000 n -0000797139 00000 n -0000797320 00000 n -0000797601 00000 n -0000797786 00000 n -0000797967 00000 n -0000798224 00000 n -0000798397 00000 n -0000798578 00000 n -0000798834 00000 n -0000799023 00000 n -0000799222 00000 n -0000799417 00000 n -0000799598 00000 n -0000799919 00000 n -0000800105 00000 n -0000800274 00000 n -0000800598 00000 n -0000800787 00000 n -0000800986 00000 n -0000801167 00000 n -0000801451 00000 n -0000801641 00000 n -0000801841 00000 n -0000802037 00000 n -0000802206 00000 n -0000802502 00000 n -0000802691 00000 n -0000802890 00000 n -0000803071 00000 n -0000803456 00000 n -0000803650 00000 n -0000803853 00000 n -0000804039 00000 n -0000804551 00000 n -0000804744 00000 n -0000804948 00000 n -0000805133 00000 n -0000805558 00000 n -0000805752 00000 n -0000805956 00000 n -0000806155 00000 n -0000806340 00000 n -0000806648 00000 n -0000806841 00000 n -0000807030 00000 n -0000807338 00000 n -0000807531 00000 n -0000807735 00000 n -0000807909 00000 n -0000808194 00000 n -0000808384 00000 n -0000808570 00000 n -0000808892 00000 n -0000809086 00000 n -0000809291 00000 n -0000809478 00000 n -0000810004 00000 n -0000810198 00000 n -0000810402 00000 n -0000810577 00000 n -0000811095 00000 n -0000811290 00000 n -0000811495 00000 n -0000811681 00000 n -0000812258 00000 n -0000812452 00000 n -0000812656 00000 n -0000812842 00000 n -0000813155 00000 n -0000813349 00000 n -0000813554 00000 n -0000813740 00000 n -0000814041 00000 n -0000814235 00000 n -0000814440 00000 n -0000814626 00000 n -0000814936 00000 n -0000815131 00000 n -0000815336 00000 n -0000815510 00000 n -0000815827 00000 n -0000816021 00000 n -0000816225 00000 n -0000816411 00000 n -0000816788 00000 n -0000816983 00000 n -0000817188 00000 n -0000817389 00000 n -0000817563 00000 n -0000817948 00000 n -0000818142 00000 n -0000818347 00000 n -0000818547 00000 n -0000818734 00000 n -0000819124 00000 n -0000819319 00000 n -0000819511 00000 n -0000819711 00000 n -0000819897 00000 n -0000820178 00000 n -0000820372 00000 n -0000820576 00000 n -0000820763 00000 n -0000821056 00000 n -0000821250 00000 n -0000821442 00000 n -0000821642 00000 n -0000821828 00000 n -0000822117 00000 n -0000822307 00000 n -0000822494 00000 n -0000822959 00000 n -0000823154 00000 n -0000823359 00000 n -0000823545 00000 n -0000823990 00000 n -0000824184 00000 n -0000824388 00000 n -0000824575 00000 n -0000825021 00000 n -0000825216 00000 n -0000825409 00000 n -0000825609 00000 n -0000825796 00000 n -0000826042 00000 n -0000826221 00000 n -0000826408 00000 n -0000826690 00000 n -0000826881 00000 n -0000827055 00000 n -0000827358 00000 n -0000827552 00000 n -0000827756 00000 n -0000827942 00000 n -0000828170 00000 n -0000828376 00000 n -0000828581 00000 n -0000828778 00000 n -0000828991 00000 n -0000829216 00000 n -0000829460 00000 n -0000829652 00000 n -0000829840 00000 n -0000830037 00000 n -0000830237 00000 n -0000830413 00000 n -0000830637 00000 n -0000830813 00000 n -0000831010 00000 n -0000831282 00000 n -0000831514 00000 n -0000831699 00000 n -0000831916 00000 n -0000832121 00000 n -0000832295 00000 n -0000832935 00000 n -0000840943 00000 n -0000841159 00000 n -0000842522 00000 n -0000843589 00000 n -0000851341 00000 n -0000851562 00000 n -0000852925 00000 n -0000854002 00000 n -0000857263 00000 n -0000857489 00000 n -0000858852 00000 n -0000859968 00000 n -0000862111 00000 n -0000862325 00000 n -0000863688 00000 n +0000286503 00000 n +0000286560 00000 n +0000303866 00000 n +0000304136 00000 n +0000304181 00000 n +0000304238 00000 n +0000304295 00000 n +0000304459 00000 n +0000304516 00000 n +0000304573 00000 n +0000304920 00000 n +0000304977 00000 n +0000305035 00000 n +0000324163 00000 n +0000324449 00000 n +0000324601 00000 n +0000324658 00000 n +0000324715 00000 n +0000324772 00000 n +0000324830 00000 n +0000325141 00000 n +0000325304 00000 n +0000325361 00000 n +0000325661 00000 n +0000325719 00000 n +0000325777 00000 n +0000326101 00000 n +0000326159 00000 n +0000326322 00000 n +0000344672 00000 n +0000344958 00000 n +0000345003 00000 n +0000345060 00000 n +0000345117 00000 n +0000345174 00000 n +0000345337 00000 n +0000345394 00000 n +0000345451 00000 n +0000345509 00000 n +0000345666 00000 n +0000345724 00000 n +0000345888 00000 n +0000345946 00000 n +0000363037 00000 n +0000363323 00000 n +0000363368 00000 n +0000363425 00000 n +0000363482 00000 n +0000363645 00000 n +0000363703 00000 n +0000363880 00000 n +0000363937 00000 n +0000363995 00000 n +0000364053 00000 n +0000364111 00000 n +0000364268 00000 n +0000380602 00000 n +0000380880 00000 n +0000380925 00000 n +0000381087 00000 n +0000381144 00000 n +0000381201 00000 n +0000381258 00000 n +0000381315 00000 n +0000381372 00000 n +0000381535 00000 n +0000381593 00000 n +0000381650 00000 n +0000381707 00000 n +0000396946 00000 n +0000397224 00000 n +0000397269 00000 n +0000397428 00000 n +0000397485 00000 n +0000397542 00000 n +0000397599 00000 n +0000397656 00000 n +0000397816 00000 n +0000397874 00000 n +0000397931 00000 n +0000398238 00000 n +0000398296 00000 n +0000398354 00000 n +0000413102 00000 n +0000413372 00000 n +0000413429 00000 n +0000413486 00000 n +0000413543 00000 n +0000413600 00000 n +0000413759 00000 n +0000413817 00000 n +0000414215 00000 n +0000414273 00000 n +0000414331 00000 n +0000433592 00000 n +0000433870 00000 n +0000433916 00000 n +0000434065 00000 n +0000434122 00000 n +0000434180 00000 n +0000434226 00000 n +0000434272 00000 n +0000434443 00000 n +0000434501 00000 n +0000434559 00000 n +0000434617 00000 n +0000443269 00000 n +0000443539 00000 n +0000443584 00000 n +0000443641 00000 n +0000443698 00000 n +0000444020 00000 n +0000444077 00000 n +0000444373 00000 n +0000444544 00000 n +0000444601 00000 n +0000461801 00000 n +0000462058 00000 n +0000462103 00000 n +0000462160 00000 n +0000462206 00000 n +0000462264 00000 n +0000462442 00000 n +0000482348 00000 n +0000482605 00000 n +0000482651 00000 n +0000482805 00000 n +0000482863 00000 n +0000483169 00000 n +0000503717 00000 n +0000503990 00000 n +0000504151 00000 n +0000504208 00000 n +0000504265 00000 n +0000504435 00000 n +0000504602 00000 n +0000526005 00000 n +0000526278 00000 n +0000526427 00000 n +0000526598 00000 n +0000526757 00000 n +0000526814 00000 n +0000548645 00000 n +0000548934 00000 n +0000549102 00000 n +0000549249 00000 n +0000549398 00000 n +0000549549 00000 n +0000549709 00000 n +0000549767 00000 n +0000572727 00000 n +0000573016 00000 n +0000573185 00000 n +0000573353 00000 n +0000573523 00000 n +0000573695 00000 n +0000573855 00000 n +0000595504 00000 n +0000595793 00000 n +0000595838 00000 n +0000595997 00000 n +0000596155 00000 n +0000596315 00000 n +0000596466 00000 n +0000596616 00000 n +0000619414 00000 n +0000619703 00000 n +0000619760 00000 n +0000619930 00000 n +0000620101 00000 n +0000620268 00000 n +0000620440 00000 n +0000620615 00000 n +0000642888 00000 n +0000643169 00000 n +0000643309 00000 n +0000643485 00000 n +0000643542 00000 n +0000643711 00000 n +0000643898 00000 n +0000664571 00000 n +0000664844 00000 n +0000664889 00000 n +0000665052 00000 n +0000665098 00000 n +0000665287 00000 n +0000665449 00000 n +0000686115 00000 n +0000686388 00000 n +0000686445 00000 n +0000686877 00000 n +0000687053 00000 n +0000687225 00000 n +0000687282 00000 n +0000687451 00000 n +0000707785 00000 n +0000708082 00000 n +0000708231 00000 n +0000708386 00000 n +0000708530 00000 n +0000708695 00000 n +0000708753 00000 n +0000708799 00000 n +0000708970 00000 n +0000709117 00000 n +0000730790 00000 n +0000731071 00000 n +0000731214 00000 n +0000731369 00000 n +0000731513 00000 n +0000731571 00000 n +0000731742 00000 n +0000742943 00000 n +0000743216 00000 n +0000743371 00000 n +0000743428 00000 n +0000743577 00000 n +0000743726 00000 n +0000743870 00000 n +0000744015 00000 n +0000744180 00000 n +0000744336 00000 n +0000744494 00000 n +0000744641 00000 n +0000744803 00000 n +0000744945 00000 n +0000745111 00000 n +0000745256 00000 n +0000745413 00000 n +0000745559 00000 n +0000745715 00000 n +0000745860 00000 n +0000746016 00000 n +0000746161 00000 n +0000746320 00000 n +0000746468 00000 n +0000746626 00000 n +0000746773 00000 n +0000746940 00000 n +0000747086 00000 n +0000747246 00000 n +0000747395 00000 n +0000747553 00000 n +0000747700 00000 n +0000747855 00000 n +0000748000 00000 n +0000748160 00000 n +0000748309 00000 n +0000748469 00000 n +0000748618 00000 n +0000748773 00000 n +0000748918 00000 n +0000749086 00000 n +0000749233 00000 n +0000749392 00000 n +0000749540 00000 n +0000749696 00000 n +0000749842 00000 n +0000750002 00000 n +0000750151 00000 n +0000750317 00000 n +0000750462 00000 n +0000750622 00000 n +0000750771 00000 n +0000750929 00000 n +0000751076 00000 n +0000751243 00000 n +0000751389 00000 n +0000751561 00000 n +0000751712 00000 n +0000751871 00000 n +0000752019 00000 n +0000752177 00000 n +0000752324 00000 n +0000752478 00000 n +0000752622 00000 n +0000752794 00000 n +0000752945 00000 n +0000753106 00000 n +0000753256 00000 n +0000753415 00000 n +0000753564 00000 n +0000753724 00000 n +0000753873 00000 n +0000754039 00000 n +0000754184 00000 n +0000754354 00000 n +0000754503 00000 n +0000754662 00000 n +0000754810 00000 n +0000754956 00000 n +0000755091 00000 n +0000755245 00000 n +0000755378 00000 n +0000755537 00000 n +0000755675 00000 n +0000755823 00000 n +0000755961 00000 n +0000756130 00000 n +0000756278 00000 n +0000756442 00000 n +0000756586 00000 n +0000756756 00000 n +0000756905 00000 n +0000757064 00000 n +0000757213 00000 n +0000757382 00000 n +0000757530 00000 n +0000757693 00000 n +0000757837 00000 n +0000758007 00000 n +0000758156 00000 n +0000758315 00000 n +0000758464 00000 n +0000758622 00000 n +0000758769 00000 n +0000758938 00000 n +0000759086 00000 n +0000759252 00000 n +0000759397 00000 n +0000759568 00000 n +0000759718 00000 n +0000759878 00000 n +0000760028 00000 n +0000760191 00000 n +0000760335 00000 n +0000760505 00000 n +0000760654 00000 n +0000760814 00000 n +0000760964 00000 n +0000761135 00000 n +0000761285 00000 n +0000761441 00000 n +0000761586 00000 n +0000761745 00000 n +0000761894 00000 n +0000762063 00000 n +0000762211 00000 n +0000762366 00000 n +0000762511 00000 n +0000762683 00000 n +0000762834 00000 n +0000762994 00000 n +0000763144 00000 n +0000763313 00000 n +0000763461 00000 n +0000763627 00000 n +0000763773 00000 n +0000763946 00000 n +0000764098 00000 n +0000764259 00000 n +0000764410 00000 n +0000764581 00000 n +0000764731 00000 n +0000764897 00000 n +0000765043 00000 n +0000765216 00000 n +0000765368 00000 n +0000765529 00000 n +0000765680 00000 n +0000765850 00000 n +0000765999 00000 n +0000766162 00000 n +0000766323 00000 n +0000766463 00000 n +0000766604 00000 n +0000766764 00000 n +0000766902 00000 n +0000767050 00000 n +0000767187 00000 n +0000767345 00000 n +0000767481 00000 n +0000767646 00000 n +0000767789 00000 n +0000767960 00000 n +0000768109 00000 n +0000768268 00000 n +0000768416 00000 n +0000768585 00000 n +0000768732 00000 n +0000768886 00000 n +0000769029 00000 n +0000769200 00000 n +0000769349 00000 n +0000769508 00000 n +0000769656 00000 n +0000769825 00000 n +0000769972 00000 n +0000770137 00000 n +0000770280 00000 n +0000770451 00000 n +0000770600 00000 n +0000770760 00000 n +0000770909 00000 n +0000771079 00000 n +0000771227 00000 n +0000771391 00000 n +0000771535 00000 n +0000771706 00000 n +0000771855 00000 n +0000772014 00000 n +0000772162 00000 n +0000772332 00000 n +0000772480 00000 n +0000772645 00000 n +0000772790 00000 n +0000772962 00000 n +0000773112 00000 n +0000773271 00000 n +0000773419 00000 n +0000773577 00000 n +0000773723 00000 n +0000773893 00000 n +0000774041 00000 n +0000774207 00000 n +0000774351 00000 n +0000774523 00000 n +0000774673 00000 n +0000774832 00000 n +0000774980 00000 n +0000775140 00000 n +0000775288 00000 n +0000775459 00000 n +0000775608 00000 n +0000775772 00000 n +0000775917 00000 n +0000776090 00000 n +0000776241 00000 n +0000776402 00000 n +0000776552 00000 n +0000776712 00000 n +0000776860 00000 n +0000777031 00000 n +0000777180 00000 n +0000777336 00000 n +0000777480 00000 n +0000777649 00000 n +0000777796 00000 n +0000777955 00000 n +0000778103 00000 n +0000778260 00000 n +0000778395 00000 n +0000778547 00000 n +0000778680 00000 n +0000778840 00000 n +0000778978 00000 n +0000779126 00000 n +0000779263 00000 n +0000779421 00000 n +0000779567 00000 n +0000779736 00000 n +0000779883 00000 n +0000780046 00000 n +0000780189 00000 n +0000780348 00000 n +0000780496 00000 n +0000780665 00000 n +0000780812 00000 n +0000780978 00000 n +0000781122 00000 n +0000781293 00000 n +0000781442 00000 n +0000781601 00000 n +0000781749 00000 n +0000781918 00000 n +0000782065 00000 n +0000782230 00000 n +0000782373 00000 n +0000782545 00000 n +0000782695 00000 n +0000782855 00000 n +0000783004 00000 n +0000783174 00000 n +0000783322 00000 n +0000783488 00000 n +0000783632 00000 n +0000783803 00000 n +0000783952 00000 n +0000784112 00000 n +0000784261 00000 n +0000784421 00000 n +0000784569 00000 n +0000784739 00000 n +0000784887 00000 n +0000785043 00000 n +0000785187 00000 n +0000785346 00000 n +0000785494 00000 n +0000785664 00000 n +0000785812 00000 n +0000785968 00000 n +0000786113 00000 n +0000786273 00000 n +0000786422 00000 n +0000786591 00000 n +0000786738 00000 n +0000786906 00000 n +0000787052 00000 n +0000787225 00000 n +0000787376 00000 n +0000787537 00000 n +0000787687 00000 n +0000787858 00000 n +0000788007 00000 n +0000788178 00000 n +0000788327 00000 n +0000788503 00000 n +0000788657 00000 n +0000788832 00000 n +0000788985 00000 n +0000789144 00000 n +0000789291 00000 n +0000789454 00000 n +0000789605 00000 n +0000789769 00000 n +0000789922 00000 n +0000790078 00000 n +0000790224 00000 n +0000790380 00000 n +0000790514 00000 n +0000790669 00000 n +0000790802 00000 n +0000790959 00000 n +0000791094 00000 n +0000791265 00000 n +0000791414 00000 n +0000791576 00000 n +0000791716 00000 n +0000791879 00000 n +0000792031 00000 n +0000792196 00000 n +0000792339 00000 n +0000792509 00000 n +0000792657 00000 n +0000792841 00000 n +0000793005 00000 n +0000793181 00000 n +0000793335 00000 n +0000793499 00000 n +0000793641 00000 n +0000793816 00000 n +0000793969 00000 n +0000794138 00000 n +0000794285 00000 n +0000794451 00000 n +0000794595 00000 n +0000794880 00000 n +0000794959 00000 n +0000795123 00000 n +0000795314 00000 n +0000795542 00000 n +0000795759 00000 n +0000795929 00000 n +0000796147 00000 n +0000796393 00000 n +0000796566 00000 n +0000796747 00000 n +0000797012 00000 n +0000797197 00000 n +0000797378 00000 n +0000797659 00000 n +0000797844 00000 n +0000798025 00000 n +0000798282 00000 n +0000798455 00000 n +0000798636 00000 n +0000798892 00000 n +0000799081 00000 n +0000799280 00000 n +0000799475 00000 n +0000799656 00000 n +0000799977 00000 n +0000800163 00000 n +0000800332 00000 n +0000800656 00000 n +0000800845 00000 n +0000801044 00000 n +0000801225 00000 n +0000801509 00000 n +0000801699 00000 n +0000801899 00000 n +0000802095 00000 n +0000802264 00000 n +0000802560 00000 n +0000802749 00000 n +0000802948 00000 n +0000803129 00000 n +0000803514 00000 n +0000803708 00000 n +0000803911 00000 n +0000804097 00000 n +0000804609 00000 n +0000804802 00000 n +0000805006 00000 n +0000805191 00000 n +0000805616 00000 n +0000805810 00000 n +0000806014 00000 n +0000806213 00000 n +0000806398 00000 n +0000806706 00000 n +0000806899 00000 n +0000807088 00000 n +0000807396 00000 n +0000807589 00000 n +0000807793 00000 n +0000807967 00000 n +0000808252 00000 n +0000808442 00000 n +0000808628 00000 n +0000808950 00000 n +0000809144 00000 n +0000809349 00000 n +0000809536 00000 n +0000810062 00000 n +0000810256 00000 n +0000810460 00000 n +0000810635 00000 n +0000811153 00000 n +0000811348 00000 n +0000811553 00000 n +0000811739 00000 n +0000812316 00000 n +0000812510 00000 n +0000812714 00000 n +0000812900 00000 n +0000813213 00000 n +0000813407 00000 n +0000813612 00000 n +0000813798 00000 n +0000814099 00000 n +0000814293 00000 n +0000814498 00000 n +0000814684 00000 n +0000814994 00000 n +0000815189 00000 n +0000815394 00000 n +0000815568 00000 n +0000815885 00000 n +0000816079 00000 n +0000816283 00000 n +0000816469 00000 n +0000816846 00000 n +0000817041 00000 n +0000817246 00000 n +0000817447 00000 n +0000817621 00000 n +0000818006 00000 n +0000818200 00000 n +0000818405 00000 n +0000818605 00000 n +0000818792 00000 n +0000819182 00000 n +0000819377 00000 n +0000819569 00000 n +0000819769 00000 n +0000819955 00000 n +0000820236 00000 n +0000820430 00000 n +0000820634 00000 n +0000820821 00000 n +0000821114 00000 n +0000821308 00000 n +0000821500 00000 n +0000821700 00000 n +0000821886 00000 n +0000822175 00000 n +0000822365 00000 n +0000822552 00000 n +0000823017 00000 n +0000823212 00000 n +0000823417 00000 n +0000823603 00000 n +0000824048 00000 n +0000824242 00000 n +0000824446 00000 n +0000824633 00000 n +0000825079 00000 n +0000825274 00000 n +0000825467 00000 n +0000825667 00000 n +0000825854 00000 n +0000826100 00000 n +0000826279 00000 n +0000826466 00000 n +0000826748 00000 n +0000826939 00000 n +0000827113 00000 n +0000827416 00000 n +0000827610 00000 n +0000827814 00000 n +0000828000 00000 n +0000828228 00000 n +0000828434 00000 n +0000828639 00000 n +0000828836 00000 n +0000829049 00000 n +0000829274 00000 n +0000829518 00000 n +0000829710 00000 n +0000829898 00000 n +0000830095 00000 n +0000830295 00000 n +0000830471 00000 n +0000830695 00000 n +0000830871 00000 n +0000831068 00000 n +0000831340 00000 n +0000831572 00000 n +0000831757 00000 n +0000831974 00000 n +0000832179 00000 n +0000832353 00000 n +0000832993 00000 n +0000841001 00000 n +0000841217 00000 n +0000842580 00000 n +0000843647 00000 n +0000851399 00000 n +0000851620 00000 n +0000852983 00000 n +0000854060 00000 n +0000857321 00000 n +0000857547 00000 n +0000858910 00000 n +0000860026 00000 n +0000862169 00000 n +0000862383 00000 n +0000863746 00000 n trailer << /Size 860 /Root 2 0 R /Info 1 0 R >> startxref -864814 +864872 %%EOF diff --git a/extra/sql/dump/test-data.sql b/extra/sql/dump/test-data.sql index a319b7b0f..f26829698 100644 --- a/extra/sql/dump/test-data.sql +++ b/extra/sql/dump/test-data.sql @@ -26,8 +26,8 @@ USE `cldsdb4`; LOCK TABLES `dictionary` WRITE; /*!40000 ALTER TABLE `dictionary` DISABLE KEYS */; -INSERT INTO `dictionary` VALUES ('DefaultActors','Not found','2020-10-09 17:11:39.923782','Not found','2020-10-09 17:11:39.923782',0,''); -INSERT INTO `dictionary` VALUES ('DefaultOperations','Not found','2020-10-09 17:11:40.013259','Not found','2020-10-09 17:11:40.013259',0,''); +INSERT INTO `dictionary` VALUES ('DefaultActors','Not found','2020-12-11 13:09:10.091122','Not found','2020-12-11 13:09:10.091122',0,''); +INSERT INTO `dictionary` VALUES ('DefaultOperations','Not found','2020-12-11 13:09:10.110987','Not found','2020-12-11 13:09:10.110987',0,''); /*!40000 ALTER TABLE `dictionary` ENABLE KEYS */; UNLOCK TABLES; @@ -37,20 +37,20 @@ UNLOCK TABLES; LOCK TABLES `dictionary_elements` WRITE; /*!40000 ALTER TABLE `dictionary_elements` DISABLE KEYS */; -INSERT INTO `dictionary_elements` VALUES ('APPC','Not found','2020-10-09 17:11:39.960011','Not found','2020-10-09 17:11:39.960011','APPC component','APPC',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('BandwidthOnDemand (SDNC operation)','Not found','2020-10-09 17:11:40.015148','Not found','2020-10-09 17:11:40.015148','SDNC operation','BandwidthOnDemand',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('Health-Check (APPC operation)','Not found','2020-10-09 17:11:40.065809','Not found','2020-10-09 17:11:40.065809','APPC operation','Health-Check',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('Migrate (APPC operation)','Not found','2020-10-09 17:11:40.061300','Not found','2020-10-09 17:11:40.061300','APPC operation','Migrate',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('ModifyConfig (APPC/VFC operation)','Not found','2020-10-09 17:11:40.048127','Not found','2020-10-09 17:11:40.048127','APPC/VFC operation','ModifyConfig',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('Rebuild (APPC operation)','Not found','2020-10-09 17:11:40.044193','Not found','2020-10-09 17:11:40.044193','APPC operation','Rebuild',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('Reroute (SDNC operation)','Not found','2020-10-09 17:11:40.031946','Not found','2020-10-09 17:11:40.031946','SDNC operation','Reroute',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('Restart (APPC operation)','Not found','2020-10-09 17:11:40.057051','Not found','2020-10-09 17:11:40.057051','APPC operation','Restart',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('SDNC','Not found','2020-10-09 17:11:39.943208','Not found','2020-10-09 17:11:39.943208','SDNC component','SDNC',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('SDNR','Not found','2020-10-09 17:11:39.940697','Not found','2020-10-09 17:11:39.940697','SDNR component','SDNR',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('SO','Not found','2020-10-09 17:11:39.954184','Not found','2020-10-09 17:11:39.954184','SO component','SO',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('VF Module Create (SO operation)','Not found','2020-10-09 17:11:40.036281','Not found','2020-10-09 17:11:40.036281','SO operation','VF Module Create',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('VF Module Delete (SO operation)','Not found','2020-10-09 17:11:40.028817','Not found','2020-10-09 17:11:40.028817','SO operation','VF Module Delete',NULL,'string'); -INSERT INTO `dictionary_elements` VALUES ('VFC','Not found','2020-10-09 17:11:39.951016','Not found','2020-10-09 17:11:39.951016','VFC component','VFC',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('APPC','Not found','2020-12-11 13:09:10.100698','Not found','2020-12-11 13:09:10.100698','APPC component','APPC',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('BandwidthOnDemand (SDNC operation)','Not found','2020-12-11 13:09:10.112242','Not found','2020-12-11 13:09:10.112242','SDNC operation','BandwidthOnDemand',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('Health-Check (APPC operation)','Not found','2020-12-11 13:09:10.123052','Not found','2020-12-11 13:09:10.123052','APPC operation','Health-Check',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('Migrate (APPC operation)','Not found','2020-12-11 13:09:10.121906','Not found','2020-12-11 13:09:10.121906','APPC operation','Migrate',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('ModifyConfig (APPC/VFC operation)','Not found','2020-12-11 13:09:10.119448','Not found','2020-12-11 13:09:10.119448','APPC/VFC operation','ModifyConfig',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('Rebuild (APPC operation)','Not found','2020-12-11 13:09:10.117513','Not found','2020-12-11 13:09:10.117513','APPC operation','Rebuild',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('Reroute (SDNC operation)','Not found','2020-12-11 13:09:10.114623','Not found','2020-12-11 13:09:10.114623','SDNC operation','Reroute',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('Restart (APPC operation)','Not found','2020-12-11 13:09:10.120619','Not found','2020-12-11 13:09:10.120619','APPC operation','Restart',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('SDNC','Not found','2020-12-11 13:09:10.097548','Not found','2020-12-11 13:09:10.097548','SDNC component','SDNC',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('SDNR','Not found','2020-12-11 13:09:10.095814','Not found','2020-12-11 13:09:10.095814','SDNR component','SDNR',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('SO','Not found','2020-12-11 13:09:10.099751','Not found','2020-12-11 13:09:10.099751','SO component','SO',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('VF Module Create (SO operation)','Not found','2020-12-11 13:09:10.115714','Not found','2020-12-11 13:09:10.115714','SO operation','VF Module Create',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('VF Module Delete (SO operation)','Not found','2020-12-11 13:09:10.113414','Not found','2020-12-11 13:09:10.113414','SO operation','VF Module Delete',NULL,'string'); +INSERT INTO `dictionary_elements` VALUES ('VFC','Not found','2020-12-11 13:09:10.098818','Not found','2020-12-11 13:09:10.098818','VFC component','VFC',NULL,'string'); /*!40000 ALTER TABLE `dictionary_elements` ENABLE KEYS */; UNLOCK TABLES; @@ -93,7 +93,7 @@ UNLOCK TABLES; LOCK TABLES `loop_element_models` WRITE; /*!40000 ALTER TABLE `loop_element_models` DISABLE KEYS */; -INSERT INTO `loop_element_models` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app',NULL,'2020-10-09 17:11:38.266040','Not found','2020-10-09 17:11:38.542649',NULL,NULL,'MICRO_SERVICE_TYPE',NULL); +INSERT INTO `loop_element_models` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app',NULL,'2020-12-11 13:08:37.738163','Not found','2020-12-11 13:08:37.868869',NULL,NULL,'MICRO_SERVICE_TYPE',NULL); /*!40000 ALTER TABLE `loop_element_models` ENABLE KEYS */; UNLOCK TABLES; @@ -112,9 +112,9 @@ UNLOCK TABLES; LOCK TABLES `loop_templates` WRITE; /*!40000 ALTER TABLE `loop_templates` DISABLE KEYS */; -INSERT INTO `loop_templates` VALUES ('LOOP_TEMPLATE_U19Qe_v1_0_ResourceInstanceName1_tca','Not found','2020-10-09 17:11:38.503094','Not found','2020-10-09 17:11:38.503094','CLOSED','tosca_definitions_version: cloudify_dsl_1_3\nimports:\n- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/docker/2.2.0/node-type.yaml\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml\n- http://onap.org:8081/repository/solutioning01-mte2-raw/type_files/dmaap/dmaap_mr.yaml\ninputs:\n location_id:\n type: string\n service_id:\n type: string\n policy_id:\n type: string\nnode_templates:\n policy_0:\n type: dcae.nodes.policy\n properties:\n policy_id: \n get_input: policy_id\n policy_model_id: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\n cdap_host_host:\n type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure\n properties:\n location_id:\n get_input: location_id\n scn_override: cdap_broker.solutioning-central.dcae.onap.org\n interfaces:\n cloudify.interfaces.lifecycle: {\n }\n tca_tca:\n type: dcae.nodes.MicroService.cdap\n properties:\n app_config:\n appDescription: DCAE Analytics Threshold Crossing Alert Application\n appName: dcae-tca\n tcaSubscriberOutputStreamName: TCASubscriberOutputStream\n tcaVESAlertsTableName: TCAVESAlertsTable\n tcaVESAlertsTableTTLSeconds: \'1728000\'\n tcaVESMessageStatusTableName: TCAVESMessageStatusTable\n tcaVESMessageStatusTableTTLSeconds: \'86400\'\n thresholdCalculatorFlowletInstances: \'2\'\n app_preferences:\n publisherContentType: application/json\n publisherHostName: mrlocal-mtnjftle01.onap.org\n publisherHostPort: \'3905\'\n publisherMaxBatchSize: \'10\'\n publisherMaxRecoveryQueueSize: \'100000\'\n publisherPollingInterval: \'20000\'\n publisherProtocol: https\n publisherTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESPub\n publisherUserName: test@tca.af.dcae.onap.org\n publisherUserPassword: password\n subscriberConsumerGroup: OpenDCAE-c12\n subscriberConsumerId: c12\n subscriberContentType: application/json\n subscriberHostName: mrlocal-mtnjftle01.onap.org\n subscriberHostPort: \'3905\'\n subscriberMessageLimit: \'-1\'\n subscriberPollingInterval: \'20000\'\n subscriberProtocol: https\n subscriberTimeoutMS: \'-1\'\n subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub\n subscriberUserName: test@tca.af.dcae.onap.org\n subscriberUserPassword: password\n tca_policy: null\n artifact_name: dcae-analytics-tca\n artifact_version: 1.0.0\n connections:\n streams_publishes: [\n ]\n streams_subscribes: [\n ]\n jar_url: http://somejar\n location_id:\n get_input: location_id\n namespace: cdap_tca_hi_lo\n programs:\n - program_id: TCAVESCollectorFlow\n program_type: flows\n - program_id: TCADMaaPMRSubscriberWorker\n program_type: workers\n - program_id: TCADMaaPMRPublisherWorker\n program_type: workers\n service_component_type: cdap_app_tca\n service_id:\n get_input: service_id\n streamname: TCASubscriberOutputStream\n relationships:\n - target: topic0\n type: dcae.relationships.subscribe_to_events\n - target: topic1\n type: dcae.relationships.publish_events\n - target: cdap_host_host\n type: dcae.relationships.component_contained_in\n - target: policy_0\n type: dcae.relationships.depends_on\n topic0:\n type: dcae.nodes.Topic\n properties:\n topic_name: \'\'\n topic1:\n type: dcae.nodes.Topic\n properties:\n topic_name: \'\'\n \n','typeId-fc2ea033-6e47-49f5-b393-71e40d6678ca',0,1,'63cac700-ab9a-4115-a74f-7eac85e3fce0'); -INSERT INTO `loop_templates` VALUES ('LOOP_TEMPLATE_U19Qe_v1_0_ResourceInstanceName1_tca_3','Not found','2020-10-09 17:11:38.401001','Not found','2020-10-09 17:11:38.401001','CLOSED','#\n# ============LICENSE_START====================================================\n# =============================================================================\n# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.\n# =============================================================================\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# ============LICENSE_END======================================================\n\ntosca_definitions_version: cloudify_dsl_1_3\n\ndescription: >\n This blueprint deploys/manages the TCA module as a Docker container\n\nimports:\n - https://www.getcloudify.org/spec/cloudify/4.5.5/types.yaml\n - \"https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/k8splugin/1.7.2/k8splugin_types.yaml\"\n - \"https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/clamppolicyplugin/1.1.0/clamppolicyplugin_types.yaml\"\ninputs:\n aaiEnrichmentHost:\n type: string\n default: \"aai.onap.svc.cluster.local\"\n aaiEnrichmentPort:\n type: string\n default: \"8443\"\n enableAAIEnrichment:\n type: string\n default: \"true\"\n dmaap_host:\n type: string\n default: \"message-router.onap.svc.cluster.local\"\n dmaap_port:\n type: string\n default: \"3904\"\n enableRedisCaching:\n type: string\n default: \"false\"\n redisHosts:\n type: string\n default: \"dcae-redis.onap.svc.cluster.local:6379\"\n tag_version:\n type: string\n default: \"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.2.2\"\n consul_host:\n type: string\n default: \"consul-server.onap\"\n consul_port:\n type: string\n default: \"8500\"\n cbs_host:\n type: string\n default: \"config-binding-service\"\n cbs_port:\n type: string\n default: \"10000\"\n policy_id:\n type: string\n default: \"onap.restart.tca\"\n external_port:\n type: string\n description: Kubernetes node port on which CDAPgui is exposed\n default: \"32012\"\n policy_model_id:\n type: string\n default: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\nnode_templates:\n tca_k8s:\n type: dcae.nodes.ContainerizedServiceComponent\n relationships:\n - target: tca_policy\n type: cloudify.relationships.depends_on\n properties:\n service_component_type: \'dcaegen2-analytics-tca\'\n application_config: {}\n docker_config: {}\n image:\n get_input: tag_version\n log_info:\n log_directory: \"/opt/app/TCAnalytics/logs\"\n application_config:\n app_config:\n appDescription: DCAE Analytics Threshold Crossing Alert Application\n appName: dcae-tca\n tcaAlertsAbatementTableName: TCAAlertsAbatementTable\n tcaAlertsAbatementTableTTLSeconds: \'1728000\'\n tcaSubscriberOutputStreamName: TCASubscriberOutputStream\n tcaVESAlertsTableName: TCAVESAlertsTable\n tcaVESAlertsTableTTLSeconds: \'1728000\'\n tcaVESMessageStatusTableName: TCAVESMessageStatusTable\n tcaVESMessageStatusTableTTLSeconds: \'86400\'\n thresholdCalculatorFlowletInstances: \'2\'\n app_preferences:\n aaiEnrichmentHost:\n get_input: aaiEnrichmentHost\n aaiEnrichmentIgnoreSSLCertificateErrors: \'true\'\n aaiEnrichmentPortNumber: \'8443\'\n aaiEnrichmentProtocol: https\n aaiEnrichmentUserName: dcae@dcae.onap.org\n aaiEnrichmentUserPassword: demo123456!\n aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query\n aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf\n enableAAIEnrichment:\n get_input: enableAAIEnrichment\n enableRedisCaching:\n get_input: enableRedisCaching\n redisHosts:\n get_input: redisHosts\n enableAlertCEFFormat: \'false\'\n publisherContentType: application/json\n publisherHostName:\n get_input: dmaap_host\n publisherHostPort:\n get_input: dmaap_port\n publisherMaxBatchSize: \'1\'\n publisherMaxRecoveryQueueSize: \'100000\'\n publisherPollingInterval: \'20000\'\n publisherProtocol: http\n publisherTopicName: unauthenticated.DCAE_CL_OUTPUT\n subscriberConsumerGroup: OpenDCAE-clamp\n subscriberConsumerId: c12\n subscriberContentType: application/json\n subscriberHostName:\n get_input: dmaap_host\n subscriberHostPort:\n get_input: dmaap_port\n subscriberMessageLimit: \'-1\'\n subscriberPollingInterval: \'30000\'\n subscriberProtocol: http\n subscriberTimeoutMS: \'-1\'\n subscriberTopicName: unauthenticated.VES_MEASUREMENT_OUTPUT\n #tca_policy: \'{\"domain\":\"measurementsForVfScaling\",\"metricsPerEventName\":[{\"eventName\":\"vFirewallBroadcastPackets\",\"controlLoopSchemaType\":\"VM\",\"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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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\"}]}]}\'\n tca_policy: \'\'\n service_component_type: dcaegen2-analytics_tca\n interfaces:\n cloudify.interfaces.lifecycle:\n start:\n inputs:\n envs:\n DMAAPHOST:\n { get_input: dmaap_host }\n DMAAPPORT: \"3904\"\n DMAAPPUBTOPIC: \"unauthenticated.DCAE_CL_OUTPUT\"\n DMAAPSUBTOPIC: \"unauthenticated.VES_MEASUREMENT_OUTPUT\"\n AAIHOST:\n { get_input: aaiEnrichmentHost }\n AAIPORT: \"8443\"\n CONSUL_HOST:\n { get_input: consul_host }\n CONSUL_PORT: \"8500\"\n CBS_HOST:\n { get_input: cbs_host }\n CBS_PORT: \"10000\"\n CONFIG_BINDING_SERVICE: \"config_binding_service\"\n ports:\n - concat: [\"11011:\", { get_input: external_port }]\n tca_policy:\n type: clamp.nodes.policy\n properties:\n policy_id:\n get_input: policy_id\n policy_model_id:\n get_input: policy_model_id\n','typeId-4bf1b214-ba2a-4c11-b6ec-377a29a1fc2b',0,1,'63cac700-ab9a-4115-a74f-7eac85e3fce0'); -INSERT INTO `loop_templates` VALUES ('LOOP_TEMPLATE_U19Qe_v1_0_ResourceInstanceName2_tca_2','Not found','2020-10-09 17:11:38.256597','Not found','2020-10-09 17:11:38.256597','CLOSED','#\n# ============LICENSE_START====================================================\n# =============================================================================\n# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.\n# =============================================================================\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# ============LICENSE_END======================================================\n\ntosca_definitions_version: cloudify_dsl_1_3\n\ndescription: >\n This blueprint deploys/manages the TCA module as a Docker container\n\nimports:\n - http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\n - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/k8splugin/1.4.12/k8splugin_types.yaml\n# - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/dcaepolicyplugin/2.3.0/dcaepolicyplugin_types.yaml\n - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/clamppolicyplugin/1.0.0/clamppolicyplugin_types.yaml\ninputs:\n aaiEnrichmentHost:\n type: string\n default: \"aai.onap.svc.cluster.local\"\n aaiEnrichmentPort:\n type: string\n default: \"8443\"\n enableAAIEnrichment:\n type: string\n default: true\n dmaap_host:\n type: string\n default: message-router.onap\n dmaap_port:\n type: string\n default: \"3904\"\n enableRedisCaching:\n type: string\n default: false\n redisHosts:\n type: string\n default: dcae-redis.onap.svc.cluster.local:6379\n tag_version:\n type: string\n default: \"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.1\"\n consul_host:\n type: string\n default: consul-server.onap\n consul_port:\n type: string\n default: \"8500\"\n cbs_host:\n type: string\n default: \"config-binding-servicel\"\n cbs_port:\n type: string\n default: \"10000\"\n policy_id:\n type: string\n default: \"onap.restart.tca\"\n external_port:\n type: string\n description: Kubernetes node port on which CDAPgui is exposed\n default: \"32012\"\n policy_model_id:\n type: string\n default: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\nnode_templates:\n tca_k8s:\n type: dcae.nodes.ContainerizedServiceComponent\n relationships:\n - target: tca_policy\n type: cloudify.relationships.depends_on\n properties:\n service_component_type: \'dcaegen2-analytics-tca\'\n application_config: {}\n docker_config: {}\n image:\n get_input: tag_version\n log_info:\n log_directory: \"/opt/app/TCAnalytics/logs\"\n application_config:\n app_config:\n appDescription: DCAE Analytics Threshold Crossing Alert Application\n appName: dcae-tca\n tcaAlertsAbatementTableName: TCAAlertsAbatementTable\n tcaAlertsAbatementTableTTLSeconds: \'1728000\'\n tcaSubscriberOutputStreamName: TCASubscriberOutputStream\n tcaVESAlertsTableName: TCAVESAlertsTable\n tcaVESAlertsTableTTLSeconds: \'1728000\'\n tcaVESMessageStatusTableName: TCAVESMessageStatusTable\n tcaVESMessageStatusTableTTLSeconds: \'86400\'\n thresholdCalculatorFlowletInstances: \'2\'\n app_preferences:\n aaiEnrichmentHost:\n get_input: aaiEnrichmentHost\n aaiEnrichmentIgnoreSSLCertificateErrors: \'true\'\n aaiEnrichmentPortNumber: \'8443\'\n aaiEnrichmentProtocol: https\n aaiEnrichmentUserName: dcae@dcae.onap.org\n aaiEnrichmentUserPassword: demo123456!\n aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query\n aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf\n enableAAIEnrichment:\n get_input: enableAAIEnrichment\n enableRedisCaching:\n get_input: enableRedisCaching\n redisHosts:\n get_input: redisHosts\n enableAlertCEFFormat: \'false\'\n publisherContentType: application/json\n publisherHostName:\n get_input: dmaap_host\n publisherHostPort:\n get_input: dmaap_port\n publisherMaxBatchSize: \'1\'\n publisherMaxRecoveryQueueSize: \'100000\'\n publisherPollingInterval: \'20000\'\n publisherProtocol: http\n publisherTopicName: unauthenticated.DCAE_CL_OUTPUT\n subscriberConsumerGroup: OpenDCAE-clamp\n subscriberConsumerId: c12\n subscriberContentType: application/json\n subscriberHostName:\n get_input: dmaap_host\n subscriberHostPort:\n get_input: dmaap_port\n subscriberMessageLimit: \'-1\'\n subscriberPollingInterval: \'30000\'\n subscriberProtocol: http\n subscriberTimeoutMS: \'-1\'\n subscriberTopicName: unauthenticated.VES_MEASUREMENT_OUTPUT\n# tca_policy: \'{\"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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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\"}]}]}\'\n service_component_type: dcaegen2-analytics_tca\n interfaces:\n cloudify.interfaces.lifecycle:\n start:\n inputs:\n envs:\n DMAAPHOST:\n { get_input: dmaap_host }\n DMAAPPORT:\n { get_input: dmaap_port }\n DMAAPPUBTOPIC: \"unauthenticated.DCAE_CL_OUTPUT\"\n DMAAPSUBTOPIC: \"unauthenticated.VES_MEASUREMENT_OUTPUT\"\n AAIHOST:\n { get_input: aaiEnrichmentHost }\n AAIPORT:\n { get_input: aaiEnrichmentPort }\n CONSUL_HOST:\n { get_input: consul_host }\n CONSUL_PORT:\n { get_input: consul_port }\n CBS_HOST:\n { get_input: cbs_host }\n CBS_PORT:\n { get_input: cbs_port }\n CONFIG_BINDING_SERVICE: \"config_binding_service\"\n ports:\n - concat: [\"11011:\", { get_input: external_port }]\n tca_policy:\n type: clamp.nodes.policy\n properties:\n policy_id:\n get_input: policy_id\n policy_model_id: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\n','typeId-66bade06-cbe6-4b82-ac71-4c74a01fc8aa',0,1,'63cac700-ab9a-4115-a74f-7eac85e3fce0'); +INSERT INTO `loop_templates` VALUES ('LOOP_TEMPLATE_vXSOK_v1_0_ResourceInstanceName1_tca','Not found','2020-12-11 13:08:37.835870','Not found','2020-12-11 13:08:37.835870','CLOSED','tosca_definitions_version: cloudify_dsl_1_3\nimports:\n- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/docker/2.2.0/node-type.yaml\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml\n- http://onap.org:8081/repository/solutioning01-mte2-raw/type_files/dmaap/dmaap_mr.yaml\ninputs:\n location_id:\n type: string\n service_id:\n type: string\n policy_id:\n type: string\nnode_templates:\n policy_0:\n type: dcae.nodes.policy\n properties:\n policy_id: \n get_input: policy_id\n policy_model_id: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\n cdap_host_host:\n type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure\n properties:\n location_id:\n get_input: location_id\n scn_override: cdap_broker.solutioning-central.dcae.onap.org\n interfaces:\n cloudify.interfaces.lifecycle: {\n }\n tca_tca:\n type: dcae.nodes.MicroService.cdap\n properties:\n app_config:\n appDescription: DCAE Analytics Threshold Crossing Alert Application\n appName: dcae-tca\n tcaSubscriberOutputStreamName: TCASubscriberOutputStream\n tcaVESAlertsTableName: TCAVESAlertsTable\n tcaVESAlertsTableTTLSeconds: \'1728000\'\n tcaVESMessageStatusTableName: TCAVESMessageStatusTable\n tcaVESMessageStatusTableTTLSeconds: \'86400\'\n thresholdCalculatorFlowletInstances: \'2\'\n app_preferences:\n publisherContentType: application/json\n publisherHostName: mrlocal-mtnjftle01.onap.org\n publisherHostPort: \'3905\'\n publisherMaxBatchSize: \'10\'\n publisherMaxRecoveryQueueSize: \'100000\'\n publisherPollingInterval: \'20000\'\n publisherProtocol: https\n publisherTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESPub\n publisherUserName: test@tca.af.dcae.onap.org\n publisherUserPassword: password\n subscriberConsumerGroup: OpenDCAE-c12\n subscriberConsumerId: c12\n subscriberContentType: application/json\n subscriberHostName: mrlocal-mtnjftle01.onap.org\n subscriberHostPort: \'3905\'\n subscriberMessageLimit: \'-1\'\n subscriberPollingInterval: \'20000\'\n subscriberProtocol: https\n subscriberTimeoutMS: \'-1\'\n subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub\n subscriberUserName: test@tca.af.dcae.onap.org\n subscriberUserPassword: password\n tca_policy: null\n artifact_name: dcae-analytics-tca\n artifact_version: 1.0.0\n connections:\n streams_publishes: [\n ]\n streams_subscribes: [\n ]\n jar_url: http://somejar\n location_id:\n get_input: location_id\n namespace: cdap_tca_hi_lo\n programs:\n - program_id: TCAVESCollectorFlow\n program_type: flows\n - program_id: TCADMaaPMRSubscriberWorker\n program_type: workers\n - program_id: TCADMaaPMRPublisherWorker\n program_type: workers\n service_component_type: cdap_app_tca\n service_id:\n get_input: service_id\n streamname: TCASubscriberOutputStream\n relationships:\n - target: topic0\n type: dcae.relationships.subscribe_to_events\n - target: topic1\n type: dcae.relationships.publish_events\n - target: cdap_host_host\n type: dcae.relationships.component_contained_in\n - target: policy_0\n type: dcae.relationships.depends_on\n topic0:\n type: dcae.nodes.Topic\n properties:\n topic_name: \'\'\n topic1:\n type: dcae.nodes.Topic\n properties:\n topic_name: \'\'\n \n','typeId-93833cac-bba0-43c2-857b-c58914e90fea',0,1,'63cac700-ab9a-4115-a74f-7eac85e3fce0'); +INSERT INTO `loop_templates` VALUES ('LOOP_TEMPLATE_vXSOK_v1_0_ResourceInstanceName1_tca_3','Not found','2020-12-11 13:08:37.795397','Not found','2020-12-11 13:08:37.795397','CLOSED','#\n# ============LICENSE_START====================================================\n# =============================================================================\n# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.\n# =============================================================================\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# ============LICENSE_END======================================================\n\ntosca_definitions_version: cloudify_dsl_1_3\n\ndescription: >\n This blueprint deploys/manages the TCA module as a Docker container\n\nimports:\n - https://www.getcloudify.org/spec/cloudify/4.5.5/types.yaml\n - \"https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/k8splugin/1.7.2/k8splugin_types.yaml\"\n - \"https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/clamppolicyplugin/1.1.0/clamppolicyplugin_types.yaml\"\ninputs:\n aaiEnrichmentHost:\n type: string\n default: \"aai.onap.svc.cluster.local\"\n aaiEnrichmentPort:\n type: string\n default: \"8443\"\n enableAAIEnrichment:\n type: string\n default: \"true\"\n dmaap_host:\n type: string\n default: \"message-router.onap.svc.cluster.local\"\n dmaap_port:\n type: string\n default: \"3904\"\n enableRedisCaching:\n type: string\n default: \"false\"\n redisHosts:\n type: string\n default: \"dcae-redis.onap.svc.cluster.local:6379\"\n tag_version:\n type: string\n default: \"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.2.2\"\n consul_host:\n type: string\n default: \"consul-server.onap\"\n consul_port:\n type: string\n default: \"8500\"\n cbs_host:\n type: string\n default: \"config-binding-service\"\n cbs_port:\n type: string\n default: \"10000\"\n policy_id:\n type: string\n default: \"onap.restart.tca\"\n external_port:\n type: string\n description: Kubernetes node port on which CDAPgui is exposed\n default: \"32012\"\n policy_model_id:\n type: string\n default: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\nnode_templates:\n tca_k8s:\n type: dcae.nodes.ContainerizedServiceComponent\n relationships:\n - target: tca_policy\n type: cloudify.relationships.depends_on\n properties:\n service_component_type: \'dcaegen2-analytics-tca\'\n application_config: {}\n docker_config: {}\n image:\n get_input: tag_version\n log_info:\n log_directory: \"/opt/app/TCAnalytics/logs\"\n application_config:\n app_config:\n appDescription: DCAE Analytics Threshold Crossing Alert Application\n appName: dcae-tca\n tcaAlertsAbatementTableName: TCAAlertsAbatementTable\n tcaAlertsAbatementTableTTLSeconds: \'1728000\'\n tcaSubscriberOutputStreamName: TCASubscriberOutputStream\n tcaVESAlertsTableName: TCAVESAlertsTable\n tcaVESAlertsTableTTLSeconds: \'1728000\'\n tcaVESMessageStatusTableName: TCAVESMessageStatusTable\n tcaVESMessageStatusTableTTLSeconds: \'86400\'\n thresholdCalculatorFlowletInstances: \'2\'\n app_preferences:\n aaiEnrichmentHost:\n get_input: aaiEnrichmentHost\n aaiEnrichmentIgnoreSSLCertificateErrors: \'true\'\n aaiEnrichmentPortNumber: \'8443\'\n aaiEnrichmentProtocol: https\n aaiEnrichmentUserName: dcae@dcae.onap.org\n aaiEnrichmentUserPassword: demo123456!\n aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query\n aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf\n enableAAIEnrichment:\n get_input: enableAAIEnrichment\n enableRedisCaching:\n get_input: enableRedisCaching\n redisHosts:\n get_input: redisHosts\n enableAlertCEFFormat: \'false\'\n publisherContentType: application/json\n publisherHostName:\n get_input: dmaap_host\n publisherHostPort:\n get_input: dmaap_port\n publisherMaxBatchSize: \'1\'\n publisherMaxRecoveryQueueSize: \'100000\'\n publisherPollingInterval: \'20000\'\n publisherProtocol: http\n publisherTopicName: unauthenticated.DCAE_CL_OUTPUT\n subscriberConsumerGroup: OpenDCAE-clamp\n subscriberConsumerId: c12\n subscriberContentType: application/json\n subscriberHostName:\n get_input: dmaap_host\n subscriberHostPort:\n get_input: dmaap_port\n subscriberMessageLimit: \'-1\'\n subscriberPollingInterval: \'30000\'\n subscriberProtocol: http\n subscriberTimeoutMS: \'-1\'\n subscriberTopicName: unauthenticated.VES_MEASUREMENT_OUTPUT\n #tca_policy: \'{\"domain\":\"measurementsForVfScaling\",\"metricsPerEventName\":[{\"eventName\":\"vFirewallBroadcastPackets\",\"controlLoopSchemaType\":\"VM\",\"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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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\"}]}]}\'\n tca_policy: \'\'\n service_component_type: dcaegen2-analytics_tca\n interfaces:\n cloudify.interfaces.lifecycle:\n start:\n inputs:\n envs:\n DMAAPHOST:\n { get_input: dmaap_host }\n DMAAPPORT: \"3904\"\n DMAAPPUBTOPIC: \"unauthenticated.DCAE_CL_OUTPUT\"\n DMAAPSUBTOPIC: \"unauthenticated.VES_MEASUREMENT_OUTPUT\"\n AAIHOST:\n { get_input: aaiEnrichmentHost }\n AAIPORT: \"8443\"\n CONSUL_HOST:\n { get_input: consul_host }\n CONSUL_PORT: \"8500\"\n CBS_HOST:\n { get_input: cbs_host }\n CBS_PORT: \"10000\"\n CONFIG_BINDING_SERVICE: \"config_binding_service\"\n ports:\n - concat: [\"11011:\", { get_input: external_port }]\n tca_policy:\n type: clamp.nodes.policy\n properties:\n policy_id:\n get_input: policy_id\n policy_model_id:\n get_input: policy_model_id\n','typeId-16cb34d9-d335-4f9c-8175-b94716ea0a23',0,1,'63cac700-ab9a-4115-a74f-7eac85e3fce0'); +INSERT INTO `loop_templates` VALUES ('LOOP_TEMPLATE_vXSOK_v1_0_ResourceInstanceName2_tca_2','Not found','2020-12-11 13:08:37.717767','Not found','2020-12-11 13:08:37.717767','CLOSED','#\n# ============LICENSE_START====================================================\n# =============================================================================\n# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.\n# =============================================================================\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# ============LICENSE_END======================================================\n\ntosca_definitions_version: cloudify_dsl_1_3\n\ndescription: >\n This blueprint deploys/manages the TCA module as a Docker container\n\nimports:\n - http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\n - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/k8splugin/1.4.12/k8splugin_types.yaml\n# - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/dcaepolicyplugin/2.3.0/dcaepolicyplugin_types.yaml\n - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/clamppolicyplugin/1.0.0/clamppolicyplugin_types.yaml\ninputs:\n aaiEnrichmentHost:\n type: string\n default: \"aai.onap.svc.cluster.local\"\n aaiEnrichmentPort:\n type: string\n default: \"8443\"\n enableAAIEnrichment:\n type: string\n default: true\n dmaap_host:\n type: string\n default: message-router.onap\n dmaap_port:\n type: string\n default: \"3904\"\n enableRedisCaching:\n type: string\n default: false\n redisHosts:\n type: string\n default: dcae-redis.onap.svc.cluster.local:6379\n tag_version:\n type: string\n default: \"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.1\"\n consul_host:\n type: string\n default: consul-server.onap\n consul_port:\n type: string\n default: \"8500\"\n cbs_host:\n type: string\n default: \"config-binding-servicel\"\n cbs_port:\n type: string\n default: \"10000\"\n policy_id:\n type: string\n default: \"onap.restart.tca\"\n external_port:\n type: string\n description: Kubernetes node port on which CDAPgui is exposed\n default: \"32012\"\n policy_model_id:\n type: string\n default: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\nnode_templates:\n tca_k8s:\n type: dcae.nodes.ContainerizedServiceComponent\n relationships:\n - target: tca_policy\n type: cloudify.relationships.depends_on\n properties:\n service_component_type: \'dcaegen2-analytics-tca\'\n application_config: {}\n docker_config: {}\n image:\n get_input: tag_version\n log_info:\n log_directory: \"/opt/app/TCAnalytics/logs\"\n application_config:\n app_config:\n appDescription: DCAE Analytics Threshold Crossing Alert Application\n appName: dcae-tca\n tcaAlertsAbatementTableName: TCAAlertsAbatementTable\n tcaAlertsAbatementTableTTLSeconds: \'1728000\'\n tcaSubscriberOutputStreamName: TCASubscriberOutputStream\n tcaVESAlertsTableName: TCAVESAlertsTable\n tcaVESAlertsTableTTLSeconds: \'1728000\'\n tcaVESMessageStatusTableName: TCAVESMessageStatusTable\n tcaVESMessageStatusTableTTLSeconds: \'86400\'\n thresholdCalculatorFlowletInstances: \'2\'\n app_preferences:\n aaiEnrichmentHost:\n get_input: aaiEnrichmentHost\n aaiEnrichmentIgnoreSSLCertificateErrors: \'true\'\n aaiEnrichmentPortNumber: \'8443\'\n aaiEnrichmentProtocol: https\n aaiEnrichmentUserName: dcae@dcae.onap.org\n aaiEnrichmentUserPassword: demo123456!\n aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query\n aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf\n enableAAIEnrichment:\n get_input: enableAAIEnrichment\n enableRedisCaching:\n get_input: enableRedisCaching\n redisHosts:\n get_input: redisHosts\n enableAlertCEFFormat: \'false\'\n publisherContentType: application/json\n publisherHostName:\n get_input: dmaap_host\n publisherHostPort:\n get_input: dmaap_port\n publisherMaxBatchSize: \'1\'\n publisherMaxRecoveryQueueSize: \'100000\'\n publisherPollingInterval: \'20000\'\n publisherProtocol: http\n publisherTopicName: unauthenticated.DCAE_CL_OUTPUT\n subscriberConsumerGroup: OpenDCAE-clamp\n subscriberConsumerId: c12\n subscriberContentType: application/json\n subscriberHostName:\n get_input: dmaap_host\n subscriberHostPort:\n get_input: dmaap_port\n subscriberMessageLimit: \'-1\'\n subscriberPollingInterval: \'30000\'\n subscriberProtocol: http\n subscriberTimeoutMS: \'-1\'\n subscriberTopicName: unauthenticated.VES_MEASUREMENT_OUTPUT\n# tca_policy: \'{\"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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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.vNicPerformanceArray[*].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\"}]}]}\'\n service_component_type: dcaegen2-analytics_tca\n interfaces:\n cloudify.interfaces.lifecycle:\n start:\n inputs:\n envs:\n DMAAPHOST:\n { get_input: dmaap_host }\n DMAAPPORT:\n { get_input: dmaap_port }\n DMAAPPUBTOPIC: \"unauthenticated.DCAE_CL_OUTPUT\"\n DMAAPSUBTOPIC: \"unauthenticated.VES_MEASUREMENT_OUTPUT\"\n AAIHOST:\n { get_input: aaiEnrichmentHost }\n AAIPORT:\n { get_input: aaiEnrichmentPort }\n CONSUL_HOST:\n { get_input: consul_host }\n CONSUL_PORT:\n { get_input: consul_port }\n CBS_HOST:\n { get_input: cbs_host }\n CBS_PORT:\n { get_input: cbs_port }\n CONFIG_BINDING_SERVICE: \"config_binding_service\"\n ports:\n - concat: [\"11011:\", { get_input: external_port }]\n tca_policy:\n type: clamp.nodes.policy\n properties:\n policy_id:\n get_input: policy_id\n policy_model_id: \"onap.policies.monitoring.cdap.tca.hi.lo.app\"\n','typeId-ab8ca488-654b-4947-a4d8-243e2cd9ab67',0,1,'63cac700-ab9a-4115-a74f-7eac85e3fce0'); /*!40000 ALTER TABLE `loop_templates` ENABLE KEYS */; UNLOCK TABLES; @@ -152,9 +152,9 @@ UNLOCK TABLES; LOCK TABLES `looptemplates_to_loopelementmodels` WRITE; /*!40000 ALTER TABLE `looptemplates_to_loopelementmodels` DISABLE KEYS */; -INSERT INTO `looptemplates_to_loopelementmodels` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','LOOP_TEMPLATE_U19Qe_v1_0_ResourceInstanceName1_tca',0); -INSERT INTO `looptemplates_to_loopelementmodels` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','LOOP_TEMPLATE_U19Qe_v1_0_ResourceInstanceName1_tca_3',0); -INSERT INTO `looptemplates_to_loopelementmodels` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','LOOP_TEMPLATE_U19Qe_v1_0_ResourceInstanceName2_tca_2',0); +INSERT INTO `looptemplates_to_loopelementmodels` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','LOOP_TEMPLATE_vXSOK_v1_0_ResourceInstanceName1_tca',0); +INSERT INTO `looptemplates_to_loopelementmodels` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','LOOP_TEMPLATE_vXSOK_v1_0_ResourceInstanceName1_tca_3',0); +INSERT INTO `looptemplates_to_loopelementmodels` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','LOOP_TEMPLATE_vXSOK_v1_0_ResourceInstanceName2_tca_2',0); /*!40000 ALTER TABLE `looptemplates_to_loopelementmodels` ENABLE KEYS */; UNLOCK TABLES; @@ -182,12 +182,12 @@ UNLOCK TABLES; LOCK TABLES `policy_models` WRITE; /*!40000 ALTER TABLE `policy_models` DISABLE KEYS */; -INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.guard.common.Blacklist','1.0.0','Not found','2020-10-09 17:11:33.689766','Not found','2020-10-09 17:11:34.010869','Blacklist','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.guard.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n This is the base Policy Type for Guard policies that guard the execution of Operational\n Policies.\n properties:\n actor:\n type: string\n description: Specifies the Actor the guard applies to.\n required: true\n operation:\n type: string\n description: Specified the operation that the actor is performing\n the guard applies to.\n required: true\n timeRange:\n type: tosca.datatypes.TimeInterval\n description: |\n An optional range of time during the day the guard policy is valid for.\n required: false\n id:\n type: string\n description: The Control Loop id this applies to.\n required: false\n onap.policies.controlloop.guard.common.Blacklist:\n derived_from: onap.policies.controlloop.guard.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Supports blacklist of entity id\'s from performing control loop\n actions on.\n properties:\n blacklist:\n type: list\n description: List of entity id\'s\n required: true\n entry_schema:\n type: string\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"xacml\"\n ]\n }\n ]\n}'); -INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.guard.common.FrequencyLimiter','1.0.0','Not found','2020-10-09 17:11:33.627436','Not found','2020-10-09 17:11:34.033593','FrequencyLimiter','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.guard.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n This is the base Policy Type for Guard policies that guard the execution of Operational\n Policies.\n properties:\n actor:\n type: string\n description: Specifies the Actor the guard applies to.\n required: true\n operation:\n type: string\n description: Specified the operation that the actor is performing\n the guard applies to.\n required: true\n timeRange:\n type: tosca.datatypes.TimeInterval\n description: |\n An optional range of time during the day the guard policy is valid for.\n required: false\n id:\n type: string\n description: The Control Loop id this applies to.\n required: false\n onap.policies.controlloop.guard.common.FrequencyLimiter:\n derived_from: onap.policies.controlloop.guard.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Supports limiting the frequency of actions being taken by a Actor.\n properties:\n timeWindow:\n type: integer\n description: The time window to count the actions against.\n required: true\n timeUnits:\n type: string\n description: The units of time the window is counting.\n constraints:\n - valid_values:\n - second\n - minute\n - hour\n - day\n - week\n - month\n - year\n limit:\n type: integer\n description: The limit\n required: true\n constraints:\n - greater_than: 0\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"xacml\"\n ]\n }\n ]\n}'); -INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.guard.common.MinMax','2.0.0','Not found','2020-10-09 17:11:33.773212','Not found','2020-10-09 17:11:33.773212','MinMax','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.guard.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n This is the base Policy Type for Guard policies that guard the execution of Operational\n Policies.\n properties:\n actor:\n type: string\n description: Specifies the Actor the guard applies to.\n required: true\n operation:\n type: string\n description: Specified the operation that the actor is performing\n the guard applies to.\n required: true\n timeRange:\n type: tosca.datatypes.TimeInterval\n description: |\n An optional range of time during the day the guard policy is valid for.\n required: false\n id:\n type: string\n description: The Control Loop id this applies to.\n required: false\n onap.policies.controlloop.guard.common.MinMax:\n derived_from: onap.policies.controlloop.guard.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Supports Min/Max number of entity for scaling operations\n properties:\n min:\n type: integer\n required: true\n description: The minimum instances of this entity\n max:\n type: integer\n required: false\n description: The maximum instances of this entity\n',NULL); -INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.operational.common.Apex','1.0.0','Not found','2020-10-09 17:11:33.562107','Not found','2020-10-09 17:11:34.058644','Apex','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.operational.Common:\n properties:\n abatement:\n name: abatement\n type: boolean\n typeVersion: 0.0.0\n description: Whether an abatement event message will be expected for\n the control loop from DCAE.\n default: \'false\'\n required: true\n constraints: [\n ]\n metadata: {\n }\n operations:\n name: operations\n type: list\n typeVersion: 0.0.0\n description: List of operations to be performed when Control Loop\n is triggered.\n required: true\n constraints: [\n ]\n entry_schema:\n type: onap.datatype.controlloop.Operation\n typeVersion: 0.0.0\n constraints: [\n ]\n metadata: {\n }\n trigger:\n name: trigger\n type: string\n typeVersion: 0.0.0\n description: Initial operation to execute upon receiving an Onset\n event message for the Control Loop.\n required: true\n constraints: [\n ]\n metadata: {\n }\n timeout:\n name: timeout\n type: integer\n typeVersion: 0.0.0\n description: |\n Overall timeout for executing all the operations. This timeout should equal or exceed the total\n timeout for each operation listed.\n required: true\n constraints: [\n ]\n metadata: {\n }\n id:\n name: id\n type: string\n typeVersion: 0.0.0\n description: The unique control loop id.\n required: true\n constraints: [\n ]\n metadata: {\n }\n name: onap.policies.controlloop.operational.Common\n version: 1.0.0\n derived_from: tosca.policies.Root\n metadata: {\n }\n description: |\n Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant\n Policy Types. This does NOT support the legacy Policy YAML policy type.\n onap.policies.controlloop.operational.common.Apex:\n properties:\n engineServiceParameters:\n name: engineServiceParameters\n type: string\n typeVersion: 0.0.0\n description: The engine parameters like name, instanceCount, policy\n implementation, parameters etc.\n required: true\n constraints: [\n ]\n metadata: {\n }\n eventOutputParameters:\n name: eventOutputParameters\n type: string\n typeVersion: 0.0.0\n description: The event output parameters.\n required: true\n constraints: [\n ]\n metadata: {\n }\n javaProperties:\n name: javaProperties\n type: string\n typeVersion: 0.0.0\n description: Name/value pairs of properties to be set for APEX if\n needed.\n required: false\n constraints: [\n ]\n metadata: {\n }\n eventInputParameters:\n name: eventInputParameters\n type: string\n typeVersion: 0.0.0\n description: The event input parameters.\n required: true\n constraints: [\n ]\n metadata: {\n }\n name: onap.policies.controlloop.operational.common.Apex\n version: 1.0.0\n derived_from: onap.policies.controlloop.operational.Common\n metadata: {\n }\n description: Operational policies for Apex PDP\ndata_types:\n onap.datatype.controlloop.Actor:\n constraints: [\n ]\n properties:\n payload:\n name: payload\n type: map\n typeVersion: 0.0.0\n description: Name/value pairs of payload information passed by Policy\n to the actor\n required: false\n constraints: [\n ]\n entry_schema:\n type: string\n typeVersion: 0.0.0\n constraints: [\n ]\n metadata:\n clamp_possible_values: ClampExecution:CDS/payload\n target:\n name: target\n type: onap.datatype.controlloop.Target\n typeVersion: 0.0.0\n description: The resource the operation should be performed on.\n required: true\n constraints: [\n ]\n metadata: {\n }\n actor:\n name: actor\n type: string\n typeVersion: 0.0.0\n description: The actor performing the operation.\n required: true\n constraints: [\n ]\n metadata:\n clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor\n operation:\n name: operation\n type: string\n typeVersion: 0.0.0\n description: The operation the actor is performing.\n required: true\n constraints: [\n ]\n metadata:\n clamp_possible_values: Dictionary:DefaultOperations, ClampExecution:CDS/operation\n name: onap.datatype.controlloop.Actor\n version: 0.0.0\n derived_from: tosca.datatypes.Root\n metadata: {\n }\n description: An actor/operation/target definition\n onap.datatype.controlloop.Operation:\n constraints: [\n ]\n properties:\n failure_retries:\n name: failure_retries\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the current operation\n has exceeded its max retries.\n default: final_failure_retries\n required: false\n constraints: [\n ]\n metadata: {\n }\n id:\n name: id\n type: string\n typeVersion: 0.0.0\n description: Unique identifier for the operation\n required: true\n constraints: [\n ]\n metadata: {\n }\n failure_timeout:\n name: failure_timeout\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the time out for\n the operation occurs.\n default: final_failure_timeout\n required: false\n constraints: [\n ]\n metadata: {\n }\n failure:\n name: failure\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke on Actor operation\n failure.\n default: final_failure\n required: false\n constraints: [\n ]\n metadata: {\n }\n operation:\n name: operation\n type: onap.datatype.controlloop.Actor\n typeVersion: 0.0.0\n description: The definition of the operation to be performed.\n required: true\n constraints: [\n ]\n metadata: {\n }\n failure_guard:\n name: failure_guard\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the current operation\n is blocked due to guard policy enforcement.\n default: final_failure_guard\n required: false\n constraints: [\n ]\n metadata: {\n }\n retries:\n name: retries\n type: integer\n typeVersion: 0.0.0\n description: The number of retries the actor should attempt to perform\n the operation.\n default: \'0\'\n required: true\n constraints: [\n ]\n metadata: {\n }\n timeout:\n name: timeout\n type: integer\n typeVersion: 0.0.0\n description: The amount of time for the actor to perform the operation.\n required: true\n constraints: [\n ]\n metadata: {\n }\n failure_exception:\n name: failure_exception\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the current operation\n causes an exception.\n default: final_failure_exception\n required: false\n constraints: [\n ]\n metadata: {\n }\n description:\n name: description\n type: string\n typeVersion: 0.0.0\n description: A user-friendly description of the intent for the operation\n required: false\n constraints: [\n ]\n metadata: {\n }\n success:\n name: success\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke on success. A value\n of \"final_success\" indicates and end to the operation.\n default: final_success\n required: false\n constraints: [\n ]\n metadata: {\n }\n name: onap.datatype.controlloop.Operation\n version: 0.0.0\n derived_from: tosca.datatypes.Root\n metadata: {\n }\n description: An operation supported by an actor\n onap.datatype.controlloop.Target:\n constraints: [\n ]\n properties:\n entityIds:\n name: entityIds\n type: map\n typeVersion: 0.0.0\n description: |\n Map of values that identify the resource. If none are provided, it is assumed that the\n entity that generated the ONSET event will be the target.\n required: false\n constraints: [\n ]\n entry_schema:\n type: string\n typeVersion: 0.0.0\n constraints: [\n ]\n metadata:\n clamp_possible_values: ClampExecution:CSAR_RESOURCES\n targetType:\n name: targetType\n type: string\n typeVersion: 0.0.0\n description: Category for the target type\n required: true\n constraints:\n - valid_values:\n - VNF\n - VM\n - VFMODULE\n - PNF\n metadata: {\n }\n name: onap.datatype.controlloop.Target\n version: 0.0.0\n derived_from: tosca.datatypes.Root\n metadata: {\n }\n description: Definition for a entity in A&AI to perform a control loop operation\n on\nname: ToscaServiceTemplateSimple\nversion: 1.0.0\nmetadata: {\n }\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"drools\"\n ]\n }\n ]\n}'); -INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.operational.common.Drools','1.0.0','Not found','2020-10-09 17:11:33.405456','Not found','2020-10-09 17:11:34.097298','Drools','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.operational.common.Drools:\n derived_from: onap.policies.controlloop.operational.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Operational policies for Drools PDP\n properties:\n controllerName:\n type: string\n description: Drools controller properties\n required: false\n onap.policies.controlloop.operational.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant\n Policy Types. This does NOT support the legacy Policy YAML policy type.\n properties:\n id:\n type: string\n description: The unique control loop id.\n required: true\n timeout:\n type: integer\n description: |\n Overall timeout for executing all the operations. This timeout should equal or exceed the total\n timeout for each operation listed.\n required: true\n abatement:\n type: boolean\n description: Whether an abatement event message will be expected for\n the control loop from DCAE.\n required: true\n default: false\n trigger:\n type: string\n description: Initial operation to execute upon receiving an Onset\n event message for the Control Loop.\n required: true\n operations:\n type: list\n description: List of operations to be performed when Control Loop\n is triggered.\n required: true\n entry_schema:\n type: onap.datatype.controlloop.Operation\ndata_types:\n onap.datatype.controlloop.Target:\n derived_from: tosca.datatypes.Root\n description: Definition for a entity in A&AI to perform a control loop operation\n on\n properties:\n targetType:\n type: string\n description: Category for the target type\n required: true\n constraints:\n - valid_values:\n - VNF\n - VM\n - VFMODULE\n - PNF\n entityIds:\n type: map\n description: |\n Map of values that identify the resource. If none are provided, it is assumed that the\n entity that generated the ONSET event will be the target.\n required: false\n metadata:\n clamp_possible_values: ClampExecution:CSAR_RESOURCES\n entry_schema:\n type: string\n onap.datatype.controlloop.Actor:\n derived_from: tosca.datatypes.Root\n description: An actor/operation/target definition\n properties:\n actor:\n type: string\n description: The actor performing the operation.\n required: true\n metadata:\n clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor\n operation:\n type: string\n description: The operation the actor is performing.\n required: true\n metadata:\n clamp_possible_values: Dictionary:DefaultOperations, ClampExecution:CDS/operations\n target:\n type: onap.datatype.controlloop.Target\n description: The resource the operation should be performed on.\n required: true\n payload:\n type: map\n description: Name/value pairs of payload information passed by Policy\n to the actor\n required: false\n metadata:\n clamp_possible_values: ClampExecution:CDS/payload\n entry_schema:\n type: string\n onap.datatype.controlloop.Operation:\n derived_from: tosca.datatypes.Root\n description: An operation supported by an actor\n properties:\n id:\n type: string\n description: Unique identifier for the operation\n required: true\n description:\n type: string\n description: A user-friendly description of the intent for the operation\n required: false\n operation:\n type: onap.datatype.controlloop.Actor\n description: The definition of the operation to be performed.\n required: true\n timeout:\n type: integer\n description: The amount of time for the actor to perform the operation.\n required: true\n retries:\n type: integer\n description: The number of retries the actor should attempt to perform\n the operation.\n required: true\n default: 0\n success:\n type: string\n description: Points to the operation to invoke on success. A value\n of \"final_success\" indicates and end to the operation.\n required: false\n default: final_success\n failure:\n type: string\n description: Points to the operation to invoke on Actor operation\n failure.\n required: false\n default: final_failure\n failure_timeout:\n type: string\n description: Points to the operation to invoke when the time out for\n the operation occurs.\n required: false\n default: final_failure_timeout\n failure_retries:\n type: string\n description: Points to the operation to invoke when the current operation\n has exceeded its max retries.\n required: false\n default: final_failure_retries\n failure_exception:\n type: string\n description: Points to the operation to invoke when the current operation\n causes an exception.\n required: false\n default: final_failure_exception\n failure_guard:\n type: string\n description: Points to the operation to invoke when the current operation\n is blocked due to guard policy enforcement.\n required: false\n default: final_failure_guard\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"drools\"\n ]\n }\n ]\n}'); -INSERT INTO `policy_models` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','1.0.0','Not found','2020-10-09 17:11:38.086948','Not found','2020-10-09 17:11:38.086948','app','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.Monitoring:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: a base policy type for all policies that govern monitoring provisioning\n onap.policies.monitoring.cdap.tca.hi.lo.app:\n derived_from: onap.policies.Monitoring\n version: 1.0.0\n properties:\n tca_policy:\n type: onap.datatypes.monitoring.tca_policy\n description: TCA Policy JSON\n required: true\ndata_types:\n onap.datatypes.monitoring.metricsPerEventName:\n derived_from: tosca.datatypes.Root\n properties:\n controlLoopSchemaType:\n type: string\n required: true\n description: Specifies Control Loop Schema Type for the event Name\n e.g. VNF, VM\n constraints:\n - valid_values:\n - VM\n - VNF\n eventName:\n type: string\n required: true\n description: Event name to which thresholds need to be applied\n policyName:\n type: string\n required: true\n description: TCA Policy Scope Name\n policyScope:\n type: string\n required: true\n description: TCA Policy Scope\n policyVersion:\n type: string\n required: true\n description: TCA Policy Scope Version\n thresholds:\n type: list\n required: true\n description: Thresholds associated with eventName\n entry_schema:\n type: onap.datatypes.monitoring.thresholds\n onap.datatypes.monitoring.tca_policy:\n derived_from: tosca.datatypes.Root\n properties:\n domain:\n type: string\n required: true\n description: Domain name to which TCA needs to be applied\n default: measurementsForVfScaling\n constraints:\n - equal: measurementsForVfScaling\n metricsPerEventName:\n type: list\n required: true\n description: Contains eventName and threshold details that need to\n be applied to given eventName\n entry_schema:\n type: onap.datatypes.monitoring.metricsPerEventName\n onap.datatypes.monitoring.thresholds:\n derived_from: tosca.datatypes.Root\n properties:\n closedLoopControlName:\n type: string\n required: true\n description: Closed Loop Control Name associated with the threshold\n closedLoopEventStatus:\n type: string\n required: true\n description: Closed Loop Event Status of the threshold\n constraints:\n - valid_values:\n - ONSET\n - ABATED\n direction:\n type: string\n required: true\n description: Direction of the threshold\n constraints:\n - valid_values:\n - LESS\n - LESS_OR_EQUAL\n - GREATER\n - GREATER_OR_EQUAL\n - EQUAL\n fieldPath:\n type: string\n required: true\n description: Json field Path as per CEF message which needs to be\n analyzed for TCA\n constraints:\n - valid_values:\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage\n - $.event.measurementsForVfScalingFields.meanRequestLatency\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed\n - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\n severity:\n type: string\n required: true\n description: Threshold Event Severity\n constraints:\n - valid_values:\n - CRITICAL\n - MAJOR\n - MINOR\n - WARNING\n - NORMAL\n thresholdValue:\n type: integer\n required: true\n description: Threshold value for the field Path inside CEF message\n version:\n type: string\n required: true\n description: Version number associated with the threshold\n',NULL); +INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.guard.common.Blacklist','1.0.0','Not found','2020-12-11 13:08:35.348618','Not found','2020-12-11 13:08:35.531457','Blacklist','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.guard.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n This is the base Policy Type for Guard policies that guard the execution of Operational\n Policies.\n properties:\n actor:\n type: string\n description: Specifies the Actor the guard applies to.\n required: true\n operation:\n type: string\n description: Specified the operation that the actor is performing\n the guard applies to.\n required: true\n timeRange:\n type: tosca.datatypes.TimeInterval\n description: |\n An optional range of time during the day the guard policy is valid for.\n required: false\n id:\n type: string\n description: The Control Loop id this applies to.\n required: false\n onap.policies.controlloop.guard.common.Blacklist:\n derived_from: onap.policies.controlloop.guard.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Supports blacklist of entity id\'s from performing control loop\n actions on.\n properties:\n blacklist:\n type: list\n description: List of entity id\'s\n required: true\n entry_schema:\n type: string\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"xacml\"\n ]\n }\n ]\n}'); +INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.guard.common.FrequencyLimiter','1.0.0','Not found','2020-12-11 13:08:35.280128','Not found','2020-12-11 13:08:35.546611','FrequencyLimiter','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.guard.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n This is the base Policy Type for Guard policies that guard the execution of Operational\n Policies.\n properties:\n actor:\n type: string\n description: Specifies the Actor the guard applies to.\n required: true\n operation:\n type: string\n description: Specified the operation that the actor is performing\n the guard applies to.\n required: true\n timeRange:\n type: tosca.datatypes.TimeInterval\n description: |\n An optional range of time during the day the guard policy is valid for.\n required: false\n id:\n type: string\n description: The Control Loop id this applies to.\n required: false\n onap.policies.controlloop.guard.common.FrequencyLimiter:\n derived_from: onap.policies.controlloop.guard.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Supports limiting the frequency of actions being taken by a Actor.\n properties:\n timeWindow:\n type: integer\n description: The time window to count the actions against.\n required: true\n timeUnits:\n type: string\n description: The units of time the window is counting.\n constraints:\n - valid_values:\n - second\n - minute\n - hour\n - day\n - week\n - month\n - year\n limit:\n type: integer\n description: The limit\n required: true\n constraints:\n - greater_than: 0\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"xacml\"\n ]\n }\n ]\n}'); +INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.guard.common.MinMax','2.0.0','Not found','2020-12-11 13:08:35.392508','Not found','2020-12-11 13:08:35.392508','MinMax','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.guard.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n This is the base Policy Type for Guard policies that guard the execution of Operational\n Policies.\n properties:\n actor:\n type: string\n description: Specifies the Actor the guard applies to.\n required: true\n operation:\n type: string\n description: Specified the operation that the actor is performing\n the guard applies to.\n required: true\n timeRange:\n type: tosca.datatypes.TimeInterval\n description: |\n An optional range of time during the day the guard policy is valid for.\n required: false\n id:\n type: string\n description: The Control Loop id this applies to.\n required: false\n onap.policies.controlloop.guard.common.MinMax:\n derived_from: onap.policies.controlloop.guard.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Supports Min/Max number of entity for scaling operations\n properties:\n min:\n type: integer\n required: true\n description: The minimum instances of this entity\n max:\n type: integer\n required: false\n description: The maximum instances of this entity\n',NULL); +INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.operational.common.Apex','1.0.0','Not found','2020-12-11 13:08:35.195163','Not found','2020-12-11 13:08:35.560779','Apex','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.operational.Common:\n properties:\n abatement:\n name: abatement\n type: boolean\n typeVersion: 0.0.0\n description: Whether an abatement event message will be expected for\n the control loop from DCAE.\n default: \'false\'\n required: true\n constraints: [\n ]\n metadata: {\n }\n operations:\n name: operations\n type: list\n typeVersion: 0.0.0\n description: List of operations to be performed when Control Loop\n is triggered.\n required: true\n constraints: [\n ]\n entry_schema:\n type: onap.datatype.controlloop.Operation\n typeVersion: 0.0.0\n constraints: [\n ]\n metadata: {\n }\n trigger:\n name: trigger\n type: string\n typeVersion: 0.0.0\n description: Initial operation to execute upon receiving an Onset\n event message for the Control Loop.\n required: true\n constraints: [\n ]\n metadata: {\n }\n timeout:\n name: timeout\n type: integer\n typeVersion: 0.0.0\n description: |\n Overall timeout for executing all the operations. This timeout should equal or exceed the total\n timeout for each operation listed.\n required: true\n constraints: [\n ]\n metadata: {\n }\n id:\n name: id\n type: string\n typeVersion: 0.0.0\n description: The unique control loop id.\n required: true\n constraints: [\n ]\n metadata: {\n }\n name: onap.policies.controlloop.operational.Common\n version: 1.0.0\n derived_from: tosca.policies.Root\n metadata: {\n }\n description: |\n Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant\n Policy Types. This does NOT support the legacy Policy YAML policy type.\n onap.policies.controlloop.operational.common.Apex:\n properties:\n engineServiceParameters:\n name: engineServiceParameters\n type: string\n typeVersion: 0.0.0\n description: The engine parameters like name, instanceCount, policy\n implementation, parameters etc.\n required: true\n constraints: [\n ]\n metadata: {\n }\n eventOutputParameters:\n name: eventOutputParameters\n type: string\n typeVersion: 0.0.0\n description: The event output parameters.\n required: true\n constraints: [\n ]\n metadata: {\n }\n javaProperties:\n name: javaProperties\n type: string\n typeVersion: 0.0.0\n description: Name/value pairs of properties to be set for APEX if\n needed.\n required: false\n constraints: [\n ]\n metadata: {\n }\n eventInputParameters:\n name: eventInputParameters\n type: string\n typeVersion: 0.0.0\n description: The event input parameters.\n required: true\n constraints: [\n ]\n metadata: {\n }\n name: onap.policies.controlloop.operational.common.Apex\n version: 1.0.0\n derived_from: onap.policies.controlloop.operational.Common\n metadata: {\n }\n description: Operational policies for Apex PDP\ndata_types:\n onap.datatype.controlloop.Actor:\n constraints: [\n ]\n properties:\n payload:\n name: payload\n type: map\n typeVersion: 0.0.0\n description: Name/value pairs of payload information passed by Policy\n to the actor\n required: false\n constraints: [\n ]\n entry_schema:\n type: string\n typeVersion: 0.0.0\n constraints: [\n ]\n metadata:\n clamp_possible_values: ClampExecution:CDS/payload\n target:\n name: target\n type: onap.datatype.controlloop.Target\n typeVersion: 0.0.0\n description: The resource the operation should be performed on.\n required: true\n constraints: [\n ]\n metadata: {\n }\n actor:\n name: actor\n type: string\n typeVersion: 0.0.0\n description: The actor performing the operation.\n required: true\n constraints: [\n ]\n metadata:\n clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor\n operation:\n name: operation\n type: string\n typeVersion: 0.0.0\n description: The operation the actor is performing.\n required: true\n constraints: [\n ]\n metadata:\n clamp_possible_values: Dictionary:DefaultOperations, ClampExecution:CDS/operation\n name: onap.datatype.controlloop.Actor\n version: 0.0.0\n derived_from: tosca.datatypes.Root\n metadata: {\n }\n description: An actor/operation/target definition\n onap.datatype.controlloop.Operation:\n constraints: [\n ]\n properties:\n failure_retries:\n name: failure_retries\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the current operation\n has exceeded its max retries.\n default: final_failure_retries\n required: false\n constraints: [\n ]\n metadata: {\n }\n id:\n name: id\n type: string\n typeVersion: 0.0.0\n description: Unique identifier for the operation\n required: true\n constraints: [\n ]\n metadata: {\n }\n failure_timeout:\n name: failure_timeout\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the time out for\n the operation occurs.\n default: final_failure_timeout\n required: false\n constraints: [\n ]\n metadata: {\n }\n failure:\n name: failure\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke on Actor operation\n failure.\n default: final_failure\n required: false\n constraints: [\n ]\n metadata: {\n }\n operation:\n name: operation\n type: onap.datatype.controlloop.Actor\n typeVersion: 0.0.0\n description: The definition of the operation to be performed.\n required: true\n constraints: [\n ]\n metadata: {\n }\n failure_guard:\n name: failure_guard\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the current operation\n is blocked due to guard policy enforcement.\n default: final_failure_guard\n required: false\n constraints: [\n ]\n metadata: {\n }\n retries:\n name: retries\n type: integer\n typeVersion: 0.0.0\n description: The number of retries the actor should attempt to perform\n the operation.\n default: \'0\'\n required: true\n constraints: [\n ]\n metadata: {\n }\n timeout:\n name: timeout\n type: integer\n typeVersion: 0.0.0\n description: The amount of time for the actor to perform the operation.\n required: true\n constraints: [\n ]\n metadata: {\n }\n failure_exception:\n name: failure_exception\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke when the current operation\n causes an exception.\n default: final_failure_exception\n required: false\n constraints: [\n ]\n metadata: {\n }\n description:\n name: description\n type: string\n typeVersion: 0.0.0\n description: A user-friendly description of the intent for the operation\n required: false\n constraints: [\n ]\n metadata: {\n }\n success:\n name: success\n type: string\n typeVersion: 0.0.0\n description: Points to the operation to invoke on success. A value\n of \"final_success\" indicates and end to the operation.\n default: final_success\n required: false\n constraints: [\n ]\n metadata: {\n }\n name: onap.datatype.controlloop.Operation\n version: 0.0.0\n derived_from: tosca.datatypes.Root\n metadata: {\n }\n description: An operation supported by an actor\n onap.datatype.controlloop.Target:\n constraints: [\n ]\n properties:\n entityIds:\n name: entityIds\n type: map\n typeVersion: 0.0.0\n description: |\n Map of values that identify the resource. If none are provided, it is assumed that the\n entity that generated the ONSET event will be the target.\n required: false\n constraints: [\n ]\n entry_schema:\n type: string\n typeVersion: 0.0.0\n constraints: [\n ]\n metadata:\n clamp_possible_values: ClampExecution:CSAR_RESOURCES\n targetType:\n name: targetType\n type: string\n typeVersion: 0.0.0\n description: Category for the target type\n required: true\n constraints:\n - valid_values:\n - VNF\n - VM\n - VFMODULE\n - PNF\n metadata: {\n }\n name: onap.datatype.controlloop.Target\n version: 0.0.0\n derived_from: tosca.datatypes.Root\n metadata: {\n }\n description: Definition for a entity in A&AI to perform a control loop operation\n on\nname: ToscaServiceTemplateSimple\nversion: 1.0.0\nmetadata: {\n }\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"drools\"\n ]\n }\n ]\n}'); +INSERT INTO `policy_models` VALUES ('onap.policies.controlloop.operational.common.Drools','1.0.0','Not found','2020-12-11 13:08:35.125997','Not found','2020-12-11 13:08:35.578296','Drools','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.controlloop.operational.common.Drools:\n derived_from: onap.policies.controlloop.operational.Common\n type_version: 1.0.0\n version: 1.0.0\n description: Operational policies for Drools PDP\n properties:\n controllerName:\n type: string\n description: Drools controller properties\n required: false\n onap.policies.controlloop.operational.Common:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: |\n Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant\n Policy Types. This does NOT support the legacy Policy YAML policy type.\n properties:\n id:\n type: string\n description: The unique control loop id.\n required: true\n timeout:\n type: integer\n description: |\n Overall timeout for executing all the operations. This timeout should equal or exceed the total\n timeout for each operation listed.\n required: true\n abatement:\n type: boolean\n description: Whether an abatement event message will be expected for\n the control loop from DCAE.\n required: true\n default: false\n trigger:\n type: string\n description: Initial operation to execute upon receiving an Onset\n event message for the Control Loop.\n required: true\n operations:\n type: list\n description: List of operations to be performed when Control Loop\n is triggered.\n required: true\n entry_schema:\n type: onap.datatype.controlloop.Operation\ndata_types:\n onap.datatype.controlloop.Target:\n derived_from: tosca.datatypes.Root\n description: Definition for a entity in A&AI to perform a control loop operation\n on\n properties:\n targetType:\n type: string\n description: Category for the target type\n required: true\n constraints:\n - valid_values:\n - VNF\n - VM\n - VFMODULE\n - PNF\n entityIds:\n type: map\n description: |\n Map of values that identify the resource. If none are provided, it is assumed that the\n entity that generated the ONSET event will be the target.\n required: false\n metadata:\n clamp_possible_values: ClampExecution:CSAR_RESOURCES\n entry_schema:\n type: string\n onap.datatype.controlloop.Actor:\n derived_from: tosca.datatypes.Root\n description: An actor/operation/target definition\n properties:\n actor:\n type: string\n description: The actor performing the operation.\n required: true\n metadata:\n clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor\n operation:\n type: string\n description: The operation the actor is performing.\n required: true\n metadata:\n clamp_possible_values: Dictionary:DefaultOperations, ClampExecution:CDS/operations\n target:\n type: onap.datatype.controlloop.Target\n description: The resource the operation should be performed on.\n required: true\n payload:\n type: map\n description: Name/value pairs of payload information passed by Policy\n to the actor\n required: false\n metadata:\n clamp_possible_values: ClampExecution:CDS/payload\n entry_schema:\n type: string\n onap.datatype.controlloop.Operation:\n derived_from: tosca.datatypes.Root\n description: An operation supported by an actor\n properties:\n id:\n type: string\n description: Unique identifier for the operation\n required: true\n description:\n type: string\n description: A user-friendly description of the intent for the operation\n required: false\n operation:\n type: onap.datatype.controlloop.Actor\n description: The definition of the operation to be performed.\n required: true\n timeout:\n type: integer\n description: The amount of time for the actor to perform the operation.\n required: true\n retries:\n type: integer\n description: The number of retries the actor should attempt to perform\n the operation.\n required: true\n default: 0\n success:\n type: string\n description: Points to the operation to invoke on success. A value\n of \"final_success\" indicates and end to the operation.\n required: false\n default: final_success\n failure:\n type: string\n description: Points to the operation to invoke on Actor operation\n failure.\n required: false\n default: final_failure\n failure_timeout:\n type: string\n description: Points to the operation to invoke when the time out for\n the operation occurs.\n required: false\n default: final_failure_timeout\n failure_retries:\n type: string\n description: Points to the operation to invoke when the current operation\n has exceeded its max retries.\n required: false\n default: final_failure_retries\n failure_exception:\n type: string\n description: Points to the operation to invoke when the current operation\n causes an exception.\n required: false\n default: final_failure_exception\n failure_guard:\n type: string\n description: Points to the operation to invoke when the current operation\n is blocked due to guard policy enforcement.\n required: false\n default: final_failure_guard\n','{\n \"supportedPdpGroups\": [\n {\n \"controlloop\": [\n \"drools\"\n ]\n }\n ]\n}'); +INSERT INTO `policy_models` VALUES ('onap.policies.monitoring.cdap.tca.hi.lo.app','1.0.0','Not found','2020-12-11 13:08:37.637693','Not found','2020-12-11 13:08:37.637693','app','tosca_definitions_version: tosca_simple_yaml_1_1_0\npolicy_types:\n onap.policies.Monitoring:\n derived_from: tosca.policies.Root\n version: 1.0.0\n description: a base policy type for all policies that govern monitoring provisioning\n onap.policies.monitoring.cdap.tca.hi.lo.app:\n derived_from: onap.policies.Monitoring\n version: 1.0.0\n properties:\n tca_policy:\n type: onap.datatypes.monitoring.tca_policy\n description: TCA Policy JSON\n required: true\ndata_types:\n onap.datatypes.monitoring.metricsPerEventName:\n derived_from: tosca.datatypes.Root\n properties:\n controlLoopSchemaType:\n type: string\n required: true\n description: Specifies Control Loop Schema Type for the event Name\n e.g. VNF, VM\n constraints:\n - valid_values:\n - VM\n - VNF\n eventName:\n type: string\n required: true\n description: Event name to which thresholds need to be applied\n policyName:\n type: string\n required: true\n description: TCA Policy Scope Name\n policyScope:\n type: string\n required: true\n description: TCA Policy Scope\n policyVersion:\n type: string\n required: true\n description: TCA Policy Scope Version\n thresholds:\n type: list\n required: true\n description: Thresholds associated with eventName\n entry_schema:\n type: onap.datatypes.monitoring.thresholds\n onap.datatypes.monitoring.tca_policy:\n derived_from: tosca.datatypes.Root\n properties:\n domain:\n type: string\n required: true\n description: Domain name to which TCA needs to be applied\n default: measurementsForVfScaling\n constraints:\n - equal: measurementsForVfScaling\n metricsPerEventName:\n type: list\n required: true\n description: Contains eventName and threshold details that need to\n be applied to given eventName\n entry_schema:\n type: onap.datatypes.monitoring.metricsPerEventName\n onap.datatypes.monitoring.thresholds:\n derived_from: tosca.datatypes.Root\n properties:\n closedLoopControlName:\n type: string\n required: true\n description: Closed Loop Control Name associated with the threshold\n closedLoopEventStatus:\n type: string\n required: true\n description: Closed Loop Event Status of the threshold\n constraints:\n - valid_values:\n - ONSET\n - ABATED\n direction:\n type: string\n required: true\n description: Direction of the threshold\n constraints:\n - valid_values:\n - LESS\n - LESS_OR_EQUAL\n - GREATER\n - GREATER_OR_EQUAL\n - EQUAL\n fieldPath:\n type: string\n required: true\n description: Json field Path as per CEF message which needs to be\n analyzed for TCA\n constraints:\n - valid_values:\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated\n - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait\n - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage\n - $.event.measurementsForVfScalingFields.meanRequestLatency\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree\n - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed\n - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\n severity:\n type: string\n required: true\n description: Threshold Event Severity\n constraints:\n - valid_values:\n - CRITICAL\n - MAJOR\n - MINOR\n - WARNING\n - NORMAL\n thresholdValue:\n type: integer\n required: true\n description: Threshold value for the field Path inside CEF message\n version:\n type: string\n required: true\n description: Version number associated with the threshold\n',NULL); /*!40000 ALTER TABLE `policy_models` ENABLE KEYS */; UNLOCK TABLES; @@ -209,4 +209,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-10-09 15:12:32 +-- Dump completed on 2020-12-11 12:09:39 diff --git a/src/main/java/org/onap/clamp/authorization/AuthorizationController.java b/src/main/java/org/onap/clamp/authorization/AuthorizationController.java deleted file mode 100644 index f4da09a2e..000000000 --- a/src/main/java/org/onap/clamp/authorization/AuthorizationController.java +++ /dev/null @@ -1,189 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.authorization; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.util.Date; -import org.apache.camel.Exchange; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.exception.NotAuthorizedException; -import org.onap.clamp.clds.model.ClampInformation; -import org.onap.clamp.clds.util.LoggingUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; - -/** - * Verify user has right permissions. - */ -@Component -public class AuthorizationController { - - protected static final EELFLogger logger = - EELFManager.getInstance().getLogger(AuthorizationController.class); - protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - protected static final EELFLogger securityLogger = - EELFManager.getInstance().getSecurityLogger(); - - // By default we'll set it to a default handler - @Autowired - private ClampProperties refProp; - - private SecurityContext securityContext = SecurityContextHolder.getContext(); - - public static final String PERM_PREFIX = "security.permission.type."; - private static final String PERM_INSTANCE = "security.permission.instance"; - - private static String retrieveUserName(SecurityContext securityContext) { - if (securityContext == null || securityContext.getAuthentication() == null) { - return null; - } - if ((securityContext.getAuthentication().getPrincipal()) instanceof String) { - // anonymous case - return ((String) securityContext.getAuthentication().getPrincipal()); - } else { - return ((UserDetails) securityContext.getAuthentication().getPrincipal()).getUsername(); - } - } - - /** - * Get the principal name. - * - * @return The principal name - */ - public static String getPrincipalName(SecurityContext securityContext) { - String principal = AuthorizationController.retrieveUserName(securityContext); - String name = "Not found"; - if (principal != null) { - name = principal; - } - return name; - } - - /** - * Insert authorize the api based on the permission. - * - * @param camelExchange The Camel Exchange object containing the properties - * @param typeVar The type of the permissions - * @param instanceVar The instance of the permissions. e.g. dev - * @param action The action of the permissions. e.g. read - */ - public void authorize(Exchange camelExchange, String typeVar, String instanceVar, - String action) { - String type = refProp.getStringValue(PERM_PREFIX + typeVar); - String instance = refProp.getStringValue(PERM_INSTANCE); - - if (null == type || type.isEmpty()) { - // authorization is turned off, since the permission is not defined - return; - } - if (null != instanceVar && !instanceVar.isEmpty()) { - instance = instanceVar; - } - String principalName = AuthorizationController.getPrincipalName(this.securityContext); - SecureServicePermission perm = SecureServicePermission.create(type, instance, action); - Date startTime = new Date(); - LoggingUtils.setTargetContext("Clamp", "authorize"); - LoggingUtils.setTimeContext(startTime, new Date()); - securityLogger.debug("checking if {} has permission: {}", principalName, perm); - - if (!isUserPermitted(perm)) { - String msg = principalName + " does not have permission: " + perm; - LoggingUtils.setErrorContext("100", "Authorization Error"); - securityLogger.warn(msg); - throw new NotAuthorizedException(msg); - } - } - - /** - * Insert authorize the api based on the permission. - * - * @param inPermission Security permission in input - * @return True if user is permitted - */ - public boolean isUserPermitted(SecureServicePermission inPermission) { - - String principalName = AuthorizationController.getPrincipalName(this.securityContext); - // check if the user has the permission key or the permission key with a - // combination of all instance and/or all action. - if (hasRole(inPermission.getKey()) || hasRole(inPermission.getKeyAllInstance())) { - auditLogger.info("{} authorized because user has permission with * for instance: {}", - principalName, inPermission.getKey().replace("|", ":")); - return true; - // the rest of these don't seem to be required - isUserInRole method - // appears to take * as a wildcard - } else if (hasRole(inPermission.getKeyAllInstanceAction())) { - auditLogger.info( - "{} authorized because user has permission with * for instance and * for action: {}", - principalName, inPermission.getKey().replace("|", ":")); - return true; - } else if (hasRole(inPermission.getKeyAllAction())) { - auditLogger.info("{} authorized because user has permission with * for action: {}", - principalName, inPermission.getKey().replace("|", ":")); - return true; - } else { - return false; - } - } - - protected boolean hasRole(String role) { - Authentication authentication = securityContext.getAuthentication(); - if (authentication == null) { - return false; - } - for (GrantedAuthority auth : authentication.getAuthorities()) { - if (role.equals(auth.getAuthority())) { - return true; - } - } - return false; - } - - /** - * Gets clds info. CLDS IFO service will return 3 things 1. User Name 2. CLDS - * code version that is currently installed from pom.xml file 3. User - * permissions - * - * @return the clds info - */ - public ClampInformation getClampInformation() { - ClampInformation clampInfo = new ClampInformation(); - Authentication authentication = securityContext.getAuthentication(); - if (authentication == null) { - return new ClampInformation(); - } - clampInfo.setUserName(AuthorizationController.getPrincipalName(this.securityContext)); - for (GrantedAuthority auth : authentication.getAuthorities()) { - clampInfo.getAllPermissions().add(auth.getAuthority()); - } - return clampInfo; - } -} diff --git a/src/main/java/org/onap/clamp/authorization/CldsUser.java b/src/main/java/org/onap/clamp/authorization/CldsUser.java deleted file mode 100644 index b50f50cb2..000000000 --- a/src/main/java/org/onap/clamp/authorization/CldsUser.java +++ /dev/null @@ -1,97 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.authorization; - -import java.util.Arrays; - -/** - * The class represents the CldsUser that can be extracted from cldsusers.json. - */ -public class CldsUser { - - private String user; - private String password; - private SecureServicePermission[] permissions; - - /** - * Returns the user. - * - * @return the user - */ - public String getUser() { - return user; - } - - /** - * Sets the user. - * - * @param user - * the user to set - */ - public void setUser(String user) { - this.user = user; - } - - /** - * Returns the password. - * - * @return the password - */ - public String getPassword() { - return password; - } - - /** - * Sets the password. - * - * @param password - * the password to set - */ - public void setPassword(String password) { - this.password = password; - } - - /** - * Returns the permissions. - * - * @return the permissions - */ - public SecureServicePermission[] getPermissions() { - return Arrays.copyOf(permissions, permissions.length); - } - - public String[] getPermissionsString() { - return Arrays.stream(getPermissions()).map(SecureServicePermission::getKey).toArray(String[]::new); - } - - /** - * Sets the permissions. - * - * @param permissionsArray - * the permissions to set - */ - public void setPermissions(SecureServicePermission[] permissionsArray) { - this.permissions = Arrays.copyOf(permissionsArray, permissionsArray.length); - } -} diff --git a/src/main/java/org/onap/clamp/authorization/SecureServicePermission.java b/src/main/java/org/onap/clamp/authorization/SecureServicePermission.java deleted file mode 100644 index 0ee126ead..000000000 --- a/src/main/java/org/onap/clamp/authorization/SecureServicePermission.java +++ /dev/null @@ -1,203 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.authorization; - -/** - * Permission class that can be instantiated easily using constructor or factory - * methods. - */ -public class SecureServicePermission { - public static final String ALL = "*"; - - private String type; - private String instance; - private String action; - - /** - * Factory method to create permission given type, instance, and action. - * - * @param type type of the permission - * @param instance instance of the permission - * @param action action of the permission - * @return instance of SecureServicePermission with type, instance and action - */ - public static SecureServicePermission create(String type, String instance, String action) { - return new SecureServicePermission(type, instance, action); - } - - /** - * Factory method to create permission given type and instance. Default - * action to ALL/*. - * - * @param type type of the permission - * @param instance instance of the permission - * @return instance of SecureServicePermission with type, instance and default action - */ - public static SecureServicePermission create(String type, String instance) { - return new SecureServicePermission(type, instance, ALL); - } - - /** - * Factory method to create permission given type. Default instance and - * action to ALL/*. - * - * @param type type of the permission - * @return instance of SecureServicePermission with type and default instance and action - */ - public static SecureServicePermission create(String type) { - return new SecureServicePermission(type, ALL, ALL); - } - - /** - * Instantiate permission given type, instance, and action. - * - * @param type type of the permission - * @param instance instance of the permission - * @param action action of the permission - */ - public SecureServicePermission(String type, String instance, String action) { - this.type = type; - this.instance = instance; - this.action = action; - } - - /** - * Instantiate permission given type from concatenated string. - * - * @param concatenatedString - * the string type|instance|action, less than 3 params can be - * provided (e.g. "permission-type-cl", "permission-type-cl|dev", - * "permission-type-cl|dev|update" ) - */ - public SecureServicePermission(String concatenatedString) { - String[] userInfo = concatenatedString.split("[|]"); - // We should have at least 1 string - this.type = userInfo[0]; - this.instance = (userInfo.length > 1 ? userInfo[1] : ALL); - this.action = (userInfo.length > 2 ? userInfo[2] : ALL); - } - - /** - * Override toString - return permission in key format. - */ - @Override - public String toString() { - return getKey(); - } - - /** - * Return Permission in Key format = type, instance, and action separate by - * pipe character. - * - * @return permission in key format - */ - public String getKey() { - return type + "|" + instance + "|" + action; - } - - /** - * Return Permission in Key format = type, all instance, and action separate - * by pipe character. - * - * @return permission in key format - */ - public String getKeyAllInstance() { - return type + "|" + ALL + "|" + action; - } - - /** - * Return Permission in Key format = type, all instance, and all action - * separate by pipe character. - * - * @return permission in key format - */ - public String getKeyAllInstanceAction() { - return type + "|" + ALL + "|" + ALL; - } - - /** - * Return Permission in Key format = type, instance, and all action separate - * by pipe character. - * - * @return permission in key format - */ - public String getKeyAllAction() { - return type + "|" + instance + "|" + ALL; - } - - /** - * Returns the permission type. - * - * @return the type - */ - public String getType() { - return type; - } - - /** - * Sets the type of permission. - * - * @param type the type to set - */ - public void setType(String type) { - this.type = type; - } - - /** - * Returns the instance of permission. - * - * @return the instance - */ - public String getInstance() { - return instance; - } - - /** - * Sets the instance of permission. - * - * @param instance the instance to set - */ - public void setInstance(String instance) { - this.instance = instance; - } - - /** - * Returns the action of permission. - * - * @return the action - */ - public String getAction() { - return action; - } - - /** - * Sets the action of permission. - * - * @param action the action to set - */ - public void setAction(String action) { - this.action = action; - } - -} diff --git a/src/main/java/org/onap/clamp/authorization/SecureServicePermissionDeserializer.java b/src/main/java/org/onap/clamp/authorization/SecureServicePermissionDeserializer.java deleted file mode 100644 index 026ee802c..000000000 --- a/src/main/java/org/onap/clamp/authorization/SecureServicePermissionDeserializer.java +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.authorization; - - -import com.google.gson.Gson; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import java.lang.reflect.Type; - -public class SecureServicePermissionDeserializer implements JsonDeserializer { - - @Override - public SecureServicePermission deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { - if (json.isJsonPrimitive()) { - return new SecureServicePermission(json.getAsString()); - } else { - // if not string try default deserialization - return new Gson().fromJson(json, SecureServicePermission.class); - } - } -} diff --git a/src/main/java/org/onap/clamp/authorization/UserService.java b/src/main/java/org/onap/clamp/authorization/UserService.java deleted file mode 100644 index b4f51c95b..000000000 --- a/src/main/java/org/onap/clamp/authorization/UserService.java +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - */ - -package org.onap.clamp.authorization; - - -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Controller; - -/** - * User service used for authorization verification at the login page. Do not - * remove this class. - */ -@Controller -public class UserService { - - private SecurityContext securityContext = SecurityContextHolder.getContext(); - - /** - * REST service that returns the username. - * - * @return the user name - */ - public String getUser() { - return AuthorizationController.getPrincipalName(securityContext); - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/Application.java b/src/main/java/org/onap/clamp/clds/Application.java deleted file mode 100644 index e83ff3e76..000000000 --- a/src/main/java/org/onap/clamp/clds/Application.java +++ /dev/null @@ -1,182 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.IOException; -import java.io.InputStream; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.Enumeration; -import org.apache.catalina.connector.Connector; -import org.onap.clamp.clds.util.ClampVersioning; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.util.PassDecoder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.boot.web.servlet.server.ServletWebServerFactory; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.core.env.Environment; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@ComponentScan(basePackages = { "org.onap.clamp" }) -@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class }) -@EnableJpaRepositories(basePackages = { "org.onap.clamp" }) -@EntityScan(basePackages = { "org.onap.clamp" }) -@EnableTransactionManagement -@EnableConfigurationProperties -@EnableAsync -@EnableScheduling -@EnableJpaAuditing -public class Application extends SpringBootServletInitializer { - - protected static final EELFLogger eelfLogger = EELFManager.getInstance().getLogger(Application.class); - // This settings is an additional one to Spring config, - // only if we want to have an additional port automatically redirected to - // HTTPS - @Value("${server.http-to-https-redirection.port:none}") - private String httpRedirectedPort; - /** - * This 8080 is the default port used by spring if this parameter is not - * specified in application.properties. - */ - @Value("${server.port:8080}") - private String springServerPort; - @Value("${server.ssl.key-store:none}") - private String sslKeystoreFile; - - @Autowired - private Environment env; - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(Application.class); - } - - public static void main(String[] args) { - // Start the Spring application - SpringApplication.run(Application.class, args); - } - - /** - * This method is used to declare the camel servlet. - * - * @return A servlet bean - * @throws IOException IO Exception - */ - @Bean - public ServletRegistrationBean camelServletRegistrationBean() throws IOException { - eelfLogger.info(ResourceFileUtils.getResourceAsString("boot-message.txt") + "(v" - + ClampVersioning.getCldsVersionFromProps() + ")" + System.getProperty("line.separator") - + getSslExpirationDate()); - ServletRegistrationBean registration = new ServletRegistrationBean(new ClampServlet(), "/restservices/clds/*"); - registration.setName("CamelServlet"); - return registration; - } - - /** - * This method is used by Spring to create the servlet container factory. - * - * @return The TomcatEmbeddedServletContainerFactory just created - */ - @Bean - public ServletWebServerFactory getEmbeddedServletContainerFactory() { - TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); - if (!"none".equals(httpRedirectedPort) && !"none".equals(sslKeystoreFile)) { - // Automatically redirect to HTTPS - tomcat = new TomcatEmbeddedServletContainerFactoryRedirection(); - Connector newConnector = createRedirectConnector(Integer.parseInt(springServerPort)); - if (newConnector != null) { - tomcat.addAdditionalTomcatConnectors(newConnector); - } - } - return tomcat; - } - - private Connector createRedirectConnector(int redirectSecuredPort) { - if (redirectSecuredPort <= 0) { - eelfLogger.warn("HTTP port redirection to HTTPS is disabled because the HTTPS port is 0 (random port) or -1" - + " (Connector disabled)"); - return null; - } - Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); - connector.setScheme("http"); - connector.setSecure(false); - connector.setPort(Integer.parseInt(httpRedirectedPort)); - connector.setRedirectPort(redirectSecuredPort); - return connector; - } - - private String getSslExpirationDate() throws IOException { - StringBuilder result = new StringBuilder(" :: SSL Certificates :: "); - try { - if (env.getProperty("server.ssl.key-store") != null) { - - KeyStore keystore = KeyStore.getInstance(env.getProperty("server.ssl.key-store-type")); - String password = PassDecoder.decode(env.getProperty("server.ssl.key-store-password"), - env.getProperty("clamp.config.keyFile")); - String keyStore = env.getProperty("server.ssl.key-store"); - InputStream is = ResourceFileUtils.getResourceAsStream(keyStore.replaceAll("classpath:", "")); - keystore.load(is, password.toCharArray()); - - Enumeration aliases = keystore.aliases(); - while (aliases.hasMoreElements()) { - String alias = aliases.nextElement(); - if ("X.509".equals(keystore.getCertificate(alias).getType())) { - result.append("* " + alias + " expires " - + ((X509Certificate) keystore.getCertificate(alias)).getNotAfter() - + System.getProperty("line.separator")); - } - } - } else { - result.append("* NONE HAS been configured"); - } - } catch (CertificateException | NoSuchAlgorithmException | KeyStoreException e) { - eelfLogger.warn("SSL certificate access error ", e); - - } - return result.toString(); - } -} diff --git a/src/main/java/org/onap/clamp/clds/ClampInUserAuditorAware.java b/src/main/java/org/onap/clamp/clds/ClampInUserAuditorAware.java deleted file mode 100644 index 9351db23c..000000000 --- a/src/main/java/org/onap/clamp/clds/ClampInUserAuditorAware.java +++ /dev/null @@ -1,40 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds; - -import java.util.Optional; -import org.onap.clamp.authorization.AuthorizationController; -import org.springframework.data.domain.AuditorAware; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -@Component -public class ClampInUserAuditorAware implements AuditorAware { - - @Override - public Optional getCurrentAuditor() { - return Optional.of(AuthorizationController.getPrincipalName(SecurityContextHolder.getContext())); - } - -} diff --git a/src/main/java/org/onap/clamp/clds/ClampServlet.java b/src/main/java/org/onap/clamp/clds/ClampServlet.java deleted file mode 100644 index 5ca3dfb6e..000000000 --- a/src/main/java/org/onap/clamp/clds/ClampServlet.java +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import fj.data.Array; -import java.io.IOException; -import java.security.Principal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.camel.component.servlet.CamelHttpTransportServlet; -import org.onap.clamp.authorization.SecureServicePermission; -import org.springframework.context.ApplicationContext; -import org.springframework.http.HttpStatus; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.User; -import org.springframework.web.context.support.WebApplicationContextUtils; - -public class ClampServlet extends CamelHttpTransportServlet { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = -4198841134910211542L; - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(ClampServlet.class); - private static final String PERM_INSTANCE = "clamp.config.security.permission.instance"; - private static final String PERM_CL = "clamp.config.security.permission.type.cl"; - private static final String PERM_TEMPLATE = "clamp.config.security.permission.type.template"; - private static final String PERM_VF = "clamp.config.security.permission.type.filter.vf"; - private static final String PERM_MANAGE = "clamp.config.security.permission.type.cl.manage"; - private static final String PERM_TOSCA = "clamp.config.security.permission.type.tosca"; - private static final String AUTHENTICATION_CLASS = "clamp.config.security.authentication.class"; - private static final String READ = "read"; - private static final String UPDATE = "update"; - - private static List permissionList; - - private synchronized List loadDynamicAuthenticationClasses() { - return Arrays.stream(WebApplicationContextUtils.getWebApplicationContext(getServletContext()) - .getEnvironment().getProperty(AUTHENTICATION_CLASS).split(",")).map(className -> className.trim()) - .collect(Collectors.toList()); - } - - private synchronized List getPermissionList() { - if (permissionList == null) { - permissionList = new ArrayList<>(); - ApplicationContext applicationContext = WebApplicationContextUtils - .getWebApplicationContext(getServletContext()); - String cldsPermissionInstance = applicationContext.getEnvironment().getProperty(PERM_INSTANCE); - permissionList.add(SecureServicePermission.create(applicationContext.getEnvironment().getProperty(PERM_CL), - cldsPermissionInstance, READ)); - permissionList.add(SecureServicePermission.create(applicationContext.getEnvironment().getProperty(PERM_CL), - cldsPermissionInstance, UPDATE)); - permissionList.add(SecureServicePermission.create( - applicationContext.getEnvironment().getProperty(PERM_TEMPLATE), cldsPermissionInstance, READ)); - permissionList.add(SecureServicePermission.create( - applicationContext.getEnvironment().getProperty(PERM_TEMPLATE), cldsPermissionInstance, UPDATE)); - permissionList.add(SecureServicePermission.create(applicationContext.getEnvironment().getProperty(PERM_VF), - cldsPermissionInstance, "*")); - permissionList.add(SecureServicePermission - .create(applicationContext.getEnvironment().getProperty(PERM_MANAGE), cldsPermissionInstance, "*")); - permissionList.add(SecureServicePermission - .create(applicationContext.getEnvironment().getProperty(PERM_TOSCA), cldsPermissionInstance, READ)); - permissionList.add(SecureServicePermission - .create(applicationContext.getEnvironment().getProperty(PERM_TOSCA), - cldsPermissionInstance, UPDATE)); - } - return permissionList; - } - - /** - * When AAF is enabled, request object will contain a cadi Wrapper, so queries - * to isUserInRole will invoke a http call to AAF server. - */ - @Override - protected void doService(HttpServletRequest request, HttpServletResponse response) { - Principal principal = request.getUserPrincipal(); - if (principal != null && loadDynamicAuthenticationClasses().stream() - .anyMatch(className -> className.equals(principal.getClass().getName()))) { - // When AAF is enabled, there is a need to provision the permissions to Spring - // system - List grantedAuths = new ArrayList<>(); - for (SecureServicePermission perm : getPermissionList()) { - String permString = perm.toString(); - if (request.isUserInRole(permString)) { - grantedAuths.add(new SimpleGrantedAuthority(permString)); - } - } - Authentication auth = new UsernamePasswordAuthenticationToken(new User(principal.getName(), "", - grantedAuths), "", grantedAuths); - SecurityContextHolder.getContext().setAuthentication(auth); - } - try { - super.doService(request, response); - } catch (ServletException | IOException ioe) { - logger.error("Exception caught when executing doService in servlet", ioe); - try { - response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value()); - } catch (IOException e) { - logger.error("Exception caught when executing HTTP sendError in servlet", e); - } - } - } -} diff --git a/src/main/java/org/onap/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java b/src/main/java/org/onap/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java deleted file mode 100644 index a0109a688..000000000 --- a/src/main/java/org/onap/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java +++ /dev/null @@ -1,53 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds; - -import org.apache.catalina.Context; -import org.apache.tomcat.util.descriptor.web.SecurityCollection; -import org.apache.tomcat.util.descriptor.web.SecurityConstraint; -import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; - -/** - * This class is a factory that redirects by default all HTTP to HTTPS - * connector. It is used by the Application.java class and defined in a Spring - * Bean. - * In order to do this, the method postProcessContext has been overridden to - * provide another behavior. - */ -public class TomcatEmbeddedServletContainerFactoryRedirection extends TomcatServletWebServerFactory { - - /** - * This method is there to force the automatic redirection of all calls done - * on the tomcat server to a Secure connection. - */ - @Override - protected void postProcessContext(Context context) { - SecurityConstraint securityConstraint = new SecurityConstraint(); - securityConstraint.setUserConstraint("CONFIDENTIAL"); - SecurityCollection collection = new SecurityCollection(); - collection.addPattern("/*"); - securityConstraint.addCollection(collection); - context.addConstraint(securityConstraint); - } -} diff --git a/src/main/java/org/onap/clamp/clds/client/CdsServices.java b/src/main/java/org/onap/clamp/clds/client/CdsServices.java deleted file mode 100644 index 31960cc02..000000000 --- a/src/main/java/org/onap/clamp/clds/client/CdsServices.java +++ /dev/null @@ -1,227 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.clds.client; - -import static java.lang.Boolean.parseBoolean; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import java.util.Date; -import java.util.Map; -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; -import org.apache.camel.builder.ExchangeBuilder; -import org.onap.clamp.clds.exception.cds.CdsParametersException; -import org.onap.clamp.clds.model.cds.CdsBpWorkFlowListResponse; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.LoggingUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * This class implements the communication with CDS for the service inventory. - */ -@Component -public class CdsServices { - - @Autowired - CamelContext camelContext; - - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CdsServices.class); - - private static final String TYPE = "type"; - private static final String PROPERTIES = "properties"; - private static final String LIST = "list"; - - /** - * Constructor. - */ - @Autowired - public CdsServices() { - } - - - /** - * Query CDS to get blueprint's workflow list. - * - * @param blueprintName CDS blueprint name - * @param blueprintVersion CDS blueprint version - * @return CdsBpWorkFlowListResponse CDS blueprint's workflow list - */ - public CdsBpWorkFlowListResponse getBlueprintWorkflowList(String blueprintName, String blueprintVersion) { - LoggingUtils.setTargetContext("CDS", "getBlueprintWorkflowList"); - - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext) - .withProperty("blueprintName", blueprintName).withProperty("blueprintVersion", blueprintVersion) - .build(); - - Exchange exchangeResponse = camelContext.createProducerTemplate() - .send("direct:get-blueprint-workflow-list", myCamelExchange); - - if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { - String cdsResponse = (String) exchangeResponse.getIn().getBody(); - logger.info("getBlueprintWorkflowList, response from CDS:" + cdsResponse); - LoggingUtils.setResponseContext("0", "Get Blueprint workflow list", this.getClass().getName()); - Date startTime = new Date(); - LoggingUtils.setTimeContext(startTime, new Date()); - return JsonUtils.GSON_JPA_MODEL.fromJson(cdsResponse, CdsBpWorkFlowListResponse.class); - } else { - logger.error("CDS getBlueprintWorkflowList FAILED"); - return null; - } - - } - - /** - * Query CDS to get input properties of workflow. - * - * @param blueprintName CDS blueprint name - * @param blueprintVersion CDS blueprint name - * @param workflow CDS blueprint's workflow - * @return input properties in json format - */ - public JsonObject getWorkflowInputProperties(String blueprintName, String blueprintVersion, - String workflow) { - LoggingUtils.setTargetContext("CDS", "getWorkflowInputProperties"); - - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext) - .withBody(getCdsPayloadForWorkFlow(blueprintName, blueprintVersion, workflow)) - .build(); - - Exchange exchangeResponse = camelContext.createProducerTemplate() - .send("direct:get-blueprint-workflow-input-properties", myCamelExchange); - - if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { - String cdsResponse = (String) exchangeResponse.getIn().getBody(); - logger.info("getWorkflowInputProperties, response from CDS:" + cdsResponse); - LoggingUtils.setResponseContext("0", "Get Blueprint workflow input properties", this.getClass().getName()); - Date startTime = new Date(); - LoggingUtils.setTimeContext(startTime, new Date()); - return parseCdsResponse(cdsResponse); - } else { - logger.error("CDS getWorkflowInputProperties FAILED"); - return null; - } - } - - protected JsonObject parseCdsResponse(String response) { - JsonObject root = JsonParser.parseString(response).getAsJsonObject(); - JsonObject inputs = root.getAsJsonObject("workFlowData").getAsJsonObject("inputs"); - JsonObject dataTypes = root.getAsJsonObject("dataTypes"); - - JsonObject workFlowProperties = new JsonObject(); - workFlowProperties.add("inputs", getInputProperties(inputs, dataTypes, new JsonObject())); - return workFlowProperties; - } - - private JsonObject getInputProperties(JsonObject inputs, JsonObject dataTypes, - JsonObject inputObject) { - if (inputs == null) { - return inputObject; - } - - for (Map.Entry entry : inputs.entrySet()) { - String key = entry.getKey(); - JsonObject inputProperty = inputs.getAsJsonObject(key); - String type = inputProperty.get(TYPE).getAsString(); - if (isComplexType(type, dataTypes)) { - inputObject.add(key, handleComplexType(type, dataTypes)); - } else if (LIST.equalsIgnoreCase(type)) { - handleListType(key, inputProperty, dataTypes, inputObject); - } else if (isInputParam(inputProperty)) { - inputObject.add(key, entry.getValue()); - } - } - return inputObject; - } - - private void handleListType(String propertyName, - JsonObject inputProperty, - JsonObject dataTypes, - JsonObject inputObject) { - if (inputProperty.get("entry_schema") == null) { - throw new CdsParametersException("Entry schema is null for " + propertyName); - } - - String type = inputProperty.get("entry_schema").getAsJsonObject().get( - TYPE).getAsString(); - if (dataTypes.get(type) != null) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty(TYPE, LIST); - jsonObject.add(PROPERTIES, getPropertiesObject(type, dataTypes)); - inputObject.add(propertyName, jsonObject); - } else if (isInputParam(inputProperty)) { - inputObject.add(propertyName, inputProperty); - } - } - - private JsonObject handleComplexType(String key, JsonObject dataTypes) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty(TYPE, "object"); - jsonObject.add(PROPERTIES, getPropertiesObject(key, dataTypes)); - return jsonObject; - } - - private JsonObject getPropertiesObject(String key, JsonObject dataTypes) { - JsonObject properties = dataTypes.get(key).getAsJsonObject().get(PROPERTIES).getAsJsonObject(); - JsonObject object = new JsonObject(); - getInputProperties(properties, dataTypes, object); - return object; - } - - private boolean isComplexType(String type, JsonObject dataTypes) { - if (dataTypes == null) { - return false; - } - return dataTypes.get(type) != null; - } - - private boolean isInputParam(JsonObject inputProperty) { - JsonElement inputParam = inputProperty.get("input-param"); - if (inputParam == null) { - return false; - } - return parseBoolean(inputParam.getAsString()); - } - - /** - * Creates payload to query CDS to get workflow input properties. - * - * @param blueprintName CDS blueprint name - * @param version CDS blueprint version - * @param workflow CDS blueprint workflow - * @return returns payload in json format - */ - public String getCdsPayloadForWorkFlow(String blueprintName, String version, String workflow) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("blueprintName", blueprintName); - jsonObject.addProperty("version", version); - jsonObject.addProperty("returnContent", "json"); - jsonObject.addProperty("workflowName", workflow); - jsonObject.addProperty("specType", "TOSCA"); - return jsonObject.toString(); - } -} diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java deleted file mode 100644 index ade96e0a7..000000000 --- a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * ============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============================================ - * Modifications copyright (c) 2018 Nokia - * =================================================================== - * - */ - -package org.onap.clamp.clds.client; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.IOException; -import java.util.Date; -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; -import org.apache.camel.builder.ExchangeBuilder; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.LoggingUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * This class implements the communication with DCAE for the service inventory. - */ -@Component -public class DcaeInventoryServices { - - @Autowired - CamelContext camelContext; - - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeInventoryServices.class); - protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - public static final String DCAE_INVENTORY_URL = "dcae.inventory.url"; - public static final String DCAE_INVENTORY_RETRY_INTERVAL = "dcae.intentory.retry.interval"; - public static final String DCAE_INVENTORY_RETRY_LIMIT = "dcae.intentory.retry.limit"; - private final ClampProperties refProp; - - /** - * Constructor. - */ - @Autowired - public DcaeInventoryServices(ClampProperties refProp) { - this.refProp = refProp; - } - - private int getTotalCountFromDcaeInventoryResponse(String responseStr) throws ParseException { - JSONParser parser = new JSONParser(); - Object obj0 = parser.parse(responseStr); - JSONObject jsonObj = (JSONObject) obj0; - Long totalCount = (Long) jsonObj.get("totalCount"); - return totalCount.intValue(); - } - - private DcaeInventoryResponse getItemsFromDcaeInventoryResponse(String responseStr) throws ParseException { - JSONParser parser = new JSONParser(); - Object obj0 = parser.parse(responseStr); - JSONObject jsonObj = (JSONObject) obj0; - JSONArray itemsArray = (JSONArray) jsonObj.get("items"); - JSONObject dcaeServiceType0 = (JSONObject) itemsArray.get(0); - return JsonUtils.GSON.fromJson(dcaeServiceType0.toString(), DcaeInventoryResponse.class); - } - - /** - * DO a query to DCAE to get some Information. - * - * @param artifactName The artifact Name - * @param serviceUuid The service UUID - * @param resourceUuid The resource UUID - * @return The DCAE inventory for the artifact in DcaeInventoryResponse - * @throws IOException In case of issues with the stream - * @throws ParseException In case of issues with the Json parsing - */ - public DcaeInventoryResponse getDcaeInformation(String artifactName, String serviceUuid, String resourceUuid) - throws IOException, ParseException, InterruptedException { - LoggingUtils.setTargetContext("DCAE", "getDcaeInformation"); - - int retryInterval = 0; - int retryLimit = 1; - if (refProp.getStringValue(DCAE_INVENTORY_RETRY_LIMIT) != null) { - retryLimit = Integer.valueOf(refProp.getStringValue(DCAE_INVENTORY_RETRY_LIMIT)); - } - if (refProp.getStringValue(DCAE_INVENTORY_RETRY_INTERVAL) != null) { - retryInterval = Integer.valueOf(refProp.getStringValue(DCAE_INVENTORY_RETRY_INTERVAL)); - } - for (int i = 0; i < retryLimit; i++) { - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext) - .withProperty("blueprintResourceId", resourceUuid).withProperty("blueprintServiceId", serviceUuid) - .withProperty("blueprintName", artifactName).build(); - metricsLogger.info("Attempt n°" + i + " to contact DCAE inventory"); - - Exchange exchangeResponse = camelContext.createProducerTemplate() - .send("direct:get-dcae-blueprint-inventory", myCamelExchange); - - if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { - String dcaeResponse = (String) exchangeResponse.getIn().getBody(); - int totalCount = getTotalCountFromDcaeInventoryResponse(dcaeResponse); - metricsLogger.info("getDcaeInformation complete: totalCount returned=" + totalCount); - if (totalCount > 0) { - logger.info("getDcaeInformation, answer from DCAE inventory:" + dcaeResponse); - LoggingUtils.setResponseContext("0", "Get Dcae Information success", this.getClass().getName()); - Date startTime = new Date(); - LoggingUtils.setTimeContext(startTime, new Date()); - return getItemsFromDcaeInventoryResponse(dcaeResponse); - } else { - logger.info("Dcae inventory totalCount returned is 0, so waiting " + retryInterval - + "ms before retrying ..."); - // wait for a while and try to connect to DCAE again - Thread.sleep(retryInterval); - } - } - } - logger.warn("Dcae inventory totalCount returned is still 0, after " + retryLimit + " attempts, returning NULL"); - return null; - } -} diff --git a/src/main/java/org/onap/clamp/clds/client/PolicyEngineServices.java b/src/main/java/org/onap/clamp/clds/client/PolicyEngineServices.java deleted file mode 100644 index c75d733a8..000000000 --- a/src/main/java/org/onap/clamp/clds/client/PolicyEngineServices.java +++ /dev/null @@ -1,227 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.client; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; -import org.apache.camel.builder.ExchangeBuilder; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.sdc.controller.installer.BlueprintMicroService; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelId; -import org.onap.clamp.loop.template.PolicyModelsService; -import org.onap.clamp.policy.pdpgroup.PdpGroup; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; - - -/** - * The class implements the communication with the Policy Engine to retrieve - * policy models (tosca). It mainly delegates the physical calls to Camel - * engine. - */ -@Component -public class PolicyEngineServices { - private final CamelContext camelContext; - - private final PolicyModelsService policyModelsService; - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyEngineServices.class); - private static int retryInterval = 0; - private static int retryLimit = 1; - - public static final String POLICY_RETRY_INTERVAL = "policy.retry.interval"; - public static final String POLICY_RETRY_LIMIT = "policy.retry.limit"; - - /** - * Default constructor. - * - * @param camelContext Camel context bean - * @param clampProperties ClampProperties bean - * @param policyModelsService policyModel service - */ - @Autowired - public PolicyEngineServices(CamelContext camelContext, ClampProperties clampProperties, - PolicyModelsService policyModelsService) { - this.camelContext = camelContext; - this.policyModelsService = policyModelsService; - if (clampProperties.getStringValue(POLICY_RETRY_LIMIT) != null) { - retryLimit = Integer.parseInt(clampProperties.getStringValue(POLICY_RETRY_LIMIT)); - } - if (clampProperties.getStringValue(POLICY_RETRY_INTERVAL) != null) { - retryInterval = Integer.parseInt(clampProperties.getStringValue(POLICY_RETRY_INTERVAL)); - } - } - - /** - * This method query Policy engine and create a PolicyModel object with type and version. - * If the policy already exist in the db it returns the existing one. - * - * @param policyType The policyType id - * @param policyVersion The policy version of that type - * @return A PolicyModel created from policyEngine data or null if nothing is found on policyEngine - */ - public PolicyModel createPolicyModelFromPolicyEngine(String policyType, String policyVersion) { - PolicyModel policyModelFound = policyModelsService.getPolicyModel(policyType, policyVersion); - if (policyModelFound == null) { - String policyTosca = this.downloadOnePolicy(policyType, policyVersion); - if (policyTosca != null && !policyTosca.isEmpty()) { - return policyModelsService.savePolicyModelInNewTransaction( - new PolicyModel(policyType, policyTosca, policyVersion)); - } else { - logger.error("Policy not found in the Policy Engine, returning null: " + policyType - + "/" + policyVersion); - return null; - } - } else { - logger.info("Skipping policy model download as it exists already in the database " + policyType - + "/" + policyVersion); - return policyModelFound; - } - } - - /** - * This method query Policy engine and create a PolicyModel object with type and version. - * - * @param microService microservice object instance - * @return A PolicyModel created from policyEngine data - */ - public PolicyModel createPolicyModelFromPolicyEngine(BlueprintMicroService microService) { - return createPolicyModelFromPolicyEngine(microService.getModelType(), microService.getModelVersion()); - } - - /** - * This method synchronize the clamp database and the policy engine. - * So it creates the required PolicyModel. - */ - public void synchronizeAllPolicies() { - LinkedHashMap loadedYaml; - loadedYaml = new Yaml().load(downloadAllPolicies()); - if (loadedYaml == null || loadedYaml.isEmpty()) { - logger.warn("getAllPolicyType yaml returned by policy engine could not be decoded, as it's null or empty"); - return; - } - - LinkedHashMap policyTypesMap = (LinkedHashMap) loadedYaml - .get("policy_types"); - policyTypesMap.forEach((key, value) -> - this.createPolicyModelFromPolicyEngine(key, - ((String) ((LinkedHashMap) value).get("version")))); - } - - /** - * This method can be used to download all policy types + data types defined in - * policy engine. - * - * @return A yaml containing all policy Types and all data types - */ - public String downloadAllPolicies() { - return callCamelRoute(ExchangeBuilder.anExchange(camelContext).build(), "direct:get-all-policy-models", - "Get all policies"); - } - - /** - * This method can be used to download a policy tosca model on the engine. - * - * @param policyType The policy type (id) - * @param policyVersion The policy version - * @return A string with the whole policy tosca model - */ - public String downloadOnePolicy(String policyType, String policyVersion) { - logger.info("Downloading the policy model " + policyType + "/" + policyVersion); - DumperOptions options = new DumperOptions(); - options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN); - options.setIndent(4); - options.setPrettyFlow(true); - options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Yaml yamlParser = new Yaml(options); - String responseBody = callCamelRoute( - ExchangeBuilder.anExchange(camelContext).withProperty("policyModelName", policyType) - .withProperty("policyModelVersion", policyVersion).build(), "direct:get-policy-model", - "Get one policy"); - - if (responseBody == null || responseBody.isEmpty()) { - logger.warn("getPolicyModel returned by policy engine could not be decoded, as it's null or empty"); - return null; - } - - return yamlParser.dump((Map) yamlParser.load(responseBody)); - } - - /** - * This method can be used to download all Pdp Groups data from policy engine. - */ - public void downloadPdpGroups() { - String responseBody = - callCamelRoute(ExchangeBuilder.anExchange(camelContext).build(), "direct:get-all-pdp-groups", - "Get Pdp Groups"); - - if (responseBody == null || responseBody.isEmpty()) { - logger.warn("getPdpGroups returned by policy engine could not be decoded, as it's null or empty"); - return; - } - - JsonObject jsonObj = JsonUtils.GSON.fromJson(responseBody, JsonObject.class); - - List pdpGroupList = new LinkedList<>(); - JsonArray itemsArray = (JsonArray) jsonObj.get("groups"); - - for (com.google.gson.JsonElement jsonElement : itemsArray) { - JsonObject item = (JsonObject) jsonElement; - PdpGroup pdpGroup = JsonUtils.GSON.fromJson(item.toString(), PdpGroup.class); - pdpGroupList.add(pdpGroup); - } - - policyModelsService.updatePdpGroupInfo(pdpGroupList); - } - - private String callCamelRoute(Exchange exchange, String camelFlow, String logMsg) { - for (int i = 0; i < retryLimit; i++) { - Exchange exchangeResponse = camelContext.createProducerTemplate().send(camelFlow, exchange); - if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { - return (String) exchangeResponse.getIn().getBody(); - } else { - logger.info(logMsg + " query " + retryInterval + "ms before retrying ..."); - // wait for a while and try to connect to DCAE again - try { - Thread.sleep(retryInterval); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } - return ""; - } -} diff --git a/src/main/java/org/onap/clamp/clds/config/AafConfiguration.java b/src/main/java/org/onap/clamp/clds/config/AafConfiguration.java deleted file mode 100644 index 7c86728bb..000000000 --- a/src/main/java/org/onap/clamp/clds/config/AafConfiguration.java +++ /dev/null @@ -1,66 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.config; - -import javax.servlet.Filter; -import org.onap.clamp.clds.filter.ClampCadiFilter; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -@Configuration -@Profile("clamp-aaf-authentication") -public class AafConfiguration { - - /** - * Method to return clamp cadi filter. - * - * @return Filter - */ - @Bean(name = "cadiFilter") - public Filter cadiFilter() { - return new ClampCadiFilter(); - } - - /** - * Method to register cadi filter. - * - * @return FilterRegistrationBean - */ - @Bean - public FilterRegistrationBean cadiFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setFilter(cadiFilter()); - registration.addUrlPatterns("/restservices/clds/v1/user/*"); - registration.addUrlPatterns("/restservices/clds/v2/dictionary/*"); - registration.addUrlPatterns("/restservices/clds/v2/templates/*"); - registration.addUrlPatterns("/restservices/clds/v2/clampInformation/*"); - registration.addUrlPatterns("/restservices/clds/v2/policyToscaModels/*"); - registration.addUrlPatterns("/restservices/clds/v2/loop/*"); - registration.setName("cadiFilter"); - registration.setOrder(0); - return registration; - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java deleted file mode 100644 index 36e11f64f..000000000 --- a/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java +++ /dev/null @@ -1,134 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - */ - -package org.onap.clamp.clds.config; - -import java.io.IOException; -import java.net.URL; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManagerFactory; -import org.apache.camel.CamelContext; -import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.component.http4.HttpClientConfigurer; -import org.apache.camel.component.http4.HttpComponent; -import org.apache.camel.model.rest.RestBindingMode; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLSocketFactory; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.BasicHttpClientConnectionManager; -import org.onap.clamp.clds.util.ClampVersioning; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.util.PassDecoder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -@Component -public class CamelConfiguration extends RouteBuilder { - - @Autowired - CamelContext camelContext; - - @Autowired - private Environment env; - - private void configureDefaultSslProperties() throws IOException { - if (env.getProperty("server.ssl.trust-store") != null) { - URL storeResource = Thread.currentThread().getContextClassLoader() - .getResource(env.getProperty("server.ssl.trust-store").replaceFirst("classpath:", "")); - System.setProperty("javax.net.ssl.trustStore", storeResource.getPath()); - String keyFile = env.getProperty("clamp.config.keyFile"); - String trustStorePass = PassDecoder.decode(env.getProperty("server.ssl.trust-store-password"), - keyFile); - System.setProperty("javax.net.ssl.trustStorePassword", trustStorePass); - System.setProperty("javax.net.ssl.trustStoreType", "jks"); - System.setProperty("ssl.TrustManagerFactory.algorithm", "PKIX"); - storeResource = Thread.currentThread().getContextClassLoader() - .getResource(env.getProperty("server.ssl.key-store").replaceFirst("classpath:", "")); - System.setProperty("javax.net.ssl.keyStore", storeResource.getPath()); - - String keyStorePass = PassDecoder.decode(env.getProperty("server.ssl.key-store-password"), - keyFile); - System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass); - System.setProperty("javax.net.ssl.keyStoreType", env.getProperty("server.ssl.key-store-type")); - } - } - - private void registerTrustStore() - throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException, CertificateException, IOException { - if (env.getProperty("server.ssl.trust-store") != null) { - KeyStore truststore = KeyStore.getInstance("JKS"); - String keyFile = env.getProperty("clamp.config.keyFile"); - String password = PassDecoder.decode(env.getProperty("server.ssl.trust-store-password"), keyFile); - truststore.load( - ResourceFileUtils.getResourceAsStream(env.getProperty("server.ssl.trust-store")), - password.toCharArray()); - - TrustManagerFactory trustFactory = TrustManagerFactory.getInstance("PKIX"); - trustFactory.init(truststore); - SSLContext sslcontext = SSLContext.getInstance("TLS"); - sslcontext.init(null, trustFactory.getTrustManagers(), null); - SSLSocketFactory factory = new SSLSocketFactory(sslcontext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); - SchemeRegistry registry = new SchemeRegistry(); - final Scheme scheme = new Scheme("https4", 443, factory); - registry.register(scheme); - ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory(); - HttpComponent http4 = camelContext.getComponent("https4", HttpComponent.class); - http4.setHttpClientConfigurer(new HttpClientConfigurer() { - - @Override - public void configureHttpClient(HttpClientBuilder builder) { - builder.setSSLSocketFactory(factory); - Registry registry = RegistryBuilder.create() - .register("https", factory).register("http", plainsf).build(); - builder.setConnectionManager(new BasicHttpClientConnectionManager(registry)); - } - }); - } - } - - @Override - public void configure() - throws KeyManagementException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { - restConfiguration().component("servlet").bindingMode(RestBindingMode.json).jsonDataFormat("clamp-gson") - .dataFormatProperty("prettyPrint", "true")// .enableCORS(true) - // turn on swagger api-doc - .apiContextPath("api-doc").apiVendorExtension(true).apiProperty("api.title", "Clamp Rest API") - .apiProperty("api.version", ClampVersioning.getCldsVersionFromProps()) - .apiProperty("base.path", "/restservices/clds/"); - - // camelContext.setTracing(true); - - configureDefaultSslProperties(); - registerTrustStore(); - } -} diff --git a/src/main/java/org/onap/clamp/clds/config/ClampProperties.java b/src/main/java/org/onap/clamp/clds/config/ClampProperties.java deleted file mode 100644 index 0b5c951bf..000000000 --- a/src/main/java/org/onap/clamp/clds/config/ClampProperties.java +++ /dev/null @@ -1,105 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.config; - -import java.io.IOException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -/** - * Holds Clamp properties and add some functionalities. - */ -@Component -public class ClampProperties { - - @Autowired - private ApplicationContext appContext; - @Autowired - private Environment env; - public static final String CONFIG_PREFIX = "clamp.config."; - - /** - * get property value. - * - * @param key The first key - * @return The string with the value - */ - public String getStringValue(String key) { - return env.getProperty(CONFIG_PREFIX + key); - } - - /** - * get property value for a combo key (key1 + "." + key2). If not found just use - * key1. - * - * @param key1 The first key - * @param key2 The second key after a dot - * @return The string with the value - */ - public String getStringValue(String key1, String key2) { - String value = getStringValue(key1 + "." + key2); - if (value == null || value.length() == 0) { - value = getStringValue(key1); - } - return value; - } - - /** - * Return the file content. The value obtained from the clds-reference file will - * be used as a filename. - * - * @param key The key that will be used to access the clds-reference file - * @return File content in String - * @throws IOException In case of issues with the JSON parser - */ - public String getFileContent(String key) throws IOException { - String fileReference = getStringValue(key); - return (fileReference != null) ? getFileContentFromPath(fileReference) : null; - } - - /** - * Return the file content. First try with combo key (key1 + "." + key2), - * otherwise default to just key1. The value obtained from the clds-reference - * file will be used as a filename. - * - * @param key1 The first key - * @param key2 The second key after a dot - * @return File content in String - * @throws IOException In case of issues with the JSON parser - */ - public String getFileContent(String key1, String key2) throws IOException { - String fileReference = getStringValue(key1, key2); - return (fileReference != null) ? getFileContentFromPath(fileReference) : null; - } - - private String getFileContentFromPath(String filepath) throws IOException { - URL url = appContext.getResource(filepath).getURL(); - return IOUtils.toString(url, StandardCharsets.UTF_8); - } -} diff --git a/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java b/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java deleted file mode 100644 index a7ef10738..000000000 --- a/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java +++ /dev/null @@ -1,74 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds.config; - -import com.google.gson.JsonParseException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; -import org.onap.clamp.authorization.CldsUser; -import org.onap.clamp.clds.exception.CldsUsersException; -import org.onap.clamp.clds.util.JsonUtils; - -public class CldsUserJsonDecoder { - - private CldsUserJsonDecoder() { - } - - /** - * This method decodes the JSON file provided to a CldsUser Array. The stream is - * closed after this call, this is not possible to reuse it. - * - * @param cldsUsersFile - * The inputStream containing the users json file - * @return CldsUser[] Array containing a list of the user defined in the JSON - * file - */ - public static CldsUser[] decodeJson(InputStream cldsUsersFile) { - try { - return decodeJson(IOUtils.toString(cldsUsersFile, StandardCharsets.UTF_8.name())); - } catch (IOException e) { - throw new CldsUsersException("Exception occurred during the decoding of the clds-users.json", e); - } - } - - /** - * This method decodes the JSON string to a CldsUser Array. - * - * @param cldsUsersString JSON string - * @return CldsUser[] Array containing a list of the user defined in the JSON - */ - public static CldsUser[] decodeJson(String cldsUsersString) { - try { - // the ObjectMapper readValue method closes the stream no need to do - // it - return JsonUtils.GSON.fromJson(cldsUsersString, CldsUser[].class); - } catch (JsonParseException e) { - throw new CldsUsersException("Exception occurred during the decoding of the clds-users.json", e); - } - } -} diff --git a/src/main/java/org/onap/clamp/clds/config/DefaultDictionaryElements.java b/src/main/java/org/onap/clamp/clds/config/DefaultDictionaryElements.java deleted file mode 100644 index 1c52e4100..000000000 --- a/src/main/java/org/onap/clamp/clds/config/DefaultDictionaryElements.java +++ /dev/null @@ -1,167 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.config; - -import javax.annotation.PostConstruct; -import org.onap.clamp.tosca.Dictionary; -import org.onap.clamp.tosca.DictionaryElement; -import org.onap.clamp.tosca.DictionaryService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -@Configuration -@Profile("default-dictionary-elements") -public class DefaultDictionaryElements { - - @Autowired - private DictionaryService dictionaryService; - - /** - * Init method. - */ - @PostConstruct - public void init() { - preProvisionDefaultActors(); - preProvisionDefaultOperations(); - } - - private void preProvisionDefaultActors() { - // Set up dictionary elements - Dictionary actorDictionary = new Dictionary(); - actorDictionary.setName("DefaultActors"); - actorDictionary.setSecondLevelDictionary(0); - actorDictionary.setSubDictionaryType(""); - - DictionaryElement elementSo = new DictionaryElement(); - elementSo.setName("SO"); - elementSo.setShortName("SO"); - elementSo.setType("string"); - elementSo.setDescription("SO component"); - actorDictionary.addDictionaryElements(elementSo); - - DictionaryElement elementSdnc = new DictionaryElement(); - elementSdnc.setName("SDNC"); - elementSdnc.setShortName("SDNC"); - elementSdnc.setType("string"); - elementSdnc.setDescription("SDNC component"); - actorDictionary.addDictionaryElements(elementSdnc); - - DictionaryElement elementAppc = new DictionaryElement(); - elementAppc.setName("APPC"); - elementAppc.setShortName("APPC"); - elementAppc.setType("string"); - elementAppc.setDescription("APPC component"); - actorDictionary.addDictionaryElements(elementAppc); - - DictionaryElement elementVfc = new DictionaryElement(); - elementVfc.setName("VFC"); - elementVfc.setShortName("VFC"); - elementVfc.setType("string"); - elementVfc.setDescription("VFC component"); - actorDictionary.addDictionaryElements(elementVfc); - - DictionaryElement elementSdnr = new DictionaryElement(); - elementSdnr.setName("SDNR"); - elementSdnr.setShortName("SDNR"); - elementSdnr.setType("string"); - elementSdnr.setDescription("SDNR component"); - actorDictionary.addDictionaryElements(elementSdnr); - - dictionaryService.saveOrUpdateDictionary(actorDictionary); - } - - private void preProvisionDefaultOperations() { - // Set up dictionary elements - Dictionary operationDictionary = new Dictionary(); - operationDictionary.setName("DefaultOperations"); - operationDictionary.setSecondLevelDictionary(0); - operationDictionary.setSubDictionaryType(""); - - DictionaryElement elementRestart = new DictionaryElement(); - elementRestart.setName("Restart"); - elementRestart.setShortName("Restart (APPC operation)"); - elementRestart.setType("string"); - elementRestart.setDescription("APPC operation"); - operationDictionary.addDictionaryElements(elementRestart); - - DictionaryElement elementRebuild = new DictionaryElement(); - elementRebuild.setName("Rebuild"); - elementRebuild.setShortName("Rebuild (APPC operation)"); - elementRebuild.setType("string"); - elementRebuild.setDescription("APPC operation"); - operationDictionary.addDictionaryElements(elementRebuild); - - DictionaryElement elementMigrate = new DictionaryElement(); - elementMigrate.setName("Migrate"); - elementMigrate.setShortName("Migrate (APPC operation)"); - elementMigrate.setType("string"); - elementMigrate.setDescription("APPC operation"); - operationDictionary.addDictionaryElements(elementMigrate); - - DictionaryElement elementHealthCheck = new DictionaryElement(); - elementHealthCheck.setName("Health-Check"); - elementHealthCheck.setShortName("Health-Check (APPC operation)"); - elementHealthCheck.setType("string"); - elementHealthCheck.setDescription("APPC operation"); - operationDictionary.addDictionaryElements(elementHealthCheck); - - DictionaryElement elementModifyConfig = new DictionaryElement(); - elementModifyConfig.setName("ModifyConfig"); - elementModifyConfig.setShortName("ModifyConfig (APPC/VFC operation)"); - elementModifyConfig.setType("string"); - elementModifyConfig.setDescription("APPC/VFC operation"); - operationDictionary.addDictionaryElements(elementModifyConfig); - - DictionaryElement elementVfModuleCreate = new DictionaryElement(); - elementVfModuleCreate.setName("VF Module Create"); - elementVfModuleCreate.setShortName("VF Module Create (SO operation)"); - elementVfModuleCreate.setType("string"); - elementVfModuleCreate.setDescription("SO operation"); - operationDictionary.addDictionaryElements(elementVfModuleCreate); - - DictionaryElement elementVfModuleDelete = new DictionaryElement(); - elementVfModuleDelete.setName("VF Module Delete"); - elementVfModuleDelete.setShortName("VF Module Delete (SO operation)"); - elementVfModuleDelete.setType("string"); - elementVfModuleDelete.setDescription("SO operation"); - operationDictionary.addDictionaryElements(elementVfModuleDelete); - - DictionaryElement elementReroute = new DictionaryElement(); - elementReroute.setName("Reroute"); - elementReroute.setShortName("Reroute (SDNC operation)"); - elementReroute.setType("string"); - elementReroute.setDescription("SDNC operation"); - operationDictionary.addDictionaryElements(elementReroute); - - DictionaryElement elementBandwidthOnDemand = new DictionaryElement(); - elementBandwidthOnDemand.setName("BandwidthOnDemand"); - elementBandwidthOnDemand.setShortName("BandwidthOnDemand (SDNC operation)"); - elementBandwidthOnDemand.setType("string"); - elementBandwidthOnDemand.setDescription("SDNC operation"); - operationDictionary.addDictionaryElements(elementBandwidthOnDemand); - - dictionaryService.saveOrUpdateDictionary(operationDictionary); - } -} diff --git a/src/main/java/org/onap/clamp/clds/config/DefaultUserConfiguration.java b/src/main/java/org/onap/clamp/clds/config/DefaultUserConfiguration.java deleted file mode 100644 index cfd5f990f..000000000 --- a/src/main/java/org/onap/clamp/clds/config/DefaultUserConfiguration.java +++ /dev/null @@ -1,138 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds.config; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.IOException; -import org.onap.clamp.authorization.CldsUser; -import org.onap.clamp.clds.exception.CldsConfigException; -import org.onap.clamp.clds.exception.CldsUsersException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -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.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -/** - * This class is used to enable the HTTP authentication to login. It requires a - * specific JSON file containing the user definition - * (classpath:clds/clds-users.json). - */ -@Configuration -@EnableWebSecurity -@Profile("clamp-default-user") -public class DefaultUserConfiguration extends WebSecurityConfigurerAdapter { - - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DefaultUserConfiguration.class); - - private static final String SETUP_WEB_USERS_EXCEPTION_MSG = "Exception occurred during the " - + " setup of the Web users in memory"; - @Autowired - private ClampProperties refProp; - @Value("${clamp.config.security.permission.type.cl:permission-type-cl}") - private String cldsPersmissionTypeCl; - @Value("${CLDS_PERMISSION_INSTANCE:dev}") - private String cldsPermissionInstance; - @Value("${clamp.config.security.encoder:bcrypt}") - private String cldsEncoderMethod; - @Value("${clamp.config.security.encoder.bcrypt.strength:10}") - private Integer cldsBcryptEncoderStrength; - - /** - * This method configures on which URL the authorization will be enabled. - */ - @Override - protected void configure(HttpSecurity http) { - try { - http.csrf().disable().httpBasic().and().authorizeRequests().antMatchers("/restservices/clds/v1/user/**") - .authenticated().anyRequest().permitAll().and().sessionManagement() - .maximumSessions(1); - - } catch (Exception e) { - logger.error(SETUP_WEB_USERS_EXCEPTION_MSG, e); - throw new CldsUsersException(SETUP_WEB_USERS_EXCEPTION_MSG, e); - } - } - - /** - * This method is called by the framework and is used to load all the users - * defined in cldsUsersFile variable (this file path can be configured in the - * application.properties). - * - * @param auth authentication manager builder - */ - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) { - // configure algorithm used for password hashing - final PasswordEncoder passwordEncoder = getPasswordEncoder(); - - try { - CldsUser[] usersList = loadUsers(); - // no users defined - if (null == usersList) { - logger.warn("No users defined. Users should be defined under clds-users.json"); - return; - } - for (CldsUser user : usersList) { - auth.inMemoryAuthentication().withUser(user.getUser()).password(user.getPassword()) - .authorities(user.getPermissionsString()).and().passwordEncoder(passwordEncoder); - } - } catch (Exception e) { - logger.error(SETUP_WEB_USERS_EXCEPTION_MSG, e); - throw new CldsUsersException(SETUP_WEB_USERS_EXCEPTION_MSG, e); - } - } - - /** - * This method loads physically the JSON file and convert it to an Array of - * CldsUser. - * - * @return The array of CldsUser - * @throws IOException In case of the file is not found - */ - private CldsUser[] loadUsers() throws IOException { - logger.info("Load from clds-users.properties"); - return CldsUserJsonDecoder.decodeJson(refProp.getFileContent("files.cldsUsers")); - } - - /** - * This methods returns the chosen encoder for password hashing. - */ - private PasswordEncoder getPasswordEncoder() { - if ("bcrypt".equals(cldsEncoderMethod)) { - return new BCryptPasswordEncoder(cldsBcryptEncoderStrength); - } else { - throw new CldsConfigException( - "Invalid clamp.config.security.encoder value. 'bcrypt' is the only option at this time."); - } - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/config/SslConfig.java b/src/main/java/org/onap/clamp/clds/config/SslConfig.java deleted file mode 100644 index 6345f4b56..000000000 --- a/src/main/java/org/onap/clamp/clds/config/SslConfig.java +++ /dev/null @@ -1,93 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.config; - -import java.io.IOException; -import java.io.InputStream; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.util.PassDecoder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; -import org.springframework.boot.web.server.Ssl; -import org.springframework.boot.web.server.SslStoreProvider; -import org.springframework.boot.web.server.WebServerFactoryCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.core.env.Environment; -import org.springframework.core.io.ResourceLoader; - -@Configuration -@Profile("clamp-ssl-config") -public class SslConfig { - @Autowired - private Environment env; - - @Bean - WebServerFactoryCustomizer tomcatCustomizer(ServerProperties serverProperties, - ResourceLoader resourceLoader) { - return (tomcat) -> tomcat.setSslStoreProvider(new SslStoreProvider() { - @Override - public KeyStore getKeyStore() throws KeyStoreException, - NoSuchAlgorithmException, CertificateException, IOException { - KeyStore keystore = KeyStore.getInstance(env.getProperty("server.ssl.key-store-type")); - String password = PassDecoder.decode(env.getProperty("server.ssl.key-store-password"), - env.getProperty("clamp.config.keyFile")); - keystore.load(ResourceFileUtils.getResourceAsStream(env.getProperty("server.ssl.key-store")), - password.toCharArray()); - return keystore; - } - - @Override - public KeyStore getTrustStore() throws KeyStoreException, - NoSuchAlgorithmException, CertificateException, IOException { - KeyStore truststore = KeyStore.getInstance("JKS"); - String password = PassDecoder.decode(env.getProperty("server.ssl.trust-store-password"), - env.getProperty("clamp.config.keyFile")); - truststore.load( - ResourceFileUtils.getResourceAsStream(env.getProperty("server.ssl.trust-store")), - password.toCharArray()); - return truststore; - } - }); - } - - @Bean - WebServerFactoryCustomizer tomcatSslCustomizer(ServerProperties serverProperties, - ResourceLoader resourceLoader) { - return (tomcat) -> tomcat.setSsl(new Ssl() { - @Override - public String getKeyPassword() { - String password = PassDecoder.decode(env.getProperty("server.ssl.key-password"), - env.getProperty("clamp.config.keyFile")); - return password; - } - }); - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/config/SystemPropertiesLoader.java b/src/main/java/org/onap/clamp/clds/config/SystemPropertiesLoader.java deleted file mode 100644 index 10c6901fb..000000000 --- a/src/main/java/org/onap/clamp/clds/config/SystemPropertiesLoader.java +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.config; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.util.Properties; -import javax.annotation.Resource; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.stereotype.Component; - -@Component -public class SystemPropertiesLoader implements ApplicationListener { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(SystemPropertiesLoader.class); - - @Resource(name = "mapper") - private Properties myTranslator; - - @Override - public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { - logger.info("Loading additional JVM properties:" + myTranslator.toString()); - System.getProperties().putAll(myTranslator); - } -} 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 deleted file mode 100644 index b6f1e1a65..000000000 --- a/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java +++ /dev/null @@ -1,97 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds.config.sdc; - -import com.google.gson.JsonObject; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.PostConstruct; -import org.onap.clamp.clds.exception.sdc.controller.SdcParametersException; -import org.onap.clamp.clds.util.JsonUtils; -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; - -/** - * 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. - */ -public class SdcControllersConfiguration { - - private static final String CONTROLLER_SUBTREE_KEY = "sdc-connections"; - @Autowired - protected ApplicationContext appContext; - /** - * The file name that will be loaded by Spring. - */ - @Value("${clamp.config.files.sdcController:'classpath:/clds/sdc-controllers-config.json'}") - protected String sdcControllerFile; - /** - * The root of the JSON. - */ - private JsonObject jsonRootNode; - - /** - * Loads configuration from SDC controller config file. - * - * @throws IOException IO Exception - */ - @PostConstruct - public void loadConfiguration() throws IOException { - Resource resource = appContext.getResource(sdcControllerFile); - // Try to load json tree - jsonRootNode = JsonUtils.GSON.fromJson(new InputStreamReader( - resource.getInputStream(), StandardCharsets.UTF_8), - JsonObject.class); - } - - public SdcSingleControllerConfiguration getSdcSingleControllerConfiguration(String controllerName) { - return getAllDefinedControllers().get(controllerName); - } - - /** - * This method reads all Controllers configurations and returns them. - * - * @return A list of controller Names defined in the config - */ - public Map getAllDefinedControllers() { - Map result = new HashMap<>(); - if (jsonRootNode.get(CONTROLLER_SUBTREE_KEY) != null) { - jsonRootNode.get(CONTROLLER_SUBTREE_KEY).getAsJsonObject().entrySet().forEach( - entry -> result.put(entry.getKey(), - new SdcSingleControllerConfiguration(entry.getValue().getAsJsonObject(), entry.getKey()))); - } else { - throw new SdcParametersException( - CONTROLLER_SUBTREE_KEY + " key not found in the file: " + sdcControllerFile); - } - return result; - } -} diff --git a/src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java b/src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java deleted file mode 100644 index da90e6060..000000000 --- a/src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java +++ /dev/null @@ -1,290 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.config.sdc; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import java.security.GeneralSecurityException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import org.apache.commons.codec.DecoderException; -import org.onap.clamp.clds.exception.sdc.controller.SdcParametersException; -import org.onap.clamp.clds.util.CryptoUtils; -import org.onap.sdc.api.consumer.IConfiguration; - -/** - * This class maps the SDC config JSON for one controller. - */ -public class SdcSingleControllerConfiguration implements IConfiguration { - - private static final EELFLogger logger = EELFManager.getInstance() - .getLogger(SdcSingleControllerConfiguration.class); - /** - * The sdc Controller name corresponding. - */ - private String sdcControllerName; - /** - * The root of the JSON. - */ - private JsonObject jsonRootNode; - // All keys that can be present in the JSON - public static final String CONSUMER_GROUP_ATTRIBUTE_NAME = "consumerGroup"; - public static final String CONSUMER_ID_ATTRIBUTE_NAME = "consumerId"; - public static final String ENVIRONMENT_NAME_ATTRIBUTE_NAME = "environmentName"; - public static final String SDC_KEY_ATTRIBUTE_NAME = "password"; - public static final String POLLING_INTERVAL_ATTRIBUTE_NAME = "pollingInterval"; - public static final String RELEVANT_ARTIFACT_TYPES_ATTRIBUTE_NAME = "relevantArtifactTypes"; - public static final String USER_ATTRIBUTE_NAME = "user"; - public static final String SDC_ADDRESS_ATTRIBUTE_NAME = "sdcAddress"; - public static final String POLLING_TIMEOUT_ATTRIBUTE_NAME = "pollingTimeout"; - public static final String ACTIVATE_SERVER_TLS_AUTH = "activateServerTLSAuth"; - public static final String KEY_STORE_KEY = "keyStorePassword"; - public static final String KEY_STORE_PATH = "keyStorePath"; - public static final String MESSAGE_BUS_ADDRESSES = "messageBusAddresses"; - private String errorMessageKeyNotFound; - /** - * Supported artifact types. - */ - public static final String HEAT = "HEAT"; - public static final String HEAT_ARTIFACT = "HEAT_ARTIFACT"; - public static final String HEAT_ENV = "HEAT_ENV"; - public static final String HEAT_NESTED = "HEAT_NESTED"; - public static final String HEAT_NET = "HEAT_NET"; - public static final String HEAT_VOL = "HEAT_VOL"; - public static final String OTHER = "OTHER"; - public static final String TOSCA_CSAR = "TOSCA_CSAR"; - public static final String VF_MODULES_METADATA = "VF_MODULES_METADATA"; - private static final String[] SUPPORTED_ARTIFACT_TYPES = { - TOSCA_CSAR, VF_MODULES_METADATA - }; - public static final List SUPPORTED_ARTIFACT_TYPES_LIST = Collections - .unmodifiableList(Arrays.asList(SUPPORTED_ARTIFACT_TYPES)); - - /** - * This constructor builds a SdcSingleControllerConfiguration from the - * corresponding json. - * - * @param jsonNode - * The JSON node - * @param controllerName - * The controller name that must appear in the JSON - */ - public SdcSingleControllerConfiguration(JsonObject jsonNode, String controllerName) { - jsonRootNode = jsonNode; - setSdcControllerName(controllerName); - testAllRequiredParameters(); - } - - public String getSdcControllerName() { - return sdcControllerName; - } - - /** - * Sets SDC controller name. - * - * @param controllerName SDC controller name - */ - public void setSdcControllerName(String controllerName) { - this.sdcControllerName = controllerName; - errorMessageKeyNotFound = " parameter cannot be found in config file for controller name" + sdcControllerName; - testAllRequiredParameters(); - } - - private String getStringConfig(String key) { - if (jsonRootNode != null && jsonRootNode.get(key) != null) { - String config = jsonRootNode.get(key).getAsString(); - return config.isEmpty() ? null : config; - } - return null; - } - - private Integer getIntConfig(String key) { - if (jsonRootNode != null && jsonRootNode.get(key) != null) { - return jsonRootNode.get(key).getAsInt(); - } else { - return 0; - } - } - - private String getEncryptedStringConfig(String key) throws GeneralSecurityException, DecoderException { - if (jsonRootNode != null && jsonRootNode.get(key) != null) { - return jsonRootNode.get(key).getAsString().isEmpty() ? null - : CryptoUtils.decrypt(jsonRootNode.get(key).getAsString()); - } - return null; - } - - @Override - public java.lang.Boolean isUseHttpsWithDmaap() { - return false; - } - - @Override - public String getConsumerGroup() { - if (jsonRootNode != null && jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME) != null) { - String config = jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).getAsString(); - return "NULL".equals(config) || config.isEmpty() ? null : config; - } - return null; - } - - @Override - public String getConsumerID() { - return getStringConfig(CONSUMER_ID_ATTRIBUTE_NAME); - } - - @Override - public String getEnvironmentName() { - return getStringConfig(ENVIRONMENT_NAME_ATTRIBUTE_NAME); - } - - @Override - public String getPassword() { - try { - return getEncryptedStringConfig(SDC_KEY_ATTRIBUTE_NAME); - } catch (GeneralSecurityException | DecoderException e) { - logger.error("Unable to decrypt the SDC password", e); - return null; - } - } - - @Override - public int getPollingInterval() { - return getIntConfig(POLLING_INTERVAL_ATTRIBUTE_NAME); - } - - @Override - public List getRelevantArtifactTypes() { - // DO not return the Static List SUPPORTED_ARTIFACT_TYPES_LIST because - // the ASDC Client could try to modify it !!! - return Arrays.asList(SUPPORTED_ARTIFACT_TYPES); - } - - @Override - public String getUser() { - return getStringConfig(USER_ATTRIBUTE_NAME); - } - - @Override - public String getAsdcAddress() { - return getStringConfig(SDC_ADDRESS_ATTRIBUTE_NAME); - } - - @Override - public int getPollingTimeout() { - return getIntConfig(POLLING_TIMEOUT_ATTRIBUTE_NAME); - } - - @Override - public boolean activateServerTLSAuth() { - if (jsonRootNode != null && jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH) != null - && jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH).isJsonPrimitive()) { - return jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH).getAsBoolean(); - } else { - return false; - } - } - - @Override - public String getKeyStorePassword() { - try { - return getEncryptedStringConfig(KEY_STORE_KEY); - } catch (GeneralSecurityException | DecoderException e) { - logger.error("Unable to decrypt the SDC password", e); - return null; - } - } - - @Override - public String getKeyStorePath() { - return getStringConfig(KEY_STORE_PATH); - } - - /** - * This method can be used to validate all required parameters are well - * there. - */ - public void testAllRequiredParameters() { - // Special case for this attribute that can be null from - // getConsumerGroup - if (jsonRootNode == null) { - throw new SdcParametersException("Json is null for controller " + this.getSdcControllerName()); - } - if (this.getConsumerGroup() == null && (jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME) == null - || !"NULL".equals(jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).getAsString()))) { - throw new SdcParametersException(CONSUMER_GROUP_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getConsumerID() == null || this.getConsumerID().isEmpty()) { - throw new SdcParametersException(CONSUMER_ID_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getEnvironmentName() == null || this.getEnvironmentName().isEmpty()) { - throw new SdcParametersException(ENVIRONMENT_NAME_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getAsdcAddress() == null || this.getAsdcAddress().isEmpty()) { - throw new SdcParametersException(SDC_ADDRESS_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getMsgBusAddress() == null || this.getMsgBusAddress().isEmpty()) { - throw new SdcParametersException(MESSAGE_BUS_ADDRESSES + errorMessageKeyNotFound); - } - if (this.getPassword() == null || this.getPassword().isEmpty()) { - throw new SdcParametersException(SDC_KEY_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getPollingInterval() == 0) { - throw new SdcParametersException(POLLING_INTERVAL_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getPollingTimeout() == 0) { - throw new SdcParametersException(POLLING_TIMEOUT_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getRelevantArtifactTypes() == null || this.getRelevantArtifactTypes().isEmpty()) { - throw new SdcParametersException(RELEVANT_ARTIFACT_TYPES_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - if (this.getUser() == null || this.getUser().isEmpty()) { - throw new SdcParametersException(USER_ATTRIBUTE_NAME + errorMessageKeyNotFound); - } - } - - /** - * The flag allows the client to receive metadata for all resources of the - * service regardless of the artifacts associated to them. Setting the flag - * to false will preserve legacy behavior. - */ - @Override - public boolean isFilterInEmptyResources() { - return false; - } - - @Override - public List getMsgBusAddress() { - List addressesList = new ArrayList<>(); - if (jsonRootNode != null && jsonRootNode.get(MESSAGE_BUS_ADDRESSES) != null) { - jsonRootNode.get(MESSAGE_BUS_ADDRESSES).getAsJsonArray().forEach(k -> addressesList.add(k.getAsString())); - return addressesList; - } else { - return addressesList; - } - } -} diff --git a/src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java b/src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java deleted file mode 100644 index 14c08c800..000000000 --- a/src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.config.spring; - -import org.onap.clamp.clds.config.ClampProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.PropertiesFactoryBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -@Configuration -@Profile("clamp-default") -public class CldsConfiguration { - - @Autowired - private ApplicationContext appContext; - @Autowired - private ClampProperties refProp; - - - /** - * This loads the file system.properties. - * - * @return The PropertiesFactoryBean - */ - @Bean(name = "mapper") - public PropertiesFactoryBean mapper() { - PropertiesFactoryBean bean = new PropertiesFactoryBean(); - bean.setLocation(appContext.getResource(refProp.getStringValue("files.systemProperties"))); - return bean; - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java b/src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java deleted file mode 100644 index 62c3a1fd1..000000000 --- a/src/main/java/org/onap/clamp/clds/config/spring/SdcControllerConfiguration.java +++ /dev/null @@ -1,110 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.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.ClampProperties; -import org.onap.clamp.clds.config.sdc.SdcControllersConfiguration; -import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException; -import org.onap.clamp.clds.sdc.controller.SdcSingleController; -import org.onap.clamp.clds.sdc.controller.SdcSingleControllerStatus; -import org.onap.clamp.loop.CsarInstaller; -import org.springframework.beans.factory.annotation.Autowired; -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; -import org.springframework.scheduling.annotation.Scheduled; - -@Configuration -@Profile("clamp-sdc-controller") -public class SdcControllerConfiguration { - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcControllerConfiguration.class); - private List sdcControllersList = new ArrayList<>(); - private final ClampProperties clampProp; - private final CsarInstaller csarInstaller; - - @Autowired - public SdcControllerConfiguration(ClampProperties clampProp, - @Qualifier("csarInstaller") CsarInstaller csarInstaller) { - this.clampProp = clampProp; - this.csarInstaller = csarInstaller; - } - - /** - * Loads SDC controller configuration. - */ - @PostConstruct - public void loadSdcControllers() { - SdcControllersConfiguration sdcControllersConfig = getSdcControllersConfiguration(); - sdcControllersConfig.getAllDefinedControllers().forEach((key, value) -> { - logger.info("Creating controller instance:" + key); - SdcSingleController sdcController = new SdcSingleController(clampProp, csarInstaller, value, null); - sdcControllersList.add(sdcController); - }); - } - - /** - * Checks whether all SDC controllers defined are up and running. - */ - @Scheduled(fixedRate = 120000) - public void checkAllSdcControllers() { - logger.info("Checking that all SDC Controllers defined are up and running"); - for (SdcSingleController controller : sdcControllersList) { - try { - if (SdcSingleControllerStatus.STOPPED.equals(controller.getControllerStatus())) { - controller.initSdc(); - } - } catch (SdcControllerException e) { - logger.error("Exception caught when booting sdc controller", e); - } - } - logger.info("SDC Controllers check completed"); - } - - /** - * Closes all SDC Controller and the SDC Client. - */ - @PreDestroy - public void killSdcControllers() { - sdcControllersList.forEach(e -> { - try { - e.closeSdc(); - } catch (SdcControllerException e1) { - logger.error("Exception caught when stopping sdc controller", e1); - } - }); - } - - @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/exception/CldsConfigException.java b/src/main/java/org/onap/clamp/clds/exception/CldsConfigException.java deleted file mode 100644 index 93d98151a..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/CldsConfigException.java +++ /dev/null @@ -1,61 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception; - -/** - * New exception to CldsUser errors. - * - */ -public class CldsConfigException extends RuntimeException { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = 5958873136187918505L; - - /** - * This constructor can be used to create a new CldsConfigException. - * - * @param message - * A string message detailing the problem - * @param ex - * The exception sent by the code - */ - public CldsConfigException(String message, Throwable ex) { - super(message, ex); - } - - /** - * This constructor can be used to create a new CldsConfigException. Use - * this constructor only if you are creating a new exception stack, not if - * an exception was already raised by another code. - * - * @param message - * A string message detailing the problem - */ - public CldsConfigException(String message) { - super(message); - } - -} diff --git a/src/main/java/org/onap/clamp/clds/exception/CldsUsersException.java b/src/main/java/org/onap/clamp/clds/exception/CldsUsersException.java deleted file mode 100644 index 270bfa1e2..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/CldsUsersException.java +++ /dev/null @@ -1,61 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception; - -/** - * New exception to CldsUser errors. - * - */ -public class CldsUsersException extends RuntimeException { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = 933535057227505342L; - - /** - * This constructor can be used to create a new CldsUsersException. - * - * @param message - * A string message detailing the problem - * @param ex - * The exception sent by the code - */ - public CldsUsersException(String message, Throwable ex) { - super(message, ex); - } - - /** - * This constructor can be used to create a new CldsUsersException. Use this - * constructor only if you are creating a new exception stack, not if an - * exception was already raised by another code. - * - * @param message - * A string message detailing the problem - */ - public CldsUsersException(String message) { - super(message); - } - -} diff --git a/src/main/java/org/onap/clamp/clds/exception/NotAuthorizedException.java b/src/main/java/org/onap/clamp/clds/exception/NotAuthorizedException.java deleted file mode 100644 index 1bdf18e7e..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/NotAuthorizedException.java +++ /dev/null @@ -1,61 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception; - -/** - * New exception to request errors. - * - */ -public class NotAuthorizedException extends RuntimeException { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = -5738167530541646123L; - - /** - * This constructor can be used to create a new CldsConfigException. - * - * @param message - * A string message detailing the problem - * @param ex - * The exception sent by the code - */ - public NotAuthorizedException(String message, Throwable ex) { - super(message, ex); - } - - /** - * This constructor can be used to create a new CldsConfigException. Use this - * constructor only if you are creating a new exception stack, not if an - * exception was already raised by another code. - * - * @param message - * A string message detailing the problem - */ - public NotAuthorizedException(String message) { - super(message); - } - -} diff --git a/src/main/java/org/onap/clamp/clds/exception/cds/CdsParametersException.java b/src/main/java/org/onap/clamp/clds/exception/cds/CdsParametersException.java deleted file mode 100644 index 73ce31f89..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/cds/CdsParametersException.java +++ /dev/null @@ -1,53 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.clds.exception.cds; - -/** - * Exception while parsing CDS response. - */ -public class CdsParametersException extends RuntimeException { - - /** - * serialization id. - */ - private static final long serialVersionUID = 8425657297510362736L; - - /** - * This constructor can be used to create a new CdsParametersException. - * - * @param message The message to dump - */ - public CdsParametersException(final String message) { - super(message); - } - - /** - * This constructor can be used to create a new CdsParametersException. - * - * @param message The message to dump - * @param cause The Throwable cause object - */ - public CdsParametersException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/onap/clamp/clds/exception/dcae/DcaeDeploymentException.java b/src/main/java/org/onap/clamp/clds/exception/dcae/DcaeDeploymentException.java deleted file mode 100644 index e733da53d..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/dcae/DcaeDeploymentException.java +++ /dev/null @@ -1,61 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception.dcae; - -/** - * New exception to capture DCAE communication errors. - * - */ -public class DcaeDeploymentException extends RuntimeException { - - /** - * Generated ID. - */ - private static final long serialVersionUID = 8452294782552680243L; - - /** - * This constructor can be used to create a new DcaeDeploymentException. - * - * @param message - * A string message detailing the problem - * @param ex - * The exception sent by the code - */ - public DcaeDeploymentException(String message, Throwable ex) { - super(message, ex); - } - - /** - * This constructor can be used to create a new DcaeDeploymentException. Use - * this constructor only if you are creating a new exception stack, not if - * an exception was already raised by another code. - * - * @param message - * A string message detailing the problem - */ - public DcaeDeploymentException(String message) { - super(message); - } - -} diff --git a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/BlueprintParserException.java b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/BlueprintParserException.java deleted file mode 100644 index 7257fd8a0..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/BlueprintParserException.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception.sdc.controller; - -/** - * Exception during blueprint parsing. - */ -public class BlueprintParserException extends Exception { - - /** - * Serial ID. - */ - private static final long serialVersionUID = -3044162346353623199L; - - /** - * This constructor can be used to create a new SdcDownloadException. - * - * @param message The message to dump - */ - public BlueprintParserException(final String message) { - super(message); - } - - /** - * This constructor can be used to create a new SdcDownloadException. - * - * @param message The message to dump - * @param cause The Throwable cause object - */ - public BlueprintParserException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/CsarHandlerException.java b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/CsarHandlerException.java deleted file mode 100644 index c3ebde1f8..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/CsarHandlerException.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception.sdc.controller; - -/** - * Exception during Csar operations. - */ -public class CsarHandlerException extends Exception { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = -7628640776124409155L; - - /** - * This constructor can be used to create a new CsarHandlerException. - * - * @param message The message to dump - */ - public CsarHandlerException(final String message) { - super(message); - } - - /** - * This constructor can be used to create a new CsarHandlerException. - * - * @param message The message to dump - * @param cause The Throwable cause object - */ - public CsarHandlerException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java deleted file mode 100644 index 523766af1..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception.sdc.controller; - -/** - * Exception during SDC artifact installation. - */ -public class SdcArtifactInstallerException extends Exception { - - /** - * serialization id. - */ - private static final long serialVersionUID = 4095937499475915021L; - - /** - * This constructor can be used to create a new SdcArtifactInstallerException. - * - * @param message The message to dump - */ - public SdcArtifactInstallerException(final String message) { - super(message); - } - - /** - * This constructor can be used to create a new SdcArtifactInstallerException. - * - * @param message The message to dump - * @param cause The Throwable cause object - */ - public SdcArtifactInstallerException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcControllerException.java b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcControllerException.java deleted file mode 100644 index d73001d78..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcControllerException.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception.sdc.controller; - -/** - * Exception of the SDC controller. - */ -public class SdcControllerException extends Exception { - - /** - * serialization id. - */ - private static final long serialVersionUID = -4236006447255525130L; - - /** - * This constructor can be used to create a new SdcControllerException. - * - * @param message The message to dump - */ - public SdcControllerException(final String message) { - super(message); - } - - /** - * This constructor can be used to create a new SdcControllerException. - * - * @param message The message to dump - * @param cause The Throwable cause object - */ - public SdcControllerException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcDownloadException.java b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcDownloadException.java deleted file mode 100644 index 6cd3fb88d..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcDownloadException.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception.sdc.controller; - -/** - * Exception during download from SDC. - */ -public class SdcDownloadException extends Exception { - - /** - * serialization id. - */ - private static final long serialVersionUID = -5276848693231134901L; - - /** - * This constructor can be used to create a new SdcDownloadException. - * - * @param message The message to dump - */ - public SdcDownloadException(final String message) { - super(message); - } - - /** - * This constructor can be used to create a new SdcDownloadException. - * - * @param message The message to dump - * @param cause The Throwable cause object - */ - public SdcDownloadException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcParametersException.java b/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcParametersException.java deleted file mode 100644 index bfe63cbfb..000000000 --- a/src/main/java/org/onap/clamp/clds/exception/sdc/controller/SdcParametersException.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.exception.sdc.controller; - -/** - * Exception of the SDC controller. - */ -public class SdcParametersException extends RuntimeException { - - /** - * serialization id. - */ - private static final long serialVersionUID = 8425657297510362736L; - - /** - * This constructor can be used to create a new SdcParametersException. - * - * @param message The message to dump - */ - public SdcParametersException(final String message) { - super(message); - } - - /** - * This constructor can be used to create a new SdcParametersException. - * - * @param message The message to dump - * @param cause The Throwable cause object - */ - public SdcParametersException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/onap/clamp/clds/filter/ClampCadiFilter.java b/src/main/java/org/onap/clamp/clds/filter/ClampCadiFilter.java deleted file mode 100644 index c673f544a..000000000 --- a/src/main/java/org/onap/clamp/clds/filter/ClampCadiFilter.java +++ /dev/null @@ -1,190 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.filter; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.nio.file.StandardCopyOption; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import org.onap.aaf.cadi.config.Config; -import org.onap.aaf.cadi.filter.CadiFilter; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.ApplicationContext; - -public class ClampCadiFilter extends CadiFilter { - private static final EELFLogger logger = EELFManager.getInstance().getLogger(ClampCadiFilter.class); - - @Autowired - private ApplicationContext appContext; - - @Value("${server.ssl.key-store:#{null}}") - private String keyStore; - - @Value("${server.ssl.key-store-password:#{null}}") - private String keyStorePass; - - @Value("${server.ssl.trust-store:#{null}}") - private String trustStore; - - @Value("${server.ssl.trust-store-password:#{null}}") - private String trustStorePass; - - @Value("${server.ssl.key-alias:clamp@clamp.onap.org}") - private String alias; - - @Value("${clamp.config.keyFile:#{null}}") - private String keyFile; - - @Value("${clamp.config.cadi.cadiLoglevel:#{null}}") - private String cadiLoglevel; - - @Value("${clamp.config.cadi.cadiLatitude:#{null}}") - private String cadiLatitude; - - @Value("${clamp.config.cadi.cadiLongitude:#{null}}") - private String cadiLongitude; - - @Value("${clamp.config.cadi.aafLocateUrl:#{null}}") - private String aafLocateUrl; - - @Value("${clamp.config.cadi.oauthTokenUrl:#{null}}") - private String oauthTokenUrl; - - @Value("${clamp.config.cadi.oauthIntrospectUrl:#{null}}") - private String oauthIntrospectUrl; - - @Value("${clamp.config.cadi.aafEnv:#{null}}") - private String aafEnv; - - @Value("${clamp.config.cadi.aafUrl:#{null}}") - private String aafUrl; - - @Value("${clamp.config.cadi.cadiX509Issuers:#{null}}") - private String cadiX509Issuers; - - @Value("${clamp.config.caCerts:#{null}}") - private String caCertsPath; - - private void checkIfNullProperty(String key, String value) { - /* - * When value is null, so not defined in application.properties set nothing in - * System properties - */ - if (value != null) { - /* - * Ensure that any properties already defined in System.prop by JVM params won't - * be overwritten by Spring application.properties values - */ - System.setProperty(key, System.getProperty(key, value)); - } - } - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - // set some properties in System so that Cadi filter will find its config - // The JVM values set will always overwrite the Spring ones. - checkIfNullProperty(Config.CADI_KEYFILE, convertSpringToPath(keyFile)); - checkIfNullProperty(Config.CADI_LOGLEVEL, cadiLoglevel); - checkIfNullProperty(Config.CADI_LATITUDE, cadiLatitude); - checkIfNullProperty(Config.CADI_LONGITUDE, cadiLongitude); - - checkIfNullProperty(Config.AAF_LOCATE_URL, aafLocateUrl); - checkIfNullProperty(Config.AAF_OAUTH2_TOKEN_URL, oauthTokenUrl); - checkIfNullProperty(Config.AAF_OAUTH2_INTROSPECT_URL, oauthIntrospectUrl); - - checkIfNullProperty(Config.AAF_ENV, aafEnv); - checkIfNullProperty(Config.AAF_URL, aafUrl); - checkIfNullProperty(Config.CADI_X509_ISSUERS, cadiX509Issuers); - checkIfNullProperty(Config.CADI_KEYSTORE, convertSpringToPath(keyStore)); - checkIfNullProperty(Config.CADI_TRUSTSTORE, convertSpringToPath(trustStore)); - checkIfNullProperty(Config.CADI_ALIAS, alias); - checkIfNullProperty(Config.CADI_KEYSTORE_PASSWORD, keyStorePass); - checkIfNullProperty(Config.CADI_TRUSTSTORE_PASSWORD, trustStorePass); - - super.init(filterConfig); - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - try { - String certHeader = ((HttpServletRequest) request).getHeader("X-SSL-Cert"); - if (certHeader != null) { - CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); - X509Certificate cert = (X509Certificate) certificateFactory - .generateCertificate(new ByteArrayInputStream( - URLDecoder.decode(certHeader, StandardCharsets.UTF_8.toString()).getBytes())); - X509Certificate caCert = (X509Certificate) certificateFactory - .generateCertificate(new ByteArrayInputStream( - ResourceFileUtils.getResourceAsString(this.caCertsPath).getBytes())); - - X509Certificate[] certifArray = ((X509Certificate[]) request - .getAttribute("javax.servlet.request.X509Certificate")); - if (certifArray == null) { - certifArray = new X509Certificate[] { cert, caCert }; - request.setAttribute("javax.servlet.request.X509Certificate", certifArray); - } else { - certifArray[0] = cert; - certifArray[1] = caCert; - } - } - - } catch (CertificateException e) { - logger.error("Unable to inject the X.509 certificate", e); - } - super.doFilter(request, response, chain); - } - - private String convertSpringToPath(String fileName) { - try (InputStream ioFile = appContext.getResource(fileName).getInputStream()) { - if (!fileName.contains("file:")) { - File targetFile = new File(appContext.getResource(fileName).getFilename()); - java.nio.file.Files.copy(ioFile, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - return targetFile.getPath(); - } else { - return appContext.getResource(fileName).getFile().getPath(); - } - } catch (IOException e) { - logger.error("Unable to open and copy the file: " + fileName, e); - return null; - } - - } -} diff --git a/src/main/java/org/onap/clamp/clds/model/ClampInformation.java b/src/main/java/org/onap/clamp/clds/model/ClampInformation.java deleted file mode 100644 index d73e94204..000000000 --- a/src/main/java/org/onap/clamp/clds/model/ClampInformation.java +++ /dev/null @@ -1,62 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model; - -import com.google.gson.annotations.Expose; -import java.util.ArrayList; -import java.util.List; -import org.onap.clamp.clds.util.ClampVersioning; - -public class ClampInformation { - @Expose - private String userName; - @Expose - private String cldsVersion = ClampVersioning.getCldsVersionFromProps(); - @Expose - List allPermissions = new ArrayList<>(); - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public String getCldsVersion() { - return cldsVersion; - } - - public void setCldsVersion(String cldsVersion) { - this.cldsVersion = cldsVersion; - } - - public List getAllPermissions() { - return allPermissions; - } - - public void setAllPermissions(List allPermissions) { - this.allPermissions = allPermissions; - } -} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsHealthCheck.java b/src/main/java/org/onap/clamp/clds/model/CldsHealthCheck.java deleted file mode 100644 index 651997cd3..000000000 --- a/src/main/java/org/onap/clamp/clds/model/CldsHealthCheck.java +++ /dev/null @@ -1,60 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model; - -import com.google.gson.annotations.Expose; - -public class CldsHealthCheck { - @Expose - private String healthCheckComponent; - @Expose - private String healthCheckStatus; - @Expose - private String description; - - public String getHealthCheckComponent() { - return healthCheckComponent; - } - - public void setHealthCheckComponent(String healthCheckComponent) { - this.healthCheckComponent = healthCheckComponent; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getHealthCheckStatus() { - return healthCheckStatus; - } - - public void setHealthCheckStatus(String healthCheckStatus) { - this.healthCheckStatus = healthCheckStatus; - } - -} diff --git a/src/main/java/org/onap/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java b/src/main/java/org/onap/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java deleted file mode 100644 index 36510ea8f..000000000 --- a/src/main/java/org/onap/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java +++ /dev/null @@ -1,66 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.clds.model.cds; - -import com.google.gson.annotations.Expose; -import java.util.LinkedList; -import java.util.List; - -/** - * This class maps the CDS response to a pojo. - */ -public class CdsBpWorkFlowListResponse { - - @Expose - private String blueprintName; - - @Expose - private String version; - - @Expose - private List workflows = new LinkedList(); - - public String getBlueprintName() { - return blueprintName; - } - - public void setBlueprintName(String blueprintName) { - this.blueprintName = blueprintName; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public List getWorkflows() { - return workflows; - } - - public void setWorkflows(List workflows) { - this.workflows = workflows; - } -} diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java deleted file mode 100644 index fc2ca5caa..000000000 --- a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java +++ /dev/null @@ -1,62 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model.dcae; - -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; - -/** - * This class stores the multiple DcaeInventoryResponse coming back from DCAE. - * The structure is a map of list indexed by asdcServiceId. The list is sorted - * by asdcResourceId. Therefore it's possible to retrieve all the loops defined - * in the DCAE inventory and created by DCAE Mod. - */ -public class DcaeInventoryCache { - - private static Map> blueprintsMap = new ConcurrentHashMap<>(); - - /** - * Add Dcae inventory response. - * - * @param inventoryResponse the Dcae inventory response - */ - public void addDcaeInventoryResponse(DcaeInventoryResponse inventoryResponse) { - Set responsesSet = blueprintsMap.get(inventoryResponse.getAsdcServiceId()); - if (responsesSet == null) { - responsesSet = new TreeSet<>(); - blueprintsMap.put(inventoryResponse.getAsdcServiceId(), responsesSet); - } - responsesSet.add(inventoryResponse); - } - - public Set getAllLoopIds() { - return this.blueprintsMap.keySet(); - } - - public Set getAllBlueprintsPerLoopId(String loopId) { - return blueprintsMap.getOrDefault(loopId, new TreeSet<>()); - } -} diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java deleted file mode 100644 index 67bd026d0..000000000 --- a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java +++ /dev/null @@ -1,102 +0,0 @@ - -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model.dcae; - -import com.google.gson.annotations.Expose; - -/** - * This class maps the DCAE inventory answer to a nice pojo. - */ -public class DcaeInventoryResponse implements Comparable { - - @Expose - private String typeName; - - @Expose - private String typeId; - - @Expose - private String blueprintTemplate; - - /** - * This field will be used to know all blueprints associated a loop. - */ - @Expose - private String asdcServiceId; - - /** - * This field will be used to know to order of each blueprint microservice in a - * loop. - */ - @Expose - private String asdcResourceId; - - public String getTypeName() { - return typeName; - } - - public void setTypeName(String typeName) { - this.typeName = typeName; - } - - public String getTypeId() { - return typeId; - } - - public void setTypeId(String typeId) { - this.typeId = typeId; - } - - public String getBlueprintTemplate() { - return blueprintTemplate; - } - - public void setBlueprintTemplate(String blueprintTemplate) { - this.blueprintTemplate = blueprintTemplate; - } - - public String getAsdcServiceId() { - return asdcServiceId; - } - - public void setAsdcServiceId(String asdcServiceId) { - this.asdcServiceId = asdcServiceId; - } - - public String getAsdcResourceId() { - return asdcResourceId; - } - - public void setAsdcResourceId(String asdcResourceId) { - this.asdcResourceId = asdcResourceId; - } - - @Override - public int compareTo(DcaeInventoryResponse otherResponse) { - int thisResourceId = Integer.parseInt(this.asdcResourceId); - int otherResourceId = Integer.parseInt(otherResponse.getAsdcResourceId()); - return (thisResourceId < otherResourceId ? -1 : (thisResourceId > otherResourceId ? 1 : 0)); - } -} diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java deleted file mode 100644 index 368e1b8e6..000000000 --- a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java +++ /dev/null @@ -1,60 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model.dcae; - -import com.google.gson.annotations.Expose; - -public class DcaeLinks { - @Expose - private String self; - @Expose - private String status; - @Expose - private String uninstall; - - public String getSelf() { - return self; - } - - public void setSelf(String self) { - this.self = self; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getUninstall() { - return uninstall; - } - - public void setUninstall(String uninstall) { - this.uninstall = uninstall; - } - -} diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java deleted file mode 100644 index aee7d0613..000000000 --- a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java +++ /dev/null @@ -1,88 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model.dcae; - -import com.google.gson.annotations.Expose; - -/** - * This class maps the DCAE deployment handler response to a nice pojo. - */ -public class DcaeOperationStatusResponse { - - @Expose - private String operationType; - - @Expose - private String status; - - @Expose - private String requestId; - - @Expose - private String error; - - @Expose - private DcaeLinks links; - - public String getOperationType() { - return operationType; - } - - public void setOperationType(String operationType) { - this.operationType = operationType; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public String getError() { - return error; - } - - public void setError(String error) { - this.error = error; - } - - public DcaeLinks getLinks() { - return links; - } - - public void setLinks(DcaeLinks links) { - this.links = links; - } - -} diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/DistributionStatusMessage.java b/src/main/java/org/onap/clamp/clds/sdc/controller/DistributionStatusMessage.java deleted file mode 100644 index c80441fa6..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/DistributionStatusMessage.java +++ /dev/null @@ -1,84 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller; - -import org.onap.sdc.api.consumer.IDistributionStatusMessage; -import org.onap.sdc.utils.DistributionStatusEnum; - -public class DistributionStatusMessage implements IDistributionStatusMessage { - - private String artifactUrl; - private String consumerId; - private String distributionId; - private DistributionStatusEnum distributionStatus; - private long timestamp; - - /** - * Distribution status message constructor. - * - * @param artifactUrl - * Url of specific SDC artifact(resource) - * @param consumerId - * Unique ID of SDC component instance - * @param distributionId - * Distribution ID published in the distribution notification. - * @param distributionStatusEnum - * Status to send in the message - * @param timestamp - * Timestamp of the message - */ - public DistributionStatusMessage(final String artifactUrl, final String consumerId, final String distributionId, - final DistributionStatusEnum distributionStatusEnum, final long timestamp) { - this.artifactUrl = artifactUrl; - this.consumerId = consumerId; - this.distributionId = distributionId; - this.distributionStatus = distributionStatusEnum; - this.timestamp = timestamp; - } - - @Override - public String getArtifactURL() { - return artifactUrl; - } - - @Override - public String getConsumerID() { - return consumerId; - } - - @Override - public String getDistributionID() { - return distributionId; - } - - @Override - public DistributionStatusEnum getStatus() { - return distributionStatus; - } - - @Override - public long getTimestamp() { - return timestamp; - } -} 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 deleted file mode 100644 index 8afb3e81a..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java +++ /dev/null @@ -1,433 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018-2019 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============================================ - * Modifications copyright (c) 2018 Nokia - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.util.Date; -import java.util.Map.Entry; -import java.util.concurrent.ThreadLocalRandom; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.config.sdc.SdcSingleControllerConfiguration; -import org.onap.clamp.clds.exception.sdc.controller.BlueprintParserException; -import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException; -import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; -import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException; -import org.onap.clamp.clds.exception.sdc.controller.SdcDownloadException; -import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact; -import org.onap.clamp.clds.sdc.controller.installer.CsarHandler; -import org.onap.clamp.clds.util.LoggingUtils; -import org.onap.clamp.loop.CsarInstaller; -import org.onap.sdc.api.IDistributionClient; -import org.onap.sdc.api.consumer.IComponentDoneStatusMessage; -import org.onap.sdc.api.consumer.IDistributionStatusMessage; -import org.onap.sdc.api.consumer.INotificationCallback; -import org.onap.sdc.api.notification.IArtifactInfo; -import org.onap.sdc.api.notification.INotificationData; -import org.onap.sdc.api.results.IDistributionClientDownloadResult; -import org.onap.sdc.api.results.IDistributionClientResult; -import org.onap.sdc.impl.DistributionClientFactory; -import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; -import org.onap.sdc.utils.DistributionActionResultEnum; -import org.onap.sdc.utils.DistributionStatusEnum; - -/** - * This class handles one sdc controller defined in the config. - */ -public class SdcSingleController { - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcSingleController.class); - private boolean isSdcClientAutoManaged = false; - private CsarInstaller csarInstaller; - private ClampProperties refProp; - /** - * The constant CONFIG_SDC_FOLDER. - */ - public static final String CONFIG_SDC_FOLDER = "sdc.csarFolder"; - private int nbOfNotificationsOngoing = 0; - private SdcSingleControllerStatus controllerStatus = SdcSingleControllerStatus.STOPPED; - private SdcSingleControllerConfiguration sdcConfig; - private IDistributionClient distributionClient; - - /** - * Inner class for Notification callback. - */ - private final class SdcNotificationCallBack implements INotificationCallback { - - private SdcSingleController sdcController; - - /** - * Instantiates a new Sdc notification call back. - * - * @param controller the controller - */ - SdcNotificationCallBack(SdcSingleController controller) { - sdcController = controller; - } - - /** - * This method can be called multiple times at the same moment. The controller - * must be thread safe ! - */ - @Override - public void activateCallback(INotificationData notificationData) { - Date startTime = new Date(); - logger.info("Receive a callback notification in SDC, nb of resources: " - + notificationData.getResources().size()); - sdcController.treatNotification(notificationData); - LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "SDC Notification received and processed successfully", - this.getClass().getName()); - } - } - - /** - * Gets nb of notifications ongoing. - * - * @return the nb of notifications ongoing - */ - public int getNbOfNotificationsOngoing() { - return nbOfNotificationsOngoing; - } - - private void changeControllerStatusIdle() { - if (this.nbOfNotificationsOngoing > 1) { - --this.nbOfNotificationsOngoing; - } else { - this.nbOfNotificationsOngoing = 0; - this.controllerStatus = SdcSingleControllerStatus.IDLE; - } - } - - /** - * Change controller status. - * - * @param newControllerStatus the new controller status - */ - protected final synchronized void changeControllerStatus(SdcSingleControllerStatus newControllerStatus) { - switch (newControllerStatus) { - case BUSY: - ++this.nbOfNotificationsOngoing; - this.controllerStatus = newControllerStatus; - break; - case IDLE: - this.changeControllerStatusIdle(); - break; - default: - this.controllerStatus = newControllerStatus; - break; - } - } - - /** - * Gets controller status. - * - * @return the controller status - */ - public final synchronized SdcSingleControllerStatus getControllerStatus() { - return this.controllerStatus; - } - - /** - * Instantiates a new Sdc single controller. - * - * @param clampProp the clamp prop - * @param csarInstaller the csar installer - * @param sdcSingleConfig the sdc single config - * @param distributionClient the distribution client - */ - public SdcSingleController(ClampProperties clampProp, CsarInstaller csarInstaller, - SdcSingleControllerConfiguration sdcSingleConfig, - IDistributionClient distributionClient) { - this.distributionClient = distributionClient; - isSdcClientAutoManaged = (distributionClient == null); - this.sdcConfig = sdcSingleConfig; - this.refProp = clampProp; - this.csarInstaller = csarInstaller; - } - - /** - * This method initializes the SDC Controller and the SDC Client. - * - * @throws SdcControllerException It throws an exception if the SDC Client - * cannot be instantiated or if an init attempt - * is done when already initialized - */ - public void initSdc() throws SdcControllerException { - logger.info("Attempt to initialize the SDC Controller: " + sdcConfig.getSdcControllerName()); - if (this.getControllerStatus() != SdcSingleControllerStatus.STOPPED) { - throw new SdcControllerException("The controller is already initialized, call the closeSDC method first"); - } - if (distributionClient == null) { - distributionClient = DistributionClientFactory.createDistributionClient(); - } - IDistributionClientResult result = distributionClient.init(sdcConfig, new SdcNotificationCallBack(this)); - if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) { - logger.error("SDC distribution client init failed with reason:" + result.getDistributionMessageResult()); - this.changeControllerStatus(SdcSingleControllerStatus.STOPPED); - throw new SdcControllerException("Initialization of the SDC Controller failed with reason: " - + result.getDistributionMessageResult()); - } - logger.info("SDC Controller successfully initialized: " + sdcConfig.getSdcControllerName()); - logger.info("Attempt to start the SDC Controller: " + sdcConfig.getSdcControllerName()); - result = this.distributionClient.start(); - if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) { - logger.error("SDC distribution client start failed with reason:" + result.getDistributionMessageResult()); - this.changeControllerStatus(SdcSingleControllerStatus.STOPPED); - throw new SdcControllerException( - "Startup of the SDC Controller failed with reason: " + result.getDistributionMessageResult()); - } - logger.info("SDC Controller successfully started: " + sdcConfig.getSdcControllerName()); - this.changeControllerStatus(SdcSingleControllerStatus.IDLE); - } - - /** - * This method closes the SDC Controller and the SDC Client. - * - * @throws SdcControllerException It throws an exception if the SDC Client - * cannot be closed because it's currently BUSY - * in processing notifications. - */ - public void closeSdc() throws SdcControllerException { - if (this.getControllerStatus() == SdcSingleControllerStatus.BUSY) { - throw new SdcControllerException("Cannot close the SDC controller as it's currently in BUSY state"); - } - if (this.distributionClient != null) { - this.distributionClient.stop(); - // If auto managed we can set it to Null, SdcController controls it. - // In the other case the client of this class has specified it, so - // we can't reset it - if (isSdcClientAutoManaged) { - // Next init will initialize it with a new SDC Client - this.distributionClient = null; - } - } - this.changeControllerStatus(SdcSingleControllerStatus.STOPPED); - } - - private void sendAllNotificationForCsarHandler(INotificationData notificationData, CsarHandler csar, - NotificationType notificationType, - DistributionStatusEnum distributionStatus, String errorMessage) { - if (csar != null) { - // Notify for the CSAR - this.sendSdcNotification(notificationType, csar.getArtifactElement().getArtifactURL(), - sdcConfig.getConsumerID(), notificationData.getDistributionID(), distributionStatus, errorMessage, - System.currentTimeMillis()); - // Notify for all VF resources found - for (Entry blueprint : csar.getMapOfBlueprints().entrySet()) { - // Normally always 1 artifact in resource for Clamp as we - // specified - // only VF_METADATA type - this.sendSdcNotification(notificationType, - blueprint.getValue().getResourceAttached().getArtifacts().get(0).getArtifactURL(), - sdcConfig.getConsumerID(), notificationData.getDistributionID(), distributionStatus, - errorMessage, System.currentTimeMillis()); - } - } else { - this.sendSdcNotification(notificationType, null, sdcConfig.getConsumerID(), - notificationData.getDistributionID(), distributionStatus, errorMessage, System.currentTimeMillis()); - } - } - - /** - * This method processes the notification received from Sdc. - * - * @param notificationData The INotificationData - */ - public void treatNotification(INotificationData notificationData) { - CsarHandler csar = null; - try { - // wait for a random time, so that 2 running Clamp will not treat - // the same Notification at the same time - Thread.sleep(ThreadLocalRandom.current().nextInt(1, 10) * 1000L); - logger.info("Notification received for service UUID:" + notificationData.getServiceUUID()); - this.changeControllerStatus(SdcSingleControllerStatus.BUSY); - csar = new CsarHandler(notificationData, this.sdcConfig.getSdcControllerName(), - refProp.getStringValue(CONFIG_SDC_FOLDER)); - csar.save(downloadTheArtifact(csar.getArtifactElement())); - if (csarInstaller.isCsarAlreadyDeployed(csar)) { - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DOWNLOAD, - DistributionStatusEnum.ALREADY_DOWNLOADED, null); - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, - DistributionStatusEnum.ALREADY_DEPLOYED, null); - } else { - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DOWNLOAD, - DistributionStatusEnum.DOWNLOAD_OK, null); - csarInstaller.installTheCsar(csar); - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, - DistributionStatusEnum.DEPLOY_OK, null); - } - this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_OK, null); - } catch (SdcArtifactInstallerException | SdcToscaParserException e) { - logger.error("SdcArtifactInstallerException exception caught during the notification processing", e); - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, - DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); - this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); - } catch (SdcDownloadException | CsarHandlerException e) { - logger.error("SdcDownloadException exception caught during the notification processing", e); - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DOWNLOAD, - DistributionStatusEnum.DOWNLOAD_ERROR, e.getMessage()); - this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); - } catch (InterruptedException e) { - logger.error("Interrupt exception caught during the notification processing", e); - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, - DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); - this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); - Thread.currentThread().interrupt(); - } catch (BlueprintParserException e) { - logger.error("BlueprintParser exception caught during the notification processing", e); - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, - DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); - this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); - } catch (RuntimeException e) { - logger.error("Unexpected exception caught during the notification processing", e); - sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, - DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); - this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); - } finally { - this.changeControllerStatus(SdcSingleControllerStatus.IDLE); - } - } - - private enum NotificationType { - /** - * Download notification type. - */ - DOWNLOAD, - /** - * Deploy notification type. - */ - DEPLOY - } - - private IDistributionClientDownloadResult downloadTheArtifact(IArtifactInfo artifact) throws SdcDownloadException { - logger.info("Trying to download the artifact : " + artifact.getArtifactURL() + " UUID: " - + artifact.getArtifactUUID()); - IDistributionClientDownloadResult downloadResult; - try { - downloadResult = distributionClient.download(artifact); - if (null == downloadResult) { - logger.info("downloadResult is Null for: " + artifact.getArtifactUUID()); - return null; - } - } catch (RuntimeException e) { - throw new SdcDownloadException("Exception caught when downloading the artifact", e); - } - if (DistributionActionResultEnum.SUCCESS.equals(downloadResult.getDistributionActionResult())) { - logger.info("Successfully downloaded the artifact " + artifact.getArtifactURL() + " UUID " - + artifact.getArtifactUUID() + "Size of payload " + downloadResult.getArtifactPayload().length); - } else { - throw new SdcDownloadException("Artifact " + artifact.getArtifactName() - + " could not be downloaded from SDC URL " + artifact.getArtifactURL() + " UUID " - + artifact.getArtifactUUID() + ")" + System.lineSeparator() + "Error message is " - + downloadResult.getDistributionMessageResult() + System.lineSeparator()); - } - return downloadResult; - } - - private void sendSdcNotification(NotificationType notificationType, String artifactUrl, String consumerId, - String distributionId, DistributionStatusEnum status, String errorReason, - long timestamp) { - String event = "Sending " + notificationType.name() + "(" + status.name() + ")" - + " notification to SDC for artifact:" + artifactUrl; - if (errorReason != null) { - event = event + "(" + errorReason + ")"; - } - logger.info(event); - String action = ""; - try { - IDistributionStatusMessage message = new DistributionStatusMessage(artifactUrl, consumerId, distributionId, - status, timestamp); - switch (notificationType) { - case DOWNLOAD: - this.sendDownloadStatus(message, errorReason); - action = "sendDownloadStatus"; - break; - case DEPLOY: - this.sendDeploymentStatus(message, errorReason); - action = "sendDeploymentdStatus"; - break; - default: - break; - } - } catch (RuntimeException e) { - logger.warn("Unable to send the SDC Notification (" + action + ") due to an exception", e); - } - logger.info("SDC Notification sent successfully(" + action + ")"); - } - - private void sendComponentStatus(INotificationData notificationData, DistributionStatusEnum status, - String errorReason) { - try { - IComponentDoneStatusMessage message = new IComponentDoneStatusMessage() { - - @Override public String getDistributionID() { - return notificationData.getDistributionID(); - } - - @Override public String getConsumerID() { - return sdcConfig.getConsumerID(); - } - - @Override public long getTimestamp() { - return System.currentTimeMillis(); - } - - @Override public DistributionStatusEnum getStatus() { - return status; - } - - @Override public String getComponentName() { - return sdcConfig.getUser(); - } - }; - - if (errorReason != null) { - this.distributionClient.sendComponentDoneStatus(message, errorReason); - } else { - this.distributionClient.sendComponentDoneStatus(message); - } - } catch (RuntimeException e) { - logger.warn("Unable to send the SDC Notification (" + status.name() + ") due to an exception", e); - } - logger.info("SDC Notification sent successfully(" + status.name() + ")"); - } - - private void sendDownloadStatus(IDistributionStatusMessage message, String errorReason) { - if (errorReason != null) { - this.distributionClient.sendDownloadStatus(message, errorReason); - } else { - this.distributionClient.sendDownloadStatus(message); - } - } - - private void sendDeploymentStatus(IDistributionStatusMessage message, String errorReason) { - if (errorReason != null) { - this.distributionClient.sendDeploymentStatus(message, errorReason); - } else { - this.distributionClient.sendDeploymentStatus(message); - } - } -} diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleControllerStatus.java b/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleControllerStatus.java deleted file mode 100644 index a50e340e3..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleControllerStatus.java +++ /dev/null @@ -1,28 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller; - -public enum SdcSingleControllerStatus { - STOPPED, IDLE, BUSY -} diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintArtifact.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintArtifact.java deleted file mode 100644 index 35bc909dc..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintArtifact.java +++ /dev/null @@ -1,70 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller.installer; - -import org.onap.sdc.api.notification.IResourceInstance; - -/** - * This class is useful to store the information concerning - * blueprint artifact extracted from SDC CSAR. - */ -public class BlueprintArtifact { - - private String dcaeBlueprint; - private String blueprintArtifactName; - private String blueprintInvariantServiceUuid; - private IResourceInstance resourceAttached; - - public String getDcaeBlueprint() { - return dcaeBlueprint; - } - - public void setDcaeBlueprint(String dcaeBlueprint) { - this.dcaeBlueprint = dcaeBlueprint; - } - - public String getBlueprintArtifactName() { - return blueprintArtifactName; - } - - public void setBlueprintArtifactName(String blueprintArtifactName) { - this.blueprintArtifactName = blueprintArtifactName; - } - - public String getBlueprintInvariantServiceUuid() { - return blueprintInvariantServiceUuid; - } - - public void setBlueprintInvariantServiceUuid(String blueprintInvariantServiceUuid) { - this.blueprintInvariantServiceUuid = blueprintInvariantServiceUuid; - } - - public IResourceInstance getResourceAttached() { - return resourceAttached; - } - - public void setResourceAttached(IResourceInstance resourceAttached) { - this.resourceAttached = resourceAttached; - } -} diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintMicroService.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintMicroService.java deleted file mode 100644 index e00ce9430..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintMicroService.java +++ /dev/null @@ -1,93 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia 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============================================ - * Modifications copyright (c) 2019-2020 AT&T - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller.installer; - -import java.util.Objects; - -public class BlueprintMicroService { - private final String name; - private final String modelType; - private final String inputFrom; - private final String modelVersion; - - /** - * The Micro service constructor. - * - * @param name The name in String - * @param modelType The model type - * @param inputFrom Comes from (single chained) - */ - public BlueprintMicroService(String name, String modelType, String inputFrom, String modelVersion) { - this.name = name; - this.inputFrom = inputFrom; - this.modelType = modelType; - this.modelVersion = modelVersion; - } - - public String getName() { - return name; - } - - public String getModelType() { - return modelType; - } - - public String getInputFrom() { - return inputFrom; - } - - /** - * modelVerrsion getter. - * - * @return the modelVersion - */ - public String getModelVersion() { - return modelVersion; - } - - @Override - public String toString() { - return "MicroService {" + "name='" + name + '\'' + ", modelType='" + modelType + '\'' + ", inputFrom='" - + inputFrom + '\'' + ", modelVersion='" + modelVersion + '\'' + '}'; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - BlueprintMicroService that = (BlueprintMicroService) obj; - return name.equals(that.name) && modelType.equals(that.modelType) && inputFrom.equals(that.inputFrom) - && modelVersion.equals(that.modelVersion); - } - - @Override - public int hashCode() { - return Objects.hash(name, modelType, inputFrom, modelVersion); - } -} diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java deleted file mode 100644 index 0c6ec8d83..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java +++ /dev/null @@ -1,220 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia 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============================================ - * Modifications copyright (c) 2019 AT&T - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller.installer; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import java.util.AbstractMap; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.json.JSONObject; -import org.onap.clamp.clds.exception.sdc.controller.BlueprintParserException; -import org.yaml.snakeyaml.Yaml; - -public class BlueprintParser { - - static final String TCA = "TCA"; - private static final String NODE_TEMPLATES = "node_templates"; - private static final String DCAE_NODES = "dcae.nodes."; - private static final String DCAE_NODES_POLICY = ".nodes.policy"; - private static final String TYPE = "type"; - private static final String PROPERTIES = "properties"; - private static final String NAME = "name"; - private static final String INPUT = "inputs"; - private static final String GET_INPUT = "get_input"; - private static final String POLICY_MODEL_ID = "policy_model_id"; - private static final String POLICY_MODEL_VERSION = "policy_model_version"; - private static final String RELATIONSHIPS = "relationships"; - private static final String CLAMP_NODE_RELATIONSHIPS_GETS_INPUT_FROM = "clamp_node.relationships.gets_input_from"; - private static final String TARGET = "target"; - public static final String DEFAULT_VERSION = "1.0.0"; - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(BlueprintParser.class); - - private BlueprintParser() { - - } - - /** - * Get all micro services from blueprint. - * - * @param blueprintString the blueprint in a String - * @return A set of MircoService - * @throws BlueprintParserException In case of issues with the parsing - */ - public static Set getMicroServices(String blueprintString) throws BlueprintParserException { - Set microServices = new HashSet<>(); - JsonObject blueprintJson = BlueprintParser.convertToJson(blueprintString); - JsonObject nodeTemplateList = blueprintJson.get(NODE_TEMPLATES).getAsJsonObject(); - JsonObject inputList = blueprintJson.get(INPUT).getAsJsonObject(); - - for (Entry entry : nodeTemplateList.entrySet()) { - JsonObject nodeTemplate = entry.getValue().getAsJsonObject(); - if (!nodeTemplate.get(TYPE).getAsString().contains(DCAE_NODES_POLICY) - && nodeTemplate.get(TYPE).getAsString().contains(DCAE_NODES)) { - BlueprintMicroService microService = getNodeRepresentation(entry, nodeTemplateList, inputList); - if (!microService.getModelType().isBlank()) { - microServices.add(microService); - } else { - logger.warn("Microservice " + microService.getName() - + " will NOT be used by CLAMP as the model type is not defined or has not been found"); - } - } - } - logger.debug("Those microservices have been found in the blueprint:" + microServices); - return microServices; - } - - /** - * Does a fallback to TCA. - * - * @return The list of microservices - */ - public static List fallbackToOneMicroService() { - return Collections.singletonList( - new BlueprintMicroService(TCA, "onap.policies.monitoring.cdap.tca.hi.lo.app", "", DEFAULT_VERSION)); - } - - static String getName(Entry entry) { - String microServiceYamlName = entry.getKey(); - JsonObject ob = entry.getValue().getAsJsonObject(); - if (ob.has(PROPERTIES)) { - JsonObject properties = ob.get(PROPERTIES).getAsJsonObject(); - if (properties.has(NAME)) { - return properties.get(NAME).getAsString(); - } - } - return microServiceYamlName; - } - - static String getInput(Entry entry) { - JsonObject ob = entry.getValue().getAsJsonObject(); - if (ob.has(RELATIONSHIPS)) { - JsonArray relationships = ob.getAsJsonArray(RELATIONSHIPS); - for (JsonElement element : relationships) { - String target = getTarget(element.getAsJsonObject()); - if (!target.isEmpty()) { - return target; - } - } - } - return ""; - } - - static String findPropertyInRelationshipsArray(String propertyName, JsonArray relationshipsArray, - JsonObject blueprintNodeTemplateList, JsonObject blueprintInputList) throws BlueprintParserException { - for (JsonElement elem : relationshipsArray) { - if (blueprintNodeTemplateList.get(elem.getAsJsonObject().get(TARGET).getAsString()) == null) { - throw new BlueprintParserException( - "The Target mentioned in the blueprint is not a known entry in the blueprint: " - + elem.getAsJsonObject().get(TARGET).getAsString()); - } else { - String property = getPropertyValue(propertyName, - new AbstractMap.SimpleEntry( - elem.getAsJsonObject().get(TARGET).getAsString(), blueprintNodeTemplateList - .get(elem.getAsJsonObject().get(TARGET).getAsString()).getAsJsonObject()), - blueprintNodeTemplateList, blueprintInputList); - if (!property.isEmpty()) { - return property; - } - } - } - return ""; - } - - static String getDirectOrInputPropertyValue(String propertyName, JsonObject blueprintInputList, - JsonObject nodeTemplateContent) { - JsonObject properties = nodeTemplateContent.get(PROPERTIES).getAsJsonObject(); - if (properties.has(propertyName)) { - if (properties.get(propertyName).isJsonObject()) { - // it's a blueprint parameter - return blueprintInputList - .get(properties.get(propertyName).getAsJsonObject().get(GET_INPUT).getAsString()) - .getAsJsonObject().get("default").getAsString(); - } else { - // It's a direct value - return properties.get(propertyName).getAsString(); - } - } - return ""; - } - - static String getPropertyValue(String propertyName, Entry nodeTemplateEntry, - JsonObject blueprintNodeTemplateList, JsonObject blueprintIputList) throws BlueprintParserException { - JsonObject nodeTemplateContent = nodeTemplateEntry.getValue().getAsJsonObject(); - // Search first in this node template - if (nodeTemplateContent.has(PROPERTIES)) { - String propValue = getDirectOrInputPropertyValue(propertyName, blueprintIputList, nodeTemplateContent); - if (!propValue.isBlank()) { - return propValue; - } - } - // Or it's may be defined in a relationship - if (nodeTemplateContent.has(RELATIONSHIPS)) { - return findPropertyInRelationshipsArray(propertyName, - nodeTemplateContent.get(RELATIONSHIPS).getAsJsonArray(), blueprintNodeTemplateList, - blueprintIputList); - } - return ""; - } - - static BlueprintMicroService getNodeRepresentation(Entry nodeTemplateEntry, - JsonObject blueprintNodeTemplateList, JsonObject blueprintInputList) throws BlueprintParserException { - String modelIdFound = getPropertyValue(POLICY_MODEL_ID, nodeTemplateEntry, blueprintNodeTemplateList, - blueprintInputList); - String versionFound = getPropertyValue(POLICY_MODEL_VERSION, nodeTemplateEntry, blueprintNodeTemplateList, - blueprintInputList); - if (modelIdFound.isBlank()) { - logger.warn("policy_model_id is not defined for the node template:" + nodeTemplateEntry.getKey()); - } - if (versionFound.isBlank()) { - logger.warn("policy_model_version is not defined (setting it to a default value) for the node template:" - + nodeTemplateEntry.getKey()); - } - return new BlueprintMicroService(getName(nodeTemplateEntry), modelIdFound, getInput(nodeTemplateEntry), - !versionFound.isBlank() ? versionFound : DEFAULT_VERSION); - } - - private static String getTarget(JsonObject elementObject) { - if (elementObject.has(TYPE) && elementObject.has(TARGET) - && elementObject.get(TYPE).getAsString().equals(CLAMP_NODE_RELATIONSHIPS_GETS_INPUT_FROM)) { - return elementObject.get(TARGET).getAsString(); - } - return ""; - } - - private static JsonObject convertToJson(String yamlString) { - Map map = new Yaml().load(yamlString); - return new Gson().fromJson(new JSONObject(map).toString(), JsonObject.class); - } -} diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/ChainGenerator.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/ChainGenerator.java deleted file mode 100644 index 7768cd817..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/ChainGenerator.java +++ /dev/null @@ -1,90 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller.installer; - -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.springframework.stereotype.Component; - -@Component -public class ChainGenerator { - - ChainGenerator() { - } - - /** - * Get list of microservices chain. - * - * @param input A set of microservices - * @return The list of microservice chained - */ - public List getChainOfMicroServices(Set input) { - LinkedList returnList = new LinkedList<>(); - if (preValidate(input)) { - LinkedList theList = new LinkedList<>(); - for (BlueprintMicroService ms : input) { - insertNodeTemplateIntoChain(ms, theList); - } - if (postValidate(theList)) { - returnList = theList; - } - } - return returnList; - } - - private boolean preValidate(Set input) { - List noInputs = input.stream().filter(ms -> "".equals(ms.getInputFrom())) - .collect(Collectors.toList()); - return noInputs.size() == 1; - } - - private boolean postValidate(LinkedList microServices) { - for (int i = 1; i < microServices.size() - 1; i++) { - BlueprintMicroService prev = microServices.get(i - 1); - BlueprintMicroService current = microServices.get(i); - if (!current.getInputFrom().equals(prev.getName())) { - return false; - } - } - return true; - } - - private void insertNodeTemplateIntoChain(BlueprintMicroService microServicetoInsert, - LinkedList chainOfMicroServices) { - int insertIndex = 0; - for (int i = 0; i < chainOfMicroServices.size(); i++) { - BlueprintMicroService current = chainOfMicroServices.get(i); - if (microServicetoInsert.getName().equals(current.getInputFrom())) { - insertIndex = i; - break; - } else if (current.getName().equals(microServicetoInsert.getInputFrom())) { - insertIndex = i + 1; - break; - } - } - chainOfMicroServices.add(insertIndex, microServicetoInsert); - } -} diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java deleted file mode 100644 index aa1a6af71..000000000 --- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java +++ /dev/null @@ -1,219 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller.installer; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import org.apache.commons.io.IOUtils; -import org.codehaus.plexus.util.StringUtils; -import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException; -import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; -import org.onap.sdc.api.notification.IArtifactInfo; -import org.onap.sdc.api.notification.INotificationData; -import org.onap.sdc.api.notification.IResourceInstance; -import org.onap.sdc.api.results.IDistributionClientDownloadResult; -import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; -import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; -import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; - -/** - * CsarDescriptor that will be used to deploy file in CLAMP file system. Some - * methods can also be used to get some data from it. - */ -public class CsarHandler { - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarHandler.class); - private IArtifactInfo artifactElement; - private String csarFilePath; - private String controllerName; - private SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); - private ISdcCsarHelper sdcCsarHelper; - private Map mapOfBlueprints = new HashMap<>(); - public static final String CSAR_TYPE = "TOSCA_CSAR"; - public static final String BLUEPRINT_TYPE = "DCAE_INVENTORY_BLUEPRINT"; - private INotificationData sdcNotification; - public static final String RESOURCE_INSTANCE_NAME_PREFIX = "/Artifacts/Resources/"; - public static final String RESOURCE_INSTANCE_NAME_SUFFIX = "/Deployment/"; - public static final String POLICY_DEFINITION_NAME_SUFFIX = "Definitions/policies.yml"; - public static final String DATA_DEFINITION_NAME_SUFFIX = "Definitions/data.yml"; - public static final String DATA_DEFINITION_KEY = "data_types:"; - - /** - * Constructor for CsarHandler taking sdc notification in input. - */ - public CsarHandler(INotificationData data, String controller, String clampCsarPath) throws CsarHandlerException { - this.sdcNotification = data; - this.controllerName = controller; - this.artifactElement = searchForUniqueCsar(data); - this.csarFilePath = buildFilePathForCsar(artifactElement, clampCsarPath); - } - - private String buildFilePathForCsar(IArtifactInfo artifactElement, String clampCsarPath) { - return clampCsarPath + "/" + controllerName + "/" + artifactElement.getArtifactName(); - } - - private IArtifactInfo searchForUniqueCsar(INotificationData notificationData) throws CsarHandlerException { - List serviceArtifacts = notificationData.getServiceArtifacts(); - for (IArtifactInfo artifact : serviceArtifacts) { - if (artifact.getArtifactType().equals(CSAR_TYPE)) { - return artifact; - } - } - throw new CsarHandlerException("Unable to find a CSAR in the Sdc Notification"); - } - - /** - * This saves the notification to disk and database. - * - * @param resultArtifact The artifact to install - * @throws SdcArtifactInstallerException In case of issues with the installation - * @throws SdcToscaParserException In case of issues with the parsing of - * the CSAR - */ - public synchronized void save(IDistributionClientDownloadResult resultArtifact) - throws SdcArtifactInstallerException, SdcToscaParserException { - try { - logger.info("Writing CSAR file to: " + csarFilePath + " UUID " + artifactElement.getArtifactUUID() + ")"); - Path path = Paths.get(csarFilePath); - Files.createDirectories(path.getParent()); - // Create or replace the file - try (OutputStream out = Files.newOutputStream(path)) { - out.write(resultArtifact.getArtifactPayload(), 0, resultArtifact.getArtifactPayload().length); - } - sdcCsarHelper = factory.getSdcCsarHelper(csarFilePath); - this.loadDcaeBlueprint(); - } catch (IOException e) { - throw new SdcArtifactInstallerException( - "Exception caught when trying to write the CSAR on the file system to " + csarFilePath, e); - } - } - - private IResourceInstance searchForResourceByInstanceName(String blueprintResourceInstanceName) - throws SdcArtifactInstallerException { - for (IResourceInstance resource : this.sdcNotification.getResources()) { - String filteredString = resource.getResourceInstanceName().replaceAll("-", ""); - filteredString = filteredString.replaceAll(" ", ""); - if (filteredString.equalsIgnoreCase(blueprintResourceInstanceName)) { - return resource; - } - } - throw new SdcArtifactInstallerException("Error when searching for " + blueprintResourceInstanceName - + " as ResourceInstanceName in Sdc notification and did not find it"); - } - - private void loadDcaeBlueprint() throws IOException, SdcArtifactInstallerException { - try (ZipFile zipFile = new ZipFile(csarFilePath)) { - Enumeration entries = zipFile.entries(); - while (entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - if (!entry.isDirectory() && entry.getName().contains(BLUEPRINT_TYPE)) { - BlueprintArtifact blueprintArtifact = new BlueprintArtifact(); - blueprintArtifact.setBlueprintArtifactName( - entry.getName().substring(entry.getName().lastIndexOf('/') + 1, entry.getName().length())); - blueprintArtifact - .setBlueprintInvariantServiceUuid(this.getSdcNotification().getServiceInvariantUUID()); - try (InputStream stream = zipFile.getInputStream(entry)) { - blueprintArtifact.setDcaeBlueprint(IOUtils.toString(stream, StandardCharsets.UTF_8)); - } - blueprintArtifact.setResourceAttached(searchForResourceByInstanceName(entry.getName().substring( - entry.getName().indexOf(RESOURCE_INSTANCE_NAME_PREFIX) - + RESOURCE_INSTANCE_NAME_PREFIX.length(), - entry.getName().indexOf(RESOURCE_INSTANCE_NAME_SUFFIX)))); - this.mapOfBlueprints.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); - logger.info("Found a blueprint entry in the CSAR " + blueprintArtifact.getBlueprintArtifactName() - + " for resource instance Name " - + blueprintArtifact.getResourceAttached().getResourceInstanceName()); - } - } - logger.info(this.mapOfBlueprints.size() + " blueprint(s) will be converted to closed loop"); - } - } - - public IArtifactInfo getArtifactElement() { - return artifactElement; - } - - public String getFilePath() { - return csarFilePath; - } - - public String setFilePath(String newPath) { - return csarFilePath = newPath; - } - - public synchronized ISdcCsarHelper getSdcCsarHelper() { - return sdcCsarHelper; - } - - public INotificationData getSdcNotification() { - return sdcNotification; - } - - public Map getMapOfBlueprints() { - return mapOfBlueprints; - } - - /** - * Get the whole policy model Yaml. It combines the content of policies.yaml and - * data.yaml. - * - * @return The whole policy model yaml - * @throws IOException The IO Exception - */ - public Optional getPolicyModelYaml() throws IOException { - String result = null; - try (ZipFile zipFile = new ZipFile(csarFilePath)) { - ZipEntry entry = zipFile.getEntry(POLICY_DEFINITION_NAME_SUFFIX); - if (entry != null) { - ZipEntry data = zipFile.getEntry(DATA_DEFINITION_NAME_SUFFIX); - if (data != null) { - String dataStr = IOUtils.toString(zipFile.getInputStream(data), StandardCharsets.UTF_8); - String dataStrWithoutHeader = dataStr.substring(dataStr.indexOf(DATA_DEFINITION_KEY)); - String policyStr = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8); - StringUtils.chomp(policyStr); - result = policyStr.concat(dataStrWithoutHeader); - } else { - result = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8); - } - } else { - logger.info("Policy model not found inside the CSAR file: " + csarFilePath); - } - return Optional.ofNullable(result); - } - } -} diff --git a/src/main/java/org/onap/clamp/clds/service/CldsHealthcheckService.java b/src/main/java/org/onap/clamp/clds/service/CldsHealthcheckService.java deleted file mode 100644 index 3fceace55..000000000 --- a/src/main/java/org/onap/clamp/clds/service/CldsHealthcheckService.java +++ /dev/null @@ -1,81 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - */ - -package org.onap.clamp.clds.service; - -import java.util.Date; -import org.onap.clamp.clds.model.CldsHealthCheck; -import org.onap.clamp.clds.util.LoggingUtils; -import org.onap.clamp.clds.util.OnapLogConstants; -import org.onap.clamp.loop.LoopController; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.event.Level; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; - -/** - * Service to retrieve the Health Check of the clds application. - * - */ -@Component -public class CldsHealthcheckService { - - @Autowired - private LoopController loopController; - - protected static final Logger logger = LoggerFactory.getLogger(CldsHealthcheckService.class); - - /** - * REST service that retrieves clds healthcheck information. - * - * @return CldsHealthCheck class containing healthcheck info - */ - public CldsHealthCheck gethealthcheck() { - CldsHealthCheck cldsHealthCheck = new CldsHealthCheck(); - Date startTime = new Date(); - LoggingUtils util = new LoggingUtils(logger); - LoggingUtils.setRequestContext("CldsService: GET healthcheck", "Clamp-Health-Check"); - LoggingUtils.setTimeContext(startTime, new Date()); - try { - loopController.getLoopNames(); - cldsHealthCheck.setHealthCheckComponent("CLDS-APP"); - cldsHealthCheck.setHealthCheckStatus("UP"); - cldsHealthCheck.setDescription("OK"); - LoggingUtils.setResponseContext("0", "Get healthcheck success", - this.getClass().getName()); - util.exiting(HttpStatus.OK.value(), "Healthcheck success", Level.INFO, - OnapLogConstants.ResponseStatus.COMPLETE); - } catch (Exception e) { - logger.error("CLAMP application Heath check failed", e); - LoggingUtils.setResponseContext("999", "Get healthcheck failed", - this.getClass().getName()); - cldsHealthCheck.setHealthCheckComponent("CLDS-APP"); - cldsHealthCheck.setHealthCheckStatus("DOWN"); - cldsHealthCheck.setDescription("NOT-OK"); - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Healthcheck failed", Level.INFO, - OnapLogConstants.ResponseStatus.ERROR); - } - return cldsHealthCheck; - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/JsonEditorSchemaConstants.java b/src/main/java/org/onap/clamp/clds/tosca/JsonEditorSchemaConstants.java deleted file mode 100644 index e3c661698..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/JsonEditorSchemaConstants.java +++ /dev/null @@ -1,86 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca; - -public class JsonEditorSchemaConstants { - - //Data types in JSON Schema - public static final String TYPE_OBJECT = "object"; - public static final String TYPE_ARRAY = "array"; - public static final String TYPE_MAP = "map"; - public static final String TYPE_STRING = "string"; - public static final String TYPE_INTEGER = "integer"; - public static final String TYPE_DATE_TIME = "datetime"; - - //Key elements in JSON Schema - public static final String TYPE = "type"; - public static final String TITLE = "title"; - public static final String REQUIRED = "required"; - public static final String DEFAULT = "default"; - public static final String ENUM = "enum"; - public static final String ENUM_TITLES = "enum_titles"; - public static final String OPTIONS = "options"; - public static final String FORMAT = "format"; - public static final String ITEMS = "items"; - public static final String PROPERTIES = "properties"; - public static final String PROPERTY_ORDER = "propertyOrder"; - public static final String VALUES = "values"; - public static final String HEADER_TEMPLATE = "headerTemplate"; - public static final String HEADER_TEMPLATE_VALUE = "{{self.name}}"; - - public static final String MINIMUM = "minimum"; - public static final String MAXIMUM = "maximum"; - public static final String MIN_LENGTH = "minLength"; - public static final String MAX_LENGTH = "maxLength"; - public static final String EXCLUSIVE_MINIMUM = "exclusiveMinimum"; - public static final String EXCLUSIVE_MAXIMUM = "exclusiveMaximum"; - public static final String MINITEMS = "minItems"; - public static final String MAXITEMS = "maxItems"; - - public static final String CUSTOM_KEY_FORMAT = "format"; - public static final String CUSTOM_KEY_FORMAT_TABS_TOP = "tabs-top"; - public static final String CUSTOM_KEY_FORMAT_TABS = "tabs"; - public static final String CUSTOM_KEY_FORMAT_INPUT = "input"; - public static final String FORMAT_SELECT = "select"; - public static final String UNIQUE_ITEMS = "uniqueItems"; - public static final String TRUE = "true"; - public static final String QSSCHEMA = "qschema"; - public static final String TYPE_QBLDR = "qbldr"; - - public static final String ID = "id"; - public static final String LABEL = "label"; - public static final String OPERATORS = "operators"; - public static final String FILTERS = "filters"; - - public static final String SCHEMA = "schema"; - public static final String CURRENT_VALUES = "currentValues"; - - public static final String PLUGIN = "plugin"; - public static final String DATE_TIME_PICKER = "datetimepicker"; - public static final String VALIDATION = "validation"; - public static final String DATE_TIME_FORMAT = "YYYY/MM/DD HH:mm:ss"; - public static final String INPUT_EVENT = "input_event"; - public static final String DP_CHANGE = "dp.change"; - -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/ToscaSchemaConstants.java b/src/main/java/org/onap/clamp/clds/tosca/ToscaSchemaConstants.java deleted file mode 100644 index d00c431c8..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/ToscaSchemaConstants.java +++ /dev/null @@ -1,83 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca; - -public class ToscaSchemaConstants { - - // Data types in TOSCA Schema - public static final String TYPE_LIST = "list"; - public static final String TYPE_MAP = "map"; - public static final String TYPE_STRING = "string"; - public static final String TYPE_INTEGER = "integer"; - public static final String TYPE_NUMBER = "number"; - public static final String TYPE_DATE_TIME = "datetime"; - public static final String TYPE_FLOAT = "float"; - public static final String TYPE_BOOLEAN = "boolean"; - public static final String TYPE_USER_DEFINED = "userDefined"; - - // Key elements in Tosca - public static final String NODE_TYPES = "policy_types"; - public static final String DATA_TYPES = "data_types"; - public static final String TYPE = "type"; - public static final String DESCRIPTION = "description"; - public static final String DEFAULT = "default"; - public static final String PROPERTIES = "properties"; - public static final String REQUIRED = "required"; - public static final String ENTRY_SCHEMA = "entry_schema"; - - public static final String METADATA = "metadata"; - public static final String METADATA_POLICY_MODEL_TYPE = "policy_model_type"; - public static final String METADATA_ACRONYM = "acronym"; - public static final String METADATA_ELEMENT_NAME = "element_name"; - public static final String METADATA_HEADER_TEMPLATE = "header_template"; - public static final String METADATA_CLAMP_POSSIBLE_VALUES = "clamp_possible_values"; - - // Constraints - public static final String CONSTRAINTS = "constraints"; - public static final String VALID_VALUES = "valid_values"; - public static final String EQUAL = "equal"; - public static final String GREATER_THAN = "greater_than"; - public static final String GREATER_OR_EQUAL = "greater_or_equal"; - public static final String LESS_THAN = "less_than"; - public static final String LESS_OR_EQUAL = "less_or_equal"; - public static final String IN_RANGE = "in_range"; - public static final String LENGTH = "length"; - public static final String MIN_LENGTH = "min_length"; - public static final String MAX_LENGTH = "max_length"; - public static final String PATTERN = "pattern"; - - // Prefix for policy nodes - public static final String POLICY_NODE = "onap.policies."; - - // Prefix for data nodes - public static final String POLICY_DATA = "onap.datatypes."; - - // Prefix for dictionary elements - public static final String DICTIONARY = "Dictionary:"; - - // Custom Elements that must exist in the Tosca models - public static final String NAME = "name"; - public static final String CONTEXT = "context"; - -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertor.java b/src/main/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertor.java deleted file mode 100644 index 45bb87ed8..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertor.java +++ /dev/null @@ -1,780 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.stream.Collectors; -import org.json.JSONArray; -import org.json.JSONObject; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.tosca.Dictionary; -import org.onap.clamp.tosca.DictionaryElement; -import org.onap.clamp.tosca.DictionaryService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.yaml.snakeyaml.Yaml; - -/** - * Tosca Model Yaml parser and convertor to JSON Schema consumable for JSON - * Editor. - * - */ -@Component -public class ToscaYamlToJsonConvertor { - - @Autowired - private DictionaryService dictionaryService; - - @Autowired - private ClampProperties refProp; - - private int simpleTypeOrder = 1000; - private int complexTypeOrder = 10000; - private int complexSimpleTypeOrder = 1; - - private int incrementSimpleTypeOrder() { - return simpleTypeOrder++; - } - - private int incrementComplexTypeOrder() { - return complexTypeOrder = complexTypeOrder + 10000; - } - - private int incrementComplexSimpleTypeOrder() { - complexSimpleTypeOrder++; - return complexTypeOrder + complexSimpleTypeOrder; - } - - /** - * Parses Tosca YAML string and Converts to JsonObject. - * - * @param yamlString YAML string - * @return JsonObject - */ - public JsonObject validateAndConvertToJson(String yamlString) { - - Yaml yaml = new Yaml(); - LinkedHashMap loadedYaml = yaml.load(yamlString); - if (loadedYaml == null) { - return null; - } - - JSONObject jsonObject = new JSONObject(loadedYaml); - return new Gson().fromJson(jsonObject.toString(), JsonObject.class); - } - - /** - * return the values by looking up the key in the Toscsa JSON object. - * - * @param obj Tosca Json Object - * @param key the parameter key to look up - * @return the value for the provided key - */ - public String getValueFromMetadata(JsonObject obj, String key) { - JsonElement jsonElement = obj.get(ToscaSchemaConstants.NODE_TYPES); - if (jsonElement.isJsonObject()) { - Iterator> itr = - jsonElement.getAsJsonObject().entrySet().iterator(); - while (itr.hasNext()) { - Entry entry = itr.next(); - if (entry.getValue() != null && entry.getValue().isJsonObject() - && entry.getValue().getAsJsonObject().has(ToscaSchemaConstants.METADATA)) { - JsonObject metadatas = entry.getValue().getAsJsonObject() - .get(ToscaSchemaConstants.METADATA).getAsJsonObject(); - if (metadatas.has(key)) { - return metadatas.get(key).getAsString(); - } - } - } - } - return null; - } - - /** - * Parses Tosca YAML string. - * - * @param yamlString YAML string - * @param modelTypeToUse The model type that must be used to obtain the Json - * Schema - * @return JSON string - */ - public String parseToscaYaml(String yamlString, String modelTypeToUse) { - - Yaml yaml = new Yaml(); - LinkedHashMap loadedYaml = yaml.load(yamlString); - if (loadedYaml == null) { - return ""; - } - LinkedHashMap nodeTypes = new LinkedHashMap<>(); - LinkedHashMap dataNodes = new LinkedHashMap<>(); - JSONObject jsonParentObject = new JSONObject(); - JSONObject jsonTempObject = new JSONObject(); - parseNodeAndDataType(loadedYaml, nodeTypes, dataNodes); - populateJsonEditorObject(loadedYaml, nodeTypes, dataNodes, jsonParentObject, jsonTempObject, - modelTypeToUse); - - String headerTemplate = getValueFromMetadata(validateAndConvertToJson(yamlString), - ToscaSchemaConstants.METADATA_HEADER_TEMPLATE); - if (headerTemplate != null) { - jsonParentObject.put(JsonEditorSchemaConstants.HEADER_TEMPLATE, - JsonEditorSchemaConstants.HEADER_TEMPLATE_VALUE); - } - if (jsonTempObject.length() > 0) { - jsonParentObject = jsonTempObject; - } - JSONObject jsonEditorObject = new JSONObject(); - jsonEditorObject.put(JsonEditorSchemaConstants.SCHEMA, jsonParentObject); - return jsonEditorObject.toString(); - } - - // Parse node_type and data_type - @SuppressWarnings("unchecked") - private void parseNodeAndDataType(LinkedHashMap map, - LinkedHashMap nodeTypes, LinkedHashMap dataNodes) { - map.entrySet().stream().forEach(n -> { - if (n.getKey().contains(ToscaSchemaConstants.NODE_TYPES) - && n.getValue() instanceof Map) { - parseNodeAndDataType((LinkedHashMap) n.getValue(), nodeTypes, - dataNodes); - } else if (n.getKey().contains(ToscaSchemaConstants.DATA_TYPES) - && n.getValue() instanceof Map) { - parseNodeAndDataType((LinkedHashMap) n.getValue(), nodeTypes, - dataNodes); - } else if (n.getKey().contains(ToscaSchemaConstants.POLICY_NODE)) { - nodeTypes.put(n.getKey(), n.getValue()); - } else if (n.getKey().contains(ToscaSchemaConstants.POLICY_DATA)) { - dataNodes.put(n.getKey(), n.getValue()); - } - }); - } - - @SuppressWarnings("unchecked") - private void populateJsonEditorObject(LinkedHashMap map, - LinkedHashMap nodeTypes, LinkedHashMap dataNodes, - JSONObject jsonParentObject, JSONObject jsonTempObject, String modelTypeToUse) { - - Map jsonEntrySchema = new HashMap<>(); - jsonParentObject.put(JsonEditorSchemaConstants.TYPE, JsonEditorSchemaConstants.TYPE_OBJECT); - if (nodeTypes.get(modelTypeToUse) instanceof Map) { - ((LinkedHashMap) nodeTypes.get(modelTypeToUse)).entrySet() - .forEach(ntElement -> { - if (ntElement.getKey().equalsIgnoreCase(ToscaSchemaConstants.PROPERTIES)) { - JSONArray rootNodeArray = new JSONArray(); - if (ntElement.getValue() instanceof Map) { - ((LinkedHashMap) ntElement.getValue()).entrySet() - .forEach((ntPropertiesElement) -> { - boolean isListNode = false; - parseDescription( - (LinkedHashMap) ntPropertiesElement - .getValue(), - jsonParentObject); - LinkedHashMap parentPropertiesMap = - (LinkedHashMap) ntPropertiesElement - .getValue(); - if (parentPropertiesMap.containsKey(ToscaSchemaConstants.TYPE) - && ((String) parentPropertiesMap - .get(ToscaSchemaConstants.TYPE)) - .contains(ToscaSchemaConstants.TYPE_MAP) - && parentPropertiesMap - .containsKey(ToscaSchemaConstants.ENTRY_SCHEMA)) { - parentPropertiesMap = - (LinkedHashMap) parentPropertiesMap - .get(ToscaSchemaConstants.ENTRY_SCHEMA); - isListNode = true; - } - if (parentPropertiesMap.containsKey(ToscaSchemaConstants.TYPE) - && ((String) parentPropertiesMap - .get(ToscaSchemaConstants.TYPE)) - .contains(ToscaSchemaConstants.POLICY_DATA)) { - ((LinkedHashMap) dataNodes.get( - parentPropertiesMap.get(ToscaSchemaConstants.TYPE))) - .entrySet().stream().forEach(pmap -> { - if (pmap.getKey().equalsIgnoreCase( - ToscaSchemaConstants.PROPERTIES)) { - parseToscaProperties( - ToscaSchemaConstants.POLICY_NODE, - (LinkedHashMap) pmap - .getValue(), - jsonParentObject, rootNodeArray, - jsonEntrySchema, dataNodes, - incrementSimpleTypeOrder()); - } - }); - } - if (isListNode) { - jsonTempObject.put(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_ARRAY); - parseDescription( - (LinkedHashMap) ntPropertiesElement - .getValue(), - jsonTempObject); - jsonTempObject.put(JsonEditorSchemaConstants.ITEMS, - jsonParentObject); - jsonTempObject.put(JsonEditorSchemaConstants.FORMAT, - JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_TABS); - jsonTempObject.put(JsonEditorSchemaConstants.UNIQUE_ITEMS, - JsonEditorSchemaConstants.TRUE); - } - }); - } - } - }); - } - } - - @SuppressWarnings("unchecked") - private void parseToscaProperties(String parentKey, LinkedHashMap propertiesMap, - JSONObject jsonDataNode, JSONArray array, Map jsonEntrySchema, - LinkedHashMap dataNodes, final int order) { - JSONObject jsonPropertyNode = new JSONObject(); - propertiesMap.entrySet().stream().forEach(p -> { - // Populate JSON Array for "required" key - - if (p.getValue() instanceof Map) { - LinkedHashMap nodeMap = - (LinkedHashMap) p.getValue(); - if (nodeMap.containsKey(ToscaSchemaConstants.REQUIRED) - && ((boolean) nodeMap.get(ToscaSchemaConstants.REQUIRED))) { - array.put(p.getKey()); - } - // if(nodeMap.containsKey(ToscaSchemaConstants.CONSTRAINTS)) - parseToscaChildNodeMap(p.getKey(), nodeMap, jsonPropertyNode, jsonEntrySchema, - dataNodes, array, incrementSimpleTypeOrder()); - } - }); - jsonDataNode.put(JsonEditorSchemaConstants.REQUIRED, array); - jsonDataNode.put(JsonEditorSchemaConstants.PROPERTIES, jsonPropertyNode); - } - - @SuppressWarnings("unchecked") - private void parseToscaPropertiesForType(String parentKey, - LinkedHashMap propertiesMap, JSONObject jsonDataNode, JSONArray array, - Map jsonEntrySchema, LinkedHashMap dataNodes, - boolean isType, int order) { - JSONObject jsonPropertyNode = new JSONObject(); - - propertiesMap.entrySet().stream().forEach(p -> { - // array.put(p.getKey()); - boolean overWriteArray = false; - if (p.getValue() instanceof Map) { - LinkedHashMap nodeMap = - (LinkedHashMap) p.getValue(); - if (!(parentKey.contains(ToscaSchemaConstants.ENTRY_SCHEMA) - || parentKey.contains(ToscaSchemaConstants.POLICY_NODE)) - && nodeMap.containsKey(ToscaSchemaConstants.TYPE) - && (((String) nodeMap.get(ToscaSchemaConstants.TYPE)) - .contains(ToscaSchemaConstants.POLICY_DATA))) { - overWriteArray = true; - } - if (nodeMap.containsKey(ToscaSchemaConstants.REQUIRED) - && ((boolean) nodeMap.get(ToscaSchemaConstants.REQUIRED))) { - array.put(p.getKey()); - } - parseToscaChildNodeMap(p.getKey(), nodeMap, jsonPropertyNode, jsonEntrySchema, - dataNodes, array, order); - } - }); - jsonDataNode.put(JsonEditorSchemaConstants.REQUIRED, array); - jsonDataNode.put(JsonEditorSchemaConstants.PROPERTIES, jsonPropertyNode); - } - - private void parseToscaChildNodeMap(String childObjectKey, - LinkedHashMap childNodeMap, JSONObject jsonPropertyNode, - Map jsonEntrySchema, LinkedHashMap dataNodes, - JSONArray array, int order) { - JSONObject childObject = new JSONObject(); - // JSONArray childArray = new JSONArray(); - parseDescription(childNodeMap, childObject); - parseTypes(childObjectKey, childNodeMap, childObject, jsonEntrySchema, dataNodes, array, - order); - parseConstraints(childNodeMap, childObject); - parseMetadataPossibleValues(childNodeMap, childObject); - parseEntrySchema(childNodeMap, childObject, jsonPropertyNode, jsonEntrySchema, dataNodes); - - jsonPropertyNode.put(childObjectKey, childObject); - order++; - - } - - private void parseEntrySchema(LinkedHashMap childNodeMap, - JSONObject childObject, JSONObject jsonPropertyNode, - Map jsonEntrySchema, LinkedHashMap dataNodes) { - if (childNodeMap.get(ToscaSchemaConstants.ENTRY_SCHEMA) != null) { - if (childNodeMap.get(ToscaSchemaConstants.ENTRY_SCHEMA) instanceof Map) { - LinkedHashMap entrySchemaMap = - (LinkedHashMap) childNodeMap - .get(ToscaSchemaConstants.ENTRY_SCHEMA); - entrySchemaMap.entrySet().stream().forEach(entry -> { - if (entry.getKey().equalsIgnoreCase(ToscaSchemaConstants.TYPE) - && entry.getValue() != null) { - String entrySchemaType = (String) entry.getValue(); - if (entrySchemaType.contains(ToscaSchemaConstants.POLICY_DATA)) { - JSONArray array = new JSONArray(); - if (jsonEntrySchema.get(entrySchemaType) != null) { - // Already traversed - JSONObject entrySchemaObject = jsonEntrySchema.get(entrySchemaType); - attachEntrySchemaJsonObject(childObject, entrySchemaObject, - JsonEditorSchemaConstants.TYPE_OBJECT); - } else if (dataNodes.containsKey(entrySchemaType)) { - - JSONObject entrySchemaObject = new JSONObject(); - // Need to traverse - ((LinkedHashMap) dataNodes.get(entrySchemaType)) - .entrySet().stream().forEach(pmap -> { - if (pmap.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.PROPERTIES)) { - parseToscaProperties(ToscaSchemaConstants.ENTRY_SCHEMA, - (LinkedHashMap) pmap.getValue(), - entrySchemaObject, array, jsonEntrySchema, - dataNodes, incrementComplexTypeOrder()); - jsonEntrySchema.put(entrySchemaType, entrySchemaObject); - dataNodes.remove(entrySchemaType); - attachEntrySchemaJsonObject(childObject, - entrySchemaObject, - JsonEditorSchemaConstants.TYPE_OBJECT); - } - - }); - } - } else if (entrySchemaType - .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING) - || entrySchemaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER) - || entrySchemaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_FLOAT)) { - JSONObject entrySchemaObject = new JSONObject(); - parseConstraints(entrySchemaMap, entrySchemaObject); - parseMetadataPossibleValues(entrySchemaMap, entrySchemaObject); - String jsontype = JsonEditorSchemaConstants.TYPE_STRING; - if (entrySchemaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER) - || entrySchemaType - .equalsIgnoreCase(ToscaSchemaConstants.TYPE_FLOAT)) { - jsontype = JsonEditorSchemaConstants.TYPE_INTEGER; - } - if (childNodeMap.get(ToscaSchemaConstants.TYPE) != null) { - // Only known value of type is String for now - if (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) { - String typeValue = - (String) childNodeMap.get(ToscaSchemaConstants.TYPE); - if (typeValue - .equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { - // Custom key for JSON Editor and UI rendering - childObject.put(JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT, - JsonEditorSchemaConstants.FORMAT_SELECT); - // childObject.put(JsonEditorSchemaConstants.UNIQUE_ITEMS, - // JsonEditorSchemaConstants.TRUE); - } - } - } - attachEntrySchemaJsonObject(childObject, entrySchemaObject, jsontype); - } - } - }); - } - } - } - - private void attachEntrySchemaJsonObject(JSONObject childObject, JSONObject entrySchemaObject, - String dataType) { - - entrySchemaObject.put(JsonEditorSchemaConstants.TYPE, dataType); - childObject.put(JsonEditorSchemaConstants.ITEMS, entrySchemaObject); - } - - @SuppressWarnings("unchecked") - private void attachTypeJsonObject(JSONObject childObject, JSONObject typeObject) { - Iterator keys = typeObject.keys(); - while (keys.hasNext()) { - String key = keys.next(); - childObject.put(key, typeObject.get(key)); - } - } - - /* - * private String parseKey(String toscaKey, String lookupString) { return - * toscaKey.substring(toscaKey.indexOf(lookupString) + lookupString.length(), - * toscaKey.length()); } - */ - - private void parseDescription(LinkedHashMap childNodeMap, - JSONObject childObject) { - if (childNodeMap.get(ToscaSchemaConstants.DESCRIPTION) != null) { - childObject.put(JsonEditorSchemaConstants.TITLE, - childNodeMap.get(ToscaSchemaConstants.DESCRIPTION)); - } - } - - private void parseTypes(String childObjectKey, LinkedHashMap childNodeMap, - JSONObject childObject, Map jsonEntrySchema, - LinkedHashMap dataNodes, JSONArray array, int order) { - if (childNodeMap.get(ToscaSchemaConstants.TYPE) != null) { - // Only known value of type is String for now - if (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) { - childObject.put(JsonEditorSchemaConstants.PROPERTY_ORDER, order); - String typeValue = (String) childNodeMap.get(ToscaSchemaConstants.TYPE); - if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER)) { - childObject.put(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_INTEGER); - - } else if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_FLOAT)) { - childObject.put(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_INTEGER); - } else if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { - childObject.put(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_ARRAY); - // Custom key for JSON Editor and UI rendering - childObject.put(JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT, - JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_TABS_TOP); - childObject.put(JsonEditorSchemaConstants.UNIQUE_ITEMS, - JsonEditorSchemaConstants.TRUE); - } else if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP)) { - childObject.put(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_OBJECT); - } else if (typeValue.contains(ToscaSchemaConstants.POLICY_DATA)) { - JSONArray childArray = new JSONArray(); - - if (jsonEntrySchema.get(typeValue) != null) { - // Already traversed - JSONObject entrySchemaObject = jsonEntrySchema.get(typeValue); - attachTypeJsonObject(childObject, entrySchemaObject); - } else if (dataNodes.containsKey(typeValue)) { - JSONObject entrySchemaObject = new JSONObject(); - // Need to traverse - JSONArray jsonArray = new JSONArray(); - ((LinkedHashMap) dataNodes.get(typeValue)).entrySet() - .stream().forEach(pmap -> { - if (pmap.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.PROPERTIES)) { - parseToscaPropertiesForType(childObjectKey, - (LinkedHashMap) pmap.getValue(), - entrySchemaObject, childArray, jsonEntrySchema, dataNodes, - true, incrementComplexSimpleTypeOrder()); - jsonEntrySchema.put(typeValue, entrySchemaObject); - dataNodes.remove(typeValue); - attachTypeJsonObject(childObject, entrySchemaObject); - } - }); - } - } else { - childObject.put(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_STRING); - } - } - if (childNodeMap.get(ToscaSchemaConstants.DEFAULT) != null) { - childObject.put(JsonEditorSchemaConstants.DEFAULT, - childNodeMap.get(ToscaSchemaConstants.DEFAULT)); - } - } - } - - private void parseConstraints(LinkedHashMap childNodeMap, - JSONObject childObject) { - if (childNodeMap.containsKey(ToscaSchemaConstants.CONSTRAINTS) - && childNodeMap.get(ToscaSchemaConstants.CONSTRAINTS) != null) { - List> constraintsList = - (List>) childNodeMap - .get(ToscaSchemaConstants.CONSTRAINTS); - constraintsList.stream().forEach(c -> { - if (c instanceof Map) { - c.entrySet().stream().forEach(constraint -> { - if (constraint.getKey().equalsIgnoreCase(ToscaSchemaConstants.MIN_LENGTH) - || constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.GREATER_OR_EQUAL)) { - // For String min_lenghth is minimum length whereas for number, it will - // be - // minimum or greater than to the defined value - if (childNodeMap.containsKey(ToscaSchemaConstants.TYPE) - && (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) - && ((String) childNodeMap.get(ToscaSchemaConstants.TYPE)) - .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { - childObject.put(JsonEditorSchemaConstants.MIN_LENGTH, - constraint.getValue()); - } else { - childObject.put(JsonEditorSchemaConstants.MINIMUM, - constraint.getValue()); - } - } else if (constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.MAX_LENGTH) - || constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.LESS_OR_EQUAL)) { - // For String max_lenghth is maximum length whereas for number, it will - // be - // maximum or less than the defined value - if (childNodeMap.containsKey(ToscaSchemaConstants.TYPE) - && (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) - && ((String) childNodeMap.get(ToscaSchemaConstants.TYPE)) - .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { - childObject.put(JsonEditorSchemaConstants.MAX_LENGTH, - constraint.getValue()); - } else { - childObject.put(JsonEditorSchemaConstants.MAXIMUM, - constraint.getValue()); - } - } else if (constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.LESS_THAN)) { - childObject.put(JsonEditorSchemaConstants.EXCLUSIVE_MAXIMUM, - constraint.getValue()); - } else if (constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.GREATER_THAN)) { - childObject.put(JsonEditorSchemaConstants.EXCLUSIVE_MINIMUM, - constraint.getValue()); - } else if (constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.IN_RANGE)) { - if (constraint.getValue() instanceof ArrayList) { - if (childNodeMap.containsKey(ToscaSchemaConstants.TYPE) - && (childNodeMap - .get(ToscaSchemaConstants.TYPE) instanceof String) - && ((String) childNodeMap.get(ToscaSchemaConstants.TYPE)) - .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { - childObject.put(JsonEditorSchemaConstants.MIN_LENGTH, - ((ArrayList) constraint.getValue()).get(0)); - childObject.put(JsonEditorSchemaConstants.MAX_LENGTH, - ((ArrayList) constraint.getValue()).get(1)); - } else { - childObject.put(JsonEditorSchemaConstants.MINIMUM, - ((ArrayList) constraint.getValue()).get(0)); - childObject.put(JsonEditorSchemaConstants.MAXIMUM, - ((ArrayList) constraint.getValue()).get(1)); - } - - } - } else if (constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.VALID_VALUES)) { - JSONArray validValuesArray = new JSONArray(); - - if (constraint.getValue() instanceof ArrayList) { - boolean processDictionary = - ((ArrayList) constraint.getValue()).stream().anyMatch( - value -> (value instanceof String && ((String) value) - .contains(ToscaSchemaConstants.DICTIONARY))); - if (!processDictionary) { - ((ArrayList) constraint.getValue()).stream() - .forEach(value -> { - validValuesArray.put(value); - }); - childObject.put(JsonEditorSchemaConstants.ENUM, - validValuesArray); - } else { - ((ArrayList) constraint.getValue()).stream() - .forEach(value -> { - if ((value instanceof String && ((String) value) - .contains(ToscaSchemaConstants.DICTIONARY))) { - processDictionaryElements(childObject, - (String) value); - } - - }); - - } - } - - } - }); - } - }); - } - } - - private void parseMetadataPossibleValues(LinkedHashMap childNodeMap, - JSONObject childObject) { - if (childNodeMap.containsKey(ToscaSchemaConstants.METADATA) - && childNodeMap.get(ToscaSchemaConstants.METADATA) != null) { - LinkedHashMap metadataMap = - (LinkedHashMap) childNodeMap.get(ToscaSchemaConstants.METADATA); - if (metadataMap instanceof Map) { - metadataMap.entrySet().stream().forEach(constraint -> { - if (constraint.getKey() - .equalsIgnoreCase(ToscaSchemaConstants.METADATA_CLAMP_POSSIBLE_VALUES)) { - JSONArray validValuesArray = new JSONArray(); - - if (constraint.getValue() instanceof ArrayList) { - boolean processDictionary = ((ArrayList) constraint.getValue()) - .stream().anyMatch(value -> (value instanceof String - && ((String) value).contains(ToscaSchemaConstants.DICTIONARY))); - if (processDictionary) { - ((ArrayList) constraint.getValue()).stream().forEach(value -> { - if ((value instanceof String && ((String) value) - .contains(ToscaSchemaConstants.DICTIONARY))) { - processDictionaryElements(childObject, (String) value); - } - - }); - - } - } - - } - }); - } - } - } - - private void processDictionaryElements(JSONObject childObject, String dictionaryReference) { - if (dictionaryReference.contains("#")) { - String[] dictionaryKeyArray = dictionaryReference - .substring(dictionaryReference.indexOf(ToscaSchemaConstants.DICTIONARY) + 11, - dictionaryReference.length()) - .split("#"); - // We support only one # as of now. - List cldsDictionaryElements = null; - List subDictionaryElements = null; - if (dictionaryKeyArray != null && dictionaryKeyArray.length == 2) { - cldsDictionaryElements = dictionaryService.getDictionary(dictionaryKeyArray[0]) - .getDictionaryElements().stream().collect(Collectors.toList()); - subDictionaryElements = dictionaryService.getDictionary(dictionaryKeyArray[1]) - .getDictionaryElements().stream().collect(Collectors.toList()); - - if (cldsDictionaryElements != null) { - List subCldsDictionaryNames = subDictionaryElements.stream() - .map(DictionaryElement::getShortName).collect(Collectors.toList()); - JSONArray jsonArray = new JSONArray(); - - Optional.ofNullable(cldsDictionaryElements).get().stream().forEach(c -> { - JSONObject jsonObject = new JSONObject(); - if (c.getSubDictionary() != null) { - Dictionary subDictionary = - dictionaryService.getDictionary(c.getSubDictionary()); - if (subDictionary != null - && !subDictionary.getDictionaryElements().isEmpty()) { - - jsonObject.put(JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_INPUT, - JsonEditorSchemaConstants.FORMAT_SELECT); - - List shortNames = new ArrayList<>(); - subDictionary.getDictionaryElements().stream().forEach(c1 -> { - shortNames.add(c1.getShortName()); - }); - jsonObject.put(JsonEditorSchemaConstants.VALUES, shortNames); - } - } - jsonObject.put(JsonEditorSchemaConstants.TYPE, getJsonType(c.getType())); - - if (c.getType() != null - && (c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING) - || c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME) - || c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP))) { - jsonObject.put(JsonEditorSchemaConstants.MIN_LENGTH, 1); - - if (c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME)) { - jsonObject.put(JsonEditorSchemaConstants.PLUGIN, - JsonEditorSchemaConstants.DATE_TIME_PICKER); - jsonObject.put(JsonEditorSchemaConstants.INPUT_EVENT, - JsonEditorSchemaConstants.DP_CHANGE); - JSONObject formatJsonObject = new JSONObject(); - formatJsonObject.put(JsonEditorSchemaConstants.FORMAT, - JsonEditorSchemaConstants.DATE_TIME_FORMAT); - jsonObject.put(JsonEditorSchemaConstants.VALIDATION, - formatJsonObject); - } - } - - jsonObject.put(JsonEditorSchemaConstants.ID, c.getName()); - jsonObject.put(JsonEditorSchemaConstants.LABEL, c.getShortName()); - jsonObject.put(JsonEditorSchemaConstants.OPERATORS, subCldsDictionaryNames); - jsonArray.put(jsonObject); - });; - JSONObject filterObject = new JSONObject(); - filterObject.put(JsonEditorSchemaConstants.FILTERS, jsonArray); - - childObject.put(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_QBLDR); - // TO invoke validation on such parameters - childObject.put(JsonEditorSchemaConstants.MIN_LENGTH, 1); - childObject.put(JsonEditorSchemaConstants.QSSCHEMA, filterObject); - - } - } - } else { - String dictionaryKey = dictionaryReference.substring( - dictionaryReference.indexOf(ToscaSchemaConstants.DICTIONARY) + 11, - dictionaryReference.length()); - - if (dictionaryKey != null) { - if (dictionaryKey.contains(ToscaSchemaConstants.TYPE_USER_DEFINED)) { - childObject.put(JsonEditorSchemaConstants.ENUM, new ArrayList<>()); - // Add Enum titles for generated translated values during - // JSON instance generation - JSONObject enumTitles = new JSONObject(); - enumTitles.put(JsonEditorSchemaConstants.ENUM_TITLES, new ArrayList<>()); - childObject.put(JsonEditorSchemaConstants.OPTIONS, enumTitles); - } else { - List cldsDictionaryElements = - dictionaryService.getDictionary(dictionaryKey).getDictionaryElements() - .stream().collect(Collectors.toList()); - if (cldsDictionaryElements != null) { - List cldsDictionaryNames = new ArrayList<>(); - List cldsDictionaryFullNames = new ArrayList<>(); - cldsDictionaryElements.stream().forEach(c -> { - // Json type will be translated before Policy creation - if (c.getType() != null && !c.getType().equalsIgnoreCase("json")) { - cldsDictionaryFullNames.add(c.getName()); - } - cldsDictionaryNames.add(c.getShortName()); - }); - - if (!cldsDictionaryFullNames.isEmpty()) { - childObject.put(JsonEditorSchemaConstants.ENUM, - cldsDictionaryFullNames); - // Add Enum titles for generated translated values during JSON instance - // generation - JSONObject enumTitles = new JSONObject(); - enumTitles.put(JsonEditorSchemaConstants.ENUM_TITLES, - cldsDictionaryNames); - childObject.put(JsonEditorSchemaConstants.OPTIONS, enumTitles); - } else { - childObject.put(JsonEditorSchemaConstants.ENUM, cldsDictionaryNames); - } - - } - } - } - } - } - - private String getJsonType(String toscaType) { - String jsonType = null; - if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER) - || toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_NUMBER)) { - jsonType = JsonEditorSchemaConstants.TYPE_INTEGER; - } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME)) { - jsonType = JsonEditorSchemaConstants.TYPE_DATE_TIME; - } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { - jsonType = JsonEditorSchemaConstants.TYPE_ARRAY; - } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP)) { - jsonType = JsonEditorSchemaConstants.TYPE_MAP; - } else { - jsonType = JsonEditorSchemaConstants.TYPE_STRING; - } - return jsonType; - } - -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java b/src/main/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java deleted file mode 100644 index 5832986a1..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java +++ /dev/null @@ -1,98 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import java.io.IOException; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParser; -import org.onap.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParserWithDictionarySupport; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateManager; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.service.Service; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class ToscaConverterWithDictionarySupport { - - private static final EELFLogger logger = - EELFManager.getInstance().getLogger(ToscaConverterWithDictionarySupport.class); - - private ClampProperties clampProperties; - private ToscaMetadataParser metadataParser; - - /** - * Constructor with Spring support. - * - * @param clampProperties Clamp Spring properties - * @param metadataParser Metadata parser - */ - @Autowired - public ToscaConverterWithDictionarySupport(ClampProperties clampProperties, - ToscaMetadataParserWithDictionarySupport metadataParser) { - this.clampProperties = clampProperties; - this.metadataParser = metadataParser; - } - - /** - * This method converts a tosca file to a json schema. - * It uses some parameters specified in the application.properties. - * - * @param toscaFile The tosca file as String - * @param policyTypeToDecode The policy type to decode - * @param serviceModel The service model associated so that the clamp enrichment could be done if required by - * the tosca model - * @return A json object being a json schema - */ - public JsonObject convertToscaToJsonSchemaObject(String toscaFile, String policyTypeToDecode, - Service serviceModel) { - try { - return new JsonTemplateManager(toscaFile, - clampProperties.getFileContent("tosca.converter.default.datatypes"), - clampProperties.getFileContent("tosca.converter.json.schema.templates")) - .getJsonSchemaForPolicyType(policyTypeToDecode, Boolean.parseBoolean(clampProperties.getStringValue( - "tosca.converter.dictionary.support.enabled")) ? metadataParser : null, serviceModel); - } catch (IOException | UnknownComponentException e) { - logger.error("Unable to convert the tosca properly, exception caught during the decoding", - e); - return new JsonObject(); - } - } - - /** - * This method converts a tosca file to a json schema. - * It uses some parameters specified in the application.properties. - * - * @param toscaFile The tosca file as String - * @param policyTypeToDecode The policy type to decode - * @param serviceModel The service Model so that clamp enrichment could be done if required by tosca model - * @return A String containing the json schema - */ - public String convertToscaToJsonSchemaString(String toscaFile, String policyTypeToDecode, Service serviceModel) { - return JsonUtils.GSON.toJson(this.convertToscaToJsonSchemaObject(toscaFile, policyTypeToDecode, serviceModel)); - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java b/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java deleted file mode 100644 index e30f9158b..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java +++ /dev/null @@ -1,34 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -public class UnknownComponentException extends Exception { - public UnknownComponentException(String nameEntry) { - this.getWrongName(nameEntry); - } - - public String getWrongName(String nameEntry) { - return "Unknown Component: " + nameEntry; - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/elements/ArrayField.java b/src/main/java/org/onap/clamp/clds/tosca/update/elements/ArrayField.java deleted file mode 100644 index 83f792f3f..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/elements/ArrayField.java +++ /dev/null @@ -1,72 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.elements; - -import com.google.gson.JsonArray; -import java.util.ArrayList; - -public class ArrayField { - - private ArrayList complexFields; - - /** - * Constructor from arraryList. - * - * @param arrayProperties the array properties - */ - public ArrayField(ArrayList arrayProperties) { - this.complexFields = arrayProperties; - } - - /** - * Each LinkedHashMap is parsed to extract the Array and each of its value. They are casted for the JsonObject. - * - * @return JsonArray - */ - public JsonArray deploy() { - - JsonArray subPropertyValuesArray = new JsonArray(); - for (Object arrayElement : complexFields) { - //Cast for each Primitive Type - String typeValue = arrayElement.getClass().getSimpleName(); - switch (typeValue) { - case "String": - subPropertyValuesArray.add((String) arrayElement); - break; - case "Boolean": - subPropertyValuesArray.add((Boolean) arrayElement); - break; - case "Double": - subPropertyValuesArray.add((Number) arrayElement); - break; - case "Integer": - subPropertyValuesArray.add((Number) arrayElement); - break; - default: - break; - } - } - return subPropertyValuesArray; - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/elements/Constraint.java b/src/main/java/org/onap/clamp/clds/tosca/update/elements/Constraint.java deleted file mode 100644 index d6bd355e3..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/elements/Constraint.java +++ /dev/null @@ -1,222 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.elements; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.Map.Entry; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplate; - -public class Constraint { - - private LinkedHashMap constraints; - private JsonTemplate jsonTemplate; - - public Constraint(LinkedHashMap constraints, JsonTemplate jsonTemplate) { - this.jsonTemplate = jsonTemplate; - this.constraints = constraints; - } - - /** - * Deploy the linkedhashmap which contains the constraints, to extract them one to one. - * - * @param jsonSchema The json Schema - * @param typeProperty The ype property - * @return the json object - */ - public JsonObject deployConstraints(JsonObject jsonSchema, String typeProperty) { - for (Entry constraint : constraints.entrySet()) { - this.parseConstraint(jsonSchema, constraint.getKey(), constraint.getValue(), typeProperty); - } - return jsonSchema; - } - - /** - * Each case of Tosca constraints below parse specifically the field in the JsonObject. - * - * @param jsonSchema Json Schema - * @param nameConstraint Name constraint - * @param valueConstraint value constraint - * @param typeProperty Type Property - */ - @SuppressWarnings("unchecked") - public void parseConstraint(JsonObject jsonSchema, String nameConstraint, Object valueConstraint, - String typeProperty) { - switch (nameConstraint) { - case "equal": - checkTemplateField("const", jsonSchema, valueConstraint); - break; - case "greater_than": - checkTemplateField("exclusiveMinimum", jsonSchema, valueConstraint); - break; - case "greater_or_equal": - checkTemplateField("minimum", jsonSchema, valueConstraint); - break; - case "less_than": - checkTemplateField("exclusiveMaximum", jsonSchema, valueConstraint); - break; - case "less_or_equal": - checkTemplateField("maximum", jsonSchema, valueConstraint); - break; - case "in_range": - ArrayList limitValues = (ArrayList) valueConstraint; - checkTemplateField("minimum", jsonSchema, limitValues.get(0)); - checkTemplateField("maximum", jsonSchema, limitValues.get(1)); - break; - case "pattern": - jsonSchema.addProperty(nameConstraint, (String) valueConstraint); - break; - case "length": - this.getSpecificLength(jsonSchema, valueConstraint, typeProperty); - break; - case "min_length": - String[] prefixValues = nameConstraint.split("_"); - this.getLimitValue(jsonSchema, valueConstraint, typeProperty, prefixValues[0]); - break; - case "max_length": - String[] maxtab = nameConstraint.split("_"); - this.getLimitValue(jsonSchema, valueConstraint, typeProperty, maxtab[0]); - break; - default://valid_value - this.getValueArray(jsonSchema, valueConstraint, typeProperty); - break; - } - - } - - /** - * To be done. - * - * @param jsonSchema json schema - * @param fieldValue field value - * @param typeProperty For the complex components, get a specific number of items/properties - */ - public void getSpecificLength(JsonObject jsonSchema, Object fieldValue, String typeProperty) { - switch (typeProperty.toLowerCase()) { - case "string": - checkTemplateField("minLength", jsonSchema, fieldValue); - checkTemplateField("maxLength", jsonSchema, fieldValue); - break; - case "array": - if (fieldValue.equals(1) && jsonTemplate.hasFields("uniqueItems")) { - jsonSchema.addProperty("uniqueItems", true); - } else { - checkTemplateField("minItems", jsonSchema, fieldValue); - checkTemplateField("maxItems", jsonSchema, fieldValue); - } - break; - default:// Map && List - checkTemplateField("minProperties", jsonSchema, fieldValue); - checkTemplateField("maxProperties", jsonSchema, fieldValue); - break; - } - - } - - /** - * To be done. - * - * @param jsonSchema json schema - * @param fieldValue field value - * @param typeProperty type property - * @param side Get the limits fieldValue for the properties : depend of the type of the component - */ - public void getLimitValue(JsonObject jsonSchema, Object fieldValue, String typeProperty, String side) { - switch (typeProperty) { - case "string": - if (side.equals("min")) { - checkTemplateField("minLength", jsonSchema, fieldValue); - } else { - checkTemplateField("maxLength", jsonSchema, fieldValue); - } - break; - default:// Array - if (side.equals("min")) { - checkTemplateField("minItems", jsonSchema, fieldValue); - } else { - checkTemplateField("maxItems", jsonSchema, fieldValue); - } - break; - } - - } - - /** - * To be done. - * - * @param jsonSchema Json schema - * @param fieldValue field value - * @param typeProperty Get as Enum the valid values for the property - */ - public void getValueArray(JsonObject jsonSchema, Object fieldValue, String typeProperty) { - if (jsonTemplate.hasFields("enum")) { - JsonArray enumeration = new JsonArray(); - if (typeProperty.equals("string") || typeProperty.equals("String")) { - ArrayList arrayValues = (ArrayList) fieldValue; - for (String arrayItem : arrayValues) { - enumeration.add(arrayItem); - } - jsonSchema.add("enum", enumeration); - } else { - ArrayList arrayValues = (ArrayList) fieldValue; - for (Number arrayItem : arrayValues) { - enumeration.add(arrayItem); - } - jsonSchema.add("enum", enumeration); - } - } - } - - /** - * To be done. - * - * @param field Field - * @param jsonSchema Json schema - * @param fieldValue Simple way to avoid code duplication - */ - public void checkTemplateField(String field, JsonObject jsonSchema, Object fieldValue) { - if (jsonTemplate.hasFields(field)) { - String typeField = fieldValue.getClass().getSimpleName(); - switch (typeField) { - case "String": - jsonSchema.addProperty(field, (String) fieldValue); - break; - case "Integer": - jsonSchema.addProperty(field, (Integer) fieldValue); - break; - case "Number": - jsonSchema.addProperty(field, (Number) fieldValue); - break; - case "Boolean": - jsonSchema.addProperty(field, (Boolean) fieldValue); - break; - default: - break; - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElement.java b/src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElement.java deleted file mode 100644 index 9035a5806..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElement.java +++ /dev/null @@ -1,121 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.elements; - -import java.util.ArrayList; -import java.util.LinkedHashMap; - -public class ToscaElement { - - /** - * name parameter is used as "key", in the LinkedHashMap of Components. - */ - private String name; - private String derivedFrom; - private String version; - private String typeVersion; - private String description; - private LinkedHashMap properties; - - public ToscaElement() { - } - - /** - * Constructor. - * - * @param name name - * @param derivedFrom derivedFrom - * @param description description - */ - @SuppressWarnings({"unchecked", "rawtypes"}) - public ToscaElement(String name, String derivedFrom, String description) { - super(); - this.name = name; - this.derivedFrom = derivedFrom; - this.description = description; - this.properties = new LinkedHashMap(); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDerivedFrom() { - return derivedFrom; - } - - public void setDerivedFrom(String derivedFrom) { - this.derivedFrom = derivedFrom; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public String getTypeVersion() { - return typeVersion; - } - - public void setTypeVersion(String typeVersion) { - this.typeVersion = typeVersion; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public LinkedHashMap getProperties() { - return properties; - } - - public void setProperties(LinkedHashMap properties) { - this.properties = properties; - } - - public void addProperties(ToscaElementProperty toscaElementProperty) { - this.properties.put(toscaElementProperty.getName(), toscaElementProperty); - } - - public ArrayList propertiesNames() { - return new ArrayList<>(properties.keySet()); - } - - @Override - public String toString() { - return name + ": " + description + ", version: " + version + ", nb de properties: " + properties.size() - + System.getProperty("line.separator") + propertiesNames(); - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElementProperty.java b/src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElementProperty.java deleted file mode 100644 index c5ab5a18e..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/elements/ToscaElementProperty.java +++ /dev/null @@ -1,135 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.elements; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplate; - -public class ToscaElementProperty { - - /** - * name parameter is used as "key", in the LinkedHashMap of Components. - */ - private String name; - private LinkedHashMap items; - - /** - * Constructor. - * - * @param name the name - * @param items the items - */ - public ToscaElementProperty(String name, LinkedHashMap items) { - super(); - this.name = name; - this.items = items; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public LinkedHashMap getItems() { - return items; - } - - public void setItems(LinkedHashMap items) { - this.items = items; - } - - /** - * For each primitive value, requires to get each field Value and cast it and add it in a Json. - * - * @param fieldsContent field - * @param fieldName field - * @param value value - */ - public void addFieldToJson(JsonObject fieldsContent, String fieldName, Object value) { - if (value != null) { - String typeValue = value.getClass().getSimpleName(); - switch (typeValue) { - case "String": - fieldsContent.addProperty(fieldName, (String) value); - break; - case "Boolean": - fieldsContent.addProperty(fieldName, (Boolean) value); - break; - case "Double": - fieldsContent.addProperty(fieldName, (Number) value); - break; - case "Integer": - fieldsContent.addProperty(fieldName, (Integer) value); - break; - default: - fieldsContent.add(fieldName, parseArray((ArrayList) value)); - break; - } - } - } - - /** - * If a field value is an Array, create an Instance of ArrayField to insert if in the JsonObject. - * - * @param arrayProperties array pro - * @return a json array - */ - public JsonArray parseArray(ArrayList arrayProperties) { - JsonArray arrayContent = new JsonArray(); - ArrayList arrayComponent = new ArrayList<>(); - for (Object itemArray : arrayProperties) { - arrayComponent.add(itemArray); - } - ArrayField af = new ArrayField(arrayComponent); - arrayContent = af.deploy(); - return arrayContent; - } - - /** - * Create an instance of Constraint, to extract the values and add it to the Json (according to the type - * * of the current property). - * - * @param json a json - * @param constraints constraints - * @param jsonTemplate template - */ - @SuppressWarnings("unchecked") - public void addConstraintsAsJson(JsonObject json, ArrayList constraints, JsonTemplate jsonTemplate) { - for (Object constraint : constraints) { - if (constraint instanceof LinkedHashMap) { - LinkedHashMap valueConstraint = (LinkedHashMap) constraint; - Constraint constraintParser = new Constraint(valueConstraint, jsonTemplate); - constraintParser.deployConstraints(json, (String) getItems().get("type")); - } - } - - } - -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java b/src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java deleted file mode 100644 index 885e755bd..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java +++ /dev/null @@ -1,76 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.execution; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.PostConstruct; -import org.onap.clamp.clds.tosca.update.execution.cds.ToscaMetadataCdsProcess; -import org.onap.clamp.clds.tosca.update.execution.target.ToscaMetadataTargetProcess; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.tosca.DictionaryService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * This class is used to execute a code based on a key found in the metadata section. - */ -@Component -public class ToscaMetadataExecutor { - - private static final EELFLogger logger = - EELFManager.getInstance().getLogger(ToscaMetadataExecutor.class); - - @Autowired - private DictionaryService dictionaryService; - - private Map mapOfProcesses = new HashMap<>(); - - /** - * This method executes the required process specified in processInfo. - * - * @param processInfo A String containing the process to execute, like "cds/param1:value1/param2:value2" - * @param childObject The jsonObject - * @param serviceModel The service model associated to do clamp enrichment - */ - public void executeTheProcess(String processInfo, JsonObject childObject, Service serviceModel) { - String[] processParameters = (processInfo + "/ ").split("/"); - logger.info("Executing the Tosca clamp process " + processParameters[0] + " with parameters " - + processParameters[1].trim()); - mapOfProcesses.get(processParameters[0].trim()) - .executeProcess(processParameters[1].trim(), childObject, serviceModel); - } - - /** - * Init method. - */ - @PostConstruct - public void init() { - mapOfProcesses.put("CDS", new ToscaMetadataCdsProcess()); - mapOfProcesses.put("CSAR_RESOURCES", new ToscaMetadataTargetProcess()); - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java b/src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java deleted file mode 100644 index 214eadb03..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java +++ /dev/null @@ -1,43 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.execution; - -import com.google.gson.JsonObject; -import org.onap.clamp.loop.service.Service; - -/** - * This code is the interface that must be implemented to have a tosca process. - */ -public abstract class ToscaMetadataProcess { - - /** - * This method add some elements to the JsonObject childObject passed in argument. - * The process can take multiple parameters in arguments. - * - * @param parameters The parameters required by the process - * @param childObject The Json Object modified by the current process - * @param serviceModel The service model associated to do clamp enrichment - */ - public abstract void executeProcess(String parameters, JsonObject childObject, Service serviceModel); -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java b/src/main/java/org/onap/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java deleted file mode 100644 index 39fa25a2b..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java +++ /dev/null @@ -1,220 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.execution.cds; - -import static org.onap.clamp.clds.tosca.ToscaSchemaConstants.TYPE; -import static org.onap.clamp.clds.tosca.ToscaSchemaConstants.TYPE_LIST; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import java.util.Map; -import java.util.Set; -import org.onap.clamp.clds.tosca.update.execution.ToscaMetadataProcess; -import org.onap.clamp.loop.service.Service; - -/** - * This class is there to add the JsonObject for CDS in the json Schema according to what is found in the Tosca model. - */ -public class ToscaMetadataCdsProcess extends ToscaMetadataProcess { - - @Override - public void executeProcess(String parameters, JsonObject childObject, Service serviceModel) { - switch (parameters) { - case "actor": - JsonArray jsonArray = new JsonArray(); - jsonArray.add("CDS"); - addToJsonArray(childObject, "enum", jsonArray); - break; - case "payload": - generatePayload(childObject, serviceModel); - break; - case "operation": - generateOperation(childObject, serviceModel); - break; - default: - } - } - - private static void generatePayload(JsonObject childObject, Service serviceModel) { - JsonArray schemaAnyOf = new JsonArray(); - schemaAnyOf.addAll(createBlankEntry()); - schemaAnyOf.addAll(generatePayloadPerResource("VF", serviceModel)); - schemaAnyOf.addAll(generatePayloadPerResource("PNF", serviceModel)); - addToJsonArray(childObject, "anyOf", schemaAnyOf); - } - - private static void generateOperation(JsonObject childObject, Service serviceModel) { - generateOperationPerResource(childObject, "VF", serviceModel); - generateOperationPerResource(childObject, "PNF", serviceModel); - } - - private static void generateOperationPerResource(JsonObject childObject, String resourceName, - Service serviceModel) { - JsonArray schemaEnum = new JsonArray(); - JsonArray schemaTitle = new JsonArray(); - for (Map.Entry entry : serviceModel.getResourceDetails().getAsJsonObject(resourceName) - .entrySet()) { - JsonObject controllerProperties = entry.getValue().getAsJsonObject() - .getAsJsonObject("controllerProperties"); - if (controllerProperties != null && controllerProperties.getAsJsonObject("workflows") != null) { - for (String workflowsEntry : controllerProperties.getAsJsonObject("workflows").keySet()) { - schemaEnum.add(workflowsEntry); - schemaTitle.add(workflowsEntry + " (CDS operation)"); - } - } - } - addToJsonArray(childObject, "enum", schemaEnum); - if (childObject.get("options") == null) { - JsonObject optionsSection = new JsonObject(); - childObject.add("options", optionsSection); - } - addToJsonArray(childObject.getAsJsonObject("options"), "enum_titles", schemaTitle); - - } - - private static JsonArray generatePayloadPerResource(String resourceName, - Service serviceModel) { - JsonArray schemaAnyOf = new JsonArray(); - - for (Map.Entry entry : serviceModel.getResourceDetails().getAsJsonObject(resourceName) - .entrySet()) { - JsonObject controllerProperties = entry.getValue().getAsJsonObject() - .getAsJsonObject("controllerProperties"); - if (controllerProperties != null && controllerProperties.getAsJsonObject("workflows") != null) { - for (Map.Entry workflowsEntry : controllerProperties.getAsJsonObject("workflows") - .entrySet()) { - JsonObject obj = new JsonObject(); - obj.addProperty("title", workflowsEntry.getKey()); - obj.add("properties", - createInputPropertiesForPayload(workflowsEntry.getValue().getAsJsonObject(), - controllerProperties, - workflowsEntry.getKey())); - schemaAnyOf.add(obj); - } - } - } - return schemaAnyOf; - } - - private static JsonArray createBlankEntry() { - JsonArray result = new JsonArray(); - JsonObject blankObject = new JsonObject(); - blankObject.addProperty("title", "User defined"); - blankObject.add("properties", new JsonObject()); - result.add(blankObject); - return result; - } - - private static JsonObject createAnyOfJsonProperty(String name, - String defaultValue, - boolean readOnlyFlag) { - JsonObject result = new JsonObject(); - result.addProperty("title", name); - result.addProperty("type", "string"); - result.addProperty("default", defaultValue); - result.addProperty("readOnly", readOnlyFlag); - return result; - } - - private static void addToJsonArray(JsonObject childObject, String section, JsonArray value) { - if (childObject.getAsJsonArray(section) != null) { - childObject.getAsJsonArray(section).addAll(value); - } else { - childObject.add(section, value); - } - } - - /** - * Returns the properties of payload based on the cds work flows. - * - * @param workFlow cds work flows to update payload - * @param controllerProperties cds properties to get blueprint name and - * version - * @param workFlowName work flow name - * @return returns the properties of payload - */ - public static JsonObject createInputPropertiesForPayload(JsonObject workFlow, - JsonObject controllerProperties, - String workFlowName) { - String artifactName = controllerProperties.get("sdnc_model_name").getAsString(); - String artifactVersion = controllerProperties.get("sdnc_model_version").getAsString(); - JsonObject inputs = workFlow.getAsJsonObject("inputs"); - JsonObject jsonObject = new JsonObject(); - jsonObject.add("artifact_name", createAnyOfJsonProperty( - "artifact name", artifactName, true)); - jsonObject.add("artifact_version", createAnyOfJsonProperty( - "artifact version", artifactVersion, true)); - jsonObject.add("mode", createAnyOfJsonProperty( - "mode", "async", false)); - jsonObject.add("data", createDataProperty(inputs, workFlowName)); - return jsonObject; - } - - private static JsonObject createDataProperty(JsonObject inputs, String workFlowName) { - JsonObject data = new JsonObject(); - data.addProperty("title", "data"); - data.addProperty("type", "string"); - data.addProperty("format", "textarea"); - JsonObject defaultValue = new JsonObject(); - addDefaultValueForData(inputs, defaultValue, workFlowName); - data.addProperty("default", defaultValue.toString()); - return data; - } - - private static void addDefaultValueForData(JsonObject inputs, - JsonObject defaultValue, - String workFlowName) { - Set> entrySet = inputs.entrySet(); - for (Map.Entry entry : entrySet) { - String key = entry.getKey(); - JsonObject inputProperty = inputs.getAsJsonObject(key); - if (key.equalsIgnoreCase(workFlowName + "-properties")) { - addDefaultValueForData(entry.getValue().getAsJsonObject().get("properties") - .getAsJsonObject(), defaultValue, workFlowName); - } else if ("object".equalsIgnoreCase(inputProperty.get(TYPE).getAsString())) { - JsonObject object = new JsonObject(); - addDefaultValueForData(entry.getValue().getAsJsonObject().get("properties") - .getAsJsonObject(), object, workFlowName); - defaultValue.add(entry.getKey(), object); - } else if (TYPE_LIST.equalsIgnoreCase(inputProperty.get(TYPE).getAsString())) { - defaultValue.add(entry.getKey(), handleListType(entry.getValue().getAsJsonObject(), workFlowName)); - } else { - defaultValue.addProperty(entry.getKey(), ""); - } - } - } - - private static JsonArray handleListType(JsonObject inputs, - String workFlowName) { - - JsonObject object = new JsonObject(); - if (inputs.get("properties") != null) { - addDefaultValueForData(inputs.get("properties").getAsJsonObject(), object, workFlowName); - } - JsonArray arr = new JsonArray(); - arr.add(object); - return arr; - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java b/src/main/java/org/onap/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java deleted file mode 100644 index 8b8fa1784..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java +++ /dev/null @@ -1,40 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.execution.target; - -import com.google.gson.JsonObject; -import org.onap.clamp.clds.tosca.update.execution.ToscaMetadataProcess; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.policy.operational.OperationalPolicyRepresentationBuilder; - -/** - * This class is there to add the JsonObject for CDS in the json Schema according to what is found in the Tosca model. - */ -public class ToscaMetadataTargetProcess extends ToscaMetadataProcess { - - @Override - public void executeProcess(String parameters, JsonObject childObject, Service serviceModel) { - childObject.add("anyOf", OperationalPolicyRepresentationBuilder.createAnyOfArray(serviceModel, false)); - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java b/src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java deleted file mode 100644 index d23dc79ec..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java +++ /dev/null @@ -1,343 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.parser; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map.Entry; -import org.onap.clamp.clds.tosca.update.elements.ToscaElement; -import org.onap.clamp.clds.tosca.update.elements.ToscaElementProperty; -import org.onap.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParser; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplate; -import org.onap.clamp.loop.service.Service; - -public class ToscaConverterToJsonSchema { - private LinkedHashMap components; - private LinkedHashMap templates; - - private ToscaMetadataParser metadataParser; - - private Service serviceModel; - - /** - * Constructor. - * - * @param toscaElementsMap All the tosca elements found (policy type + data types + native tosca datatypes) - * @param jsonSchemaTemplates All Json schema templates to use - * @param metadataParser The metadata parser to use for metadata section - * @param serviceModel The service model for clamp enrichment - */ - public ToscaConverterToJsonSchema(LinkedHashMap toscaElementsMap, - LinkedHashMap jsonSchemaTemplates, - ToscaMetadataParser metadataParser, Service serviceModel) { - this.components = toscaElementsMap; - this.templates = jsonSchemaTemplates; - this.metadataParser = metadataParser; - this.serviceModel = serviceModel; - } - - /** - * For a given component, launch process to parse it in Json. - * - * @param toscaElementKey name components - * @return return - */ - public JsonObject getJsonSchemaOfToscaElement(String toscaElementKey) { - return this.getFieldAsObject(getToscaElement(toscaElementKey)); - } - - /** - * Return the classical/general fields of the component, & launch the properties deployment. - * - * @param toscaElement the compo - * @return a json object - */ - public JsonObject getFieldAsObject(ToscaElement toscaElement) { - - JsonObject globalFields = new JsonObject(); - if (templates.get("object").hasFields("title")) { - globalFields.addProperty("title", toscaElement.getName()); - } - if (templates.get("object").hasFields("type")) { - globalFields.addProperty("type", "object"); - } - if (templates.get("object").hasFields("description")) { - if (toscaElement.getDescription() != null) { - globalFields.addProperty("description", toscaElement.getDescription()); - } - } - if (templates.get("object").hasFields("required")) { - globalFields.add("required", this.getRequirements(toscaElement.getName())); - } - if (templates.get("object").hasFields("properties")) { - globalFields.add("properties", this.deploy(toscaElement.getName())); - } - return globalFields; - } - - /** - * Get the required properties of the Component, including the parents properties requirements. - * - * @param nameComponent name component - * @return a json array - */ - public JsonArray getRequirements(String nameComponent) { - JsonArray requirements = new JsonArray(); - ToscaElement toParse = components.get(nameComponent); - //Check for a father component, and launch the same process - if (!toParse.getDerivedFrom().equals("tosca.datatypes.Root") - && !toParse.getDerivedFrom().equals("tosca.policies.Root")) { - requirements.addAll(getRequirements(toParse.getDerivedFrom())); - } - //Each property is checked, and add to the requirement array if it's required - Collection properties = toParse.getProperties().values(); - for (ToscaElementProperty toscaElementProperty : properties) { - if (toscaElementProperty.getItems().containsKey("required") - && toscaElementProperty.getItems().get("required").equals(true)) { - requirements.add(toscaElementProperty.getName()); - } - } - return requirements; - } - - /** - * The beginning of the recursive process. Get the parents (or not) to launch the same process, and otherwise - * deploy and parse the properties. - * - * @param nameComponent name component - * @return a json object - */ - public JsonObject deploy(String nameComponent) { - JsonObject jsonSchema = new JsonObject(); - ToscaElement toParse = components.get(nameComponent); - //Check for a father component, and launch the same process - if (!toParse.getDerivedFrom().equals("tosca.datatypes.Root") - && !toParse.getDerivedFrom().equals("tosca.policies.Root")) { - jsonSchema = this.getParent(toParse.getDerivedFrom()); - } - //For each component property, check if its a complex properties (a component) or not. In that case, - //launch the analyse of the property. - for (Entry property : toParse.getProperties().entrySet()) { - if (getToscaElement((String) property.getValue().getItems().get("type")) != null) { - jsonSchema.add(property.getValue().getName(), - this.getJsonSchemaOfToscaElement((String) property.getValue().getItems().get("type"))); - } else { - jsonSchema.add(property.getValue().getName(), this.complexParse(property.getValue())); - } - } - return jsonSchema; - } - - /** - * If a component has a parent, it is deploy in the same way. - * - * @param nameComponent name component - * @return a json object - */ - public JsonObject getParent(String nameComponent) { - return deploy(nameComponent); - } - - /** - * to be done. - * - * @param toscaElementProperty property - * @return a json object - */ - @SuppressWarnings("unchecked") - public JsonObject complexParse(ToscaElementProperty toscaElementProperty) { - JsonObject propertiesInJson = new JsonObject(); - JsonTemplate currentPropertyJsonTemplate; - String typeProperty = (String) toscaElementProperty.getItems().get("type"); - if (typeProperty.toLowerCase().equals("list") || typeProperty.toLowerCase().equals("map")) { - currentPropertyJsonTemplate = templates.get("object"); - } else { - String propertyType = (String) toscaElementProperty.getItems().get("type"); - currentPropertyJsonTemplate = templates.get(propertyType.toLowerCase()); - } - //Each "special" field is analysed, and has a specific treatment - for (String propertyField : toscaElementProperty.getItems().keySet()) { - switch (propertyField) { - case "type": - if (currentPropertyJsonTemplate.hasFields(propertyField)) { - String fieldtype = (String) toscaElementProperty.getItems().get(propertyField); - switch (fieldtype.toLowerCase()) { - case "list": - propertiesInJson.addProperty("type", "array"); - break; - case "map": - propertiesInJson.addProperty("type", "object"); - break; - case "scalar-unit.time": - case "scalar-unit.frequency": - case "scalar-unit.size": - propertiesInJson.addProperty("type", "string"); - break; - case "timestamp": - propertiesInJson.addProperty("type", "string"); - propertiesInJson.addProperty("format", "date-time"); - break; - case "float": - propertiesInJson.addProperty("type", "number"); - break; - case "range": - propertiesInJson.addProperty("type", "integer"); - if (!checkConstraintPresence(toscaElementProperty, "greater_than") - && currentPropertyJsonTemplate.hasFields("exclusiveMinimum")) { - propertiesInJson.addProperty("exclusiveMinimum", false); - } - if (!checkConstraintPresence(toscaElementProperty, "less_than") - && currentPropertyJsonTemplate.hasFields("exclusiveMaximum")) { - propertiesInJson.addProperty("exclusiveMaximum", false); - } - break; - default: - propertiesInJson.addProperty("type", currentPropertyJsonTemplate.getName()); - break; - } - } - break; - case "metadata": - if (metadataParser != null) { - metadataParser.processAllMetadataElement(toscaElementProperty, serviceModel).entrySet() - .forEach((jsonEntry) -> { - propertiesInJson.add(jsonEntry.getKey(), - jsonEntry.getValue()); - - }); - } - break; - case "constraints": - toscaElementProperty.addConstraintsAsJson(propertiesInJson, - (ArrayList) toscaElementProperty.getItems().get("constraints"), - currentPropertyJsonTemplate); - break; - case "entry_schema": - //Here, a way to check if entry is a component (datatype) or a simple string - if (getToscaElement(this.extractSpecificFieldFromMap(toscaElementProperty, "entry_schema")) - != null) { - String nameComponent = this.extractSpecificFieldFromMap(toscaElementProperty, "entry_schema"); - ToscaConverterToJsonSchema child = new ToscaConverterToJsonSchema(components, templates, - metadataParser, serviceModel); - JsonObject propertiesContainer = new JsonObject(); - - switch ((String) toscaElementProperty.getItems().get("type")) { - case "map": // Get it as an object - JsonObject componentAsProperty = child.getJsonSchemaOfToscaElement(nameComponent); - propertiesContainer.add(nameComponent, componentAsProperty); - if (currentPropertyJsonTemplate.hasFields("properties")) { - propertiesInJson.add("properties", propertiesContainer); - } - break; - default://list : get it as an Array - JsonObject componentAsItem = child.getJsonSchemaOfToscaElement(nameComponent); - if (currentPropertyJsonTemplate.hasFields("properties")) { - propertiesInJson.add("items", componentAsItem); - propertiesInJson.addProperty("format", "tabs-top"); - } - break; - } - - } else if (toscaElementProperty.getItems().get("type").equals("list")) { - // Native cases - JsonObject itemContainer = new JsonObject(); - String valueInEntrySchema = - this.extractSpecificFieldFromMap(toscaElementProperty, "entry_schema"); - itemContainer.addProperty("type", valueInEntrySchema); - propertiesInJson.add("items", itemContainer); - propertiesInJson.addProperty("format", "tabs-top"); - } - // MAP Case, for now nothing - - break; - default: - //Each classical field : type, description, default.. - if (currentPropertyJsonTemplate.hasFields(propertyField) && !propertyField.equals("required")) { - toscaElementProperty.addFieldToJson(propertiesInJson, propertyField, - toscaElementProperty.getItems().get(propertyField)); - } - break; - } - } - return propertiesInJson; - } - - /** - * Look for a matching Component for the name parameter, in the components list. - * - * @param name the tosca element name to search for - * @return a tosca element - */ - public ToscaElement getToscaElement(String name) { - ToscaElement correspondingToscaElement = null; - if (components == null) { - return null; - } - for (ToscaElement toscaElement : components.values()) { - if (toscaElement.getName().equals(name)) { - correspondingToscaElement = toscaElement; - } - } - return correspondingToscaElement; - } - - /** - * Simple method to extract quickly a type field from particular property item. - * - * @param toscaElementProperty the property - * @param fieldName the fieldname - * @return a string - */ - @SuppressWarnings("unchecked") - public String extractSpecificFieldFromMap(ToscaElementProperty toscaElementProperty, String fieldName) { - LinkedHashMap entrySchemaFields = - (LinkedHashMap) toscaElementProperty.getItems().get(fieldName); - return entrySchemaFields.get("type"); - } - - /** - * Check if a constraint, for a specific property, is there. - * - * @param toscaElementProperty property - * @param nameConstraint name constraint - * @return a flag boolean - */ - public boolean checkConstraintPresence(ToscaElementProperty toscaElementProperty, String nameConstraint) { - boolean presentConstraint = false; - if (toscaElementProperty.getItems().containsKey("constraints")) { - ArrayList constraints = (ArrayList) toscaElementProperty.getItems().get("constraints"); - for (Object constraint : constraints) { - if (constraint instanceof LinkedHashMap) { - if (((LinkedHashMap) constraint).containsKey(nameConstraint)) { - presentConstraint = true; - } - } - } - } - return presentConstraint; - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaElementParser.java b/src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaElementParser.java deleted file mode 100644 index 090fcfcfa..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/parser/ToscaElementParser.java +++ /dev/null @@ -1,103 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.parser; - -import java.util.LinkedHashMap; -import java.util.Map.Entry; -import org.onap.clamp.clds.tosca.update.elements.ToscaElement; -import org.onap.clamp.clds.tosca.update.elements.ToscaElementProperty; -import org.yaml.snakeyaml.Yaml; - -public class ToscaElementParser { - /** - * Constructor. - */ - private ToscaElementParser() { - } - - private static LinkedHashMap searchAllDataTypesAndPolicyTypes(String toscaYaml) { - LinkedHashMap> file = - (LinkedHashMap>) new Yaml().load(toscaYaml); - LinkedHashMap allDataTypesFound = file.get("data_types"); - LinkedHashMap allPolicyTypesFound = file.get("policy_types"); - LinkedHashMap allItemsFound = new LinkedHashMap<>(); - // Put the policies and datatypes in the same collection - allItemsFound = (allDataTypesFound == null) ? (new LinkedHashMap<>()) : allDataTypesFound; - allItemsFound.putAll(allPolicyTypesFound == null ? new LinkedHashMap<>() : allPolicyTypesFound); - return allItemsFound; - } - - private static LinkedHashMap searchAllNativeToscaDataTypes(String toscaNativeYaml) { - return ((LinkedHashMap>) new Yaml().load(toscaNativeYaml)) - .get("data_types"); - } - - /** - * Yaml Parse gets raw policies and datatypes, in different sections : necessary to extract - * all entities and put them at the same level. - * - * @param toscaYaml the tosca model content - * @param nativeToscaYaml the tosca native datatype content - * @return a map of Tosca Element containing all tosca elements found (policy types and datatypes) - */ - public static LinkedHashMap searchAllToscaElements(String toscaYaml, - String nativeToscaYaml) { - LinkedHashMap allItemsFound = searchAllDataTypesAndPolicyTypes(toscaYaml); - allItemsFound.putAll(searchAllNativeToscaDataTypes(nativeToscaYaml)); - return parseAllItemsFound(allItemsFound); - } - - /** - * With all the component, get as Map, Components and Components properties are created. - * - * @param allMaps maps - */ - private static LinkedHashMap parseAllItemsFound(LinkedHashMap allMaps) { - LinkedHashMap allItemsFound = new LinkedHashMap(); - //Component creations, from the file maps - for (Entry itemToParse : allMaps.entrySet()) { - LinkedHashMap componentBody = (LinkedHashMap) itemToParse.getValue(); - ToscaElement toscaElement = - new ToscaElement(itemToParse.getKey(), (String) componentBody.get("derived_from"), - (String) componentBody.get("description")); - //If policy, version and type_version : - if (componentBody.get("type_version") != null) { - toscaElement.setVersion((String) componentBody.get("type_version")); - toscaElement.setTypeVersion((String) componentBody.get("type_version")); - } - //Properties creation, from the map - if (componentBody.get("properties") != null) { - LinkedHashMap properties = - (LinkedHashMap) componentBody.get("properties"); - for (Entry itemToProperty : properties.entrySet()) { - ToscaElementProperty toscaElementProperty = new ToscaElementProperty(itemToProperty.getKey(), - (LinkedHashMap) itemToProperty.getValue()); - toscaElement.addProperties(toscaElementProperty); - } - } - allItemsFound.put(toscaElement.getName(), toscaElement); - } - return allItemsFound; - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java b/src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java deleted file mode 100644 index f4a48139e..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java +++ /dev/null @@ -1,32 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.parser.metadata; - -import com.google.gson.JsonObject; -import org.onap.clamp.clds.tosca.update.elements.ToscaElementProperty; -import org.onap.clamp.loop.service.Service; - -public interface ToscaMetadataParser { - JsonObject processAllMetadataElement(ToscaElementProperty toscaElementProperty, Service serviceModel); -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java b/src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java deleted file mode 100644 index 3fdd192d6..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java +++ /dev/null @@ -1,211 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.parser.metadata; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Optional; -import org.onap.clamp.clds.tosca.JsonEditorSchemaConstants; -import org.onap.clamp.clds.tosca.ToscaSchemaConstants; -import org.onap.clamp.clds.tosca.update.elements.ToscaElementProperty; -import org.onap.clamp.clds.tosca.update.execution.ToscaMetadataExecutor; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.tosca.DictionaryElement; -import org.onap.clamp.tosca.DictionaryService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class ToscaMetadataParserWithDictionarySupport implements ToscaMetadataParser { - - @Autowired - private ToscaMetadataExecutor toscaMetadataExecutor; - - @Autowired - private DictionaryService dictionaryService; - - /** - * This method is used to start the processing of the metadata field. - * - * @param toscaElementProperty The property metadata as Json Object - * @return The jsonObject structure that must be added to the json schema - */ - public JsonObject processAllMetadataElement(ToscaElementProperty toscaElementProperty, Service serviceModel) { - if (dictionaryService != null) { - return parseMetadataPossibleValues(toscaElementProperty.getItems(), dictionaryService, serviceModel, - toscaMetadataExecutor); - } else { - return null; - } - } - - private static JsonObject parseMetadataPossibleValues(LinkedHashMap childNodeMap, - DictionaryService dictionaryService, Service serviceModel, - ToscaMetadataExecutor toscaMetadataExecutor) { - JsonObject childObject = new JsonObject(); - if (childNodeMap.containsKey(ToscaSchemaConstants.METADATA) - && childNodeMap.get(ToscaSchemaConstants.METADATA) != null) { - ((LinkedHashMap) childNodeMap.get(ToscaSchemaConstants.METADATA)).forEach((key, - value) -> { - if (key.equalsIgnoreCase(ToscaSchemaConstants.METADATA_CLAMP_POSSIBLE_VALUES)) { - String[] multipleValues = ((String) value).split(","); - for (String multipleValue : multipleValues) { - if (multipleValue.contains(ToscaSchemaConstants.DICTIONARY)) { - processDictionaryElements(multipleValue, childObject, dictionaryService); - } - if (multipleValue.contains("ClampExecution:")) { - executeClampProcess(multipleValue.replaceAll("ClampExecution:", ""), childObject, - serviceModel, toscaMetadataExecutor); - } - } - - } - }); - } - return childObject; - } - - private static void executeClampProcess(String processInfo, JsonObject childObject, Service serviceModel, - ToscaMetadataExecutor toscaMetadataExecutor) { - toscaMetadataExecutor.executeTheProcess(processInfo, childObject, serviceModel); - } - - /** - * For dictionary with multiple levels (defined by #). - * - * @param dictionaryKeyArray the array containing the different elements - * @param childObject the structure getting the new entries - * @param dictionaryService the dictionary service bean - */ - private static void processComplexDictionaryElements(String[] dictionaryKeyArray, JsonObject childObject, - DictionaryService dictionaryService) { - // We support only one # as of now. - List dictionaryElements = null; - if (dictionaryKeyArray.length == 2) { - dictionaryElements = new ArrayList<>(dictionaryService.getDictionary(dictionaryKeyArray[0]) - .getDictionaryElements()); - JsonArray subDictionaryNames = new JsonArray(); - new ArrayList(dictionaryService.getDictionary(dictionaryKeyArray[1]) - .getDictionaryElements()).forEach(elem -> subDictionaryNames.add(elem.getShortName())); - - JsonArray jsonArray = new JsonArray(); - - Optional.of(dictionaryElements).get().forEach(c -> { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty(JsonEditorSchemaConstants.TYPE, getJsonType(c.getType())); - if (c.getType() != null - && c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { - jsonObject.addProperty(JsonEditorSchemaConstants.MIN_LENGTH, 1); - - } - jsonObject.addProperty(JsonEditorSchemaConstants.ID, c.getName()); - jsonObject.addProperty(JsonEditorSchemaConstants.LABEL, c.getShortName()); - jsonObject.add(JsonEditorSchemaConstants.OPERATORS, subDictionaryNames); - jsonArray.add(jsonObject); - }); - - JsonObject filterObject = new JsonObject(); - filterObject.add(JsonEditorSchemaConstants.FILTERS, jsonArray); - - childObject.addProperty(JsonEditorSchemaConstants.TYPE, - JsonEditorSchemaConstants.TYPE_QBLDR); - // TO invoke validation on such parameters - childObject.addProperty(JsonEditorSchemaConstants.MIN_LENGTH, 1); - childObject.add(JsonEditorSchemaConstants.QSSCHEMA, filterObject); - - } - } - - /** - * For dictionary with single entry. - * - * @param dictionaryKeyArray the array containing the different elements - * @param childObject the structure getting the new entries - * @param dictionaryService the dictionary service bean - */ - private static void processSimpleDictionaryElements(String[] dictionaryKeyArray, JsonObject childObject, - DictionaryService dictionaryService) { - JsonArray dictionaryNames = new JsonArray(); - JsonArray dictionaryFullNames = new JsonArray(); - dictionaryService.getDictionary(dictionaryKeyArray[0]).getDictionaryElements().forEach(c -> { - // Json type will be translated before Policy creation - if (c.getType() != null && !c.getType().equalsIgnoreCase("json")) { - dictionaryFullNames.add(c.getName()); - } - dictionaryNames.add(c.getShortName()); - }); - - if (dictionaryFullNames.size() > 0) { - if (childObject.get(JsonEditorSchemaConstants.ENUM) != null) { - childObject.get(JsonEditorSchemaConstants.ENUM).getAsJsonArray().add(dictionaryFullNames); - } else { - childObject.add(JsonEditorSchemaConstants.ENUM, dictionaryFullNames); - } - // Add Enum titles for generated translated values during JSON instance - // generation - JsonObject enumTitles = new JsonObject(); - enumTitles.add(JsonEditorSchemaConstants.ENUM_TITLES, dictionaryNames); - if (childObject.get(JsonEditorSchemaConstants.OPTIONS) != null) { - childObject.get(JsonEditorSchemaConstants.OPTIONS).getAsJsonArray().add(enumTitles); - } else { - childObject.add(JsonEditorSchemaConstants.OPTIONS, enumTitles); - } - - } else { - if (childObject.get(JsonEditorSchemaConstants.ENUM) != null) { - childObject.get(JsonEditorSchemaConstants.ENUM).getAsJsonArray().add(dictionaryNames); - } else { - childObject.add(JsonEditorSchemaConstants.ENUM, dictionaryNames); - } - } - } - - private static void processDictionaryElements(String dictionaryReference, JsonObject childObject, - DictionaryService dictionaryService) { - String[] dictionaryKeyArray = - dictionaryReference.substring(dictionaryReference.indexOf(ToscaSchemaConstants.DICTIONARY) + 11, - dictionaryReference.length()).split("#"); - if (dictionaryKeyArray.length > 1) { - processComplexDictionaryElements(dictionaryKeyArray, childObject, dictionaryService); - } else { - processSimpleDictionaryElements(dictionaryKeyArray, childObject, dictionaryService); - } - } - - private static String getJsonType(String toscaType) { - String jsonType = null; - if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER)) { - jsonType = JsonEditorSchemaConstants.TYPE_INTEGER; - } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { - jsonType = JsonEditorSchemaConstants.TYPE_ARRAY; - } else { - jsonType = JsonEditorSchemaConstants.TYPE_STRING; - } - return jsonType; - } - -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplate.java b/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplate.java deleted file mode 100644 index 0b7a9a171..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplate.java +++ /dev/null @@ -1,223 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.templates; - -import com.google.gson.JsonObject; -import java.util.ArrayList; -import java.util.List; - -public class JsonTemplate { - - /** - * name parameter is used as "key", in the LinkedHashMap of Templates. - */ - private String name; - private List jsonTemplateFields; - - public JsonTemplate(String name) { - this.name = name; - this.jsonTemplateFields = new ArrayList<>(); - } - - public JsonTemplate(String name, List jsonTemplateFields) { - this.name = name; - this.jsonTemplateFields = jsonTemplateFields; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getJsonTemplateFields() { - return jsonTemplateFields; - } - - public void setJsonTemplateFields(List jsonTemplateFields) { - this.jsonTemplateFields = jsonTemplateFields; - } - - /** - * Search in fields if fieldName exists. - * - * @param fieldName The field name - * @return Ture if it exists, false otherwise - */ - public boolean hasFields(String fieldName) { - for (JsonTemplateField jsonTemplateField : this.getJsonTemplateFields()) { - if (jsonTemplateField.getTitle().equals(fieldName)) { - return true; - } - } - return false; - } - - /** - * Get a specific Field. - * - * @param fieldName The field name - * @return THe Field found - */ - public JsonTemplateField getSpecificField(String fieldName) { - for (JsonTemplateField jsonTemplateField : this.getJsonTemplateFields()) { - if (jsonTemplateField.getTitle().equals(fieldName)) { - return jsonTemplateField; - } - } - return null; - } - - public void addField(JsonTemplateField jsonTemplateField) { - jsonTemplateFields.add(jsonTemplateField); - } - - public void removeField(JsonTemplateField jsonTemplateField) { - jsonTemplateFields.remove(jsonTemplateField); - } - - /** - * Enable or disable the visibility. - * - * @param nameField THe field name - * @param state True or false - */ - public void setVisibility(String nameField, boolean state) { - for (JsonTemplateField jsonTemplateField : this.jsonTemplateFields) { - if (jsonTemplateField.getTitle().equals(nameField)) { - jsonTemplateField.setVisible(state); - } - } - } - - /** - * This method defines if a field is static or not. - * - * @param nameField The name of the field - * @param state true or false - */ - public void setStatic(String nameField, boolean state) { - for (JsonTemplateField jsonTemplateField : this.jsonTemplateFields) { - if (jsonTemplateField.getTitle().equals(nameField)) { - jsonTemplateField.setStaticValue(state); - } - } - } - - /** - * This method updates the value of a specfic field. - * - * @param nameField The name of the field - * @param newValue The new value as Object - */ - public void updateValueField(String nameField, Object newValue) { - for (JsonTemplateField jsonTemplateField : this.jsonTemplateFields) { - if (jsonTemplateField.getTitle().equals(nameField)) { - jsonTemplateField.setValue(newValue); - } - } - } - - /** - * Compare two templates : size and their contents. - * - * @param jsonTemplate the template - * @return a boolean - */ - public boolean checkFields(JsonTemplate jsonTemplate) { - boolean duplicateFields = false; - if (jsonTemplate.getJsonTemplateFields().size() == this.getJsonTemplateFields().size()) { - int countMatchingFields = 0; - //loop each component of first - for (JsonTemplateField jsonTemplateFieldToCheck : jsonTemplate.getJsonTemplateFields()) { - for (JsonTemplateField jsonTemplateField : this.getJsonTemplateFields()) { - if (jsonTemplateFieldToCheck.compareWithField(jsonTemplateField)) { - countMatchingFields++; - } - } - } - - if (jsonTemplate.getJsonTemplateFields().size() == countMatchingFields) { - duplicateFields = true; - } - } - return duplicateFields; - } - - /** - * This method gets the specific field status. - * - * @param field The field name - * @return true or false - */ - public boolean fieldStaticStatus(String field) { - if (this.hasFields(field) && this.getSpecificField(field).getStaticValue().equals(true) - && this.getSpecificField(field).getValue() != null) { - return true; - } - return false; - } - - public boolean isVisible(String field) { - return this.getSpecificField(field).getVisible(); - } - - /** - * Set the value of a property of the Field in the json. - * - * @param jsonSchema The Json schema - * @param fieldName The Field name - * @param value The value - */ - public void setValue(JsonObject jsonSchema, String fieldName, String value) { - if (isVisible(fieldName)) { - if (fieldStaticStatus(fieldName)) { - String defaultValue = (String) this.getSpecificField(fieldName).getValue(); - jsonSchema.addProperty(fieldName, defaultValue); - } else { - jsonSchema.addProperty(fieldName, value); - } - } - } - - /** - * Inject a static value in the json. - * - * @param jsonSchema The json schema object - * @param fieldName The field name - */ - public void injectStaticValue(JsonObject jsonSchema, String fieldName) { - if (isVisible(fieldName)) { - JsonTemplateField toInject = this.getSpecificField(fieldName); - jsonSchema.addProperty(fieldName, (String) toInject.getValue()); - } - } - - @Override - public String toString() { - return " templateFields : " + jsonTemplateFields; - } -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateField.java b/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateField.java deleted file mode 100644 index a1e15307c..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateField.java +++ /dev/null @@ -1,149 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.templates; - -public class JsonTemplateField { - private String title; - private Object value; - private Boolean visible; - private Boolean staticValue; - - public JsonTemplateField(String title) { - this.title = title; - } - - /** - * Constructor. - * - * @param title The title - * @param value The value - * @param visible visible or not - * @param staticValue The static value - */ - public JsonTemplateField(String title, Object value, Boolean visible, Boolean staticValue) { - this.title = title; - this.value = value; - this.visible = visible; - this.staticValue = staticValue; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public Boolean getVisible() { - return visible; - } - - public void setVisible(Boolean visible) { - this.visible = visible; - } - - public Boolean getStaticValue() { - return staticValue; - } - - public void setStaticValue(Boolean staticValue) { - this.staticValue = staticValue; - } - - public String toString() { - return title + " " + value + " " + visible + " " + staticValue; - } - - /** - * This method compares two fields. - * - * @param otherField Compare the current object with the one specified - * @return true if they are totally equals, false otherwise - */ - public boolean compareWithField(Object otherField) { - if (this == otherField) { - return true; - } - if (otherField == null || getClass() != otherField.getClass()) { - return false; - } - - JsonTemplateField jsonTemplateField = (JsonTemplateField) otherField; - - if (title != null ? !title.equals(jsonTemplateField.title) : jsonTemplateField.title != null) { - return false; - } - if (value != null ? !value.equals(jsonTemplateField.value) : jsonTemplateField.value != null) { - return false; - } - if (visible != null ? !visible.equals(jsonTemplateField.visible) : jsonTemplateField.visible != null) { - return false; - } - return staticValue != null ? staticValue.equals(jsonTemplateField.staticValue) : - jsonTemplateField.staticValue == null; - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object == null || getClass() != object.getClass()) { - return false; - } - - JsonTemplateField jsonTemplateField = (JsonTemplateField) object; - - return title != null ? title.equals(jsonTemplateField.title) : jsonTemplateField.title == null; - } - - @Override - public int hashCode() { - return title != null ? title.hashCode() : 0; - } - - /** - * This method test the entire equality. - * - * @param jsonTemplateField1 object one - * @param jsonTemplateField2 object two - * @return true if they are totally equals (all attributes, false otherwise - */ - public static boolean fieldsEquals(JsonTemplateField jsonTemplateField1, JsonTemplateField jsonTemplateField2) { - return (jsonTemplateField2.getTitle().equals(jsonTemplateField1.getTitle()) - && jsonTemplateField2.getValue().equals(jsonTemplateField1.getValue()) - && jsonTemplateField2.getVisible().equals(jsonTemplateField1.getVisible()) - && jsonTemplateField2.getStaticValue().equals(jsonTemplateField1.getStaticValue())); - } - -} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateManager.java b/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateManager.java deleted file mode 100644 index a278cb667..000000000 --- a/src/main/java/org/onap/clamp/clds/tosca/update/templates/JsonTemplateManager.java +++ /dev/null @@ -1,185 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update.templates; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.onap.clamp.clds.tosca.update.UnknownComponentException; -import org.onap.clamp.clds.tosca.update.elements.ToscaElement; -import org.onap.clamp.clds.tosca.update.parser.ToscaConverterToJsonSchema; -import org.onap.clamp.clds.tosca.update.parser.ToscaElementParser; -import org.onap.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParser; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.service.Service; - -public class JsonTemplateManager { - private LinkedHashMap jsonSchemaTemplates; - private LinkedHashMap toscaElements; - - /** - * Constructor. - * - * @param toscaYamlContent Policy Tosca Yaml content as string - * @param nativeToscaDatatypes The tosca yaml with tosca native datatypes - * @param jsonSchemaTemplates template properties as string - */ - public JsonTemplateManager(String toscaYamlContent, String nativeToscaDatatypes, String jsonSchemaTemplates) { - if (toscaYamlContent != null && !toscaYamlContent.isEmpty()) { - this.toscaElements = ToscaElementParser.searchAllToscaElements(toscaYamlContent, nativeToscaDatatypes); - this.jsonSchemaTemplates = initializeTemplates(jsonSchemaTemplates); - } else { - toscaElements = null; - } - } - - //GETTERS & SETTERS - public LinkedHashMap getToscaElements() { - return toscaElements; - } - - public void setToscaElements(LinkedHashMap toscaElements) { - this.toscaElements = toscaElements; - } - - public LinkedHashMap getJsonSchemaTemplates() { - return jsonSchemaTemplates; - } - - public void setJsonSchemaTemplates(LinkedHashMap jsonSchemaTemplates) { - this.jsonSchemaTemplates = jsonSchemaTemplates; - } - - /** - * Add a template. - * - * @param name name - * @param jsonTemplateFields fields - */ - public void addTemplate(String name, List jsonTemplateFields) { - JsonTemplate jsonTemplate = new JsonTemplate(name, jsonTemplateFields); - //If it is true, the operation does not have any interest : - // replace OR put two different object with the same body - if (!jsonSchemaTemplates.containsKey(jsonTemplate.getName()) || !this.hasTemplate(jsonTemplate)) { - this.jsonSchemaTemplates.put(jsonTemplate.getName(), jsonTemplate); - } - } - - /** - * By name, find and remove a given template. - * - * @param nameTemplate name template - */ - public void removeTemplate(String nameTemplate) { - this.jsonSchemaTemplates.remove(nameTemplate); - } - - /** - * Update Template : adding with true flag, removing with false. - * - * @param nameTemplate name template - * @param jsonTemplateField field name - * @param operation operation - */ - public void updateTemplate(String nameTemplate, JsonTemplateField jsonTemplateField, Boolean operation) { - // Operation = true && field is not present => add Field - if (operation - && !this.jsonSchemaTemplates.get(nameTemplate).getJsonTemplateFields().contains(jsonTemplateField)) { - this.jsonSchemaTemplates.get(nameTemplate).addField(jsonTemplateField); - } else if (!operation - && this.jsonSchemaTemplates.get(nameTemplate).getJsonTemplateFields().contains(jsonTemplateField)) { - // Operation = false && field is present => remove Field - this.jsonSchemaTemplates.get(nameTemplate).removeField(jsonTemplateField); - } - } - - /** - * Check if the JSONTemplates have the same bodies. - * - * @param jsonTemplate template - * @return a boolean - */ - public boolean hasTemplate(JsonTemplate jsonTemplate) { - boolean duplicateTemplate = false; - Collection templatesName = jsonSchemaTemplates.keySet(); - if (templatesName.contains(jsonTemplate.getName())) { - JsonTemplate existingJsonTemplate = jsonSchemaTemplates.get(jsonTemplate.getName()); - duplicateTemplate = existingJsonTemplate.checkFields(jsonTemplate); - } - return duplicateTemplate; - } - - /** - * For a given policy type, get a corresponding JsonObject from the tosca model. - * - * @param policyType The policy type in the tosca - * @param toscaMetadataParser The MetadataParser class that must be used if metadata section are encountered, - * if null they will be skipped - * @return an json object defining the equivalent json schema from the tosca for a given policy type - */ - public JsonObject getJsonSchemaForPolicyType(String policyType, ToscaMetadataParser toscaMetadataParser, - Service serviceModel) - throws UnknownComponentException { - ToscaConverterToJsonSchema - toscaConverterToJsonSchema = new ToscaConverterToJsonSchema(toscaElements, jsonSchemaTemplates, - toscaMetadataParser, serviceModel); - if (toscaConverterToJsonSchema.getToscaElement(policyType) == null) { - throw new UnknownComponentException(policyType); - } - return toscaConverterToJsonSchema.getJsonSchemaOfToscaElement(policyType); - } - - /** - * Create and complete several Templates from file.properties. - * - * @param jsonTemplates The template properties as String - * @return a map - */ - @SuppressWarnings("unused") - private LinkedHashMap initializeTemplates(String jsonTemplates) { - - LinkedHashMap generatedTemplates = new LinkedHashMap<>(); - JsonObject templates = JsonUtils.GSON.fromJson(jsonTemplates, JsonObject.class); - - for (Map.Entry templateAsJson : templates.entrySet()) { - JsonTemplate jsonTemplate = new JsonTemplate(templateAsJson.getKey()); - JsonObject templateBody = (JsonObject) templateAsJson.getValue(); - for (Map.Entry field : templateBody.entrySet()) { - String fieldName = field.getKey(); - JsonObject bodyFieldAsJson = (JsonObject) field.getValue(); - Object fieldValue = bodyFieldAsJson.get("defaultValue").getAsString(); - Boolean fieldVisible = bodyFieldAsJson.get("visible").getAsBoolean(); - Boolean fieldStatic = bodyFieldAsJson.get("static").getAsBoolean(); - JsonTemplateField - bodyJsonTemplateField = new JsonTemplateField(fieldName, fieldValue, fieldVisible, fieldStatic); - jsonTemplate.getJsonTemplateFields().add(bodyJsonTemplateField); - } - generatedTemplates.put(jsonTemplate.getName(), jsonTemplate); - } - return generatedTemplates; - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/util/ClampVersioning.java b/src/main/java/org/onap/clamp/clds/util/ClampVersioning.java deleted file mode 100644 index bcdae5e43..000000000 --- a/src/main/java/org/onap/clamp/clds/util/ClampVersioning.java +++ /dev/null @@ -1,61 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * Modifications copyright (c) 2018 Nokia - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.InputStream; -import java.util.Properties; - -/** - * This class give a way to know the Clamp version easily, the version in that - * file is set by maven at build time. - * - */ -public class ClampVersioning { - private static final String RESOURCE_NAME = "clds-version.properties"; - private static final String CLDS_VERSION_PROPERTY = "clds.version"; - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ClampVersioning.class); - - private ClampVersioning() { - } - - /** - * Returns Clds version from properties. - * - * @return Clds version from properties - */ - public static String getCldsVersionFromProps() { - String cldsVersion = ""; - Properties props = new Properties(); - try (InputStream resourceStream = ResourceFileUtils.getResourceAsStream(RESOURCE_NAME)) { - props.load(resourceStream); - cldsVersion = props.getProperty(CLDS_VERSION_PROPERTY); - } catch (Exception ex) { - LOGGER.error("Exception caught during the " + CLDS_VERSION_PROPERTY + " property reading", ex); - } - return cldsVersion; - } -} diff --git a/src/main/java/org/onap/clamp/clds/util/CryptoUtils.java b/src/main/java/org/onap/clamp/clds/util/CryptoUtils.java deleted file mode 100644 index 1ddf3a90a..000000000 --- a/src/main/java/org/onap/clamp/clds/util/CryptoUtils.java +++ /dev/null @@ -1,168 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.common.base.Charsets; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.security.GeneralSecurityException; -import java.security.SecureRandom; -import java.util.Properties; -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.apache.commons.lang3.ArrayUtils; - -/** - * CryptoUtils for encrypting/decrypting string based on a Key defined in - * application.properties (Spring config file). - */ -public final class CryptoUtils { - - /** - * Used to log CryptoUtils class. - */ - private static final EELFLogger logger = EELFManager.getInstance().getLogger(CryptoUtils.class); - // Openssl commands: - // Encrypt: echo -n "123456" | openssl aes-128-cbc -e -K - // -iv <16 Bytes iv (HEX), be careful it's 32 Hex Chars> | xxd -u -g100 - // Final result is to put in properties file is: IV + Outcome of openssl - // command - // ************************************************************ - // Decrypt: echo -n 'Encrypted string' | xxd -r -ps | openssl aes-128-cbc -d - // -K - // -iv <16 Bytes IV extracted from Encrypted String, be - // careful it's 32 Hex Chars> - /** - * Definition of encryption algorithm. - */ - private static final String ALGORITHM = "AES"; - - /** - * AES Encryption Key environment variable for external configuration. - */ - private static final String AES_ENCRYPTION_KEY = "AES_ENCRYPTION_KEY"; - - /** - * Detailed definition of encryption algorithm. - */ - private static final String ALGORITHM_DETAILS = ALGORITHM + "/CBC/PKCS5PADDING"; - private static final int IV_BLOCK_SIZE_IN_BITS = 128; - /** - * An Initial Vector of 16 Bytes, so 32 Hexadecimal Chars. - */ - private static final int IV_BLOCK_SIZE_IN_BYTES = IV_BLOCK_SIZE_IN_BITS / 8; - /** - * Key to read in the key.properties file. - */ - private static final String KEY_PARAM = "org.onap.clamp.encryption.aes.key"; - private static final String PROPERTIES_FILE_NAME = "clds/key.properties"; - /** - * The SecretKeySpec created from the Base 64 String key. - */ - private static final SecretKeySpec SECRET_KEY_SPEC = readSecretKeySpec(PROPERTIES_FILE_NAME); - - /** - * Private constructor to avoid creating instances of util class. - */ - private CryptoUtils() { - } - - /** - * Encrypt a value based on the Clamp Encryption Key. - * - * @param value The value to encrypt - * @return The encrypted string - * @throws GeneralSecurityException In case of issue with the encryption - * @throws UnsupportedEncodingException In case of issue with the charset - * conversion - */ - public static String encrypt(String value) throws GeneralSecurityException { - Cipher cipher = Cipher.getInstance(ALGORITHM_DETAILS, "SunJCE"); - byte[] iv = new byte[IV_BLOCK_SIZE_IN_BYTES]; - SecureRandom.getInstance("SHA1PRNG").nextBytes(iv); - IvParameterSpec ivspec = new IvParameterSpec(iv); - cipher.init(Cipher.ENCRYPT_MODE, SECRET_KEY_SPEC, ivspec); - return Hex.encodeHexString(ArrayUtils.addAll(iv, cipher.doFinal(value.getBytes(Charsets.UTF_8)))); - } - - /** - * Decrypt a value based on the Clamp Encryption Key. - * - * @param message The encrypted string that must be decrypted using the Clamp - * Encryption Key - * @return The String decrypted - * @throws GeneralSecurityException In case of issue with the encryption - * @throws DecoderException In case of issue to decode the HexString - */ - public static String decrypt(String message) throws GeneralSecurityException, DecoderException { - byte[] encryptedMessage = Hex.decodeHex(message.toCharArray()); - Cipher cipher = Cipher.getInstance(ALGORITHM_DETAILS, "SunJCE"); - IvParameterSpec ivspec = new IvParameterSpec(ArrayUtils.subarray(encryptedMessage, 0, IV_BLOCK_SIZE_IN_BYTES)); - byte[] realData = ArrayUtils.subarray(encryptedMessage, IV_BLOCK_SIZE_IN_BYTES, encryptedMessage.length); - cipher.init(Cipher.DECRYPT_MODE, SECRET_KEY_SPEC, ivspec); - byte[] decrypted = cipher.doFinal(realData); - return new String(decrypted); - } - - /** - * Method used to generate the SecretKeySpec from a Base64 String. - * - * @param keyString The key as a string in Base 64 - * @return The SecretKeySpec created - * @throws DecoderException In case of issues with the decoding of Base64 - */ - private static SecretKeySpec getSecretKeySpec(String keyString) throws DecoderException { - byte[] key = Hex.decodeHex(keyString.toCharArray()); - return new SecretKeySpec(key, ALGORITHM); - } - - /** - * Reads SecretKeySpec from file specified by propertiesFileName. - * - * @param propertiesFileName File name with properties - * @return SecretKeySpec secret key spec read from propertiesFileName - */ - private static SecretKeySpec readSecretKeySpec(String propertiesFileName) { - Properties props = new Properties(); - try { - // Workaround fix to make encryption key configurable - // System environment variable takes precedence for over clds/key.properties - String encryptionKey = System.getenv(AES_ENCRYPTION_KEY); - if (encryptionKey != null && encryptionKey.trim().length() > 0) { - return getSecretKeySpec(encryptionKey); - } else { - props.load(ResourceFileUtils.getResourceAsStream(propertiesFileName)); - return getSecretKeySpec(props.getProperty(KEY_PARAM)); - } - } catch (IOException | DecoderException e) { - logger.error("Exception occurred during the key reading", e); - return null; - } - } -} diff --git a/src/main/java/org/onap/clamp/clds/util/JsonUtils.java b/src/main/java/org/onap/clamp/clds/util/JsonUtils.java deleted file mode 100644 index fa639a0a1..000000000 --- a/src/main/java/org/onap/clamp/clds/util/JsonUtils.java +++ /dev/null @@ -1,53 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import java.time.Instant; -import org.onap.clamp.authorization.SecureServicePermission; -import org.onap.clamp.authorization.SecureServicePermissionDeserializer; -import org.onap.clamp.dao.model.gson.converter.InstantDeserializer; -import org.onap.clamp.dao.model.gson.converter.InstantSerializer; - -/** - * This class is used to access the GSON with restricted type access. - */ -public class JsonUtils { - - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(JsonUtils.class); - - public static final Gson GSON = new GsonBuilder() - .registerTypeAdapter(SecureServicePermission.class, new SecureServicePermissionDeserializer()).create(); - - public static final Gson GSON_JPA_MODEL = new GsonBuilder() - .registerTypeAdapter(Instant.class, new InstantSerializer()) - .registerTypeAdapter(Instant.class, new InstantDeserializer()).setPrettyPrinting() - .excludeFieldsWithoutExposeAnnotation().create(); - - private JsonUtils() { - } -} diff --git a/src/main/java/org/onap/clamp/clds/util/LogMessages.java b/src/main/java/org/onap/clamp/clds/util/LogMessages.java deleted file mode 100644 index 7f4c8781f..000000000 --- a/src/main/java/org/onap/clamp/clds/util/LogMessages.java +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import com.att.eelf.i18n.EELFResolvableErrorEnum; -import com.att.eelf.i18n.EELFResourceManager; - -public enum LogMessages implements EELFResolvableErrorEnum { - LOGSERVICE_HELLO_MESSAGE, LOGSERVICE_EMAIL_ERROR, LOGSERVICE_EMAIL_CLASS, LOGSERVICE_EMAIL_CLASS_NULL, - PROCESS_INSTANCE_ID; - - static { - EELFResourceManager.loadMessageBundle("logmessages"); - } -} diff --git a/src/main/java/org/onap/clamp/clds/util/LoggingUtils.java b/src/main/java/org/onap/clamp/clds/util/LoggingUtils.java deleted file mode 100644 index a502a52cb..000000000 --- a/src/main/java/org/onap/clamp/clds/util/LoggingUtils.java +++ /dev/null @@ -1,414 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.URLConnection; -import java.net.UnknownHostException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; -import java.util.Date; -import java.util.TimeZone; -import java.util.UUID; -import javax.net.ssl.HttpsURLConnection; -import javax.servlet.http.HttpServletRequest; -import javax.validation.constraints.NotNull; -import org.onap.clamp.authorization.AuthorizationController; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; -import org.slf4j.event.Level; -import org.springframework.security.core.context.SecurityContextHolder; - -/** - * This class handles the special info that appear in the log, like RequestID, - * time context, ... - */ -public class LoggingUtils { - - protected static final Logger logger = LoggerFactory.getLogger(LoggingUtils.class); - - private static final DateFormat DATE_FORMAT = createDateFormat(); - - private static final String DATE_FORMATTER_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; - - /** String constant for messages ENTERING, EXITING, etc. */ - private static final String EMPTY_MESSAGE = ""; - - /** Logger delegate. */ - private Logger mlogger; - - /** Automatic UUID, overrideable per adapter or per invocation. */ - private static UUID sInstanceUUID = UUID.randomUUID(); - - /** - * Constructor. - */ - public LoggingUtils(final Logger loggerP) { - this.mlogger = checkNotNull(loggerP); - } - - /** - * Set request related logging variables in thread local data via MDC. - * - * @param service Service Name of API (ex. "PUT template") - * @param partner Partner name (client or user invoking API) - */ - public static void setRequestContext(String service, String partner) { - MDC.put("RequestId", UUID.randomUUID().toString()); - MDC.put("ServiceName", service); - MDC.put("PartnerName", partner); - // Defaulting to HTTP/1.1 protocol - MDC.put("Protocol", "HTTP/1.1"); - try { - MDC.put("ServerFQDN", InetAddress.getLocalHost().getCanonicalHostName()); - MDC.put("ServerIPAddress", InetAddress.getLocalHost().getHostAddress()); - } catch (UnknownHostException e) { - logger.error("Failed to initiate setRequestContext", e); - } - } - - /** - * Set time related logging variables in thread local data via MDC. - * - * @param beginTimeStamp Start time - * @param endTimeStamp End time - */ - public static void setTimeContext(@NotNull Date beginTimeStamp, @NotNull Date endTimeStamp) { - MDC.put("EntryTimestamp", generateTimestampStr(beginTimeStamp)); - MDC.put("EndTimestamp", generateTimestampStr(endTimeStamp)); - MDC.put("ElapsedTime", String.valueOf(endTimeStamp.getTime() - beginTimeStamp.getTime())); - } - - /** - * Set response related logging variables in thread local data via MDC. - * - * @param code Response code ("0" indicates success) - * @param description Response description - * @param className class name of invoking class - */ - public static void setResponseContext(String code, String description, String className) { - MDC.put("ResponseCode", code); - MDC.put("StatusCode", "0".equals(code) ? "COMPLETE" : "ERROR"); - MDC.put("ResponseDescription", description != null ? description : ""); - MDC.put("ClassName", className != null ? className : ""); - } - - /** - * Set target related logging variables in thread local data via MDC. - * - * @param targetEntity Target entity (an external/sub component, for ex. "sdc") - * @param targetServiceName Target service name (name of API invoked on target) - */ - public static void setTargetContext(String targetEntity, String targetServiceName) { - MDC.put("TargetEntity", targetEntity != null ? targetEntity : ""); - MDC.put("TargetServiceName", targetServiceName != null ? targetServiceName : ""); - } - - /** - * Set error related logging variables in thread local data via MDC. - * - * @param code Error code - * @param description Error description - */ - public static void setErrorContext(String code, String description) { - MDC.put("ErrorCode", code); - MDC.put("ErrorDescription", description != null ? description : ""); - } - - private static String generateTimestampStr(Date timeStamp) { - return DATE_FORMAT.format(timeStamp); - } - - /** - * Get a previously stored RequestID for the thread local data via MDC. If - * one was not previously stored, generate one, store it, and return that - * one. - * - * @return A string with the request ID - */ - public static String getRequestId() { - String requestId = MDC.get(OnapLogConstants.Mdcs.REQUEST_ID); - if (requestId == null || requestId.isEmpty()) { - requestId = UUID.randomUUID().toString(); - MDC.put(OnapLogConstants.Mdcs.REQUEST_ID, requestId); - } - return requestId; - } - - private static DateFormat createDateFormat() { - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - return dateFormat; - } - - /* ******************************************************************************************* - * Method for ONAP Application Logging Specification v1.2 - * *******************************************************************************************/ - - /** - * Report ENTERING marker. - * - * @param request non-null incoming request (wrapper) - * @param serviceName service name - */ - public void entering(HttpServletRequest request, String serviceName) { - // MDC.clear(); - checkNotNull(request); - // Extract MDC values from standard HTTP headers. - final String requestId = - defaultToUuid(request.getHeader(OnapLogConstants.Headers.REQUEST_ID)); - final String invocationId = - defaultToUuid(request.getHeader(OnapLogConstants.Headers.INVOCATION_ID)); - final String partnerName = - defaultToEmpty(request.getHeader(OnapLogConstants.Headers.PARTNER_NAME)); - - // Default the partner name to the user name used to login to clamp - if (partnerName.equalsIgnoreCase(EMPTY_MESSAGE)) { - MDC.put(OnapLogConstants.Mdcs.PARTNER_NAME, - AuthorizationController.getPrincipalName(SecurityContextHolder.getContext())); - } - - // Set standard MDCs. Override this entire method if you want to set - // others, OR set them BEFORE or AFTER the invocation of #entering, - // depending on where you need them to appear, OR extend the - // ServiceDescriptor to add them. - MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, ZonedDateTime.now(ZoneOffset.UTC) - .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO))); - MDC.put(OnapLogConstants.Mdcs.REQUEST_ID, requestId); - MDC.put(OnapLogConstants.Mdcs.INVOCATION_ID, invocationId); - MDC.put(OnapLogConstants.Mdcs.CLIENT_IP_ADDRESS, defaultToEmpty(request.getRemoteAddr())); - MDC.put(OnapLogConstants.Mdcs.SERVER_FQDN, defaultToEmpty(request.getServerName())); - MDC.put(OnapLogConstants.Mdcs.INSTANCE_UUID, defaultToEmpty(sInstanceUUID)); - - // Default the service name to the requestURI, in the event that - // no value has been provided. - if (serviceName == null || serviceName.equalsIgnoreCase(EMPTY_MESSAGE)) { - MDC.put(OnapLogConstants.Mdcs.SERVICE_NAME, request.getRequestURI()); - } else { - MDC.put(OnapLogConstants.Mdcs.SERVICE_NAME, serviceName); - } - - // Set the Response Status code to in progress - MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE, - OnapLogConstants.ResponseStatus.INPROGRESS.toString()); - setElapsedTime(); - - this.mlogger.info(OnapLogConstants.Markers.ENTRY, "Entering"); - } - - /** - * Report EXITING marker. - * - * - * @param code response code - * @param descrption response description - * @param severity response severity - * @param status response status code - */ - public void exiting(int code, String descrption, Level severity, - OnapLogConstants.ResponseStatus status) { - try { - - MDC.put(OnapLogConstants.Mdcs.RESPONSE_CODE, defaultToEmpty(code)); - MDC.put(OnapLogConstants.Mdcs.RESPONSE_DESCRIPTION, defaultToEmpty(descrption)); - MDC.put(OnapLogConstants.Mdcs.RESPONSE_SEVERITY, defaultToEmpty(severity)); - MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE, defaultToEmpty(status)); - - setElapsedTime(); - this.mlogger.info(OnapLogConstants.Markers.EXIT, "Exiting"); - } finally { - MDC.clear(); - } - } - - private void setElapsedTime() { - ZonedDateTime startTime = - ZonedDateTime.parse(MDC.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP), - DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneOffset.UTC)); - ZonedDateTime endTime = ZonedDateTime.now(ZoneOffset.UTC); - long duration = ChronoUnit.MILLIS.between(startTime, endTime); - MDC.put(OnapLogConstants.Mdcs.ELAPSED_TIME, String.valueOf(duration)); - } - - /** - * Get the property value. - * - * @param name The name of the property - * @return The value of the property - */ - public String getProperties(String name) { - return MDC.get(name); - } - - /** - * Report pending invocation with INVOKE marker, - * setting standard ONAP logging headers automatically. - * - * @param con The HTTP url connection - * @param targetEntity The target entity - * @param targetServiceName The target service name - * @return The HTTP url connection - */ - public HttpURLConnection invoke(final HttpURLConnection con, String targetEntity, - String targetServiceName) { - return this.invokeGeneric(con, targetEntity, targetServiceName); - } - - /** - * Report pending invocation with INVOKE marker, - * setting standard ONAP logging headers automatically. - * - * @param targetEntity The target entity - * @param targetServiceName The target service name - */ - public void invoke(String targetEntity, String targetServiceName) { - final String invocationId = UUID.randomUUID().toString(); - - invokeContext(targetEntity, targetServiceName, invocationId); - - // Log INVOKE*, with the invocationID as the message body. - // (We didn't really want this kind of behavior in the standard, - // but is it worse than new, single-message MDC?) - this.mlogger.info(OnapLogConstants.Markers.INVOKE, "INVOKE"); - this.mlogger.info(OnapLogConstants.Markers.INVOKE_SYNCHRONOUS + "{" + invocationId + "}"); - } - - /** - * Report pending invocation with INVOKE marker, - * setting standard ONAP logging headers automatically. - * - * @param con The HTTPS url connection - * @param targetEntity The target entity - * @param targetServiceName The target service name - * @return The HTTPS url connection - */ - public HttpsURLConnection invokeHttps(final HttpsURLConnection con, String targetEntity, - String targetServiceName) { - return this.invokeGeneric(con, targetEntity, targetServiceName); - } - - /** - * Report pending invocation with INVOKE-RETURN marker. - */ - public void invokeReturn() { - MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE, - OnapLogConstants.ResponseStatus.COMPLETE.toString()); - // Add the Invoke-return marker and clear the needed MDC - this.mlogger.info(OnapLogConstants.Markers.INVOKE_RETURN, "INVOKE-RETURN"); - invokeReturnContext(); - } - - /** - * Dependency-free nullcheck. - * - * @param in to be checked - * @param argument (and return) type - * @return input arg - */ - private static T checkNotNull(final T in) { - if (in == null) { - throw new NullPointerException(); - } - return in; - } - - /** - * Dependency-free string default. - * - * @param in to be filtered - * @return input string or null - */ - private static String defaultToEmpty(final Object in) { - if (in == null) { - return ""; - } - return in.toString(); - } - - /** - * Dependency-free string default. - * - * @param in to be filtered - * @return input string or null - */ - private static String defaultToUuid(final String in) { - if (in == null) { - return UUID.randomUUID().toString(); - } - return in; - } - - /** - * Set target related logging variables in thread local data via MDC. - * - * @param targetEntity Target entity (an external/sub component, for ex. "sdc") - * @param targetServiceName Target service name (name of API invoked on target) - * @param invocationId The invocation ID - */ - private void invokeContext(String targetEntity, String targetServiceName, String invocationId) { - MDC.put(OnapLogConstants.Mdcs.TARGET_ENTITY, defaultToEmpty(targetEntity)); - MDC.put(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME, defaultToEmpty(targetServiceName)); - MDC.put(OnapLogConstants.Mdcs.INVOCATIONID_OUT, invocationId); - MDC.put(OnapLogConstants.Mdcs.INVOKE_TIMESTAMP, ZonedDateTime.now(ZoneOffset.UTC) - .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO))); - } - - /** - * Clear target related logging variables in thread local data via MDC. - */ - private void invokeReturnContext() { - MDC.remove(OnapLogConstants.Mdcs.TARGET_ENTITY); - MDC.remove(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME); - MDC.remove(OnapLogConstants.Mdcs.INVOCATIONID_OUT); - MDC.remove(OnapLogConstants.Mdcs.INVOKE_TIMESTAMP); - MDC.remove(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE); - } - - private T invokeGeneric(final T con, String targetEntity, - String targetServiceName) { - final String invocationId = UUID.randomUUID().toString(); - - // Set standard HTTP headers on (southbound request) builder. - con.setRequestProperty(OnapLogConstants.Headers.REQUEST_ID, - defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.REQUEST_ID))); - con.setRequestProperty(OnapLogConstants.Headers.INVOCATION_ID, invocationId); - con.setRequestProperty(OnapLogConstants.Headers.PARTNER_NAME, - defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.PARTNER_NAME))); - - invokeContext(targetEntity, targetServiceName, invocationId); - - // Log INVOKE*, with the invocationID as the message body. - // (We didn't really want this kind of behavior in the standard, - // but is it worse than new, single-message MDC?) - this.mlogger.info(OnapLogConstants.Markers.INVOKE, ""); - this.mlogger.info(OnapLogConstants.Markers.INVOKE_SYNCHRONOUS + "{" + invocationId + "}"); - return con; - } -} diff --git a/src/main/java/org/onap/clamp/clds/util/OnapLogConstants.java b/src/main/java/org/onap/clamp/clds/util/OnapLogConstants.java deleted file mode 100644 index 8185b7592..000000000 --- a/src/main/java/org/onap/clamp/clds/util/OnapLogConstants.java +++ /dev/null @@ -1,304 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import org.slf4j.Marker; -import org.slf4j.MarkerFactory; - -/** - * Constants for standard ONAP headers, MDCs, etc. - */ -public final class OnapLogConstants { - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // - // Constructors. - // - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - /** - * Hide and forbid construction. - */ - private OnapLogConstants() { - throw new UnsupportedOperationException(); - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // - // Inner classes. - // - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - /** - * Marker constants. - */ - public static final class Markers { - - /** Marker reporting invocation. */ - public static final Marker INVOKE = MarkerFactory.getMarker("INVOKE"); - - /** Marker reporting invocation return. */ - public static final Marker INVOKE_RETURN = MarkerFactory.getMarker("INVOKE-RETURN"); - - /** Marker reporting synchronous invocation. */ - public static final Marker INVOKE_SYNCHRONOUS = build("INVOKE", "SYNCHRONOUS"); - - /** Marker reporting asynchronous invocation. */ - public static final Marker INVOKE_ASYNCHRONOUS = build("INVOKE", "ASYNCHRONOUS"); - - /** Marker reporting entry into a component. */ - public static final Marker ENTRY = MarkerFactory.getMarker("ENTRY"); - - /** Marker reporting exit from a component. */ - public static final Marker EXIT = MarkerFactory.getMarker("EXIT"); - - /** - * Build nested, detached marker. - * - * @param m1 top token. - * @param m2 sub-token. - * @return detached Marker. - */ - private static Marker build(final String m1, final String m2) { - final Marker marker = MarkerFactory.getDetachedMarker(m1); - marker.add(MarkerFactory.getDetachedMarker(m2)); - return marker; - } - - /** - * Hide and forbid construction. - */ - private Markers() { - throw new UnsupportedOperationException(); - } - } - - /** - * MDC name constants. - */ - public static final class Mdcs { - - // Tracing. //////////////////////////////////////////////////////////// - - /** MDC correlating messages for an invocation. */ - public static final String INVOCATION_ID = "InvocationID"; - - public static final String SERVER_INVOCATION_ID = "ServerInvocationId"; - - public static final String CLIENT_INVOCATION_ID = "ClientInvocationId"; - - /** MDC correlating messages for a logical transaction. */ - public static final String REQUEST_ID = "RequestID"; - - /** MDC recording calling partner name. */ - public static final String PARTNER_NAME = "PartnerName"; - - /** MDC recording current service. */ - public static final String SERVICE_NAME = "ServiceName"; - - /** MDC recording target service. */ - public static final String TARGET_SERVICE_NAME = "TargetServiceName"; - - /** MDC recording InvocationID Out. */ - public static final String INVOCATIONID_OUT = "InvocationIDOut"; - - /** MDC recording target entity. */ - public static final String TARGET_ENTITY = "TargetEntity"; - - /** MDC recording target element. */ - public static final String TARGET_ELEMENT = "TargetElement"; - - /** MDC recording current service instance id. */ - public static final String SERVICE_INSTANCE_ID = "ServiceInstanceID"; - - /** MDC recording current instance id. */ - public static final String INSTANCE_UUID = "InstanceID"; - - // Network. //////////////////////////////////////////////////////////// - - /** MDC recording caller address. */ - public static final String CLIENT_IP_ADDRESS = "ClientIPAddress"; - - /** MDC recording server IP address. */ - public static final String SERVER_IP_ADDRESS = "ServerIPAddress"; - - /** MDC recording server FQDN. */ - public static final String SERVER_FQDN = "ServerFQDN"; - - /** MDC recording virtual server name. */ - public static final String VIRTUAL_SERVER_NAME = "VirtualServerName"; - - /** MDC recording context name. */ - public static final String CONTEXT_NAME = "ContextName"; - - /** - * MDC recording timestamp at the start of the current request, - * with the same scope as {@link #REQUEST_ID}. - * - *

- * Open issues: - *

    - *
      - * Easily confused with {@link #INVOKE_TIMESTAMP}. - *
    - *
      - * No mechanism for propagation between components, e.g. via HTTP headers. - *
    - *
      - * Whatever mechanism we define, it's going to be costly. - *
    - *
- *

- */ - public static final String ENTRY_TIMESTAMP = "EntryTimestamp"; - - /** MDC recording timestamp at the start of the current invocation. */ - public static final String INVOKE_TIMESTAMP = "InvokeTimestamp"; - - /** MDC recording elapsed time. */ - public static final String ELAPSED_TIME = "ElapsedTime"; - - /** MDC recording log timestamp. */ - public static final String LOG_TIMESTAMP = "LogTimestamp"; - - // Outcomes. /////////////////////////////////////////////////////////// - - /** MDC reporting outcome code. */ - public static final String RESPONSE_CODE = "ResponseCode"; - - /** MDC reporting outcome description. */ - public static final String RESPONSE_DESCRIPTION = "ResponseDesc"; - - /** MDC reporting severity. */ - public static final String RESPONSE_SEVERITY = "Severity"; - - /** MDC reporting response status code. */ - public static final String RESPONSE_STATUS_CODE = "StatusCode"; - - /** MDC recording error code. */ - public static final String ERROR_CODE = "ErrorCode"; - - /** MDC recording error description. */ - public static final String ERROR_DESC = "ErrorDesc"; - - // Unsorted. /////////////////////////////////////////////////////////// - - /** - * Hide and forbid construction. - */ - private Mdcs() { - throw new UnsupportedOperationException(); - } - } - - /** - * Header name constants. - */ - public static final class Headers { - - /** HTTP X-ONAP-RequestID header. */ - public static final String REQUEST_ID = "X-ONAP-RequestID"; - - /** HTTP X-InvocationID header. */ - public static final String INVOCATION_ID = "X-ONAP-InvocationID"; - - /** HTTP X-ONAP-PartnerName header. */ - public static final String PARTNER_NAME = "X-ONAP-PartnerName"; - - /** - * Hide and forbid construction. - */ - private Headers() { - throw new UnsupportedOperationException(); - } - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // - // Enums. - // - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - /** - * Response success or not, for setting StatusCode. - */ - public enum ResponseStatus { - - /** Success. */ - COMPLETE, - - /** Not. */ - ERROR, - - /** In Progress. */ - INPROGRESS - } - - /** - * Synchronous or asynchronous execution, for setting invocation marker. - */ - public enum InvocationMode { - - /** Synchronous, blocking. */ - SYNCHRONOUS("SYNCHRONOUS", Markers.INVOKE_SYNCHRONOUS), - - /** Asynchronous, non-blocking. */ - ASYNCHRONOUS("ASYNCHRONOUS", Markers.INVOKE_ASYNCHRONOUS); - - /** Enum value. */ - private String enumValue; - - /** Corresponding marker. */ - private Marker marker; - - /** - * Construct enum. - * - * @param enumValue enum value. - * @param marker corresponding Marker. - */ - InvocationMode(final String enumValue, final Marker marker) { - this.enumValue = enumValue; - this.marker = marker; - } - - /** - * Get Marker for enum. - * - * @return Marker. - */ - public Marker getMarker() { - return this.marker; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return this.enumValue; - } - } - -} diff --git a/src/main/java/org/onap/clamp/clds/util/ResourceFileUtils.java b/src/main/java/org/onap/clamp/clds/util/ResourceFileUtils.java deleted file mode 100644 index f858ed2b8..000000000 --- a/src/main/java/org/onap/clamp/clds/util/ResourceFileUtils.java +++ /dev/null @@ -1,89 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Scanner; - -/** - * Utility methods supporting resources accesses. - */ -public final class ResourceFileUtils { - - /** - * getResourceAsStram supports the "file:" prefix as they use URL. - * So here we want to eliminate classpath: prefix, so that this class can get - * files from jar resource or file system. - */ - - private static final String CLASSPATH_PREFIX = "classpath:"; - - /** - * Private constructor to avoid creating instances of util class. - */ - private ResourceFileUtils() { - } - - /** - * Method to access a file from the jar resource folder or file system. - * Give the prefix "classpath:" so that it accesses the jar resource folder (default case) - * or the prefix "file:" so that it accesses the file system. - * - * @param fileName The path of the resource (no prefix it will be a classpath access, - * "classpath:/myfilename" or "file:/myfilename") - * @return The file as inputStream - */ - public static InputStream getResourceAsStream(String fileName) { - InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( - fileName.startsWith(CLASSPATH_PREFIX) ? fileName.replaceFirst(CLASSPATH_PREFIX, "") : fileName); - if (is == null) { - throw new IllegalArgumentException("Unable to find resource: " + fileName); - } - return is; - } - - /** - * Method to access a resource file as a string. - * Give the prefix "classpath:" so that it accesses the jar resource folder (default case) - * or the prefix "file:" so that it accesses the file system. - * - * @param fileName The path of the resource (no prefix it will be a classpath access, - * "classpath:/myfilename" or "file:/myfilename") - * @return The file as String - * @throws IOException In case of failure to find the file. - */ - public static String getResourceAsString(String fileName) throws IOException { - try (InputStream is = getResourceAsStream(fileName)) { - return streamToString(is); - } - } - - private static String streamToString(InputStream inputStream) { - try (Scanner scanner = new Scanner(inputStream)) { - Scanner delimitedScanner = scanner.useDelimiter("\\A"); - return delimitedScanner.hasNext() ? delimitedScanner.next() : ""; - } - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/configuration/ClampGsonDataFormat.java b/src/main/java/org/onap/clamp/configuration/ClampGsonDataFormat.java deleted file mode 100644 index 3b56772ca..000000000 --- a/src/main/java/org/onap/clamp/configuration/ClampGsonDataFormat.java +++ /dev/null @@ -1,170 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - */ - -package org.onap.clamp.configuration; - -import com.google.gson.Gson; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.lang.reflect.Type; -import java.nio.charset.StandardCharsets; -import org.apache.camel.Exchange; -import org.apache.camel.spi.DataFormat; -import org.apache.camel.spi.DataFormatName; -import org.apache.camel.support.ServiceSupport; -import org.apache.camel.util.IOHelper; -import org.onap.clamp.clds.util.JsonUtils; - -public class ClampGsonDataFormat extends ServiceSupport implements DataFormat, DataFormatName { - private Gson gson; - private Class unmarshalType; - private Type unmarshalGenericType; - private boolean contentTypeHeader = true; - - public ClampGsonDataFormat() { - this(Object.class); - } - - /** - * Use the default Gson {@link Gson} and with a custom unmarshal type. - * - * @param unmarshalType the custom unmarshal type - */ - public ClampGsonDataFormat(Class unmarshalType) { - this(null, unmarshalType); - } - - /** - * Use a custom Gson mapper and and unmarshal type. - * - * @param gson the custom mapper - * @param unmarshalType the custom unmarshal type - */ - public ClampGsonDataFormat(Gson gson, Class unmarshalType) { - this.gson = gson; - this.unmarshalType = unmarshalType; - } - - /** - * Use the default Gson {@link Gson} and with a custom unmarshal generic type. - * - * @param unmarshalGenericType the custom unmarshal generic type - */ - public ClampGsonDataFormat(Type unmarshalGenericType) { - this(null, unmarshalGenericType); - } - - /** - * Use a custom Gson mapper and and unmarshal token type. - * - * @param gson the custom mapper - * @param unmarshalGenericType the custom unmarshal generic type - */ - public ClampGsonDataFormat(Gson gson, Type unmarshalGenericType) { - this.gson = gson; - this.unmarshalGenericType = unmarshalGenericType; - } - - @Override - public String getDataFormatName() { - return "clamp-gson"; - } - - @Override - public void marshal(final Exchange exchange, final Object graph, final OutputStream stream) throws Exception { - try (final OutputStreamWriter osw = new OutputStreamWriter(stream, StandardCharsets.UTF_8); - final BufferedWriter writer = IOHelper.buffered(osw)) { - gson.toJson(graph, writer); - } - - if (contentTypeHeader) { - if (exchange.hasOut()) { - exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "application/json"); - } else { - exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); - } - } - } - - @Override - public Object unmarshal(final Exchange exchange, final InputStream stream) throws Exception { - try (final InputStreamReader isr = new InputStreamReader(stream, StandardCharsets.UTF_8); - final BufferedReader reader = IOHelper.buffered(isr)) { - if (unmarshalGenericType == null) { - return gson.fromJson(reader, unmarshalType); - } else { - return gson.fromJson(reader, unmarshalGenericType); - } - } - } - - @Override - protected void doStart() throws Exception { - if (gson == null) { - gson = JsonUtils.GSON_JPA_MODEL; - } - } - - @Override - protected void doStop() throws Exception { - // noop - } - - // Properties - // ------------------------------------------------------------------------- - - public Class getUnmarshalType() { - return this.unmarshalType; - } - - public void setUnmarshalType(Class unmarshalType) { - this.unmarshalType = unmarshalType; - } - - public Type getUnmarshalGenericType() { - return this.unmarshalGenericType; - } - - public void setUnmarshalGenericType(Type unmarshalGenericType) { - this.unmarshalGenericType = unmarshalGenericType; - } - - public boolean isContentTypeHeader() { - return contentTypeHeader; - } - - /** - * If enabled then Gson will set the Content-Type header to - * application/json when marshalling. - */ - public void setContentTypeHeader(boolean contentTypeHeader) { - this.contentTypeHeader = contentTypeHeader; - } - - public Gson getGson() { - return this.gson; - } -} diff --git a/src/main/java/org/onap/clamp/dao/model/gson/converter/InstantDeserializer.java b/src/main/java/org/onap/clamp/dao/model/gson/converter/InstantDeserializer.java deleted file mode 100644 index 2c6c47f54..000000000 --- a/src/main/java/org/onap/clamp/dao/model/gson/converter/InstantDeserializer.java +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.dao.model.gson.converter; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import java.lang.reflect.Type; -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.time.format.FormatStyle; -import java.util.Locale; - -public class InstantDeserializer implements JsonDeserializer { - - DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.US) - .withZone(ZoneId.systemDefault()); - - @Override - public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { - return Instant.parse(json.getAsString()); - - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/dao/model/gson/converter/InstantSerializer.java b/src/main/java/org/onap/clamp/dao/model/gson/converter/InstantSerializer.java deleted file mode 100644 index 3705f122b..000000000 --- a/src/main/java/org/onap/clamp/dao/model/gson/converter/InstantSerializer.java +++ /dev/null @@ -1,40 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.dao.model.gson.converter; - -import com.google.gson.JsonElement; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import java.lang.reflect.Type; -import java.time.Instant; -import java.time.format.DateTimeFormatter; - -public class InstantSerializer implements JsonSerializer { - - @Override - public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) { - return new JsonPrimitive(DateTimeFormatter.ISO_INSTANT.format(src)); - } -} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java b/src/main/java/org/onap/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java deleted file mode 100644 index 7370e40bf..000000000 --- a/src/main/java/org/onap/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.dao.model.jsontype; - -import java.sql.CallableStatement; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import org.hibernate.type.descriptor.ValueBinder; -import org.hibernate.type.descriptor.ValueExtractor; -import org.hibernate.type.descriptor.WrapperOptions; -import org.hibernate.type.descriptor.java.JavaTypeDescriptor; -import org.hibernate.type.descriptor.sql.BasicBinder; -import org.hibernate.type.descriptor.sql.BasicExtractor; -import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; - -public class JsonStringSqlTypeDescriptor implements SqlTypeDescriptor { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = 1103168570216921981L; - - public static final JsonStringSqlTypeDescriptor INSTANCE = new JsonStringSqlTypeDescriptor(); - - @Override - public int getSqlType() { - return Types.OTHER; - } - - @Override - public boolean canBeRemapped() { - return true; - } - - @Override - public ValueBinder getBinder(JavaTypeDescriptor javaTypeDescriptor) { - return new BasicBinder(javaTypeDescriptor, this) { - @Override - protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) - throws SQLException { - st.setString(index, javaTypeDescriptor.unwrap(value, String.class, options)); - } - - @Override - protected void doBind(CallableStatement st, X value, String name, WrapperOptions options) - throws SQLException { - st.setString(name, javaTypeDescriptor.unwrap(value, String.class, options)); - } - }; - } - - @Override - public ValueExtractor getExtractor(JavaTypeDescriptor javaTypeDescriptor) { - return new BasicExtractor(javaTypeDescriptor, this) { - @Override - protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException { - return javaTypeDescriptor.wrap(extractJson(rs, name), options); - } - - @Override - protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException { - return javaTypeDescriptor.wrap(extractJson(statement, index), options); - } - - @Override - protected X doExtract(CallableStatement statement, String name, WrapperOptions options) - throws SQLException { - return javaTypeDescriptor.wrap(extractJson(statement, name), options); - } - }; - } - - protected Object extractJson(ResultSet rs, String name) throws SQLException { - return rs.getObject(name); - } - - protected Object extractJson(CallableStatement statement, int index) throws SQLException { - return statement.getObject(index); - } - - protected Object extractJson(CallableStatement statement, String name) throws SQLException { - return statement.getObject(name); - } - -} diff --git a/src/main/java/org/onap/clamp/dao/model/jsontype/JsonTypeDescriptor.java b/src/main/java/org/onap/clamp/dao/model/jsontype/JsonTypeDescriptor.java deleted file mode 100644 index 266809401..000000000 --- a/src/main/java/org/onap/clamp/dao/model/jsontype/JsonTypeDescriptor.java +++ /dev/null @@ -1,105 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.dao.model.jsontype; - -import com.google.gson.JsonObject; -import java.io.Serializable; -import org.hibernate.type.descriptor.WrapperOptions; -import org.hibernate.type.descriptor.java.AbstractTypeDescriptor; -import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan; -import org.onap.clamp.clds.util.JsonUtils; - -public class JsonTypeDescriptor extends AbstractTypeDescriptor { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = -3439698221196089003L; - - public static final JsonTypeDescriptor INSTANCE = new JsonTypeDescriptor(); - - /** - * Creates an instance of JsonTypeDescriptor. - */ - public JsonTypeDescriptor() { - super(JsonObject.class, new ImmutableMutabilityPlan() { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = 1169396106518110214L; - - @Override - public Serializable disassemble(JsonObject value) { - return JsonUtils.GSON_JPA_MODEL.toJson(value); - } - - @Override - public JsonObject assemble(Serializable cached) { - return JsonUtils.GSON_JPA_MODEL.fromJson((String) cached, JsonObject.class); - } - - }); - } - - @Override - public String toString(JsonObject value) { - return JsonUtils.GSON_JPA_MODEL.toJson(value); - } - - @Override - public JsonObject fromString(String string) { - return JsonUtils.GSON_JPA_MODEL.fromJson(string, JsonObject.class); - } - - @Override - public X unwrap(JsonObject value, Class type, WrapperOptions options) { - if (value == null) { - return null; - } - - if (String.class.isAssignableFrom(type)) { - return (X) toString(value); - } - - if (JsonObject.class.isAssignableFrom(type)) { - return (X) JsonUtils.GSON_JPA_MODEL.toJson(toString(value)); - } - throw unknownUnwrap(type); - } - - @Override - public JsonObject wrap(X value, WrapperOptions options) { - if (value == null) { - return null; - } - - if (String.class.isInstance(value)) { - return JsonUtils.GSON_JPA_MODEL.fromJson((String) value, JsonObject.class); - } - - throw unknownWrap(value.getClass()); - } - -} diff --git a/src/main/java/org/onap/clamp/dao/model/jsontype/StringJsonUserType.java b/src/main/java/org/onap/clamp/dao/model/jsontype/StringJsonUserType.java deleted file mode 100644 index 509057d16..000000000 --- a/src/main/java/org/onap/clamp/dao/model/jsontype/StringJsonUserType.java +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.dao.model.jsontype; - -import com.google.gson.JsonObject; -import org.hibernate.type.AbstractSingleColumnStandardBasicType; -import org.hibernate.type.descriptor.java.JavaTypeDescriptor; -import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; - -public class StringJsonUserType extends AbstractSingleColumnStandardBasicType { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = -7929809808079327767L; - - public StringJsonUserType() { - super(JsonStringSqlTypeDescriptor.INSTANCE, JsonTypeDescriptor.INSTANCE); - } - - public StringJsonUserType(SqlTypeDescriptor sqlTypeDescriptor, JavaTypeDescriptor javaTypeDescriptor) { - super(sqlTypeDescriptor, javaTypeDescriptor); - } - - @Override - public String getName() { - return "json"; - } - -} diff --git a/src/main/java/org/onap/clamp/flow/log/FlowLogOperation.java b/src/main/java/org/onap/clamp/flow/log/FlowLogOperation.java deleted file mode 100644 index e31406b2c..000000000 --- a/src/main/java/org/onap/clamp/flow/log/FlowLogOperation.java +++ /dev/null @@ -1,101 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.flow.log; - -import javax.servlet.http.HttpServletRequest; -import org.apache.camel.Exchange; -import org.onap.clamp.clds.util.LoggingUtils; -import org.onap.clamp.clds.util.OnapLogConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.event.Level; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; - -/** - * The Flow log operations. - */ -@Component -public class FlowLogOperation { - - protected static final Logger logger = LoggerFactory.getLogger(FlowLogOperation.class); - private LoggingUtils util = new LoggingUtils(logger); - - @Autowired - private HttpServletRequest request; - - /** - * Generate the entry log. - * - * @param serviceDesc - * The service description the loop name - */ - public void startLog(Exchange exchange, String serviceDesc) { - util.entering(request, serviceDesc); - exchange.setProperty(OnapLogConstants.Headers.REQUEST_ID, - util.getProperties(OnapLogConstants.Mdcs.REQUEST_ID)); - exchange.setProperty(OnapLogConstants.Headers.INVOCATION_ID, - util.getProperties(OnapLogConstants.Mdcs.INVOCATION_ID)); - exchange.setProperty(OnapLogConstants.Headers.PARTNER_NAME, - util.getProperties(OnapLogConstants.Mdcs.PARTNER_NAME)); - } - - /** - * Generate the exiting log. - */ - public void endLog() { - util.exiting(HttpStatus.OK.value(), "Successful", Level.INFO, - OnapLogConstants.ResponseStatus.COMPLETE); - } - - /** - * Generate the error exiting log. - */ - public void errorLog() { - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Failed", Level.INFO, - OnapLogConstants.ResponseStatus.ERROR); - } - - /** - * Generate the error exiting log. - */ - public void httpErrorLog() { - - } - - /** - * Generate the invoke log. - */ - public void invokeLog(String targetEntity, String targetServiceName) { - util.invoke(targetEntity, targetServiceName); - } - - /** - * Generate the invoke return marker. - */ - public void invokeReturnLog() { - util.invokeReturn(); - } -} diff --git a/src/main/java/org/onap/clamp/loop/CsarInstaller.java b/src/main/java/org/onap/clamp/loop/CsarInstaller.java deleted file mode 100644 index a1ef612c6..000000000 --- a/src/main/java/org/onap/clamp/loop/CsarInstaller.java +++ /dev/null @@ -1,210 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Map.Entry; -import org.json.simple.parser.ParseException; -import org.onap.clamp.clds.client.DcaeInventoryServices; -import org.onap.clamp.clds.client.PolicyEngineServices; -import org.onap.clamp.clds.exception.sdc.controller.BlueprintParserException; -import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; -import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse; -import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact; -import org.onap.clamp.clds.sdc.controller.installer.BlueprintMicroService; -import org.onap.clamp.clds.sdc.controller.installer.BlueprintParser; -import org.onap.clamp.clds.sdc.controller.installer.ChainGenerator; -import org.onap.clamp.clds.sdc.controller.installer.CsarHandler; -import org.onap.clamp.loop.cds.CdsDataInstaller; -import org.onap.clamp.loop.service.CsarServiceInstaller; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.LoopTemplatesRepository; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelId; -import org.onap.clamp.loop.template.PolicyModelsRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.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. - */ -@Component -@Qualifier("csarInstaller") -public class CsarInstaller { - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarInstaller.class); - - @Autowired - private PolicyModelsRepository policyModelsRepository; - - @Autowired - private LoopTemplatesRepository loopTemplatesRepository; - - @Autowired - private ChainGenerator chainGenerator; - - @Autowired - private DcaeInventoryServices dcaeInventoryService; - - @Autowired - private CsarServiceInstaller csarServiceInstaller; - - @Autowired - private CdsDataInstaller cdsDataInstaller; - - @Autowired - private PolicyEngineServices policyEngineServices; - - /** - * Verify whether Csar is deployed. - * - * @param csar The Csar Handler - * @return The flag indicating whether Csar is deployed - * @throws SdcArtifactInstallerException The SdcArtifactInstallerException - */ - public boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException { - boolean alreadyInstalled = csarServiceInstaller.isServiceAlreadyDeployed(csar); - - for (Entry blueprint : csar.getMapOfBlueprints().entrySet()) { - alreadyInstalled = alreadyInstalled - && loopTemplatesRepository.existsById(LoopTemplate.generateLoopTemplateName( - csar.getSdcNotification().getServiceName(), csar.getSdcNotification().getServiceVersion(), - blueprint.getValue().getResourceAttached().getResourceInstanceName(), - blueprint.getValue().getBlueprintArtifactName())); - } - return alreadyInstalled; - } - - /** - * Install the service and loop templates from the csar. - * - * @param csar The Csar Handler - * @throws SdcArtifactInstallerException The SdcArtifactInstallerException - * @throws InterruptedException The InterruptedException - * @throws BlueprintParserException In case of issues with the blueprint - * parsing - */ - public void installTheCsar(CsarHandler csar) - throws SdcArtifactInstallerException, InterruptedException, BlueprintParserException { - logger.info("Installing the CSAR " + csar.getFilePath()); - Service associatedService = csarServiceInstaller.installTheService(csar); - cdsDataInstaller.installCdsServiceProperties(csar, associatedService); - - installTheLoopTemplates(csar, associatedService); - logger.info("Successfully installed the CSAR " + csar.getFilePath()); - } - - /** - * Install the loop templates from the csar. - * - * @param csar The Csar Handler - * @param service The service object that is related to the loop - * @throws SdcArtifactInstallerException The SdcArtifactInstallerException - * @throws InterruptedException The InterruptedException - * @throws BlueprintParserException In case of issues with the blueprint - * parsing - */ - public void installTheLoopTemplates(CsarHandler csar, Service service) - throws SdcArtifactInstallerException, InterruptedException, BlueprintParserException { - try { - logger.info("Installing the Loops"); - for (Entry blueprint : csar.getMapOfBlueprints().entrySet()) { - logger.info("Processing blueprint " + blueprint.getValue().getBlueprintArtifactName()); - loopTemplatesRepository.save(createLoopTemplateFromBlueprint(csar, blueprint.getValue(), service)); - } - logger.info("Successfully installed the Loops "); - } catch (IOException e) { - throw new SdcArtifactInstallerException("Exception caught during the Loop installation in database", e); - } catch (ParseException e) { - throw new SdcArtifactInstallerException("Exception caught during the Dcae query to get ServiceTypeId", e); - } - } - - private LoopTemplate createLoopTemplateFromBlueprint(CsarHandler csar, BlueprintArtifact blueprintArtifact, - Service service) - throws IOException, ParseException, InterruptedException, BlueprintParserException, - SdcArtifactInstallerException { - LoopTemplate newLoopTemplate = new LoopTemplate(); - newLoopTemplate.setBlueprint(blueprintArtifact.getDcaeBlueprint()); - newLoopTemplate.setName(LoopTemplate.generateLoopTemplateName(csar.getSdcNotification().getServiceName(), - csar.getSdcNotification().getServiceVersion(), - blueprintArtifact.getResourceAttached().getResourceInstanceName(), - blueprintArtifact.getBlueprintArtifactName())); - List microServicesChain = chainGenerator - .getChainOfMicroServices(BlueprintParser.getMicroServices(blueprintArtifact.getDcaeBlueprint())); - if (microServicesChain.isEmpty()) { - microServicesChain = BlueprintParser.fallbackToOneMicroService(); - } - newLoopTemplate.setModelService(service); - newLoopTemplate.addLoopElementModels(createMicroServiceModels(blueprintArtifact, microServicesChain)); - newLoopTemplate.setMaximumInstancesAllowed(0); - DcaeInventoryResponse dcaeResponse = queryDcaeToGetServiceTypeId(blueprintArtifact); - newLoopTemplate.setDcaeBlueprintId(dcaeResponse.getTypeId()); - return newLoopTemplate; - } - - private HashSet createMicroServiceModels(BlueprintArtifact blueprintArtifact, - List microServicesChain) - throws SdcArtifactInstallerException { - HashSet newSet = new HashSet<>(); - for (BlueprintMicroService microService : microServicesChain) { - LoopElementModel loopElementModel = - new LoopElementModel(microService.getModelType(), LoopElementModel.MICRO_SERVICE_TYPE, - null); - newSet.add(loopElementModel); - PolicyModel newPolicyModel = policyEngineServices.createPolicyModelFromPolicyEngine(microService); - if (newPolicyModel != null) { - loopElementModel.addPolicyModel(newPolicyModel); - } else { - throw new SdcArtifactInstallerException( - "Unable to find the policy specified in the blueprint " + blueprintArtifact - .getBlueprintArtifactName() + ") on the Policy Engine:" - + microService.getModelType() + "/" + microService.getModelVersion()); - } - } - return newSet; - } - - /** - * Get the service blueprint Id in the Dcae inventory using the SDC UUID. - * - * @return The DcaeInventoryResponse object containing the dcae values - */ - private DcaeInventoryResponse queryDcaeToGetServiceTypeId(BlueprintArtifact blueprintArtifact) - throws IOException, ParseException, InterruptedException { - return dcaeInventoryService.getDcaeInformation(blueprintArtifact.getBlueprintArtifactName(), - blueprintArtifact.getBlueprintInvariantServiceUuid(), - blueprintArtifact.getResourceAttached().getResourceInvariantUUID()); - } - -} diff --git a/src/main/java/org/onap/clamp/loop/Loop.java b/src/main/java/org/onap/clamp/loop/Loop.java deleted file mode 100644 index 9fde19542..000000000 --- a/src/main/java/org/onap/clamp/loop/Loop.java +++ /dev/null @@ -1,389 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import com.google.gson.JsonObject; -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.Transient; -import org.hibernate.annotations.SortNatural; -import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.TypeDefs; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.dao.model.jsontype.StringJsonUserType; -import org.onap.clamp.loop.common.AuditEntity; -import org.onap.clamp.loop.components.external.DcaeComponent; -import org.onap.clamp.loop.components.external.ExternalComponent; -import org.onap.clamp.loop.components.external.PolicyComponent; -import org.onap.clamp.loop.deploy.DcaeDeployParameters; -import org.onap.clamp.loop.log.LoopLog; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.operational.OperationalPolicy; - -@Entity -@Table(name = "loops") -@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) -public class Loop extends AuditEntity implements Serializable { - - /** - * The serial version id. - */ - private static final long serialVersionUID = -286522707701388642L; - - @Id - @Expose - @Column(nullable = false, name = "name", unique = true) - private String name; - - @Expose - @Column(name = "dcae_deployment_id") - private String dcaeDeploymentId; - - @Expose - @Column(name = "dcae_deployment_status_url") - private String dcaeDeploymentStatusUrl; - - @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "global_properties_json") - private JsonObject globalPropertiesJson; - - @Expose - @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinColumn(name = "service_uuid") - private Service modelService; - - @Expose - @Column(nullable = false, name = "last_computed_state") - @Enumerated(EnumType.STRING) - private LoopState lastComputedState; - - @Expose - @Transient - private final Map components = new HashMap<>(); - - @Expose - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop", orphanRemoval = true) - private Set operationalPolicies = new HashSet<>(); - - @Expose - @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) - @JoinTable(name = "loops_to_microservicepolicies", joinColumns = @JoinColumn(name = "loop_name"), - inverseJoinColumns = @JoinColumn(name = "microservicepolicy_name")) - private Set microServicePolicies = new HashSet<>(); - - @Expose - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop", orphanRemoval = true) - @SortNatural - private SortedSet loopLogs = new TreeSet<>(); - - @Expose - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) - @JoinColumn(name = "loop_template_name", nullable = false) - private LoopTemplate loopTemplate; - - private void initializeExternalComponents() { - this.addComponent(new PolicyComponent()); - this.addComponent(new DcaeComponent()); - } - - /** - * Public constructor. - */ - public Loop() { - initializeExternalComponents(); - } - - /** - * Constructor. - */ - public Loop(String name) { - this.name = name; - this.lastComputedState = LoopState.DESIGN; - this.globalPropertiesJson = new JsonObject(); - initializeExternalComponents(); - } - - /** - * This constructor creates a loop from a loop template. - * - * @param name The loop name - * @param loopTemplate The loop template from which a new loop instance must be created - */ - public Loop(String name, LoopTemplate loopTemplate, ToscaConverterWithDictionarySupport toscaConverter) { - this(name); - this.setLoopTemplate(loopTemplate); - this.setModelService(loopTemplate.getModelService()); - loopTemplate.getLoopElementModelsUsed().forEach(element -> { - if (LoopElementModel.MICRO_SERVICE_TYPE.equals(element.getLoopElementModel().getLoopElementType())) { - this.addMicroServicePolicy((MicroServicePolicy) element.getLoopElementModel() - .createPolicyInstance(this, toscaConverter)); - } else if (LoopElementModel.OPERATIONAL_POLICY_TYPE - .equals(element.getLoopElementModel().getLoopElementType())) { - this.addOperationalPolicy((OperationalPolicy) element.getLoopElementModel() - .createPolicyInstance(this, toscaConverter)); - } - }); - this.setGlobalPropertiesJson(DcaeDeployParameters.getDcaeDeploymentParametersInJson(this)); - } - - public String getName() { - return name; - } - - void setName(String name) { - this.name = name; - } - - public String getDcaeDeploymentId() { - return dcaeDeploymentId; - } - - void setDcaeDeploymentId(String dcaeDeploymentId) { - this.dcaeDeploymentId = dcaeDeploymentId; - } - - public String getDcaeDeploymentStatusUrl() { - return dcaeDeploymentStatusUrl; - } - - void setDcaeDeploymentStatusUrl(String dcaeDeploymentStatusUrl) { - this.dcaeDeploymentStatusUrl = dcaeDeploymentStatusUrl; - } - - public LoopState getLastComputedState() { - return lastComputedState; - } - - void setLastComputedState(LoopState lastComputedState) { - this.lastComputedState = lastComputedState; - } - - public Set getOperationalPolicies() { - return operationalPolicies; - } - - void setOperationalPolicies(Set operationalPolicies) { - this.operationalPolicies = operationalPolicies; - } - - public Set getMicroServicePolicies() { - return microServicePolicies; - } - - void setMicroServicePolicies(Set microServicePolicies) { - this.microServicePolicies = microServicePolicies; - } - - public JsonObject getGlobalPropertiesJson() { - return globalPropertiesJson; - } - - void setGlobalPropertiesJson(JsonObject globalPropertiesJson) { - this.globalPropertiesJson = globalPropertiesJson; - } - - public Set getLoopLogs() { - return loopLogs; - } - - void setLoopLogs(SortedSet loopLogs) { - this.loopLogs = loopLogs; - } - - /** - * This method adds an operational policy to the loop. - * - * @param opPolicy the operationalPolicy to add - */ - public void addOperationalPolicy(OperationalPolicy opPolicy) { - operationalPolicies.add(opPolicy); - opPolicy.setLoop(this); - } - - /** - * This method removes an operational policy to the loop. - * - * @param opPolicy the operationalPolicy to add - */ - public void removeOperationalPolicy(OperationalPolicy opPolicy) { - operationalPolicies.remove(opPolicy); - } - - /** - * This method adds an micro service policy to the loop. - * - * @param microServicePolicy the micro service to add - */ - public void addMicroServicePolicy(MicroServicePolicy microServicePolicy) { - microServicePolicies.add(microServicePolicy); - microServicePolicy.getUsedByLoops().add(this); - } - - public void addLog(LoopLog log) { - log.setLoop(this); - this.loopLogs.add(log); - } - - public Service getModelService() { - return modelService; - } - - void setModelService(Service modelService) { - this.modelService = modelService; - } - - public Map getComponents() { - refreshDcaeComponents(); - return components; - } - - public ExternalComponent getComponent(String componentName) { - refreshDcaeComponents(); - return this.components.get(componentName); - } - - public void addComponent(ExternalComponent component) { - this.components.put(component.getComponentName(), component); - } - - public LoopTemplate getLoopTemplate() { - return loopTemplate; - } - - public void setLoopTemplate(LoopTemplate loopTemplate) { - this.loopTemplate = loopTemplate; - } - - private void refreshDcaeComponents() { - if (!this.loopTemplate.getUniqueBlueprint()) { - this.components.remove("DCAE"); - for (MicroServicePolicy policy : this.microServicePolicies) { - if (!this.components.containsKey("DCAE_" + policy.getName())) { - this.addComponent(new DcaeComponent(policy.getName())); - } - } - } - } - - /** - * Return the operationalPolicy object with the opPolicyName. - * - * @param opPolicyName The operationalPolicy name - * @return The OperationalPolicy object found in loop object - */ - public OperationalPolicy getOperationalPolicy(String opPolicyName) { - for (OperationalPolicy operationalPolicy : this.getOperationalPolicies()) { - if (operationalPolicy.getName().equals(opPolicyName)) { - return operationalPolicy; - } - } - return null; - } - - /** - * Return the microServicePolicy object with the msPolicyName. - * - * @param msPolicyName The microServicePolicy name - * @return The MicroServicePolicy object found in loop object - */ - public MicroServicePolicy getMicroServicePolicy(String msPolicyName) { - for (MicroServicePolicy microServicePolicy : this.getMicroServicePolicies()) { - if (microServicePolicy.getName().equals(msPolicyName)) { - return microServicePolicy; - } - } - return null; - } - - /** - * Generate the loop name. - * - * @param serviceName The service name - * @param serviceVersion The service version - * @param resourceName The resource name - * @param blueprintFileName The blueprint file name - * @return The generated loop name - */ - public static String generateLoopName(String serviceName, String serviceVersion, String resourceName, - String blueprintFileName) { - StringBuilder buffer = new StringBuilder("LOOP_").append(serviceName).append("_v").append(serviceVersion) - .append("_").append(resourceName).append("_").append(blueprintFileName.replaceAll(".yaml", "")); - return buffer.toString().replace('.', '_').replaceAll(" ", ""); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Loop other = (Loop) obj; - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - -} diff --git a/src/main/java/org/onap/clamp/loop/LoopController.java b/src/main/java/org/onap/clamp/loop/LoopController.java deleted file mode 100644 index 603726f56..000000000 --- a/src/main/java/org/onap/clamp/loop/LoopController.java +++ /dev/null @@ -1,204 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.List; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.microservice.MicroServicePolicyService; -import org.onap.clamp.policy.operational.OperationalPolicy; -import org.onap.clamp.policy.operational.OperationalPolicyService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; - -@Controller -public class LoopController { - - private final LoopService loopService; - - private final ToscaConverterWithDictionarySupport toscaConverter; - - private final OperationalPolicyService operationalPolicyService; - - private final MicroServicePolicyService microServicePolicyService; - - private static final Type OPERATIONAL_POLICY_TYPE = new TypeToken>() { - }.getType(); - - private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken>() { - }.getType(); - - - /** - * Constructor. - * - * @param loopService loopService - * @param operationalPolicyService operationalPolicyService - * @param microServicePolicyService microServicePolicyService - * @param toscaConverter toscaConverter - */ - @Autowired - public LoopController(LoopService loopService, OperationalPolicyService operationalPolicyService, - MicroServicePolicyService microServicePolicyService, - ToscaConverterWithDictionarySupport toscaConverter) { - this.loopService = loopService; - this.toscaConverter = toscaConverter; - this.operationalPolicyService = operationalPolicyService; - this.microServicePolicyService = microServicePolicyService; - } - - public Loop createLoop(String loopName, String templateName) { - return loopService.createLoopFromTemplate(loopName, templateName); - } - - public List getLoopNames() { - return loopService.getClosedLoopNames(); - } - - public Loop getLoop(String loopName) { - return loopService.getLoop(loopName); - } - - /** - * Update the Operational Policy properties. - * - * @param loopName The loop name - * @param operationalPoliciesJson The new Operational Policy properties - * @return The updated loop - */ - public Loop updateOperationalPolicies(String loopName, JsonArray operationalPoliciesJson) { - List operationalPolicies = JsonUtils.GSON_JPA_MODEL.fromJson(operationalPoliciesJson, - OPERATIONAL_POLICY_TYPE); - return loopService.updateAndSaveOperationalPolicies(loopName, operationalPolicies); - } - - /** - * Update the whole array of MicroService policies properties. - * - * @param loopName The loop name - * @param microServicePoliciesJson The array of all MicroService policies - * properties - * @return The updated loop - */ - public Loop updateMicroservicePolicies(String loopName, JsonArray microServicePoliciesJson) { - List microservicePolicies = JsonUtils.GSON_JPA_MODEL.fromJson(microServicePoliciesJson, - MICROSERVICE_POLICY_TYPE); - return loopService.updateAndSaveMicroservicePolicies(loopName, microservicePolicies); - } - - /** - * Update the global properties. - * - * @param loopName The loop name - * @param globalProperties The updated global properties - * @return The updated loop - */ - public Loop updateGlobalPropertiesJson(String loopName, JsonObject globalProperties) { - return loopService.updateAndSaveGlobalPropertiesJson(loopName, globalProperties); - } - - /** - * This method add an operational policy to a loop instance. - * - * @param loopName The loop name - * @param policyType The policy model type - * @param policyVersion The policy model version - * @return The loop modified - */ - public Loop addOperationalPolicy(String loopName, String policyType, String policyVersion) throws IOException { - return loopService.addOperationalPolicy(loopName, policyType, policyVersion); - } - - /** - * This method removes an operational policy from a loop instance. - * - * @param loopName The loop name - * @param policyType The policy model type - * @param policyVersion The policy model version - * @return The loop modified - */ - public Loop removeOperationalPolicy(String loopName, String policyType, String policyVersion) { - return loopService.removeOperationalPolicy(loopName, policyType, policyVersion); - } - - /** - * This method deletes the loop. - * - * @param loopName The loop Name - */ - public void deleteLoop(String loopName) { - loopService.deleteLoop(loopName); - } - - /** - * Update one MicroService policy properties. - * - * @param loopName The loop name - * @param newMicroservicePolicy The new MicroService policy properties - * @return The updated MicroService policy - */ - public MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) { - return loopService.updateMicroservicePolicy(loopName, newMicroservicePolicy); - } - - /** - * Refresh the Operational Policy Json representation of the loop. - * - * @param loop The loop - * @param operationalPolicyName The operational policy name that needs a refresh - * @return The loop object - */ - public Loop refreshOperationalPolicyJsonRepresentation(Loop loop, String operationalPolicyName) { - for (OperationalPolicy operationalPolicy : loop.getOperationalPolicies()) { - if (operationalPolicy.getName().equals(operationalPolicyName)) { - this.operationalPolicyService - .refreshOperationalPolicyJsonRepresentation(operationalPolicy, toscaConverter); - } - } - return loop; - } - - /** - * Refresh the Config Policy Json representation of the loop. - * - * @param loop The loop - * @param microServicePolicyName The microservice policy name that needs a refresh - * @return The loop object - */ - public Loop refreshMicroServicePolicyJsonRepresentation(Loop loop, String microServicePolicyName) { - for (MicroServicePolicy microServicePolicy : loop.getMicroServicePolicies()) { - if (microServicePolicy.getName().equals(microServicePolicyName)) { - this.microServicePolicyService - .refreshMicroServicePolicyJsonRepresentation(microServicePolicy, toscaConverter, loop); - } - } - return loop; - } -} diff --git a/src/main/java/org/onap/clamp/loop/LoopService.java b/src/main/java/org/onap/clamp/loop/LoopService.java deleted file mode 100644 index 5f0822816..000000000 --- a/src/main/java/org/onap/clamp/loop/LoopService.java +++ /dev/null @@ -1,190 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.List; -import java.util.Set; -import javax.persistence.EntityNotFoundException; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.loop.template.LoopTemplatesService; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelsService; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.microservice.MicroServicePolicyService; -import org.onap.clamp.policy.operational.OperationalPolicy; -import org.onap.clamp.policy.operational.OperationalPolicyService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class LoopService { - - @Autowired - private LoopsRepository loopsRepository; - - @Autowired - private MicroServicePolicyService microservicePolicyService; - - @Autowired - private OperationalPolicyService operationalPolicyService; - - @Autowired - private PolicyModelsService policyModelsService; - - @Autowired - private LoopTemplatesService loopTemplateService; - - @Autowired - private ToscaConverterWithDictionarySupport toscaConverter; - - Loop saveOrUpdateLoop(Loop loop) { - return loopsRepository.save(loop); - } - - List getClosedLoopNames() { - return loopsRepository.getAllLoopNames(); - } - - public Loop getLoop(String loopName) { - return loopsRepository.findById(loopName).orElse(null); - } - - public void deleteLoop(String loopName) { - loopsRepository.deleteById(loopName); - } - - /** - * Creates a Loop Instance from Loop Template Name. - * - * @param loopName Name of the Loop to be created - * @param templateName Loop Template to used for Loop - * @return Loop Instance - */ - public Loop createLoopFromTemplate(String loopName, String templateName) { - return loopsRepository - .save(new Loop(loopName, loopTemplateService.getLoopTemplate(templateName), toscaConverter)); - } - - /** - * This method is used to refresh the DCAE deployment status fields. - * - * @param loop The loop instance to be modified - * @param deploymentId The deployment ID as returned by DCAE - * @param deploymentUrl The Deployment URL as returned by DCAE - */ - public void updateDcaeDeploymentFields(Loop loop, String deploymentId, String deploymentUrl) { - loop.setDcaeDeploymentId(deploymentId); - loop.setDcaeDeploymentStatusUrl(deploymentUrl); - loopsRepository.saveAndFlush(loop); - } - - public void updateLoopState(Loop loop, String newState) { - loop.setLastComputedState(LoopState.valueOf(newState)); - loopsRepository.save(loop); - } - - /** - * This method add an operational policy to a loop instance. - * This creates an operational policy from the policy model info and not the loop element model - * - * @param loopName The loop name - * @param policyType The policy model type - * @param policyVersion The policy model version - * @return The loop modified - */ - Loop addOperationalPolicy(String loopName, String policyType, String policyVersion) throws IOException { - Loop loop = getLoop(loopName); - PolicyModel policyModel = policyModelsService.getPolicyModel(policyType, policyVersion); - Set opPolicySet = loop.getOperationalPolicies(); - for (OperationalPolicy opPolicy : opPolicySet) { - if (opPolicy.getPolicyModel().equals(policyModel)) { - throw new IllegalArgumentException( - "This type of Operational Policy is already added to the loop. Please choose another one."); - } - } - if (policyModel == null) { - return null; - } - loop.addOperationalPolicy( - new OperationalPolicy(loop, loop.getModelService(), policyModel, toscaConverter)); - return loopsRepository.saveAndFlush(loop); - } - - /** - * This method remove an operational policy to a loop instance. - * - * @param loopName The loop name - * @param policyType The policy model type - * @param policyVersion The policy model version - * @return The loop modified - */ - Loop removeOperationalPolicy(String loopName, String policyType, String policyVersion) { - Loop loop = getLoop(loopName); - PolicyModel policyModel = policyModelsService.getPolicyModel(policyType, policyVersion); - if (policyModel == null) { - return null; - } - for (OperationalPolicy opPolicy : loop.getOperationalPolicies()) { - if (opPolicy.getPolicyModel().getPolicyModelType().equals(policyType) - && opPolicy.getPolicyModel().getVersion().equals(policyVersion)) { - loop.removeOperationalPolicy(opPolicy); - break; - } - } - return loopsRepository.saveAndFlush(loop); - } - - Loop updateAndSaveOperationalPolicies(String loopName, List newOperationalPolicies) { - Loop loop = findClosedLoopByName(loopName); - Set newPolicies = operationalPolicyService.updatePolicies(loop, newOperationalPolicies); - loop.setOperationalPolicies(newPolicies); - return loopsRepository.save(loop); - } - - Loop updateAndSaveMicroservicePolicies(String loopName, List newMicroservicePolicies) { - Loop loop = findClosedLoopByName(loopName); - Set newPolicies = microservicePolicyService.updatePolicies(loop, newMicroservicePolicies); - loop.setMicroServicePolicies(newPolicies); - return loopsRepository.save(loop); - } - - Loop updateAndSaveGlobalPropertiesJson(String loopName, JsonObject newGlobalPropertiesJson) { - Loop loop = findClosedLoopByName(loopName); - loop.setGlobalPropertiesJson(newGlobalPropertiesJson); - return loopsRepository.save(loop); - } - - MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) { - Loop loop = findClosedLoopByName(loopName); - return microservicePolicyService.getAndUpdateMicroServicePolicy(loop, newMicroservicePolicy); - } - - private Loop findClosedLoopByName(String loopName) { - return loopsRepository.findById(loopName) - .orElseThrow(() -> new EntityNotFoundException("Couldn't find closed loop named: " + loopName)); - } -} - diff --git a/src/main/java/org/onap/clamp/loop/LoopState.java b/src/main/java/org/onap/clamp/loop/LoopState.java deleted file mode 100644 index 4707730ce..000000000 --- a/src/main/java/org/onap/clamp/loop/LoopState.java +++ /dev/null @@ -1,28 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -public enum LoopState { - DESIGN, SUBMITTED, DEPLOYED, RUNNING, STOPPED, IN_ERROR, WAITING; -} diff --git a/src/main/java/org/onap/clamp/loop/LoopsRepository.java b/src/main/java/org/onap/clamp/loop/LoopsRepository.java deleted file mode 100644 index c2ef2fd0e..000000000 --- a/src/main/java/org/onap/clamp/loop/LoopsRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -@Repository -public interface LoopsRepository extends JpaRepository { - - @Query("SELECT loop.name FROM Loop as loop") - List getAllLoopNames(); -} diff --git a/src/main/java/org/onap/clamp/loop/cds/CdsDataInstaller.java b/src/main/java/org/onap/clamp/loop/cds/CdsDataInstaller.java deleted file mode 100644 index 4c331b7d0..000000000 --- a/src/main/java/org/onap/clamp/loop/cds/CdsDataInstaller.java +++ /dev/null @@ -1,172 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.loop.cds; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import org.onap.clamp.clds.client.CdsServices; -import org.onap.clamp.clds.model.cds.CdsBpWorkFlowListResponse; -import org.onap.clamp.clds.sdc.controller.installer.CsarHandler; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.service.ServicesRepository; -import org.onap.sdc.tosca.parser.enums.SdcTypes; -import org.onap.sdc.toscaparser.api.NodeTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -/** - * This class installs the cds data in the service model properties. - * This can be refreshed later on by clicking on the button refresh, when recomputing the json schema. - */ -@Component -public class CdsDataInstaller { - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(CdsDataInstaller.class); - - @Autowired - CdsServices cdsServices; - - @Autowired - ServicesRepository serviceRepository; - - public static final String CONTROLLER_PROPERTIES = "controllerProperties"; - public static final String SDNC_MODEL_NAME = "sdnc_model_name"; - public static final String SDNC_MODEL_VERSION = "sdnc_model_version"; - - /** - * This method installs the service model properties for CDS in the service object given in input. - * - * @param csar The csar from sdc - * @param service the service object already provisioned with csar data - */ - @Transactional(propagation = Propagation.REQUIRES_NEW) - public Service installCdsServiceProperties(CsarHandler csar, Service service) { - // Iterate on all types defined in the tosca lib - for (SdcTypes type : SdcTypes.values()) { - JsonObject resourcesPropByType = service.getResourceByType(type.getValue()); - // For each type, get the metadata of each nodetemplate - for (NodeTemplate nodeTemplate : csar.getSdcCsarHelper().getServiceNodeTemplateBySdcType(type)) { - // get cds artifact information and save in resources Prop - if (SdcTypes.PNF == type || SdcTypes.VF == type) { - JsonObject controllerProperties = createCdsArtifactProperties( - String.valueOf(nodeTemplate.getPropertyValue(SDNC_MODEL_NAME)), - String.valueOf(nodeTemplate.getPropertyValue(SDNC_MODEL_VERSION))); - if (controllerProperties != null) { - resourcesPropByType.getAsJsonObject(nodeTemplate.getName()) - .add(CONTROLLER_PROPERTIES, controllerProperties); - logger.info("Successfully installed the CDS data in Service"); - } else { - logger.warn("Skipping CDS data installation in Service, as sdnc_model_name and " - + "sdnc_model_version are not provided in the CSAR"); - } - } - } - } - serviceRepository.save(service); - - return service; - } - - /** - * This method updates the service model properties for CDS in the service object given in input. - * - * @param service the service object already provisioned with csar data - */ - @Transactional(propagation = Propagation.REQUIRES_NEW) - public Service updateCdsServiceProperties(Service service) { - // Iterate on all types defined in the tosca lib - for (SdcTypes type : SdcTypes.values()) { - JsonObject resourcesPropByType = service.getResourceByType(type.getValue()); - for (String resourceName : resourcesPropByType.keySet()) { - // get cds artifact information and save in resources Prop - if ((SdcTypes.PNF == type || SdcTypes.VF == type) && resourcesPropByType.getAsJsonObject(resourceName) - .getAsJsonObject(CONTROLLER_PROPERTIES) != null) { - JsonObject controllerProperties = - createCdsArtifactProperties(resourcesPropByType.getAsJsonObject(resourceName) - .getAsJsonObject(CONTROLLER_PROPERTIES).get(SDNC_MODEL_NAME) - .getAsString(), - resourcesPropByType.getAsJsonObject(resourceName) - .getAsJsonObject(CONTROLLER_PROPERTIES).get(SDNC_MODEL_VERSION) - .getAsString()); - if (controllerProperties != null) { - resourcesPropByType.getAsJsonObject(resourceName) - .add(CONTROLLER_PROPERTIES, controllerProperties); - } - } - } - } - serviceRepository.save(service); - logger.info("Successfully updated the CDS data in Service"); - return service; - } - - /** - * Retrieve CDS artifacts information from node template and save in resource object. - * - * @param sdncModelName sdnc model name - * @param sdncModelVersion sdnc model version - * @return Returns CDS artifacts information - */ - private JsonObject createCdsArtifactProperties(String sdncModelName, String sdncModelVersion) { - if (sdncModelName != null && !"null".equals(sdncModelName) - && sdncModelVersion != null && !"null".equals(sdncModelVersion)) { - JsonObject controllerProperties = new JsonObject(); - controllerProperties.addProperty(SDNC_MODEL_NAME, sdncModelName); - controllerProperties.addProperty(SDNC_MODEL_VERSION, sdncModelVersion); - - CdsBpWorkFlowListResponse response = - queryCdsToGetWorkFlowList(sdncModelName, sdncModelVersion); - if (response == null) { - return controllerProperties; - } - - JsonObject workFlowProps = new JsonObject(); - for (String workFlow : response.getWorkflows()) { - logger.info("Found CDS workflow " + workFlow + " for model name " + sdncModelName + " and version " - + sdncModelVersion); - JsonObject inputs = queryCdsToGetWorkFlowInputProperties(response.getBlueprintName(), - response.getVersion(), workFlow); - workFlowProps.add(workFlow, inputs); - } - - controllerProperties.add("workflows", workFlowProps); - return controllerProperties; - } - return null; - } - - - private CdsBpWorkFlowListResponse queryCdsToGetWorkFlowList(String artifactName, String artifactVersion) { - return cdsServices.getBlueprintWorkflowList(artifactName, artifactVersion); - } - - private JsonObject queryCdsToGetWorkFlowInputProperties(String artifactName, String artifactVersion, - String workFlow) { - return cdsServices.getWorkflowInputProperties(artifactName, artifactVersion, workFlow); - } -} diff --git a/src/main/java/org/onap/clamp/loop/common/AuditEntity.java b/src/main/java/org/onap/clamp/loop/common/AuditEntity.java deleted file mode 100644 index d5a1bfc59..000000000 --- a/src/main/java/org/onap/clamp/loop/common/AuditEntity.java +++ /dev/null @@ -1,146 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.common; - -import com.google.gson.annotations.Expose; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import javax.persistence.Column; -import javax.persistence.EntityListeners; -import javax.persistence.MappedSuperclass; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedBy; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -/** - * This class is the parent of the hibernate entities requiring to be audited. - */ -@MappedSuperclass -@EntityListeners(AuditingEntityListener.class) -public class AuditEntity { - - @Expose - @CreatedDate - @Column(name = "created_timestamp", nullable = false, updatable = false) - private Instant createdDate; - - @Expose - @LastModifiedDate - @Column(name = "updated_timestamp", nullable = false) - private Instant updatedDate; - - @Expose - @LastModifiedBy - @Column(name = "updated_by") - private String updatedBy; - - @Expose - @CreatedBy - @Column(name = "created_by") - private String createdBy; - - public Instant getCreatedDate() { - return createdDate; - } - - /** - * createdDate setter. - * - * @param createdDate The created Date object - */ - public void setCreatedDate(Instant createdDate) { - if (createdDate != null) { - this.createdDate = createdDate.truncatedTo(ChronoUnit.SECONDS); - } else { - this.createdDate = null; - } - } - - /** - * updatedDate getter. - * - * @return the updatedDate - */ - public Instant getUpdatedDate() { - return updatedDate; - } - - /** - * updatedDate setter. - * - * @param updatedDate updatedDate to set - */ - public void setUpdatedDate(Instant updatedDate) { - if (updatedDate != null) { - this.updatedDate = updatedDate.truncatedTo(ChronoUnit.SECONDS); - } else { - this.updatedDate = null; - } - } - - /** - * updatedBy getter. - * - * @return the updatedBy - */ - public String getUpdatedBy() { - return updatedBy; - } - - /** - * updatedBy setter. - * - * @param updatedBy the updatedBy - */ - public void setUpdatedBy(String updatedBy) { - this.updatedBy = updatedBy; - } - - /** - * createdBy getter. - * - * @return the createdBy - */ - public String getCreatedBy() { - return createdBy; - } - - /** - * createdBy setter. - * - * @param createdBy the createdBy to set - */ - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - /** - * Empty constructor. - */ - public AuditEntity() { - } - -} diff --git a/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java b/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java deleted file mode 100644 index d6a061f41..000000000 --- a/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java +++ /dev/null @@ -1,266 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.components.external; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; -import javax.persistence.Transient; -import org.apache.camel.Exchange; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; -import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse; -import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.policy.microservice.MicroServicePolicy; - -public class DcaeComponent extends ExternalComponent { - - @Transient - private static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeComponent.class); - - private static final String DCAE_DEPLOYMENT_PREFIX = "CLAMP_"; - private static final String DEPLOYMENT_PARAMETER = "dcaeDeployParameters"; - private static final String DCAE_SERVICETYPE_ID = "serviceTypeId"; - private static final String DCAE_INPUTS = "inputs"; - public static final String UNIQUE_BLUEPRINT_PARAMETERS = "uniqueBlueprintParameters"; - - private String name; - - public static final ExternalComponentState BLUEPRINT_DEPLOYED = new ExternalComponentState("BLUEPRINT_DEPLOYED", - "The DCAE blueprint has been found in the DCAE inventory but not yet instancianted for this loop"); - public static final ExternalComponentState PROCESSING_MICROSERVICE_INSTALLATION = new ExternalComponentState( - "PROCESSING_MICROSERVICE_INSTALLATION", "Clamp has requested DCAE to install the microservices " - + "defined in the DCAE blueprint and it's currently processing the request"); - public static final ExternalComponentState MICROSERVICE_INSTALLATION_FAILED = new ExternalComponentState( - "MICROSERVICE_INSTALLATION_FAILED", - "Clamp has requested DCAE to install the microservices defined in the DCAE blueprint and it failed"); - public static final ExternalComponentState MICROSERVICE_INSTALLED_SUCCESSFULLY = new ExternalComponentState( - "MICROSERVICE_INSTALLED_SUCCESSFULLY", - "Clamp has requested DCAE to install the DCAE blueprint and it has been installed successfully"); - public static final ExternalComponentState PROCESSING_MICROSERVICE_UNINSTALLATION = new ExternalComponentState( - "PROCESSING_MICROSERVICE_UNINSTALLATION", "Clamp has requested DCAE to uninstall the microservices " - + "defined in the DCAE blueprint and it's currently processing the request"); - public static final ExternalComponentState MICROSERVICE_UNINSTALLATION_FAILED = new ExternalComponentState( - "MICROSERVICE_UNINSTALLATION_FAILED", - "Clamp has requested DCAE to uninstall the microservices defined in the DCAE blueprint and it failed"); - public static final ExternalComponentState MICROSERVICE_UNINSTALLED_SUCCESSFULLY = new ExternalComponentState( - "MICROSERVICE_UNINSTALLED_SUCCESSFULLY", - "Clamp has requested DCAE to uninstall the DCAE blueprint and it has been uninstalled successfully"); - public static final ExternalComponentState IN_ERROR = new ExternalComponentState("IN_ERROR", - "There was an error during the request done to DCAE, look at the logs or try again"); - - public DcaeComponent() { - super(BLUEPRINT_DEPLOYED); - this.name = "DCAE"; - } - - public DcaeComponent(String name) { - super(BLUEPRINT_DEPLOYED); - this.name = "DCAE_" + name; - } - - @Override - public String getComponentName() { - return name; - } - - - /** - * Convert the json response to a DcaeOperationStatusResponse. - * - * @param responseBody The DCAE response Json paylaod - * @return The dcae object provisioned - */ - public static DcaeOperationStatusResponse convertDcaeResponse(String responseBody) { - if (responseBody != null && !responseBody.isEmpty()) { - return JsonUtils.GSON_JPA_MODEL.fromJson(responseBody, DcaeOperationStatusResponse.class); - } else { - return null; - } - } - - /** - * Generate the deployment id, it's random. - * - * @return The deployment id - */ - public static String generateDeploymentId() { - return DCAE_DEPLOYMENT_PREFIX + UUID.randomUUID(); - } - - /** - * This method prepare the url returned by DCAE to check the status if fine. It - * extracts it from the dcaeResponse. - * - * @param dcaeResponse The dcae response object - * @return the Right Url modified if needed - */ - public static String getStatusUrl(DcaeOperationStatusResponse dcaeResponse) { - return dcaeResponse.getLinks().getStatus().replaceAll("http:", "http4:").replaceAll("https:", "https4:"); - } - - /** - * Return the deploy payload for DCAE. - * - * @param loop The loop object - * @return The payload used to send deploy closed loop request - */ - public static String getDeployPayload(Loop loop) { - JsonObject globalProp = loop.getGlobalPropertiesJson(); - JsonObject deploymentProp = globalProp.getAsJsonObject(DEPLOYMENT_PARAMETER).getAsJsonObject( - UNIQUE_BLUEPRINT_PARAMETERS); - - String serviceTypeId = loop.getLoopTemplate().getDcaeBlueprintId(); - - JsonObject rootObject = new JsonObject(); - rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId); - if (deploymentProp != null) { - rootObject.add(DCAE_INPUTS, deploymentProp); - } - logger.info("DCAE Deploy payload for unique blueprint: " + rootObject.toString()); - return rootObject.toString(); - } - - /** - * Return the deploy payload for DCAE. - * - * @param loop The loop object - * @param microServicePolicy The micro service policy - * @return The payload used to send deploy closed loop request - */ - public static String getDeployPayload(Loop loop, MicroServicePolicy microServicePolicy) { - JsonObject globalProp = loop.getGlobalPropertiesJson(); - JsonObject deploymentProp = - globalProp.getAsJsonObject(DEPLOYMENT_PARAMETER).getAsJsonObject(microServicePolicy.getName()); - - String serviceTypeId = microServicePolicy.getDcaeBlueprintId(); - - JsonObject rootObject = new JsonObject(); - rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId); - if (deploymentProp != null) { - rootObject.add(DCAE_INPUTS, deploymentProp); - } - logger.info("DCAE Deploy payload for multiple blueprints: " + rootObject.toString()); - return rootObject.toString(); - } - - /** - * Return the uninstallation payload for DCAE. - * - * @param loop The loop object - * @return The payload in string (json) - */ - public static String getUndeployPayload(Loop loop) { - JsonObject rootObject = new JsonObject(); - rootObject.addProperty(DCAE_SERVICETYPE_ID, loop.getLoopTemplate().getDcaeBlueprintId()); - logger.info("DCAE Undeploy payload for unique blueprint: " + rootObject.toString()); - return rootObject.toString(); - } - - /** - * Return the uninstallation payload for DCAE. - * - * @param policy The microServicePolicy object - * @return The payload in string (json) - */ - public static String getUndeployPayload(MicroServicePolicy policy) { - JsonObject rootObject = new JsonObject(); - rootObject.addProperty(DCAE_SERVICETYPE_ID, policy.getDcaeBlueprintId()); - logger.info("DCAE Undeploy payload for multiple blueprints: " + rootObject.toString()); - return rootObject.toString(); - } - - @Override - public ExternalComponentState computeState(Exchange camelExchange) { - - DcaeOperationStatusResponse dcaeResponse = (DcaeOperationStatusResponse) camelExchange.getIn().getExchange() - .getProperty("dcaeResponse"); - - if (dcaeResponse == null) { - setState(BLUEPRINT_DEPLOYED); - } else { - if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus().equals("succeeded")) { - setState(MICROSERVICE_INSTALLED_SUCCESSFULLY); - } else { - if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus() - .equals("processing")) { - setState(PROCESSING_MICROSERVICE_INSTALLATION); - } else { - if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus() - .equals("failed")) { - setState(MICROSERVICE_INSTALLATION_FAILED); - } else { - if (dcaeResponse.getOperationType().equals("uninstall") - && dcaeResponse.getStatus().equals("succeeded")) { - setState(MICROSERVICE_UNINSTALLED_SUCCESSFULLY); - } else { - if (dcaeResponse.getOperationType().equals("uninstall") - && dcaeResponse.getStatus().equals("processing")) { - setState(PROCESSING_MICROSERVICE_UNINSTALLATION); - } else { - if (dcaeResponse.getOperationType().equals("uninstall") && dcaeResponse.getStatus() - .equals("failed")) { - setState(MICROSERVICE_UNINSTALLATION_FAILED); - } else { - setState(IN_ERROR); - } - } - } - } - } - } - } - return this.getState(); - } - - /** - * Convert the json response to a DcaeInventoryResponse. - * - * @param responseBody The DCAE response Json paylaod - * @return list of DcaeInventoryResponse - * @throws ParseException In case of issues with the Json parsing - */ - public static List convertToDcaeInventoryResponse(String responseBody) - throws ParseException { - JSONParser parser = new JSONParser(); - JSONObject jsonObj = (JSONObject) parser.parse(responseBody); - JSONArray itemsArray = (JSONArray) jsonObj.get("items"); - Iterator it = itemsArray.iterator(); - List inventoryResponseList = new LinkedList<>(); - while (it.hasNext()) { - JSONObject item = (JSONObject) it.next(); - DcaeInventoryResponse response = JsonUtils.GSON.fromJson(item.toString(), DcaeInventoryResponse.class); - inventoryResponseList.add(response); - } - return inventoryResponseList; - } -} diff --git a/src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java b/src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java deleted file mode 100644 index 1cfb93a35..000000000 --- a/src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java +++ /dev/null @@ -1,58 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.components.external; - -import com.google.gson.annotations.Expose; -import org.apache.camel.Exchange; - -/** - * Should be abstract but Gson can't instantiate it if it's an abstract. - */ -public class ExternalComponent { - @Expose - private ExternalComponentState componentState; - - public void setState(ExternalComponentState newState) { - this.componentState = newState; - } - - public ExternalComponentState getState() { - return this.componentState; - } - - public String getComponentName() { - return null; - } - - public ExternalComponentState computeState(Exchange camelExchange) { - return new ExternalComponentState("INIT", "no desc", 0); - } - - public ExternalComponent(ExternalComponentState initialState) { - setState(initialState); - } - - public ExternalComponent() { - } -} diff --git a/src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java b/src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java deleted file mode 100644 index a57234af0..000000000 --- a/src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java +++ /dev/null @@ -1,128 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.components.external; - -import com.google.gson.annotations.Expose; - -/** - * This is a transient state reflecting the deployment status of a component. It - * can be Policy, DCAE, or whatever... This is object is generic. Clamp is now - * stateless, so it triggers the different components at runtime, the status per - * component is stored here. The state level is used to re-compute the global - * state when multiple sub states are required for that computation (generally - * provided sequentially to the method computeState from the camel routes. - * - */ -public class ExternalComponentState implements Comparable { - @Expose - private String stateName; - @Expose - private String description; - private int stateLevel; - - /** - * Constructor taking stateName, description and its level. - * - * @param stateName The stateName in string - * @param description The description in string - * @param level The level, higher value has higher priority and can't be - * down-graded - */ - public ExternalComponentState(String stateName, String description, int level) { - this.stateName = stateName; - this.description = description; - this.stateLevel = level; - } - - public ExternalComponentState(String stateName, String description) { - this(stateName, description, 0); - } - - public ExternalComponentState() { - } - - public String getStateName() { - return stateName; - } - - public String getDescription() { - return description; - } - - @Override - public String toString() { - return stateName; - } - - public int getLevel() { - return stateLevel; - } - - public void setLevel(int priority) { - this.stateLevel = priority; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((stateName == null) ? 0 : stateName.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - ExternalComponentState other = (ExternalComponentState) obj; - if (stateName == null) { - if (other.stateName != null) { - return false; - } - } else if (!stateName.equals(other.stateName)) { - return false; - } - return true; - } - - /** - * This method compares this object by using the level of them. - * - * @param stateToCompare The state to compare to the current object - * @return If the one given in input has a higher level than the current object - * it returns -1, 1 otherwise and 0 if equals. - */ - @Override - public int compareTo(ExternalComponentState stateToCompare) { - return Integer.compare(this.getLevel(), stateToCompare.getLevel()); - } - -} diff --git a/src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java b/src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java deleted file mode 100644 index 8a5ff7fc6..000000000 --- a/src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java +++ /dev/null @@ -1,196 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.components.external; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import javax.persistence.Transient; -import org.apache.camel.Exchange; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.operational.OperationalPolicy; - -public class PolicyComponent extends ExternalComponent { - - @Transient - private static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyComponent.class); - - public static final ExternalComponentState IN_ERROR = new ExternalComponentState("IN_ERROR", - "There was an error during the sending to policy, the policy engine may be corrupted or inconsistent", 100); - public static final ExternalComponentState NOT_SENT = new ExternalComponentState("NOT_SENT", - "The policies defined have NOT yet been created on the policy engine", 90); - public static final ExternalComponentState SENT = new ExternalComponentState("SENT", - "The policies defined have been created but NOT deployed on the policy engine", 50); - public static final ExternalComponentState SENT_AND_DEPLOYED = new ExternalComponentState("SENT_AND_DEPLOYED", - "The policies defined have been created and deployed on the policy engine", 10); - public static final ExternalComponentState UNKNOWN = new ExternalComponentState("UNKNOWN", - "The current status is not clear. Need to refresh the status to get the current status.", 0); - - /** - * Default constructor. - */ - public PolicyComponent() { - /* - * We assume it's good by default as we will receive the state for each policy - * on by one, each time we increase the level we can't decrease it anymore. - * That's why it starts with the lowest one SENT_AND_DEPLOYED. - */ - super(UNKNOWN); - } - - @Override - public String getComponentName() { - return "POLICY"; - } - - /** - * Generates the Json that must be sent to policy to add all policies to Active - * PDP group. - * - * @param loop the loop object - * @param action POST (to add policy to group) or DELETE (to delete policy from group) - * @return The json, payload to send - */ - public static String createPoliciesPayloadPdpGroup(Loop loop, String action) { - Map>> pdpGroupMap = new HashMap<>(); - for (OperationalPolicy opPolicy : loop.getOperationalPolicies()) { - updatePdpGroupMap(opPolicy.getPdpGroup(), opPolicy.getPdpSubgroup(), - opPolicy.getName(), - "1.0.0", pdpGroupMap); - } - - for (MicroServicePolicy msPolicy : loop.getMicroServicePolicies()) { - updatePdpGroupMap(msPolicy.getPdpGroup(), msPolicy.getPdpSubgroup(), - msPolicy.getName(), - "1.0.0", pdpGroupMap); - } - - String payload = new GsonBuilder().setPrettyPrinting().create() - .toJson(generateActivatePdpGroupPayload(pdpGroupMap, action)); - logger.info("PdpGroup policy payload: " + payload); - return payload; - } - - private static void updatePdpGroupMap(String pdpGroup, - String pdpSubGroup, - String policyName, - String policyVersion, - Map>> pdpGroupMap) { - JsonObject policyJson = new JsonObject(); - policyJson.addProperty("name", policyName); - policyJson.addProperty("version", policyVersion); - Map> pdpSubGroupMap; - List policyList; - if (pdpGroupMap.get(pdpGroup) == null) { - pdpSubGroupMap = new HashMap<>(); - policyList = new LinkedList<>(); - } else { - pdpSubGroupMap = pdpGroupMap.get(pdpGroup); - if (pdpSubGroupMap.get(pdpSubGroup) == null) { - policyList = new LinkedList<>(); - } else { - policyList = (List) pdpSubGroupMap.get(pdpSubGroup); - } - } - policyList.add(policyJson); - pdpSubGroupMap.put(pdpSubGroup, policyList); - pdpGroupMap.put(pdpGroup, pdpSubGroupMap); - } - - private static JsonObject generateActivatePdpGroupPayload( - Map>> pdpGroupMap, String action) { - JsonArray payloadArray = new JsonArray(); - for (Entry>> pdpGroupInfo : pdpGroupMap.entrySet()) { - JsonObject pdpGroupNode = new JsonObject(); - JsonArray subPdpArray = new JsonArray(); - pdpGroupNode.addProperty("name", pdpGroupInfo.getKey()); - pdpGroupNode.add("deploymentSubgroups", subPdpArray); - - for (Entry> pdpSubGroupInfo : pdpGroupInfo.getValue().entrySet()) { - JsonObject pdpSubGroupNode = new JsonObject(); - subPdpArray.add(pdpSubGroupNode); - pdpSubGroupNode.addProperty("pdpType", pdpSubGroupInfo.getKey()); - pdpSubGroupNode.addProperty("action", action); - - JsonArray policyArray = new JsonArray(); - pdpSubGroupNode.add("policies", policyArray); - - for (JsonObject policy : pdpSubGroupInfo.getValue()) { - policyArray.add(policy); - } - } - payloadArray.add(pdpGroupNode); - } - JsonObject jsonObject = new JsonObject(); - jsonObject.add("groups", payloadArray); - return jsonObject; - } - - private static ExternalComponentState findNewState(boolean found, boolean deployed) { - - ExternalComponentState newState = NOT_SENT; - if (found && deployed) { - newState = SENT_AND_DEPLOYED; - } else { - if (found) { - newState = SENT; - } else { - if (deployed) { - newState = IN_ERROR; - } - } - } - return newState; - } - - private static ExternalComponentState mergeStates(ExternalComponentState oldState, - ExternalComponentState newState) { - return (oldState.compareTo(newState) < 0) ? newState : oldState; - } - - /** - * This is a method that expect the results of the queries getPolicy and - * getPolicyDeployed for a unique policy (op, config, etc ...). It - * re-computes the global policy state for each policy results given. Therefore - * this method is called multiple times from the camel route and must be reset - * for a new global policy state retrieval. The state to compute the global - * policy state is stored in this class. - */ - @Override - public ExternalComponentState computeState(Exchange camelExchange) { - this.setState(mergeStates(this.getState(), - findNewState((boolean) camelExchange.getIn().getExchange().getProperty("policyFound"), - (boolean) camelExchange.getIn().getExchange().getProperty("policyDeployed")))); - return this.getState(); - } -} diff --git a/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java b/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java deleted file mode 100644 index b00c99c5f..000000000 --- a/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java +++ /dev/null @@ -1,113 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.deploy; - -import com.google.gson.JsonObject; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.loop.components.external.DcaeComponent; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.yaml.snakeyaml.Yaml; - -/** - * To decode the bluprint input parameters. - */ -public class DcaeDeployParameters { - - private static LinkedHashMap init(Loop loop) { - LinkedHashMap deploymentParamMap = new LinkedHashMap<>(); - Set microServiceList = loop.getMicroServicePolicies(); - - for (MicroServicePolicy microService : microServiceList) { - deploymentParamMap.put(microService.getName(), - generateDcaeDeployParameter(microService)); - } - return deploymentParamMap; - } - - private static JsonObject generateDcaeDeployParameter(MicroServicePolicy microService) { - return generateDcaeDeployParameter(microService.getLoopElementModel().getBlueprint(), - microService.getName()); - } - - private static JsonObject generateDcaeDeployParameter(String blueprint, String policyId) { - JsonObject deployJsonBody = new JsonObject(); - Yaml yaml = new Yaml(); - Map inputsNodes = ((Map) ((Map) yaml - .load(blueprint)).get("inputs")); - inputsNodes.entrySet().stream().filter(e -> !e.getKey().contains("policy_id")).forEach(elem -> { - Object defaultValue = ((Map) elem.getValue()).get("default"); - if (defaultValue != null) { - addPropertyToNode(deployJsonBody, elem.getKey(), defaultValue); - } else { - deployJsonBody.addProperty(elem.getKey(), ""); - } - }); - deployJsonBody.addProperty("policy_id", policyId); - return deployJsonBody; - } - - private static void addPropertyToNode(JsonObject node, String key, Object value) { - if (value instanceof String) { - node.addProperty(key, (String) value); - } else if (value instanceof Number) { - node.addProperty(key, (Number) value); - } else if (value instanceof Boolean) { - node.addProperty(key, (Boolean) value); - } else if (value instanceof Character) { - node.addProperty(key, (Character) value); - } else { - node.addProperty(key, JsonUtils.GSON.toJson(value)); - } - } - - /** - * Convert the object in Json. - * - * @return The deploymentParameters in Json - */ - public static JsonObject getDcaeDeploymentParametersInJson(Loop loop) { - JsonObject globalProperties = new JsonObject(); - JsonObject deployParamJson = new JsonObject(); - if (loop.getLoopTemplate().getUniqueBlueprint()) { - // Normally the unique blueprint could contain multiple microservices but then we can't guess - // the policy id params that will be used, so here we expect only one by default. - deployParamJson.add(DcaeComponent.UNIQUE_BLUEPRINT_PARAMETERS, - generateDcaeDeployParameter(loop.getLoopTemplate().getBlueprint(), - ((MicroServicePolicy) loop.getMicroServicePolicies().toArray()[0]).getName())); - - } else { - LinkedHashMap deploymentParamMap = init(loop); - for (Map.Entry mapElement : deploymentParamMap.entrySet()) { - deployParamJson.add(mapElement.getKey(), mapElement.getValue()); - } - } - globalProperties.add("dcaeDeployParameters", deployParamJson); - return globalProperties; - } - -} diff --git a/src/main/java/org/onap/clamp/loop/log/LogType.java b/src/main/java/org/onap/clamp/loop/log/LogType.java deleted file mode 100644 index 13d9dccf8..000000000 --- a/src/main/java/org/onap/clamp/loop/log/LogType.java +++ /dev/null @@ -1,28 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.log; - -public enum LogType { - INFO, WARNING, ERROR; -} diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLog.java b/src/main/java/org/onap/clamp/loop/log/LoopLog.java deleted file mode 100644 index ad3c7970f..000000000 --- a/src/main/java/org/onap/clamp/loop/log/LoopLog.java +++ /dev/null @@ -1,193 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.log; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import org.onap.clamp.loop.Loop; - -/** - * This class holds the logs created by the Clamp Backend. The Instant is always - * rounded to the nearest second as the nano seconds can't be stored in the - * database. The logs can be therefore exposed to the UI or the client doing - * some GET Loop on the backend. - * - */ -@Entity -@Table(name = "loop_logs") -public class LoopLog implements Serializable, Comparable { - /** - * The serial version ID. - */ - private static final long serialVersionUID = 1988276670074437631L; - - @Expose - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Expose - @Column(name = "log_type", nullable = false) - @Enumerated(EnumType.STRING) - private LogType logType; - - @Expose - @Column(name = "log_component", nullable = false) - private String logComponent; - - @Expose - @Column(name = "message", columnDefinition = "MEDIUMTEXT", nullable = false) - private String message; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "loop_id", nullable = false) - private Loop loop; - - @Expose - @Column(name = "log_instant", nullable = false) - private Instant logInstant = Instant.now().truncatedTo(ChronoUnit.SECONDS); - - public LoopLog() { - } - - /** - * Constructor For LoopLog taking message and logtype, logComponent and loop - * reference. - * - * @param message The message as string - * @param logType Type like INFO, WARN, DEBUG - * @param logComponent A String with DCAE, POLICY, CLAMP ,etc... - * @param loop The loop object that this log is about - */ - public LoopLog(String message, LogType logType, String logComponent, Loop loop) { - this.message = message; - this.logType = logType; - this.loop = loop; - this.logComponent = logComponent; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public LogType getLogType() { - return logType; - } - - public void setLogType(LogType logType) { - this.logType = logType; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public Loop getLoop() { - return loop; - } - - public void setLoop(Loop loop) { - this.loop = loop; - } - - public Instant getLogInstant() { - return logInstant; - } - - public void setLogInstant(Instant logInstant) { - this.logInstant = logInstant.truncatedTo(ChronoUnit.SECONDS); - } - - public String getLogComponent() { - return logComponent; - } - - public void setLogComponent(String logComponent) { - this.logComponent = logComponent; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - LoopLog other = (LoopLog) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - return true; - } - - @Override - public int compareTo(LoopLog arg0) { - // Reverse it, so that by default we have the latest - if (getId() == null) { - return 1; - } - if (arg0.getId() == null) { - return -1; - } - return arg0.getId().compareTo(this.getId()); - } - -} diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLogRepository.java b/src/main/java/org/onap/clamp/loop/log/LoopLogRepository.java deleted file mode 100644 index 0b3c34ec0..000000000 --- a/src/main/java/org/onap/clamp/loop/log/LoopLogRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.log; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface LoopLogRepository extends JpaRepository { - -} diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLogService.java b/src/main/java/org/onap/clamp/loop/log/LoopLogService.java deleted file mode 100644 index d02d0b278..000000000 --- a/src/main/java/org/onap/clamp/loop/log/LoopLogService.java +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.log; - -import org.onap.clamp.loop.Loop; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class LoopLogService { - - private final LoopLogRepository repository; - - @Autowired - public LoopLogService(LoopLogRepository repository) { - this.repository = repository; - } - - public void addLog(String message, String logType, Loop loop) { - this.addLogForComponent(message, logType, "CLAMP", loop); - } - - public void addLogForComponent(String message, String logType, String component, Loop loop) { - loop.addLog(repository.save(new LoopLog(message, LogType.valueOf(logType), component, loop))); - } - - public boolean isExisting(Long logId) { - return repository.existsById(logId); - } -} diff --git a/src/main/java/org/onap/clamp/loop/service/CsarServiceInstaller.java b/src/main/java/org/onap/clamp/loop/service/CsarServiceInstaller.java deleted file mode 100644 index c43f2cb6d..000000000 --- a/src/main/java/org/onap/clamp/loop/service/CsarServiceInstaller.java +++ /dev/null @@ -1,129 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.loop.service; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import java.util.Map.Entry; -import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; -import org.onap.clamp.clds.sdc.controller.installer.CsarHandler; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.sdc.tosca.parser.api.IEntityDetails; -import org.onap.sdc.tosca.parser.elements.queries.EntityQuery; -import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; -import org.onap.sdc.tosca.parser.enums.EntityTemplateType; -import org.onap.sdc.tosca.parser.enums.SdcTypes; -import org.onap.sdc.toscaparser.api.NodeTemplate; -import org.onap.sdc.toscaparser.api.Property; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -@Component -@Qualifier("csarInstaller") -public class CsarServiceInstaller { - private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarServiceInstaller.class); - - @Autowired - ServicesRepository serviceRepository; - - /** - * Install the Service from the csar. - * - * @param csar The Csar Handler - * @return The service object - */ - @Transactional(propagation = Propagation.REQUIRES_NEW) - public Service installTheService(CsarHandler csar) { - logger.info("Start to install the Service from csar"); - JsonObject serviceDetails = JsonUtils.GSON.fromJson( - JsonUtils.GSON.toJson(csar.getSdcCsarHelper().getServiceMetadataAllProperties()), JsonObject.class); - - // Add properties details for each type, VfModule, VF, VFC, .... - JsonObject resourcesProp = createServicePropertiesByType(csar); - resourcesProp.add("VFModule", createVfModuleProperties(csar)); - - Service modelService = new Service(serviceDetails, resourcesProp, - csar.getSdcNotification().getServiceVersion()); - - serviceRepository.save(modelService); - logger.info("Successfully installed the Service"); - return modelService; - } - - private JsonObject createServicePropertiesByType(CsarHandler csar) { - JsonObject resourcesProp = new JsonObject(); - // Iterate on all types defined in the tosca lib - for (SdcTypes type : SdcTypes.values()) { - JsonObject resourcesPropByType = new JsonObject(); - // For each type, get the metadata of each nodetemplate - for (NodeTemplate nodeTemplate : csar.getSdcCsarHelper().getServiceNodeTemplateBySdcType(type)) { - resourcesPropByType.add(nodeTemplate.getName(), - JsonUtils.GSON.toJsonTree(nodeTemplate.getMetaData().getAllProperties())); - } - resourcesProp.add(type.getValue(), resourcesPropByType); - } - return resourcesProp; - } - - private static JsonObject createVfModuleProperties(CsarHandler csar) { - JsonObject vfModuleProps = new JsonObject(); - // Loop on all Groups defined in the service (VFModule entries type: - // org.openecomp.groups.VfModule) - for (IEntityDetails entity : csar.getSdcCsarHelper().getEntity( - EntityQuery.newBuilder(EntityTemplateType.GROUP).build(), - TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE).build(), false)) { - // Get all metadata info - JsonObject allVfProps = (JsonObject) JsonUtils.GSON.toJsonTree(entity.getMetadata().getAllProperties()); - vfModuleProps.add(entity.getMetadata().getAllProperties().get("vfModuleModelName"), allVfProps); - // now append the properties section so that we can also have isBase, - // volume_group, etc ... fields under the VFmodule name - for (Entry additionalProp : entity.getProperties().entrySet()) { - allVfProps.add(additionalProp.getValue().getName(), - JsonUtils.GSON.toJsonTree(additionalProp.getValue().getValue())); - } - } - return vfModuleProps; - } - - /** - * Verify whether Service in Csar is deployed. - * - * @param csar The Csar Handler - * @return The flag indicating whether Service is deployed - * @throws SdcArtifactInstallerException The SdcArtifactInstallerException - */ - public boolean isServiceAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException { - boolean alreadyInstalled = true; - JsonObject serviceDetails = JsonUtils.GSON.fromJson( - JsonUtils.GSON.toJson(csar.getSdcCsarHelper().getServiceMetadataAllProperties()), JsonObject.class); - alreadyInstalled = serviceRepository.existsById(serviceDetails.get("UUID").getAsString()); - - return alreadyInstalled; - } -} diff --git a/src/main/java/org/onap/clamp/loop/service/Service.java b/src/main/java/org/onap/clamp/loop/service/Service.java deleted file mode 100644 index 2ac9d7e87..000000000 --- a/src/main/java/org/onap/clamp/loop/service/Service.java +++ /dev/null @@ -1,169 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.service; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; -import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.TypeDefs; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.dao.model.jsontype.StringJsonUserType; - -@Entity -@Table(name = "services") -@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) -public class Service implements Serializable { - - /** - * The serial version id. - */ - private static final long serialVersionUID = 1331119060272760758L; - - @Transient - private static final EELFLogger logger = EELFManager.getInstance().getLogger(Service.class); - - @Id - @Column(name = "service_uuid", unique = true) - private String serviceUuid; - - @Column(nullable = false, name = "name") - private String name; - - @Column(name = "version") - private String version; - - @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "service_details") - private JsonObject serviceDetails; - - @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "resource_details") - private JsonObject resourceDetails; - - /** - * Default constructor for serialization. - */ - public Service() { - } - - /** - * Constructor with string. - */ - public Service(String serviceDetails, String resourceDetails) { - JsonObject serviceDetailsJson = JsonUtils.GSON.fromJson(serviceDetails, JsonObject.class); - this.name = serviceDetailsJson.get("name").getAsString(); - this.serviceUuid = serviceDetailsJson.get("UUID").getAsString(); - this.serviceDetails = serviceDetailsJson; - this.resourceDetails = JsonUtils.GSON.fromJson(resourceDetails, JsonObject.class); - } - - /** - * Constructor with Json Object. - */ - public Service(JsonObject serviceDetails, JsonObject resourceDetails, String version) { - this.name = serviceDetails.get("name").getAsString(); - this.serviceUuid = serviceDetails.get("UUID").getAsString(); - this.serviceDetails = serviceDetails; - this.resourceDetails = resourceDetails; - this.version = version; - } - - public String getServiceUuid() { - return serviceUuid; - } - - public JsonObject getServiceDetails() { - return serviceDetails; - } - - public JsonObject getResourceDetails() { - return resourceDetails; - } - - public JsonObject getResourceByType(String type) { - return (JsonObject) resourceDetails.get(type); - } - - /** - * Name getter. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Version getter. - * - * @return the version - */ - public String getVersion() { - return version; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((serviceUuid == null) ? 0 : serviceUuid.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Service other = (Service) obj; - if (serviceUuid == null) { - if (other.serviceUuid != null) { - return false; - } - } else { - if (!serviceUuid.equals(other.serviceUuid)) { - return false; - } - } - return true; - } - -} diff --git a/src/main/java/org/onap/clamp/loop/service/ServicesRepository.java b/src/main/java/org/onap/clamp/loop/service/ServicesRepository.java deleted file mode 100644 index fe5ba8ed0..000000000 --- a/src/main/java/org/onap/clamp/loop/service/ServicesRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.service; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ServicesRepository extends JpaRepository { -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java b/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java deleted file mode 100644 index f210df949..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopElementModel.java +++ /dev/null @@ -1,295 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import org.hibernate.annotations.SortNatural; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.loop.common.AuditEntity; -import org.onap.clamp.policy.Policy; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.operational.OperationalPolicy; - -/** - * This class represents a micro service/operational/... model for a loop template. - * So it's an element in the flow (a box shown in the loop). - */ - -@Entity -@Table(name = "loop_element_models") -public class LoopElementModel extends AuditEntity implements Serializable { - /** - * The serial version id. - */ - private static final long serialVersionUID = -286522707701376645L; - - @Id - @Expose - @Column(nullable = false, name = "name", unique = true) - private String name; - - @Expose - @Column(name = "dcae_blueprint_id") - private String dcaeBlueprintId; - - /** - * Here we store the blueprint coming from DCAE, it can be null if this is not a micro service model. - */ - @Column(columnDefinition = "MEDIUMTEXT", name = "blueprint_yaml") - private String blueprint; - - public static final String MICRO_SERVICE_TYPE = "MICRO_SERVICE_TYPE"; - public static final String OPERATIONAL_POLICY_TYPE = "OPERATIONAL_POLICY_TYPE"; - /** - * The type of element. - */ - @Expose - @Column(nullable = false, name = "loop_element_type") - private String loopElementType; - - /** - * This variable is used to display the micro-service name in the SVG. - */ - @Expose - @Column(name = "short_name") - private String shortName; - - /** - * This variable is used to store the type mentioned in the micro-service - * blueprint. - */ - @Expose - @ManyToMany( - fetch = FetchType.EAGER, - cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinTable( - name = "loopelementmodels_to_policymodels", - joinColumns = @JoinColumn(name = "loop_element_name", referencedColumnName = "name"), - inverseJoinColumns = { - @JoinColumn(name = "policy_model_type", referencedColumnName = "policy_model_type"), - @JoinColumn(name = "policy_model_version", referencedColumnName = "version")}) - @SortNatural - private SortedSet policyModels = new TreeSet<>(); - - @OneToMany(fetch = FetchType.LAZY, mappedBy = "loopElementModel", orphanRemoval = true) - private Set usedByLoopTemplates = new HashSet<>(); - - /** - * policyModels getter. - * - * @return the policyModel - */ - public SortedSet getPolicyModels() { - return policyModels; - } - - /** - * Method to add a new policyModel to the list. - * - * @param policyModel The policy model - */ - public void addPolicyModel(PolicyModel policyModel) { - policyModels.add(policyModel); - policyModel.getUsedByElementModels().add(this); - } - - /** - * name getter. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * name setter. - * - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * blueprint getter. - * - * @return the blueprint - */ - public String getBlueprint() { - return blueprint; - } - - /** - * blueprint setter. - * - * @param blueprint the blueprint to set - */ - public void setBlueprint(String blueprint) { - this.blueprint = blueprint; - } - - /** - * dcaeBlueprintId getter. - * - * @return the dcaeBlueprintId - */ - public String getDcaeBlueprintId() { - return dcaeBlueprintId; - } - - /** - * dcaeBlueprintId setter. - * - * @param dcaeBlueprintId the dcaeBlueprintId to set - */ - public void setDcaeBlueprintId(String dcaeBlueprintId) { - this.dcaeBlueprintId = dcaeBlueprintId; - } - - /** - * loopElementType getter. - * - * @return the loopElementType - */ - public String getLoopElementType() { - return loopElementType; - } - - /** - * loopElementType setter. - * - * @param loopElementType the loopElementType to set - */ - public void setLoopElementType(String loopElementType) { - this.loopElementType = loopElementType; - } - - /** - * shortName getter. - * - * @return the shortName - */ - public String getShortName() { - return shortName; - } - - /** - * * @param shortName the shortName to set. - */ - public void setShortName(String shortName) { - this.shortName = shortName; - } - - /** - * usedByLoopTemplates getter. - * - * @return the usedByLoopTemplates - */ - public Set getUsedByLoopTemplates() { - return usedByLoopTemplates; - } - - /** - * Default constructor for serialization. - */ - public LoopElementModel() { - } - - /** - * Constructor. - * - * @param name The name id - * @param loopElementType The type of loop element - * @param blueprint The blueprint defined for dcae that contains the - * policy type to use - */ - public LoopElementModel(String name, String loopElementType, String blueprint) { - this.name = name; - this.loopElementType = loopElementType; - this.blueprint = blueprint; - } - - /** - * Create a policy instance from the current loop element model. - * - * @return A Policy object. - */ - public Policy createPolicyInstance(Loop loop, ToscaConverterWithDictionarySupport toscaConverter) { - if (LoopElementModel.MICRO_SERVICE_TYPE.equals(this.getLoopElementType())) { - return new MicroServicePolicy(loop, loop.getModelService(), this, toscaConverter); - } else if (LoopElementModel.OPERATIONAL_POLICY_TYPE.equals(this.getLoopElementType())) { - return new OperationalPolicy(loop, loop.getModelService(), this, toscaConverter); - } else { - return null; - } - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - LoopElementModel other = (LoopElementModel) obj; - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopElementModelsRepository.java b/src/main/java/org/onap/clamp/loop/template/LoopElementModelsRepository.java deleted file mode 100644 index 27b82189c..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopElementModelsRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface LoopElementModelsRepository extends JpaRepository { -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java b/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java deleted file mode 100644 index 1204c6c62..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopTemplate.java +++ /dev/null @@ -1,341 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import org.hibernate.annotations.SortNatural; -import org.onap.clamp.loop.common.AuditEntity; -import org.onap.clamp.loop.service.Service; - -@Entity -@Table(name = "loop_templates") -public class LoopTemplate extends AuditEntity implements Serializable { - - /** - * The serial version id. - */ - private static final long serialVersionUID = -286522707701388642L; - - @Id - @Expose - @Column(nullable = false, name = "name", unique = true) - private String name; - - @Expose - @Column(name = "dcae_blueprint_id") - private String dcaeBlueprintId; - - /** - * This field is used when we have a blueprint defining all microservices. The - * other option would be to have independent blueprint for each microservices. - * In that case they are stored in each MicroServiceModel - */ - @Column(columnDefinition = "MEDIUMTEXT", name = "blueprint_yaml") - private String blueprint; - - @Expose - @OneToMany( - cascade = CascadeType.ALL, - fetch = FetchType.EAGER, - mappedBy = "loopTemplate", - orphanRemoval = true) - @SortNatural - private SortedSet loopElementModelsUsed = new TreeSet<>(); - - @Expose - @ManyToOne( - fetch = FetchType.EAGER, - cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) - @JoinColumn(name = "service_uuid") - private Service modelService; - - @Expose - @Column(name = "maximum_instances_allowed") - private Integer maximumInstancesAllowed; - - @Expose - @Column(name = "unique_blueprint", columnDefinition = "boolean default false") - private boolean uniqueBlueprint; - - /** - * Type of Loop allowed to be created. - */ - @Expose - @Column(name = "allowed_loop_type") - @Convert(converter = LoopTypeConvertor.class) - private LoopType allowedLoopType = LoopType.CLOSED; - - /** - * name getter. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * name setter. - * - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * blueprint getter. - * - * @return the blueprint - */ - public String getBlueprint() { - return blueprint; - } - - /** - * dcaeBlueprintId getter. - * - * @return the dcaeBlueprintId - */ - public String getDcaeBlueprintId() { - return dcaeBlueprintId; - } - - /** - * dcaeBlueprintId setter. - * - * @param dcaeBlueprintId the dcaeBlueprintId to set - */ - public void setDcaeBlueprintId(String dcaeBlueprintId) { - this.dcaeBlueprintId = dcaeBlueprintId; - } - - /** - * blueprint setter. - * - * @param blueprint the blueprint to set - */ - public void setBlueprint(String blueprint) { - this.blueprint = blueprint; - if (blueprint == null) { - this.uniqueBlueprint = false; - } else { - this.uniqueBlueprint = true; - } - } - - /** - * loopElementModelsUsed getter. - * - * @return the loopElementModelsUsed - */ - public SortedSet getLoopElementModelsUsed() { - return loopElementModelsUsed; - } - - /** - * maximumInstancesAllowed getter. - * - * @return the maximumInstancesAllowed - */ - public Integer getMaximumInstancesAllowed() { - return maximumInstancesAllowed; - } - - /** - * maximumInstancesAllowed setter. - * - * @param maximumInstancesAllowed the maximumInstancesAllowed to set - */ - public void setMaximumInstancesAllowed(Integer maximumInstancesAllowed) { - this.maximumInstancesAllowed = maximumInstancesAllowed; - } - - /** - * allowedLoopType getter. - * - * @return the allowedLoopType Type of Loop allowed to be created - */ - public LoopType getAllowedLoopType() { - return allowedLoopType; - } - - /** - * allowedLoopType setter. - * - * @param allowedLoopType the allowedLoopType to set - */ - public void setAllowedLoopType(LoopType allowedLoopType) { - this.allowedLoopType = allowedLoopType; - } - - /** - * Add list of loopElements to the current template, each loopElementModel is - * added at the end of the list so the flowOrder is computed automatically. - * - * @param loopElementModels The loopElementModel set to add - */ - public void addLoopElementModels(Set loopElementModels) { - for (LoopElementModel loopElementModel : loopElementModels) { - addLoopElementModel(loopElementModel); - } - } - - /** - * Add a loopElement to the current template, the loopElementModel is added at - * the end of the list so the flowOrder is computed automatically. - * - * @param loopElementModel The loopElementModel to add - */ - public void addLoopElementModel(LoopElementModel loopElementModel) { - this.addLoopElementModel(loopElementModel, this.loopElementModelsUsed.size()); - } - - /** - * Add a loopElement model to the current template, the flow order must be - * specified manually. - * - * @param loopElementModel The loopElementModel to add - * @param listPosition The position in the flow - */ - public void addLoopElementModel(LoopElementModel loopElementModel, Integer listPosition) { - LoopTemplateLoopElementModel jointEntry = - new LoopTemplateLoopElementModel(this, loopElementModel, listPosition); - this.loopElementModelsUsed.add(jointEntry); - loopElementModel.getUsedByLoopTemplates().add(jointEntry); - } - - /** - * modelService getter. - * - * @return the modelService - */ - public Service getModelService() { - return modelService; - } - - /** - * modelService setter. - * - * @param modelService the modelService to set - */ - public void setModelService(Service modelService) { - this.modelService = modelService; - } - - /** - * uniqueBlueprint getter. - * - * @return the uniqueBlueprint - */ - public boolean getUniqueBlueprint() { - return uniqueBlueprint; - } - - /** - * Default constructor for serialization. - */ - public LoopTemplate() { - - } - - /** - * Constructor. - * - * @param name The loop template name id - * @param blueprint The blueprint containing all microservices (legacy - * case) - * @param maxInstancesAllowed The maximum number of instances that can be - * created from that template - * @param service The service associated to that loop template - */ - public LoopTemplate(String name, String blueprint, Integer maxInstancesAllowed, Service service) { - this.name = name; - this.setBlueprint(blueprint); - - this.maximumInstancesAllowed = maxInstancesAllowed; - this.modelService = service; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - LoopTemplate other = (LoopTemplate) obj; - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - - /** - * Generate the loop template name. - * - * @param serviceName The service name - * @param serviceVersion The service version - * @param resourceName The resource name - * @param blueprintFileName The blueprint file name - * @return The generated loop template name - */ - public static String generateLoopTemplateName(String serviceName, String serviceVersion, - String resourceName, String blueprintFileName) { - StringBuilder buffer = new StringBuilder("LOOP_TEMPLATE_").append(serviceName).append("_v") - .append(serviceVersion).append("_").append(resourceName).append("_") - .append(blueprintFileName.replaceAll(".yaml", "")); - return buffer.toString().replace('.', '_').replaceAll(" ", ""); - } -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModel.java b/src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModel.java deleted file mode 100644 index 36fc3fb1d..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModel.java +++ /dev/null @@ -1,192 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; - -@Entity -@Table(name = "looptemplates_to_loopelementmodels") -public class LoopTemplateLoopElementModel implements Serializable, Comparable { - - /** - * Serial ID. - */ - private static final long serialVersionUID = 5924989899078094245L; - - @EmbeddedId - private LoopTemplateLoopElementModelId loopTemplateLoopElementModelId; - - @ManyToOne(fetch = FetchType.LAZY) - @MapsId("loopTemplateName") - @JoinColumn(name = "loop_template_name") - private LoopTemplate loopTemplate; - - @Expose - @ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }) - @MapsId("loopElementModelName") - @JoinColumn(name = "loop_element_model_name") - private LoopElementModel loopElementModel; - - @Expose - @Column(nullable = false, name = "flow_order") - private Integer flowOrder; - - /** - * Default constructor for serialization. - */ - public LoopTemplateLoopElementModel() { - - } - - /** - * Constructor. - * - * @param loopTemplate The loop template object - * @param loopElementModel The loopElementModel object - * @param flowOrder The position of the micro service in the flow - */ - public LoopTemplateLoopElementModel(LoopTemplate loopTemplate, LoopElementModel loopElementModel, - Integer flowOrder) { - this.loopTemplate = loopTemplate; - this.loopElementModel = loopElementModel; - this.flowOrder = flowOrder; - this.loopTemplateLoopElementModelId = new LoopTemplateLoopElementModelId(loopTemplate.getName(), - loopElementModel.getName()); - } - - /** - * loopTemplate getter. - * - * @return the loopTemplate - */ - public LoopTemplate getLoopTemplate() { - return loopTemplate; - } - - /** - * loopTemplate setter. - * - * @param loopTemplate the loopTemplate to set - */ - public void setLoopTemplate(LoopTemplate loopTemplate) { - this.loopTemplate = loopTemplate; - } - - /** - * loopElementModel getter. - * - * @return the loopElementModel - */ - public LoopElementModel getLoopElementModel() { - return loopElementModel; - } - - /** - * loopElementModel setter. - * - * @param loopElementModel the loopElementModel to set - */ - public void setLoopElementModel(LoopElementModel loopElementModel) { - this.loopElementModel = loopElementModel; - } - - /** - * flowOrder getter. - * - * @return the flowOrder - */ - public Integer getFlowOrder() { - return flowOrder; - } - - /** - * flowOrder setter. - * - * @param flowOrder the flowOrder to set - */ - public void setFlowOrder(Integer flowOrder) { - this.flowOrder = flowOrder; - } - - @Override - public int compareTo(LoopTemplateLoopElementModel arg0) { - // Reverse it, so that by default we have the latest - if (getFlowOrder() == null) { - return 1; - } - if (arg0.getFlowOrder() == null) { - return -1; - } - return arg0.getFlowOrder().compareTo(this.getFlowOrder()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((loopTemplate == null) ? 0 : loopTemplate.hashCode()); - result = prime * result + ((loopElementModel == null) ? 0 : loopElementModel.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - LoopTemplateLoopElementModel other = (LoopTemplateLoopElementModel) obj; - if (loopTemplate == null) { - if (other.loopTemplate != null) { - return false; - } - } else if (!loopTemplate.equals(other.loopTemplate)) { - return false; - } - if (loopElementModel == null) { - if (other.loopElementModel != null) { - return false; - } - } else if (!loopElementModel.equals(other.loopElementModel)) { - return false; - } - return true; - } - -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModelId.java b/src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModelId.java deleted file mode 100644 index cac5f088a..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopTemplateLoopElementModelId.java +++ /dev/null @@ -1,100 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; - -@Embeddable -public class LoopTemplateLoopElementModelId implements Serializable { - - /** - * Serial ID. - */ - private static final long serialVersionUID = 4089888115504914773L; - - @Expose - @Column(name = "loop_template_name") - private String loopTemplateName; - - @Expose - @Column(name = "loop_element_model_name") - private String loopElementModelName; - - /** - * Default constructor for serialization. - */ - public LoopTemplateLoopElementModelId() { - - } - - /** - * Constructor. - * - * @param loopTemplateName The loop template name id - * @param microServiceModelName THe micro Service name id - */ - public LoopTemplateLoopElementModelId(String loopTemplateName, String microServiceModelName) { - this.loopTemplateName = loopTemplateName; - this.loopElementModelName = microServiceModelName; - } - - /** - * loopTemplateName getter. - * - * @return the loopTemplateName - */ - public String getLoopTemplateName() { - return loopTemplateName; - } - - /** - * loopTemplateName setter. - * - * @param loopTemplateName the loopTemplateName to set - */ - public void setLoopTemplateName(String loopTemplateName) { - this.loopTemplateName = loopTemplateName; - } - - /** - * microServiceModelName getter. - * - * @return the microServiceModelName - */ - public String getLoopElementModelName() { - return loopElementModelName; - } - - /** - * loopElementModelName setter. - * - * @param loopElementModelName the loopElementModelName to set - */ - public void setLoopElementModelName(String loopElementModelName) { - this.loopElementModelName = loopElementModelName; - } -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopTemplatesRepository.java b/src/main/java/org/onap/clamp/loop/template/LoopTemplatesRepository.java deleted file mode 100644 index c647c261a..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopTemplatesRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -@Repository -public interface LoopTemplatesRepository extends JpaRepository { - - @Query("SELECT looptemplate.name FROM LoopTemplate as looptemplate") - List getAllLoopTemplateNames(); -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopTemplatesService.java b/src/main/java/org/onap/clamp/loop/template/LoopTemplatesService.java deleted file mode 100644 index 29382137e..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopTemplatesService.java +++ /dev/null @@ -1,67 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import java.util.List; -import org.onap.clamp.clds.sdc.controller.installer.ChainGenerator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class LoopTemplatesService { - - private final LoopTemplatesRepository loopTemplatesRepository; - - @Autowired - ChainGenerator chainGenerator; - - /** - * Constructor. - */ - @Autowired - public LoopTemplatesService(LoopTemplatesRepository loopTemplatesRepository) { - this.loopTemplatesRepository = loopTemplatesRepository; - - } - - public LoopTemplate saveOrUpdateLoopTemplate(LoopTemplate loopTemplate) { - return loopTemplatesRepository.save(loopTemplate); - } - - public List getLoopTemplateNames() { - return loopTemplatesRepository.getAllLoopTemplateNames(); - } - - public List getAllLoopTemplates() { - return loopTemplatesRepository.findAll(); - } - - public LoopTemplate getLoopTemplate(String name) { - return loopTemplatesRepository.findById(name).orElse(null); - } - - public void deleteLoopTemplate(String name) { - loopTemplatesRepository.deleteById(name); - } -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopType.java b/src/main/java/org/onap/clamp/loop/template/LoopType.java deleted file mode 100644 index ccbc62a83..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopType.java +++ /dev/null @@ -1,42 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -/** - * Enums for AllowedLoopType in LoopTemplate enity. - * - */ -public enum LoopType { - OPEN("OPEN"), CLOSED("CLOSED"), HYBRID("HYBRID"); - - private String value; - - private LoopType(String value) { - this.value = value; - } - - public String getValue() { - return value; - } -} diff --git a/src/main/java/org/onap/clamp/loop/template/LoopTypeConvertor.java b/src/main/java/org/onap/clamp/loop/template/LoopTypeConvertor.java deleted file mode 100644 index 0b05613cb..000000000 --- a/src/main/java/org/onap/clamp/loop/template/LoopTypeConvertor.java +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import java.util.stream.Stream; -import javax.persistence.AttributeConverter; - -/** - * Attribute Converter to allow using LoopType Enum values in DB and Java classes. - * - */ -public class LoopTypeConvertor implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(LoopType loopType) { - if (loopType == null) { - return null; - } - return loopType.getValue(); - } - - @Override - public LoopType convertToEntityAttribute(String value) { - if (value == null) { - return null; - } - - return Stream.of(LoopType.values()).filter(c -> c.getValue().equals(value)).findFirst() - .orElseThrow(IllegalArgumentException::new); - } -} diff --git a/src/main/java/org/onap/clamp/loop/template/PolicyModel.java b/src/main/java/org/onap/clamp/loop/template/PolicyModel.java deleted file mode 100644 index 3f45d0551..000000000 --- a/src/main/java/org/onap/clamp/loop/template/PolicyModel.java +++ /dev/null @@ -1,282 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import com.google.gson.JsonObject; -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.ManyToMany; -import javax.persistence.Table; -import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.TypeDefs; -import org.onap.clamp.dao.model.jsontype.StringJsonUserType; -import org.onap.clamp.loop.common.AuditEntity; -import org.onap.clamp.util.SemanticVersioning; - -/** - * This class represents the policy model tosca revision that we can have to a - * specific microservice. - */ -@Entity -@Table(name = "policy_models") -@IdClass(PolicyModelId.class) -@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) -public class PolicyModel extends AuditEntity implements Serializable, Comparable { - - /** - * The serial version id. - */ - private static final long serialVersionUID = -286522705701376645L; - - /** - * This variable is used to store the type mentioned in the micro-service - * blueprint. - */ - @Id - @Expose - @Column(nullable = false, name = "policy_model_type") - private String policyModelType; - - /** - * Semantic versioning on policy side. - */ - @Id - @Expose - @Column(name = "version", nullable = false) - private String version; - - @Column(columnDefinition = "MEDIUMTEXT", name = "policy_tosca") - private String policyModelTosca; - - @Expose - @Column(name = "policy_acronym") - private String policyAcronym; - - @ManyToMany(mappedBy = "policyModels", fetch = FetchType.EAGER) - private Set usedByElementModels = new HashSet<>(); - - @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "policy_pdp_group") - private JsonObject policyPdpGroup; - - /** - * usedByElementModels getter. - * - * @return the usedByElementModels - */ - public Set getUsedByElementModels() { - return usedByElementModels; - } - - /** - * policyPdpGroup getter. - * - * @return the policyPdpGroup - */ - public JsonObject getPolicyPdpGroup() { - return policyPdpGroup; - } - - /** - * policyPdpGroup setter. - * - * @param policyPdpGroup the policyPdpGroup to set - */ - public void setPolicyPdpGroup(JsonObject policyPdpGroup) { - this.policyPdpGroup = policyPdpGroup; - } - - /** - * policyModelTosca getter. - * - * @return the policyModelTosca - */ - public String getPolicyModelTosca() { - return policyModelTosca; - } - - /** - * policyModelTosca setter. - * - * @param policyModelTosca the policyModelTosca to set - */ - public void setPolicyModelTosca(String policyModelTosca) { - this.policyModelTosca = policyModelTosca; - } - - /** - * policyModelType getter. - * - * @return the modelType - */ - public String getPolicyModelType() { - return policyModelType; - } - - /** - * policyModelType setter. - * - * @param modelType the modelType to set - */ - public void setPolicyModelType(String modelType) { - this.policyModelType = modelType; - } - - /** - * version getter. - * - * @return the version - */ - public String getVersion() { - return version; - } - - /** - * version setter. - * - * @param version the version to set - */ - public void setVersion(String version) { - // Try to convert it before - this.version = version; - } - - /** - * policyAcronym getter. - * - * @return the policyAcronym value - */ - public String getPolicyAcronym() { - return policyAcronym; - } - - /** - * policyAcronym setter. - * - * @param policyAcronym The policyAcronym to set - */ - public void setPolicyAcronym(String policyAcronym) { - this.policyAcronym = policyAcronym; - } - - /** - * Default constructor for serialization. - */ - public PolicyModel() { - } - - /** - * Constructor. - * - * @param policyType The policyType (referenced in the blueprint - * @param policyModelTosca The policy tosca model in yaml - * @param version the version like 1.0.0 - * @param policyAcronym Subtype for policy if it exists (could be used by UI) - */ - public PolicyModel(String policyType, String policyModelTosca, String version, - String policyAcronym) { - this.policyModelType = policyType; - this.policyModelTosca = policyModelTosca; - this.version = version; - this.policyAcronym = policyAcronym; - if (this.policyAcronym == null) { - this.policyAcronym = createDefaultPolicyAcronym(policyType); - } - } - - /** - * Constructor with acronym generated by default from policyType. - * - * @param policyType The policyType (referenced in the blueprint - * @param policyModelTosca The policy tosca model in yaml - * @param version the version like 1.0.0 - */ - public PolicyModel(String policyType, String policyModelTosca, String version) { - this(policyType, policyModelTosca, version, null); - } - - public static String createDefaultPolicyAcronym(String policyType) { - String[] policyNameArray = policyType.split("\\."); - return policyNameArray[policyNameArray.length - 1]; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((policyModelType == null) ? 0 : policyModelType.hashCode()); - result = prime * result + ((version == null) ? 0 : version.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - PolicyModel other = (PolicyModel) obj; - if (policyModelType == null) { - if (other.policyModelType != null) { - return false; - } - } else if (!policyModelType.equals(other.policyModelType)) { - return false; - } - if (version == null) { - if (other.version != null) { - return false; - } - } else if (!version.equals(other.version)) { - return false; - } - return true; - } - - @Override - public int compareTo(PolicyModel arg0) { - - if (this.getPolicyModelType().equals(arg0.getPolicyModelType())) { - // Reverse it, so that by default we have the latest in they are same model type - return SemanticVersioning.compare(arg0.getVersion(), this.version); - } else { - return this.getPolicyModelType().compareTo(arg0.getPolicyModelType()); - } - - } -} diff --git a/src/main/java/org/onap/clamp/loop/template/PolicyModelId.java b/src/main/java/org/onap/clamp/loop/template/PolicyModelId.java deleted file mode 100644 index 3fd19171f..000000000 --- a/src/main/java/org/onap/clamp/loop/template/PolicyModelId.java +++ /dev/null @@ -1,92 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; - -public class PolicyModelId implements Serializable { - - /** - * Serial Id. - */ - private static final long serialVersionUID = -2846526482064334745L; - - @Expose - private String policyModelType; - - @Expose - private String version; - - /** - * Default constructor for serialization. - */ - public PolicyModelId() { - - } - - /** - * Constructor. - */ - public PolicyModelId(String policyModelType, String version) { - this.policyModelType = policyModelType; - this.version = version; - } - - /** - * policyModelType getter. - * - * @return the policyModelType - */ - public String getPolicyModelType() { - return policyModelType; - } - - /** - * policyModelType setter. - * - * @param policyModelType the policyModelType to set - */ - public void setPolicyModelType(String policyModelType) { - this.policyModelType = policyModelType; - } - - /** - * version getter. - * - * @return the version - */ - public String getVersion() { - return version; - } - - /** - * version setter. - * - * @param version the version to set - */ - public void setVersion(String version) { - this.version = version; - } -} diff --git a/src/main/java/org/onap/clamp/loop/template/PolicyModelsRepository.java b/src/main/java/org/onap/clamp/loop/template/PolicyModelsRepository.java deleted file mode 100644 index f4b09caeb..000000000 --- a/src/main/java/org/onap/clamp/loop/template/PolicyModelsRepository.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -@Repository -public interface PolicyModelsRepository extends JpaRepository { - @Query("SELECT policymodel.policyModelType FROM PolicyModel as policymodel") - List getAllPolicyModelType(); - - List findByPolicyModelType(String policyModelType); -} diff --git a/src/main/java/org/onap/clamp/loop/template/PolicyModelsService.java b/src/main/java/org/onap/clamp/loop/template/PolicyModelsService.java deleted file mode 100644 index c482c34d5..000000000 --- a/src/main/java/org/onap/clamp/loop/template/PolicyModelsService.java +++ /dev/null @@ -1,173 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop.template; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.onap.clamp.clds.tosca.ToscaSchemaConstants; -import org.onap.clamp.clds.tosca.ToscaYamlToJsonConvertor; -import org.onap.clamp.policy.pdpgroup.PdpGroup; -import org.onap.clamp.util.SemanticVersioning; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -@Service -public class PolicyModelsService { - private final PolicyModelsRepository policyModelsRepository; - private ToscaYamlToJsonConvertor toscaYamlToJsonConvertor; - - @Autowired - public PolicyModelsService(PolicyModelsRepository policyModelrepo, - ToscaYamlToJsonConvertor convertor) { - policyModelsRepository = policyModelrepo; - toscaYamlToJsonConvertor = convertor; - } - - /** - * Save or Update Policy Model. - * - * @param policyModel The policyModel - * @return The Policy Model - */ - public PolicyModel saveOrUpdatePolicyModel(PolicyModel policyModel) { - return policyModelsRepository.saveAndFlush(policyModel); - } - - /** - * Verify whether Policy Model exist by ID. - * - * @param policyModelId The policyModel Id - * @return The flag indicates whether Policy Model exist - */ - public boolean existsById(PolicyModelId policyModelId) { - return policyModelsRepository.existsById(policyModelId); - } - - /** - * Creates or updates the Tosca Policy Model. - * - * @param policyModelTosca The Policymodel object - * @return The Policy Model created - */ - public PolicyModel createNewPolicyModelFromTosca(String policyModelTosca) { - JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(policyModelTosca); - String policyModelTypeFromTosca = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, - ToscaSchemaConstants.METADATA_POLICY_MODEL_TYPE); - Iterable models = getAllPolicyModelsByType(policyModelTypeFromTosca); - Collections.sort((List) models); - PolicyModel newPolicyModel = new PolicyModel(policyModelTypeFromTosca, policyModelTosca, - SemanticVersioning.incrementMajorVersion(((ArrayList) models).isEmpty() ? null - : ((ArrayList) models).get(0).getVersion()), - toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, - ToscaSchemaConstants.METADATA_ACRONYM)); - return saveOrUpdatePolicyModel(newPolicyModel); - } - - /** - * Update an existing Tosca Policy Model. - * - * @param policyModelType The policy Model type in Tosca yaml - * @param policyModelVersion The policy Version to update - * @param policyModelTosca The Policy Model tosca - * @return The Policy Model updated - */ - public PolicyModel updatePolicyModelTosca(String policyModelType, String policyModelVersion, - String policyModelTosca) { - JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(policyModelTosca); - PolicyModel thePolicyModel = getPolicyModel(policyModelType, policyModelVersion); - thePolicyModel.setPolicyAcronym(toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, - ToscaSchemaConstants.METADATA_ACRONYM)); - thePolicyModel.setPolicyModelTosca(policyModelTosca); - return saveOrUpdatePolicyModel(thePolicyModel); - } - - public List getAllPolicyModelTypes() { - return policyModelsRepository.getAllPolicyModelType(); - } - - public Iterable getAllPolicyModels() { - return policyModelsRepository.findAll(); - } - - public PolicyModel getPolicyModel(String type, String version) { - return policyModelsRepository.findById(new PolicyModelId(type, version)).orElse(null); - } - - public Iterable getAllPolicyModelsByType(String type) { - return policyModelsRepository.findByPolicyModelType(type); - } - - /** - * Retrieves the Tosca model Yaml string. - * - * @param type The Policy Model Type - * @param version The policy model version - * @return The Tosca model Yaml string - */ - public String getPolicyModelTosca(String type, String version) { - return policyModelsRepository.findById(new PolicyModelId(type, version)) - .orElse(new PolicyModel()).getPolicyModelTosca(); - } - - /** - * This method creates an PolicyModel in Db if it does not exist. - * - * @param policyModel The policyModel to save - */ - @Transactional(propagation = Propagation.REQUIRES_NEW) - public PolicyModel savePolicyModelInNewTransaction(PolicyModel policyModel) { - return policyModelsRepository.saveAndFlush(policyModel); - } - - /** - * Update the Pdp Group info in Policy Model DB. - * - * @param pdpGroupList The list of Pdp Group info received from Policy Engine - */ - public void updatePdpGroupInfo(List pdpGroupList) { - List policyModelList = policyModelsRepository.findAll(); - for (PolicyModel policyModel : policyModelList) { - JsonArray supportedPdpGroups = new JsonArray(); - for (PdpGroup pdpGroup : pdpGroupList) { - JsonObject supportedPdpGroup = pdpGroup.getSupportedSubgroups( - policyModel.getPolicyModelType(), policyModel.getVersion()); - if (supportedPdpGroup != null) { - supportedPdpGroups.add(supportedPdpGroup); - } - } - - if (supportedPdpGroups.size() > 0) { - JsonObject supportedPdpJson = new JsonObject(); - supportedPdpJson.add("supportedPdpGroups", supportedPdpGroups); - policyModel.setPolicyPdpGroup(supportedPdpJson); - policyModelsRepository.saveAndFlush(policyModel); - } - } - } -} diff --git a/src/main/java/org/onap/clamp/policy/Policy.java b/src/main/java/org/onap/clamp/policy/Policy.java deleted file mode 100644 index d84f2c8a0..000000000 --- a/src/main/java/org/onap/clamp/policy/Policy.java +++ /dev/null @@ -1,287 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.annotations.Expose; -import java.io.UnsupportedEncodingException; -import java.util.Map; -import javax.persistence.Column; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.JoinColumns; -import javax.persistence.ManyToOne; -import javax.persistence.MappedSuperclass; -import javax.persistence.Transient; -import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.TypeDefs; -import org.json.JSONObject; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.dao.model.jsontype.StringJsonUserType; -import org.onap.clamp.loop.common.AuditEntity; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.PolicyModel; -import org.yaml.snakeyaml.Yaml; - -@MappedSuperclass -@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) -public abstract class Policy extends AuditEntity { - - @Transient - private static final EELFLogger logger = EELFManager.getInstance().getLogger(Policy.class); - - @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "json_representation", nullable = false) - private JsonObject jsonRepresentation; - - @Expose - @Type(type = "json") - @Column(columnDefinition = "json", name = "configurations_json") - private JsonObject configurationsJson; - - /** - * This attribute can be null when the user add a policy on the loop instance, not the template. - * When null, It therefore indicates that this policy is not by default in the loop template. - */ - @Expose - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "loop_element_model_id") - private LoopElementModel loopElementModel; - - @Expose - @Column(name = "pdp_group") - private String pdpGroup; - - @Expose - @Column(name = "pdp_sub_group") - private String pdpSubgroup; - - @Expose - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumns({@JoinColumn(name = "policy_model_type", referencedColumnName = "policy_model_type"), - @JoinColumn(name = "policy_model_version", referencedColumnName = "version")}) - private PolicyModel policyModel; - - private JsonObject createJsonFromPolicyTosca() { - Map map = - new Yaml().load(this.getPolicyModel() != null ? this.getPolicyModel().getPolicyModelTosca() : ""); - JSONObject jsonObject = new JSONObject(map); - return new Gson().fromJson(jsonObject.toString(), JsonObject.class); - } - - /** - * This method create the policy payload that must be sent to PEF. - * - * @return A String containing the payload - * @throws UnsupportedEncodingException In case of failure - */ - public String createPolicyPayload() throws UnsupportedEncodingException { - JsonObject toscaJson = createJsonFromPolicyTosca(); - - JsonObject policyPayloadResult = new JsonObject(); - - policyPayloadResult.add("tosca_definitions_version", toscaJson.get("tosca_definitions_version")); - - JsonObject topologyTemplateNode = new JsonObject(); - policyPayloadResult.add("topology_template", topologyTemplateNode); - - JsonArray policiesArray = new JsonArray(); - topologyTemplateNode.add("policies", policiesArray); - - JsonObject thisPolicy = new JsonObject(); - policiesArray.add(thisPolicy); - - JsonObject policyDetails = new JsonObject(); - thisPolicy.add(this.getName(), policyDetails); - policyDetails.addProperty("type", this.getPolicyModel().getPolicyModelType()); - policyDetails.addProperty("type_version", this.getPolicyModel().getVersion()); - policyDetails.addProperty("version", this.getPolicyModel().getVersion()); - - JsonObject policyMetadata = new JsonObject(); - policyDetails.add("metadata", policyMetadata); - policyMetadata.addProperty("policy-id", this.getName()); - - policyDetails.add("properties", this.getConfigurationsJson()); - - String policyPayload = new GsonBuilder().setPrettyPrinting().create().toJson(policyPayloadResult); - logger.info("Policy payload: " + policyPayload); - return policyPayload; - } - - - /** - * Name getter. - * - * @return the name - */ - public abstract String getName(); - - /** - * Name setter. - */ - public abstract void setName(String name); - - /** - * jsonRepresentation getter. - * - * @return the jsonRepresentation - */ - public JsonObject getJsonRepresentation() { - return jsonRepresentation; - } - - /** - * jsonRepresentation setter. - * - * @param jsonRepresentation The jsonRepresentation to set - */ - public void setJsonRepresentation(JsonObject jsonRepresentation) { - this.jsonRepresentation = jsonRepresentation; - } - - /** - * Regenerate the Policy Json Representation. - * - * @param toscaConverter The tosca converter required to regenerate the json schema - * @param serviceModel The service model associated - */ - public abstract void updateJsonRepresentation(ToscaConverterWithDictionarySupport toscaConverter, - Service serviceModel); - - /** - * policyModel getter. - * - * @return the policyModel - */ - public PolicyModel getPolicyModel() { - return policyModel; - } - - /** - * policyModel setter. - * - * @param policyModel The new policyModel - */ - public void setPolicyModel(PolicyModel policyModel) { - this.policyModel = policyModel; - } - - /** - * configurationsJson getter. - * - * @return The configurationsJson - */ - public JsonObject getConfigurationsJson() { - return configurationsJson; - } - - /** - * configurationsJson setter. - * - * @param configurationsJson the configurationsJson to set - */ - public void setConfigurationsJson(JsonObject configurationsJson) { - this.configurationsJson = configurationsJson; - } - - /** - * loopElementModel getter. - * - * @return the loopElementModel - */ - public LoopElementModel getLoopElementModel() { - return loopElementModel; - } - - /** - * loopElementModel setter. - * - * @param loopElementModel the loopElementModel to set - */ - public void setLoopElementModel(LoopElementModel loopElementModel) { - this.loopElementModel = loopElementModel; - } - - /** - * pdpGroup getter. - * - * @return the pdpGroup - */ - public String getPdpGroup() { - return pdpGroup; - } - - /** - * pdpGroup setter. - * - * @param pdpGroup the pdpGroup to set - */ - public void setPdpGroup(String pdpGroup) { - this.pdpGroup = pdpGroup; - } - - /** - * pdpSubgroup getter. - * - * @return the pdpSubgroup - */ - public String getPdpSubgroup() { - return pdpSubgroup; - } - - /** - * pdpSubgroup setter. - * - * @param pdpSubgroup the pdpSubgroup to set - */ - public void setPdpSubgroup(String pdpSubgroup) { - this.pdpSubgroup = pdpSubgroup; - } - - /** - * Generate the policy name. - * - * @param policyType The policy type - * @param serviceName The service name - * @param serviceVersion The service version - * @param resourceName The resource name - * @param blueprintFilename The blueprint file name - * @return The generated policy name - */ - public static String generatePolicyName(String policyType, String serviceName, String serviceVersion, - String resourceName, String blueprintFilename) { - StringBuilder buffer = new StringBuilder(policyType).append("_").append(serviceName).append("_v") - .append(serviceVersion).append("_").append(resourceName).append("_") - .append(blueprintFilename.replaceAll(".yaml", "")); - return buffer.toString().replace('.', '_').replaceAll(" ", ""); - } -} diff --git a/src/main/java/org/onap/clamp/policy/PolicyService.java b/src/main/java/org/onap/clamp/policy/PolicyService.java deleted file mode 100644 index ad092b516..000000000 --- a/src/main/java/org/onap/clamp/policy/PolicyService.java +++ /dev/null @@ -1,35 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy; - -import java.util.List; -import java.util.Set; -import org.onap.clamp.loop.Loop; - -public interface PolicyService { - - Set updatePolicies(Loop loop, List newPolicies); - - boolean isExisting(String policyName); -} diff --git a/src/main/java/org/onap/clamp/policy/downloader/PolicyEngineController.java b/src/main/java/org/onap/clamp/policy/downloader/PolicyEngineController.java deleted file mode 100644 index b9777029a..000000000 --- a/src/main/java/org/onap/clamp/policy/downloader/PolicyEngineController.java +++ /dev/null @@ -1,76 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.downloader; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.time.Instant; -import org.json.simple.parser.ParseException; -import org.onap.clamp.clds.client.PolicyEngineServices; -import org.onap.clamp.loop.template.PolicyModelsRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.scheduling.annotation.Scheduled; - -/** - * This class implements a periodic job that is done in the background to - * synchronize policy models available on the policy engine and the clamp - * database table PolicyModel. - */ -@Configuration -@Profile("clamp-policy-controller") -public class PolicyEngineController { - - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyEngineController.class); - protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - public static final String POLICY_RETRY_INTERVAL = "policy.retry.interval"; - public static final String POLICY_RETRY_LIMIT = "policy.retry.limit"; - - private final PolicyEngineServices policyEngineServices; - - private Instant lastInstantExecuted; - - @Autowired - public PolicyEngineController(PolicyEngineServices policyEngineService, - PolicyModelsRepository policyModelsRepository) { - this.policyEngineServices = policyEngineService; - } - - @Scheduled(fixedRate = 300000) - public synchronized void synchronizeAllPolicies() { - policyEngineServices.synchronizeAllPolicies(); - lastInstantExecuted = Instant.now(); - } - - public Instant getLastInstantExecuted() { - return lastInstantExecuted; - } - - @Scheduled(fixedRate = 300000) - public synchronized void downloadPdpGroups() throws ParseException { - policyEngineServices.downloadPdpGroups(); - } -} diff --git a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java deleted file mode 100644 index a654edab9..000000000 --- a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java +++ /dev/null @@ -1,275 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.microservice; - -import com.google.gson.JsonObject; -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.ManyToMany; -import javax.persistence.Table; -import org.apache.commons.lang3.RandomStringUtils; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.TypeDefs; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.dao.model.jsontype.StringJsonUserType; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.policy.Policy; - -@Entity -@Table(name = "micro_service_policies") -@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) -public class MicroServicePolicy extends Policy implements Serializable { - /** - * The serial version ID. - */ - private static final long serialVersionUID = 6271238288583332616L; - - @Expose - @Id - @Column(nullable = false, name = "name", unique = true) - private String name; - - @Expose - @Column(name = "context") - private String context; - - @Expose - @Column(name = "device_type_scope") - private String deviceTypeScope; - - @Expose - @Column(name = "shared", nullable = false) - private Boolean shared; - - @ManyToMany(mappedBy = "microServicePolicies", fetch = FetchType.EAGER) - private Set usedByLoops = new HashSet<>(); - - @Expose - @Column(name = "dcae_deployment_id") - private String dcaeDeploymentId; - - @Expose - @Column(name = "dcae_deployment_status_url") - private String dcaeDeploymentStatusUrl; - - @Expose - @Column(name = "dcae_blueprint_id") - private String dcaeBlueprintId; - - /** - * Constructor for serialization. - */ - public MicroServicePolicy() { - } - - /** - * The constructor that does not make use of ToscaYamlToJsonConvertor but take - * the jsonRepresentation instead. - * - * @param name The name of the MicroService - * @param policyModel The policy model type of the MicroService - * @param shared The flag indicate whether the MicroService is - * shared - * @param jsonRepresentation The UI representation in json format - * @param loopElementModel The loop element model from which this instance should be created - * @param pdpGroup The Pdp Group info - * @param pdpSubgroup The Pdp Subgroup info - */ - public MicroServicePolicy(String name, PolicyModel policyModel, Boolean shared, - JsonObject jsonRepresentation, LoopElementModel loopElementModel, String pdpGroup, - String pdpSubgroup) { - this.name = name; - this.setPolicyModel(policyModel); - this.shared = shared; - this.setJsonRepresentation(jsonRepresentation); - this.setLoopElementModel(loopElementModel); - this.setPdpGroup(pdpGroup); - this.setPdpSubgroup(pdpSubgroup); - } - - /** - * Constructor with tosca converter. - * - * @param loop The loop instance - * @param service The service model object - * @param loopElementModel The loop element model from which this microservice instance is created - * @param toscaConverter The tosca converter that will used to convert the tosca policy model - */ - public MicroServicePolicy(Loop loop, Service service, LoopElementModel loopElementModel, - ToscaConverterWithDictionarySupport toscaConverter) { - this(Policy.generatePolicyName("MICROSERVICE", service.getName(), service.getVersion(), - loopElementModel.getPolicyModels().first().getPolicyAcronym() + '_' - + loopElementModel.getPolicyModels().first().getVersion(), - RandomStringUtils.randomAlphanumeric(3)), - loopElementModel.getPolicyModels().first(), false, new JsonObject(), loopElementModel, null, null); - this.updateJsonRepresentation(toscaConverter, service); - } - - @Override - public String getName() { - return name; - } - - /** - * name setter. - * - * @param name the name to set - */ - @Override - public void setName(String name) { - this.name = name; - } - - @Override - public void updateJsonRepresentation(ToscaConverterWithDictionarySupport toscaConverter, Service serviceModel) { - this.setJsonRepresentation( - toscaConverter.convertToscaToJsonSchemaObject(this.getPolicyModel().getPolicyModelTosca(), - this.getPolicyModel().getPolicyModelType(), serviceModel)); - } - - public Boolean getShared() { - return shared; - } - - void setShared(Boolean shared) { - this.shared = shared; - } - - public Set getUsedByLoops() { - return usedByLoops; - } - - void setUsedByLoops(Set usedBy) { - this.usedByLoops = usedBy; - } - - public String getContext() { - return context; - } - - public void setContext(String context) { - this.context = context; - } - - public String getDeviceTypeScope() { - return deviceTypeScope; - } - - public void setDeviceTypeScope(String deviceTypeScope) { - this.deviceTypeScope = deviceTypeScope; - } - - /** - * dcaeDeploymentId getter. - * - * @return the dcaeDeploymentId - */ - public String getDcaeDeploymentId() { - return dcaeDeploymentId; - } - - /** - * dcaeDeploymentId setter. - * - * @param dcaeDeploymentId the dcaeDeploymentId to set - */ - public void setDcaeDeploymentId(String dcaeDeploymentId) { - this.dcaeDeploymentId = dcaeDeploymentId; - } - - /** - * dcaeDeploymentStatusUrl getter. - * - * @return the dcaeDeploymentStatusUrl - */ - public String getDcaeDeploymentStatusUrl() { - return dcaeDeploymentStatusUrl; - } - - /** - * dcaeDeploymentStatusUrl setter. - * - * @param dcaeDeploymentStatusUrl the dcaeDeploymentStatusUrl to set - */ - public void setDcaeDeploymentStatusUrl(String dcaeDeploymentStatusUrl) { - this.dcaeDeploymentStatusUrl = dcaeDeploymentStatusUrl; - } - - /** - * dcaeBlueprintId getter. - * - * @return the dcaeBlueprintId - */ - public String getDcaeBlueprintId() { - return dcaeBlueprintId; - } - - /** - * dcaeBlueprintId setter. - * - * @param dcaeBlueprintId the dcaeBlueprintId to set - */ - void setDcaeBlueprintId(String dcaeBlueprintId) { - this.dcaeBlueprintId = dcaeBlueprintId; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - MicroServicePolicy other = (MicroServicePolicy) obj; - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } -} diff --git a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyRepository.java b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyRepository.java deleted file mode 100644 index 38b310ce8..000000000 --- a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.microservice; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface MicroServicePolicyRepository extends JpaRepository { - -} diff --git a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java deleted file mode 100644 index 060e79a63..000000000 --- a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicyService.java +++ /dev/null @@ -1,112 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.microservice; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.policy.PolicyService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class MicroServicePolicyService implements PolicyService { - - private final MicroServicePolicyRepository microServiceRepository; - - @Autowired - public MicroServicePolicyService(MicroServicePolicyRepository microServiceRepository) { - this.microServiceRepository = microServiceRepository; - } - - @Override - public Set updatePolicies(Loop loop, List newMicroservicePolicies) { - return newMicroservicePolicies.stream().map(policy -> getAndUpdateMicroServicePolicy(loop, policy)) - .collect(Collectors.toSet()); - } - - @Override - public boolean isExisting(String policyName) { - return microServiceRepository.existsById(policyName); - } - - /** - * Get and update the MicroService policy properties. - * - * @param loop The loop - * @param policy The new MicroService policy - * @return The updated MicroService policy - */ - public MicroServicePolicy getAndUpdateMicroServicePolicy(Loop loop, MicroServicePolicy policy) { - return microServiceRepository.save( - microServiceRepository - .findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop)) - .orElse(new MicroServicePolicy(policy.getName(), policy.getPolicyModel(), - policy.getShared(), policy.getJsonRepresentation(), null, policy.getPdpGroup(), - policy.getPdpSubgroup()))); - } - - private MicroServicePolicy updateMicroservicePolicyProperties(MicroServicePolicy oldPolicy, - MicroServicePolicy newPolicy, Loop loop) { - oldPolicy.setConfigurationsJson(newPolicy.getConfigurationsJson()); - if (!oldPolicy.getUsedByLoops().contains(loop)) { - oldPolicy.getUsedByLoops().add(loop); - } - oldPolicy.setPdpGroup(newPolicy.getPdpGroup()); - oldPolicy.setPdpSubgroup(newPolicy.getPdpSubgroup()); - return oldPolicy; - } - - /** - * Update the MicroService policy deployment related parameters. - * - * @param microServicePolicy The micro service policy - * @param deploymentId The deployment ID as returned by DCAE - * @param deploymentUrl The Deployment URL as returned by DCAE - */ - public void updateDcaeDeploymentFields(MicroServicePolicy microServicePolicy, String deploymentId, - String deploymentUrl) { - microServicePolicy.setDcaeDeploymentId(deploymentId); - microServicePolicy.setDcaeDeploymentStatusUrl(deploymentUrl); - microServiceRepository.saveAndFlush(microServicePolicy); - } - - - /** - * Api to refresh the MicroService Policy UI window. - * - * @param microServicePolicy The micro Service policy object - * @param toscaConverter The tosca converter required to convert the tosca model to json schema - * @param loop As a microservice object can belong to multiple loops, we need it here - */ - public void refreshMicroServicePolicyJsonRepresentation(MicroServicePolicy microServicePolicy, - ToscaConverterWithDictionarySupport toscaConverter, - Loop loop) { - microServicePolicy.updateJsonRepresentation(toscaConverter, loop.getModelService()); - this.microServiceRepository.saveAndFlush(microServicePolicy); - - } -} diff --git a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java deleted file mode 100644 index 4b052427f..000000000 --- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java +++ /dev/null @@ -1,218 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.policy.operational; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonObject; -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; -import org.apache.commons.lang3.RandomStringUtils; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.TypeDefs; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.dao.model.jsontype.StringJsonUserType; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.policy.Policy; - -@Entity -@Table(name = "operational_policies") -@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) -public class OperationalPolicy extends Policy implements Serializable { - /** - * The serial version ID. - */ - private static final long serialVersionUID = 6117076450841538255L; - - @Transient - private static final EELFLogger logger = EELFManager.getInstance().getLogger(OperationalPolicy.class); - - @Id - @Expose - @Column(nullable = false, name = "name", unique = true) - private String name; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "loop_id", nullable = false) - private Loop loop; - - /** - * Constructor for serialization. - */ - public OperationalPolicy() { - } - - /** - * The constructor. - * - * @param name The name of the operational policy - * @param configurationsJson The operational policy property in the format of - * json - * @param jsonRepresentation The jsonObject defining the json schema - * @param policyModel The policy model associated if any, can be null - * @param loopElementModel The loop element from which this instance is supposed to be created - * @param pdpGroup The Pdp Group info - * @param pdpSubgroup The Pdp Subgroup info - */ - public OperationalPolicy(String name, JsonObject configurationsJson, - JsonObject jsonRepresentation, PolicyModel policyModel, - LoopElementModel loopElementModel, String pdpGroup, String pdpSubgroup) { - this.name = name; - this.setPolicyModel(policyModel); - this.setConfigurationsJson(configurationsJson); - this.setPdpGroup(pdpGroup); - this.setPdpSubgroup(pdpSubgroup); - this.setLoopElementModel(loopElementModel); - this.setJsonRepresentation(jsonRepresentation); - - } - - /** - * Create an operational policy from a loop element model. - * - * @param loop The parent loop - * @param service The loop service - * @param loopElementModel The loop element model - * @param toscaConverter The tosca converter that must be used to create the Json representation - */ - public OperationalPolicy(Loop loop, Service service, LoopElementModel loopElementModel, - ToscaConverterWithDictionarySupport toscaConverter) { - this(Policy.generatePolicyName("OPERATIONAL", service.getName(), service.getVersion(), - loopElementModel.getPolicyModels().first().getPolicyAcronym() + '_' - + loopElementModel.getPolicyModels().first().getVersion(), - RandomStringUtils.randomAlphanumeric(3)), new JsonObject(), - new JsonObject(), loopElementModel.getPolicyModels().first(), loopElementModel, null, null); - this.setLoop(loop); - this.updateJsonRepresentation(toscaConverter, service); - } - - /** - * Create an operational policy from a policy model. - * - * @param loop The parent loop - * @param service The loop service - * @param policyModel The policy model - * @param toscaConverter The tosca converter that must be used to create the Json representation - */ - public OperationalPolicy(Loop loop, Service service, PolicyModel policyModel, - ToscaConverterWithDictionarySupport toscaConverter) { - this(Policy.generatePolicyName("OPERATIONAL", service.getName(), service.getVersion(), - policyModel.getPolicyAcronym() + '_' + policyModel.getVersion(), - RandomStringUtils.randomAlphanumeric(3)), - new JsonObject(), - new JsonObject(), policyModel, null, null, null); - this.setLoop(loop); - this.updateJsonRepresentation(toscaConverter, service); - } - - public void setLoop(Loop loopName) { - this.loop = loopName; - } - - public Loop getLoop() { - return loop; - } - - @Override - public String getName() { - return name; - } - - /** - * name setter. - * - * @param name the name to set - */ - @Override - public void setName(String name) { - this.name = name; - } - - @Override - public void updateJsonRepresentation(ToscaConverterWithDictionarySupport toscaConverter, Service serviceModel) { - { - this.setJsonRepresentation(new JsonObject()); - if (this.getPolicyModel() == null) { - return; - } - - // Generic Case - this.setJsonRepresentation(toscaConverter.convertToscaToJsonSchemaObject( - this.getPolicyModel().getPolicyModelTosca(), - this.getPolicyModel().getPolicyModelType(), serviceModel)); - - } - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - OperationalPolicy other = (OperationalPolicy) obj; - if (name == null) { - if (other.name != null) { - return false; - } - } else { - if (!name.equals(other.name)) { - return false; - } - } - return true; - } - - @Override - public String createPolicyPayload() throws UnsupportedEncodingException { - return super.createPolicyPayload(); - - } -} diff --git a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepository.java b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepository.java deleted file mode 100644 index c0a6e12cd..000000000 --- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.operational; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface OperationalPolicyRepository extends JpaRepository { - void deleteByName(String policyName); -} diff --git a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java deleted file mode 100644 index 9bae7bd04..000000000 --- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java +++ /dev/null @@ -1,350 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.policy.operational; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.service.Service; - -public class OperationalPolicyRepresentationBuilder { - - private static final EELFLogger logger = - EELFManager.getInstance().getLogger(OperationalPolicyRepresentationBuilder.class); - - public static final String PROPERTIES = "properties"; - public static final String ITEMS = "items"; - public static final String ANY_OF = "anyOf"; - public static final String TITLE = "title"; - public static final String RECIPE = "recipe"; - public static final String DEFAULT = "default"; - public static final String STRING = "string"; - public static final String TYPE = "type"; - public static final String TYPE_LIST = "list"; - public static final String TYPE_OBJECT = "object"; - public static final String TYPE_ARRAY = "array"; - - private OperationalPolicyRepresentationBuilder() { - throw new IllegalStateException("This is Utility class, not supposed to be initiated."); - } - - /** - * This method generates the operational policy json representation that will be - * used by ui for rendering. It uses the model (VF and VFModule) defined in the - * loop object to do so, so it's dynamic. It also uses the operational policy - * schema template defined in the resource folder. - * - * @param modelJson The loop model json - * @return The json representation - */ - public static JsonObject generateOperationalPolicySchema(Service modelJson) { - - JsonObject jsonSchema = null; - try { - jsonSchema = JsonUtils.GSON.fromJson( - ResourceFileUtils - .getResourceAsString("clds/json-schema/operational_policies/operational_policy.json"), - JsonObject.class); - jsonSchema.get(PROPERTIES).getAsJsonObject() - .get("operational_policy").getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("policies") - .getAsJsonObject().get(ITEMS).getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("target") - .getAsJsonObject().get(ANY_OF).getAsJsonArray().addAll(createAnyOfArray(modelJson, true)); - - // update CDS recipe and payload information to schema - JsonArray actors = jsonSchema.get(PROPERTIES).getAsJsonObject() - .get("operational_policy").getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("policies") - .getAsJsonObject().get(ITEMS).getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("actor") - .getAsJsonObject().get(ANY_OF).getAsJsonArray(); - - for (JsonElement actor : actors) { - if ("CDS".equalsIgnoreCase(actor.getAsJsonObject().get(TITLE).getAsString())) { - actor.getAsJsonObject().get(PROPERTIES).getAsJsonObject().get(RECIPE).getAsJsonObject() - .get(ANY_OF).getAsJsonArray() - .addAll(createAnyOfArrayForCdsRecipe(modelJson)); - } - } - return jsonSchema; - } catch (IOException e) { - logger.error("Unable to generate the json schema because of an exception", e); - return new JsonObject(); - } - } - - private static JsonObject createSchemaProperty(String title, String type, String defaultValue, String readOnlyFlag, - String[] enumArray) { - JsonObject property = new JsonObject(); - property.addProperty(TITLE, title); - property.addProperty(TYPE, type); - property.addProperty(DEFAULT, defaultValue); - property.addProperty("readOnly", readOnlyFlag); - - if (enumArray != null) { - JsonArray jsonArray = new JsonArray(); - property.add("enum", jsonArray); - for (String val : enumArray) { - jsonArray.add(val); - } - } - return property; - } - - private static JsonArray createVnfSchema(Service modelService, boolean generateType) { - JsonArray vnfSchemaArray = new JsonArray(); - JsonObject modelVnfs = modelService.getResourceByType("VF"); - - for (Entry entry : modelVnfs.entrySet()) { - JsonObject vnfOneOfSchema = new JsonObject(); - vnfOneOfSchema.addProperty(TITLE, "VNF" + "-" + entry.getKey()); - JsonObject properties = new JsonObject(); - if (generateType) { - properties.add(TYPE, createSchemaProperty("Type", STRING, "VNF", "True", null)); - } - properties.add("resourceID", createSchemaProperty("Resource ID", STRING, - modelVnfs.get(entry.getKey()).getAsJsonObject().get("invariantUUID").getAsString(), "True", null)); - - vnfOneOfSchema.add(PROPERTIES, properties); - vnfSchemaArray.add(vnfOneOfSchema); - } - return vnfSchemaArray; - } - - private static JsonArray createBlankEntry() { - JsonArray result = new JsonArray(); - JsonObject blankObject = new JsonObject(); - blankObject.addProperty("title", "User defined"); - blankObject.add("properties", new JsonObject()); - result.add(blankObject); - return result; - } - - private static JsonArray createVfModuleSchema(Service modelService, boolean generateType) { - JsonArray vfModuleOneOfSchemaArray = new JsonArray(); - JsonObject modelVfModules = modelService.getResourceByType("VFModule"); - - for (Entry entry : modelVfModules.entrySet()) { - JsonObject vfModuleOneOfSchema = new JsonObject(); - vfModuleOneOfSchema.addProperty(TITLE, "VFMODULE" + "-" + entry.getKey()); - JsonObject properties = new JsonObject(); - if (generateType) { - properties.add(TYPE, createSchemaProperty("Type", STRING, "VFMODULE", "True", null)); - } - properties.add("resourceID", - createSchemaProperty("Resource ID", STRING, - modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelName").getAsString(), - "True", null)); - properties.add("modelInvariantId", - createSchemaProperty("Model Invariant Id (ModelInvariantUUID)", STRING, - modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelInvariantUUID") - .getAsString(), - "True", null)); - properties.add("modelVersionId", - createSchemaProperty("Model Version Id (ModelUUID)", STRING, - modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelUUID").getAsString(), - "True", null)); - properties.add("modelName", - createSchemaProperty("Model Name", STRING, - modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelName").getAsString(), - "True", null)); - properties.add("modelVersion", createSchemaProperty("Model Version", STRING, - modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelVersion").getAsString(), - "True", null)); - properties - .add("modelCustomizationId", - createSchemaProperty("Customization ID", STRING, - modelVfModules.get(entry.getKey()).getAsJsonObject() - .get("vfModuleModelCustomizationUUID").getAsString(), "True", - null)); - - vfModuleOneOfSchema.add(PROPERTIES, properties); - vfModuleOneOfSchemaArray.add(vfModuleOneOfSchema); - } - return vfModuleOneOfSchemaArray; - } - - /** - * Create an anyOf array of possible structure we may have for Target. - * - * @param modelJson The service object - * @return A JsonArray with everything inside - */ - public static JsonArray createAnyOfArray(Service modelJson, boolean generateType) { - JsonArray targetOneOfStructure = new JsonArray(); - // First entry must be user defined - targetOneOfStructure.addAll(createBlankEntry()); - targetOneOfStructure.addAll(createVnfSchema(modelJson, generateType)); - targetOneOfStructure.addAll(createVfModuleSchema(modelJson, generateType)); - return targetOneOfStructure; - } - - private static JsonArray createAnyOfArrayForCdsRecipe(Service modelJson) { - JsonArray anyOfStructure = new JsonArray(); - anyOfStructure.addAll(createAnyOfCdsRecipe(modelJson.getResourceDetails().getAsJsonObject("VF"))); - anyOfStructure.addAll(createAnyOfCdsRecipe(modelJson.getResourceDetails().getAsJsonObject("PNF"))); - return anyOfStructure; - } - - private static JsonArray createAnyOfCdsRecipe(JsonObject jsonObject) { - JsonArray schemaArray = new JsonArray(); - for (Entry entry : jsonObject.entrySet()) { - JsonObject controllerProperties = entry.getValue().getAsJsonObject() - .getAsJsonObject("controllerProperties"); - - if (controllerProperties != null && controllerProperties.getAsJsonObject("workflows") != null) { - JsonObject workflows = controllerProperties.getAsJsonObject("workflows"); - for (Entry workflowsEntry : workflows.entrySet()) { - JsonObject obj = new JsonObject(); - obj.addProperty(TITLE, workflowsEntry.getKey()); - obj.addProperty(TYPE, "object"); - obj.add(PROPERTIES, createPayloadProperty(workflowsEntry.getValue().getAsJsonObject(), - controllerProperties, workflowsEntry.getKey())); - schemaArray.add(obj); - } - - } - } - return schemaArray; - } - - private static JsonObject createPayloadProperty(JsonObject workFlow, - JsonObject controllerProperties, String workFlowName) { - JsonObject payload = new JsonObject(); - payload.addProperty(TITLE, "Payload"); - payload.addProperty(TYPE, "object"); - payload.add(PROPERTIES, createInputPropertiesForPayload(workFlow, controllerProperties, - workFlowName)); - JsonObject properties = new JsonObject(); - properties.add(RECIPE, createRecipeForCdsWorkflow(workFlowName)); - properties.add("payload", payload); - return properties; - } - - private static JsonObject createRecipeForCdsWorkflow(String workflow) { - JsonObject recipe = new JsonObject(); - recipe.addProperty(TITLE, RECIPE); - recipe.addProperty(TYPE, STRING); - recipe.addProperty(DEFAULT, workflow); - JsonObject options = new JsonObject(); - options.addProperty("hidden", true); - recipe.add("options", options); - return recipe; - } - - /** - * Returns the properties of payload based on the cds work flows. - * - * @param workFlow cds work flows to update payload - * @param controllerProperties cds properties to get blueprint name and - * version - * @param workFlowName work flow name - * @return returns the properties of payload - */ - public static JsonObject createInputPropertiesForPayload(JsonObject workFlow, - JsonObject controllerProperties, - String workFlowName) { - String artifactName = controllerProperties.get("sdnc_model_name").getAsString(); - String artifactVersion = controllerProperties.get("sdnc_model_version").getAsString(); - JsonObject inputs = workFlow.getAsJsonObject("inputs"); - JsonObject jsonObject = new JsonObject(); - jsonObject.add("artifact_name", createSchemaProperty( - "artifact name", STRING, artifactName, "True", null)); - jsonObject.add("artifact_version", createSchemaProperty( - "artifact version", STRING, artifactVersion, "True", null)); - jsonObject.add("mode", createCdsInputProperty( - "mode", STRING, "async", null)); - jsonObject.add("data", createDataProperty(inputs, workFlowName)); - return jsonObject; - } - - private static JsonObject createDataProperty(JsonObject inputs, String workflowName) { - JsonObject data = new JsonObject(); - data.addProperty(TITLE, "data"); - JsonObject dataObj = new JsonObject(); - addDataFields(inputs, dataObj, workflowName); - data.add(PROPERTIES, dataObj); - return data; - } - - private static void addDataFields(JsonObject inputs, - JsonObject dataObj, - String workFlowName) { - Set> entrySet = inputs.entrySet(); - for (Map.Entry entry : entrySet) { - String key = entry.getKey(); - JsonObject inputProperty = inputs.getAsJsonObject(key); - if (key.equalsIgnoreCase(workFlowName + "-properties")) { - addDataFields(entry.getValue().getAsJsonObject().get("properties").getAsJsonObject(), - dataObj, workFlowName); - } else { - dataObj.add(entry.getKey(), - createCdsInputProperty(key, inputProperty.get(TYPE).getAsString(), null, - entry.getValue().getAsJsonObject())); - } - } - } - - private static JsonObject createCdsInputProperty(String title, - String type, - String defaultValue, - JsonObject cdsProperty) { - JsonObject property = new JsonObject(); - property.addProperty(TITLE, title); - - if (TYPE_LIST.equalsIgnoreCase(type)) { - property.addProperty(TYPE, TYPE_ARRAY); - if (cdsProperty != null && cdsProperty.get(PROPERTIES) != null) { - JsonObject listProperties = new JsonObject(); - listProperties.add(PROPERTIES, getProperties(cdsProperty.get(PROPERTIES).getAsJsonObject())); - property.add(ITEMS, listProperties); - } - } else if (TYPE_OBJECT.equalsIgnoreCase(type)) { - property.addProperty(TYPE, TYPE_OBJECT); - property.add(PROPERTIES, getProperties(cdsProperty.get(PROPERTIES).getAsJsonObject())); - } else { - property.addProperty(TYPE, type); - } - - if (defaultValue != null) { - property.addProperty(DEFAULT, defaultValue); - } - return property; - } - - private static JsonObject getProperties(JsonObject inputProperties) { - if (inputProperties == null) { - return null; - } - JsonObject dataObject = new JsonObject(); - addDataFields(inputProperties, dataObject, null); - return dataObject; - } -} diff --git a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyService.java b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyService.java deleted file mode 100644 index d5442e145..000000000 --- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicyService.java +++ /dev/null @@ -1,94 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.operational; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.loop.template.PolicyModelsRepository; -import org.onap.clamp.policy.PolicyService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class OperationalPolicyService implements PolicyService { - - private final OperationalPolicyRepository operationalPolicyRepository; - - private final PolicyModelsRepository policyModelsRepository; - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(OperationalPolicyService.class); - - @Autowired - public OperationalPolicyService(OperationalPolicyRepository repository, - PolicyModelsRepository policyModelsRepository) { - this.operationalPolicyRepository = repository; - this.policyModelsRepository = policyModelsRepository; - } - - @Override - public Set updatePolicies(Loop loop, List operationalPolicies) { - return operationalPolicies - .parallelStream() - .map(policy -> - operationalPolicyRepository - .findById(policy.getName()) - .map(p -> setConfiguration(p, policy)) - .orElse(initializeMissingFields(loop, policy))) - .collect(Collectors.toSet()); - } - - @Override - public boolean isExisting(String policyName) { - return operationalPolicyRepository.existsById(policyName); - } - - private OperationalPolicy initializeMissingFields(Loop loop, OperationalPolicy policy) { - policy.setLoop(loop); - return policy; - } - - private OperationalPolicy setConfiguration(OperationalPolicy policy, OperationalPolicy newPolicy) { - policy.setConfigurationsJson(newPolicy.getConfigurationsJson()); - policy.setPdpGroup(newPolicy.getPdpGroup()); - policy.setPdpSubgroup(newPolicy.getPdpSubgroup()); - return policy; - } - - /** - * Api to refresh the Operational Policy UI window. - * - * @param operationalPolicy The operational policy object - * @param toscaConverter the tosca converter required to convert the tosca model to json schema - */ - public void refreshOperationalPolicyJsonRepresentation(OperationalPolicy operationalPolicy, - ToscaConverterWithDictionarySupport toscaConverter) { - operationalPolicy.updateJsonRepresentation(toscaConverter, operationalPolicy.getLoop().getModelService()); - this.operationalPolicyRepository.saveAndFlush(operationalPolicy); - } -} diff --git a/src/main/java/org/onap/clamp/policy/pdpgroup/PdpGroup.java b/src/main/java/org/onap/clamp/policy/pdpgroup/PdpGroup.java deleted file mode 100644 index 6a070c550..000000000 --- a/src/main/java/org/onap/clamp/policy/pdpgroup/PdpGroup.java +++ /dev/null @@ -1,92 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.pdpgroup; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.annotations.Expose; -import java.util.List; - -/** - * This class maps the get Pdp Group response to a nice pojo. - */ -public class PdpGroup { - - @Expose - private String name; - - @Expose - private String pdpGroupState; - - @Expose - private List pdpSubgroups; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPdpGroupState() { - return pdpGroupState; - } - - public void setPdpGroupState(String pdpGroupState) { - this.pdpGroupState = pdpGroupState; - } - - public List getPdpSubgroups() { - return pdpSubgroups; - } - - public void setPdpSubgroups(List pdpSubgroups) { - this.pdpSubgroups = pdpSubgroups; - } - - /** - * Get supported subGroups based on the defined policy type and version. - * @param policyType The policy type - * @param version The version - * @return The supported subGroup list in Json format - */ - public JsonObject getSupportedSubgroups(String policyType, String version) { - if (!pdpGroupState.equalsIgnoreCase("ACTIVE")) { - return null; - } - JsonArray supportedSubgroups = new JsonArray(); - for (PdpSubgroup subGroup : pdpSubgroups) { - if (subGroup.getSupportedPolicyTypes().contains(new PolicyModelKey(policyType, version))) { - supportedSubgroups.add(subGroup.getPdpType()); - } - } - if (supportedSubgroups.size() > 0) { - JsonObject supportedPdpGroup = new JsonObject(); - supportedPdpGroup.add(this.name, supportedSubgroups); - return supportedPdpGroup; - } - return null; - } -} diff --git a/src/main/java/org/onap/clamp/policy/pdpgroup/PdpSubgroup.java b/src/main/java/org/onap/clamp/policy/pdpgroup/PdpSubgroup.java deleted file mode 100644 index 28de79abf..000000000 --- a/src/main/java/org/onap/clamp/policy/pdpgroup/PdpSubgroup.java +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.pdpgroup; - -import com.google.gson.annotations.Expose; -import java.util.List; - -/** - * This class maps the Policy get PDP Group response to a nice pojo. - */ -public class PdpSubgroup { - - @Expose - private String pdpType; - - @Expose - private List supportedPolicyTypes; - - public String getPdpType() { - return pdpType; - } - - public void setPdpType(String pdpType) { - this.pdpType = pdpType; - } - - public List getSupportedPolicyTypes() { - return supportedPolicyTypes; - } - - public void setSupportedPolicyTypes(List supportedPolicyTypes) { - this.supportedPolicyTypes = supportedPolicyTypes; - } - -} diff --git a/src/main/java/org/onap/clamp/policy/pdpgroup/PolicyModelKey.java b/src/main/java/org/onap/clamp/policy/pdpgroup/PolicyModelKey.java deleted file mode 100644 index 6d9343dc5..000000000 --- a/src/main/java/org/onap/clamp/policy/pdpgroup/PolicyModelKey.java +++ /dev/null @@ -1,125 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.pdpgroup; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; - -public class PolicyModelKey implements Serializable { - - /** - * The serial version ID. - */ - private static final long serialVersionUID = 3307410842013230886L; - - @Expose - private String name; - - @Expose - private String version; - - /** - * Constructor. - */ - public PolicyModelKey(String name, String version) { - this.name = name; - this.version = version; - } - - /** - * name getter. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * name setter. - * - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * version getter. - * - * @return the version - */ - public String getVersion() { - return version; - } - - /** - * version setter. - * - * @param version the version to set - */ - public void setVersion(String version) { - this.version = version; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((version == null) ? 0 : version.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - PolicyModelKey other = (PolicyModelKey) obj; - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - if (!name.matches(other.name)) { - return false; - } - } - if (version == null) { - if (other.version != null) { - return false; - } - } else if (!version.equals(other.version)) { - return false; - } - return true; - } -} diff --git a/src/main/java/org/onap/clamp/tosca/Dictionary.java b/src/main/java/org/onap/clamp/tosca/Dictionary.java deleted file mode 100644 index cf514c4bd..000000000 --- a/src/main/java/org/onap/clamp/tosca/Dictionary.java +++ /dev/null @@ -1,219 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.tosca; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.Table; -import org.onap.clamp.loop.common.AuditEntity; - -/** - * Represents Dictionary. - */ - -@Entity -@Table(name = "dictionary") -public class Dictionary extends AuditEntity implements Serializable { - - /** - * The serial version id. - */ - private static final long serialVersionUID = -286522707701388645L; - - @Id - @Expose - @Column(nullable = false, name = "name", unique = true) - private String name; - - @Expose - @Column(name = "dictionary_second_level") - private int secondLevelDictionary = 0; - - @Expose - @Column(name = "dictionary_type") - private String subDictionaryType; - - @Expose - @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) - @JoinTable( - name = "dictionary_to_dictionaryelements", - joinColumns = @JoinColumn(name = "dictionary_name", referencedColumnName = "name"), - inverseJoinColumns = {@JoinColumn( - name = "dictionary_element_short_name", - referencedColumnName = "short_name")}) - private Set dictionaryElements = new HashSet<>(); - - /** - * name getter. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * name setter. - * - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * secondLevelDictionary getter. - * - * @return the secondLevelDictionary - */ - public int getSecondLevelDictionary() { - return secondLevelDictionary; - } - - /** - * secondLevelDictionary setter. - * - * @param secondLevelDictionary the secondLevelDictionary to set - */ - public void setSecondLevelDictionary(int secondLevelDictionary) { - this.secondLevelDictionary = secondLevelDictionary; - } - - /** - * subDictionaryType getter. - * - * @return the subDictionaryType - */ - public String getSubDictionaryType() { - return subDictionaryType; - } - - /** - * subDictionaryType setter. - * - * @param subDictionaryType the subDictionaryType to set - */ - public void setSubDictionaryType(String subDictionaryType) { - this.subDictionaryType = subDictionaryType; - } - - /** - * dictionaryElements getter. - * - * @return the dictionaryElements List of dictionary element - */ - public Set getDictionaryElements() { - return dictionaryElements; - } - - /** - * Method to add a new dictionaryElement to the list. - * - * @param dictionaryElement The dictionary element - */ - public void addDictionaryElements(DictionaryElement dictionaryElement) { - dictionaryElements.add(dictionaryElement); - dictionaryElement.getUsedByDictionaries().add(this); - } - - /** - * Method to set dictionaryElements. - * - * @param dictionaryElements The dictionary elements set - */ - public void setDictionaryElements(Set dictionaryElements) { - this.dictionaryElements = dictionaryElements; - } - - /** - * Method to delete a dictionaryElement from the list. - * - * @param dictionaryElement The dictionary element - */ - public void removeDictionaryElement(DictionaryElement dictionaryElement) { - dictionaryElements.remove(dictionaryElement); - dictionaryElement.getUsedByDictionaries().remove(this); - } - - /** - * Default Constructor. - */ - public Dictionary() { - - } - - /** - * Constructor. - * - * @param name The Dictionary name - * @param secondLevelDictionary defines if dictionary is a secondary level - * @param subDictionaryType defines the type of secondary level dictionary - */ - public Dictionary(String name, int secondLevelDictionary, String subDictionaryType) { - this.name = name; - this.secondLevelDictionary = secondLevelDictionary; - this.subDictionaryType = subDictionaryType; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Dictionary other = (Dictionary) obj; - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - -} diff --git a/src/main/java/org/onap/clamp/tosca/DictionaryElement.java b/src/main/java/org/onap/clamp/tosca/DictionaryElement.java deleted file mode 100644 index 43a3106f5..000000000 --- a/src/main/java/org/onap/clamp/tosca/DictionaryElement.java +++ /dev/null @@ -1,254 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.tosca; - -import com.google.gson.annotations.Expose; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.ManyToMany; -import javax.persistence.Table; -import org.onap.clamp.loop.common.AuditEntity; - -/** - * Represents a Dictionary Item. - */ -@Entity -@Table(name = "dictionary_elements") -public class DictionaryElement extends AuditEntity implements Serializable { - - /** - * The serial version id. - */ - private static final long serialVersionUID = -286522707701388644L; - - @Id - @Expose - @Column(nullable = false, name = "short_name") - private String shortName; - - @Expose - @Column(nullable = false, name = "name") - private String name; - - @Expose - @Column(nullable = false, name = "description") - private String description; - - @Expose - @Column(nullable = false, name = "type") - private String type; - - @Expose - @Column(nullable = true, name = "subdictionary_name") - private String subDictionary; - - @ManyToMany(mappedBy = "dictionaryElements", fetch = FetchType.EAGER) - private Set usedByDictionaries = new HashSet<>(); - - /** - * name getter. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * name setter. - * - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * shortName getter. - * - * @return the shortName - */ - public String getShortName() { - return shortName; - } - - /** - * shortName setter. - * - * @param shortName the shortName to set - */ - public void setShortName(String shortName) { - this.shortName = shortName; - } - - /** - * description getter. - * - * @return the description - */ - public String getDescription() { - return description; - } - - /** - * description setter. - * - * @param description the description to set - */ - public void setDescription(String description) { - this.description = description; - } - - /** - * type getter. - * - * @return the type - */ - public String getType() { - return type; - } - - /** - * type setter. - * - * @param type the type to set - */ - public void setType(String type) { - this.type = type; - } - - /** - * subDictionary getter. - * - * @return the subDictionary - */ - public String getSubDictionary() { - return subDictionary; - } - - /** - * subDictionary setter. - * - * @param subDictionary the subDictionary to set - */ - public void setSubDictionary(String subDictionary) { - this.subDictionary = subDictionary; - } - - /** - * usedByDictionaries getter. - * - * @return the usedByDictionaries - */ - public Set getUsedByDictionaries() { - return usedByDictionaries; - } - - /** - * usedByDictionaries setter. - * - * @param usedByDictionaries the usedByDictionaries to set - */ - public void setUsedByDictionaries(Set usedByDictionaries) { - this.usedByDictionaries = usedByDictionaries; - } - - /** - * Default Constructor. - */ - public DictionaryElement() { - } - - /** - * Constructor. - * - * @param name The Dictionary element name - * @param shortName The short name - * @param description The description - * @param type The type of element - * @param subDictionary The sub type - */ - public DictionaryElement(String name, String shortName, String description, String type, - String subDictionary) { - this.name = name; - this.shortName = shortName; - this.description = description; - this.type = type; - this.subDictionary = subDictionary; - } - - /** - * Constructor. - * - * @param name The Dictionary element name - * @param shortName The short name - * @param description The description - * @param type The type of element - * @param subDictionary The sub type - */ - public DictionaryElement(String name, String shortName, String description, String type, - String subDictionary, Set usedByDictionaries) { - this.name = name; - this.shortName = shortName; - this.description = description; - this.type = type; - this.subDictionary = subDictionary; - this.usedByDictionaries = usedByDictionaries; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((shortName == null) ? 0 : shortName.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - DictionaryElement other = (DictionaryElement) obj; - if (shortName == null) { - if (other.shortName != null) { - return false; - } - } else if (!shortName.equals(other.shortName)) { - return false; - } - return true; - } -} diff --git a/src/main/java/org/onap/clamp/tosca/DictionaryElementsRepository.java b/src/main/java/org/onap/clamp/tosca/DictionaryElementsRepository.java deleted file mode 100644 index 43f6f1d40..000000000 --- a/src/main/java/org/onap/clamp/tosca/DictionaryElementsRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.tosca; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface DictionaryElementsRepository extends JpaRepository { - -} diff --git a/src/main/java/org/onap/clamp/tosca/DictionaryRepository.java b/src/main/java/org/onap/clamp/tosca/DictionaryRepository.java deleted file mode 100644 index ae8430d93..000000000 --- a/src/main/java/org/onap/clamp/tosca/DictionaryRepository.java +++ /dev/null @@ -1,40 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.tosca; - -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -@Repository -public interface DictionaryRepository extends JpaRepository { - - @Query("SELECT dict.name FROM Dictionary as dict") - List getAllDictionaryNames(); - - @Query("SELECT dict.name FROM Dictionary as dict where dict.secondLevelDictionary = 1") - List getAllSecondaryLevelDictionaryNames(); - -} diff --git a/src/main/java/org/onap/clamp/tosca/DictionaryService.java b/src/main/java/org/onap/clamp/tosca/DictionaryService.java deleted file mode 100644 index 6172641a7..000000000 --- a/src/main/java/org/onap/clamp/tosca/DictionaryService.java +++ /dev/null @@ -1,141 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.tosca; - -import com.google.common.collect.Sets; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import javax.persistence.EntityNotFoundException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class DictionaryService { - - private final DictionaryRepository dictionaryRepository; - private final DictionaryElementsRepository dictionaryElementsRepository; - - /** - * Constructor. - */ - @Autowired - public DictionaryService(DictionaryRepository dictionaryRepository, - DictionaryElementsRepository dictionaryElementsRepository) { - this.dictionaryRepository = dictionaryRepository; - this.dictionaryElementsRepository = dictionaryElementsRepository; - - } - - public Dictionary saveOrUpdateDictionary(Dictionary dictionary) { - return dictionaryRepository.saveAndFlush(dictionary); - } - - /** - * Creates or Updates Dictionary Element. - * - * @param dictionaryName The Dictionary name - * @param dictionary The Dictionary object with dictionary elements - * @return updated Dictionary object with all dictionary elements - */ - public Dictionary saveOrUpdateDictionaryElement(String dictionaryName, Dictionary dictionary) { - Dictionary dict = getDictionary(dictionaryName); - - Set newDictionaryElements = dictionary.getDictionaryElements(); - - if (newDictionaryElements != null && !newDictionaryElements.isEmpty()) { - Set updatedDictionaryElements = newDictionaryElements.stream() - .map(dictionaryElement -> getAndUpdateDictionaryElement(dict, dictionaryElement)) - .collect(Collectors.toSet()); - - dict.getDictionaryElements().forEach(dictElement -> { - if (!updatedDictionaryElements.contains(dictElement)) { - updatedDictionaryElements.add(dictElement); - } - }); - dict.setDictionaryElements(updatedDictionaryElements); - } - return dictionaryRepository.saveAndFlush(dict); - - } - - private DictionaryElement getAndUpdateDictionaryElement(Dictionary dictionary, - DictionaryElement element) { - return dictionaryElementsRepository - .save(dictionaryElementsRepository.findById(element.getShortName()) - .map(p -> updateDictionaryElement(p, element, dictionary)) - .orElse(new DictionaryElement(element.getName(), element.getShortName(), - element.getDescription(), element.getType(), element.getSubDictionary(), - Sets.newHashSet(dictionary)))); - } - - public void deleteDictionary(Dictionary dictionary) { - dictionaryRepository.delete(dictionary); - } - - public void deleteDictionary(String dictionaryName) { - dictionaryRepository.deleteById(dictionaryName); - } - - public List getAllDictionaries() { - return dictionaryRepository.findAll(); - } - - public List getAllSecondaryLevelDictionaryNames() { - return dictionaryRepository.getAllSecondaryLevelDictionaryNames(); - } - - public Dictionary getDictionary(String dictionaryName) { - return dictionaryRepository.findById(dictionaryName).orElseThrow( - () -> new EntityNotFoundException("Couldn't find Dictionary named: " + dictionaryName)); - } - - /** - * Deletes a dictionary element from Dictionary by shortName. - * - * @param dictionaryName The dictionary name - * @param dictionaryElementShortName the dictionary Element Short name - */ - public void deleteDictionaryElement(String dictionaryName, String dictionaryElementShortName) { - if (dictionaryRepository.existsById(dictionaryName)) { - DictionaryElement element = - dictionaryElementsRepository.findById(dictionaryElementShortName).orElse(null); - if (element != null) { - Dictionary dict = getDictionary(dictionaryName); - dict.removeDictionaryElement(element); - dictionaryRepository.saveAndFlush(dict); - } - } - } - - private DictionaryElement updateDictionaryElement(DictionaryElement oldDictionaryElement, - DictionaryElement newDictionaryElement, Dictionary dictionary) { - oldDictionaryElement.setName(newDictionaryElement.getName()); - oldDictionaryElement.setDescription(newDictionaryElement.getDescription()); - oldDictionaryElement.setType(newDictionaryElement.getType()); - oldDictionaryElement.setSubDictionary(newDictionaryElement.getSubDictionary()); - oldDictionaryElement.getUsedByDictionaries().add(dictionary); - return oldDictionaryElement; - } -} diff --git a/src/main/java/org/onap/clamp/util/PassDecoder.java b/src/main/java/org/onap/clamp/util/PassDecoder.java deleted file mode 100644 index b2e4ca2c5..000000000 --- a/src/main/java/org/onap/clamp/util/PassDecoder.java +++ /dev/null @@ -1,65 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - */ - -package org.onap.clamp.util; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import org.onap.aaf.cadi.Symm; -import org.onap.clamp.clds.util.ResourceFileUtils; - -/** - * PassDecoder for decrypting the truststore and keystore password. - */ -public class PassDecoder { - /** - * Used to log PassDecoder class. - */ - private static final EELFLogger logger = EELFManager.getInstance().getLogger(PassDecoder.class); - - /** - * Decode the password. - * - * @param encryptedPass The encrypted password - * @param keyFileName The key file name in String - */ - public static String decode(String encryptedPass, String keyFileName) { - if (null == keyFileName) { - logger.debug("Key file is not defined, thus password will not be decrypted"); - return encryptedPass; - } - if (null == encryptedPass) { - logger.error("Encrypted password is not defined"); - return null; - } - try { - return Symm.obtain(ResourceFileUtils.getResourceAsStream(keyFileName)).depass(encryptedPass); - } catch (IOException e) { - logger.error("Exception occurred during the key decryption", e); - return null; - } - } -} diff --git a/src/main/java/org/onap/clamp/util/SemanticVersioning.java b/src/main/java/org/onap/clamp/util/SemanticVersioning.java deleted file mode 100644 index 8852e2a4f..000000000 --- a/src/main/java/org/onap/clamp/util/SemanticVersioning.java +++ /dev/null @@ -1,91 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.util; - -/** - * This class is the base class for object that requires semantic versioning. - * ... This class supports also a.b.c.d... etc ... as a version. - */ -public class SemanticVersioning { - public static final int BEFORE = -1; - public static final int EQUAL = 0; - public static final int AFTER = 1; - public static final String DEFAULT_VERSION = "1.0.0"; - - /** - * The compare method that compare arg0 to arg1. - * - * @param arg0 A version in string for semantic versioning (a.b.c.d...) - * @param arg1 A version in string for semantic versioning (a.b.c.d...) - * @return objects (arg0, arg1) given as parameters. It returns the value: 0: if - * (arg0==arg1) -1: if (arg0 < arg1) 1: if (arg0 > arg1) - */ - public static int compare(String arg0, String arg1) { - - if (arg0 == null && arg1 == null) { - return EQUAL; - } - if (arg0 == null) { - return BEFORE; - } - if (arg1 == null) { - return AFTER; - } - String[] arg0Array = arg0.split("\\."); - String[] arg1Array = arg1.split("\\."); - - int smalestStringLength = Math.min(arg0Array.length, arg1Array.length); - - for (int currentVersionIndex = - 0; currentVersionIndex < smalestStringLength; ++currentVersionIndex) { - if (Integer.parseInt(arg0Array[currentVersionIndex]) < Integer - .parseInt(arg1Array[currentVersionIndex])) { - return BEFORE; - } else if (Integer.parseInt(arg0Array[currentVersionIndex]) > Integer - .parseInt(arg1Array[currentVersionIndex])) { - return AFTER; - } - // equals, so do not return anything, continue - } - if (arg0Array.length == arg1Array.length) { - return EQUAL; - } else { - return Integer.compare(arg0Array.length, arg1Array.length); - } - } - - /** - * Method to increment a version from its current version. - * - * @param currentVersion The current Version - * @return the increment version string - */ - public static String incrementMajorVersion(String currentVersion) { - if (currentVersion == null || currentVersion.isEmpty()) { - return DEFAULT_VERSION; - } - String[] versionArray = currentVersion.split("\\."); - return String.valueOf(Integer.parseInt(versionArray[0]) + 1) + ".0.0"; - } -} diff --git a/src/main/java/org/onap/policy/clamp/authorization/AuthorizationController.java b/src/main/java/org/onap/policy/clamp/authorization/AuthorizationController.java new file mode 100644 index 000000000..f703e3363 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/authorization/AuthorizationController.java @@ -0,0 +1,189 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.authorization; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.util.Date; +import org.apache.camel.Exchange; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.exception.NotAuthorizedException; +import org.onap.policy.clamp.clds.model.ClampInformation; +import org.onap.policy.clamp.clds.util.LoggingUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +/** + * Verify user has right permissions. + */ +@Component +public class AuthorizationController { + + protected static final EELFLogger logger = + EELFManager.getInstance().getLogger(AuthorizationController.class); + protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); + protected static final EELFLogger securityLogger = + EELFManager.getInstance().getSecurityLogger(); + + // By default we'll set it to a default handler + @Autowired + private ClampProperties refProp; + + private SecurityContext securityContext = SecurityContextHolder.getContext(); + + public static final String PERM_PREFIX = "security.permission.type."; + private static final String PERM_INSTANCE = "security.permission.instance"; + + private static String retrieveUserName(SecurityContext securityContext) { + if (securityContext == null || securityContext.getAuthentication() == null) { + return null; + } + if ((securityContext.getAuthentication().getPrincipal()) instanceof String) { + // anonymous case + return ((String) securityContext.getAuthentication().getPrincipal()); + } else { + return ((UserDetails) securityContext.getAuthentication().getPrincipal()).getUsername(); + } + } + + /** + * Get the principal name. + * + * @return The principal name + */ + public static String getPrincipalName(SecurityContext securityContext) { + String principal = AuthorizationController.retrieveUserName(securityContext); + String name = "Not found"; + if (principal != null) { + name = principal; + } + return name; + } + + /** + * Insert authorize the api based on the permission. + * + * @param camelExchange The Camel Exchange object containing the properties + * @param typeVar The type of the permissions + * @param instanceVar The instance of the permissions. e.g. dev + * @param action The action of the permissions. e.g. read + */ + public void authorize(Exchange camelExchange, String typeVar, String instanceVar, + String action) { + String type = refProp.getStringValue(PERM_PREFIX + typeVar); + String instance = refProp.getStringValue(PERM_INSTANCE); + + if (null == type || type.isEmpty()) { + // authorization is turned off, since the permission is not defined + return; + } + if (null != instanceVar && !instanceVar.isEmpty()) { + instance = instanceVar; + } + String principalName = AuthorizationController.getPrincipalName(this.securityContext); + SecureServicePermission perm = SecureServicePermission.create(type, instance, action); + Date startTime = new Date(); + LoggingUtils.setTargetContext("Clamp", "authorize"); + LoggingUtils.setTimeContext(startTime, new Date()); + securityLogger.debug("checking if {} has permission: {}", principalName, perm); + + if (!isUserPermitted(perm)) { + String msg = principalName + " does not have permission: " + perm; + LoggingUtils.setErrorContext("100", "Authorization Error"); + securityLogger.warn(msg); + throw new NotAuthorizedException(msg); + } + } + + /** + * Insert authorize the api based on the permission. + * + * @param inPermission Security permission in input + * @return True if user is permitted + */ + public boolean isUserPermitted(SecureServicePermission inPermission) { + + String principalName = AuthorizationController.getPrincipalName(this.securityContext); + // check if the user has the permission key or the permission key with a + // combination of all instance and/or all action. + if (hasRole(inPermission.getKey()) || hasRole(inPermission.getKeyAllInstance())) { + auditLogger.info("{} authorized because user has permission with * for instance: {}", + principalName, inPermission.getKey().replace("|", ":")); + return true; + // the rest of these don't seem to be required - isUserInRole method + // appears to take * as a wildcard + } else if (hasRole(inPermission.getKeyAllInstanceAction())) { + auditLogger.info( + "{} authorized because user has permission with * for instance and * for action: {}", + principalName, inPermission.getKey().replace("|", ":")); + return true; + } else if (hasRole(inPermission.getKeyAllAction())) { + auditLogger.info("{} authorized because user has permission with * for action: {}", + principalName, inPermission.getKey().replace("|", ":")); + return true; + } else { + return false; + } + } + + protected boolean hasRole(String role) { + Authentication authentication = securityContext.getAuthentication(); + if (authentication == null) { + return false; + } + for (GrantedAuthority auth : authentication.getAuthorities()) { + if (role.equals(auth.getAuthority())) { + return true; + } + } + return false; + } + + /** + * Gets clds info. CLDS IFO service will return 3 things 1. User Name 2. CLDS + * code version that is currently installed from pom.xml file 3. User + * permissions + * + * @return the clds info + */ + public ClampInformation getClampInformation() { + ClampInformation clampInfo = new ClampInformation(); + Authentication authentication = securityContext.getAuthentication(); + if (authentication == null) { + return new ClampInformation(); + } + clampInfo.setUserName(AuthorizationController.getPrincipalName(this.securityContext)); + for (GrantedAuthority auth : authentication.getAuthorities()) { + clampInfo.getAllPermissions().add(auth.getAuthority()); + } + return clampInfo; + } +} diff --git a/src/main/java/org/onap/policy/clamp/authorization/CldsUser.java b/src/main/java/org/onap/policy/clamp/authorization/CldsUser.java new file mode 100644 index 000000000..8f1e2bf67 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/authorization/CldsUser.java @@ -0,0 +1,97 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.authorization; + +import java.util.Arrays; + +/** + * The class represents the CldsUser that can be extracted from cldsusers.json. + */ +public class CldsUser { + + private String user; + private String password; + private SecureServicePermission[] permissions; + + /** + * Returns the user. + * + * @return the user + */ + public String getUser() { + return user; + } + + /** + * Sets the user. + * + * @param user + * the user to set + */ + public void setUser(String user) { + this.user = user; + } + + /** + * Returns the password. + * + * @return the password + */ + public String getPassword() { + return password; + } + + /** + * Sets the password. + * + * @param password + * the password to set + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * Returns the permissions. + * + * @return the permissions + */ + public SecureServicePermission[] getPermissions() { + return Arrays.copyOf(permissions, permissions.length); + } + + public String[] getPermissionsString() { + return Arrays.stream(getPermissions()).map(SecureServicePermission::getKey).toArray(String[]::new); + } + + /** + * Sets the permissions. + * + * @param permissionsArray + * the permissions to set + */ + public void setPermissions(SecureServicePermission[] permissionsArray) { + this.permissions = Arrays.copyOf(permissionsArray, permissionsArray.length); + } +} diff --git a/src/main/java/org/onap/policy/clamp/authorization/SecureServicePermission.java b/src/main/java/org/onap/policy/clamp/authorization/SecureServicePermission.java new file mode 100644 index 000000000..41887a315 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/authorization/SecureServicePermission.java @@ -0,0 +1,203 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.authorization; + +/** + * Permission class that can be instantiated easily using constructor or factory + * methods. + */ +public class SecureServicePermission { + public static final String ALL = "*"; + + private String type; + private String instance; + private String action; + + /** + * Factory method to create permission given type, instance, and action. + * + * @param type type of the permission + * @param instance instance of the permission + * @param action action of the permission + * @return instance of SecureServicePermission with type, instance and action + */ + public static SecureServicePermission create(String type, String instance, String action) { + return new SecureServicePermission(type, instance, action); + } + + /** + * Factory method to create permission given type and instance. Default + * action to ALL/*. + * + * @param type type of the permission + * @param instance instance of the permission + * @return instance of SecureServicePermission with type, instance and default action + */ + public static SecureServicePermission create(String type, String instance) { + return new SecureServicePermission(type, instance, ALL); + } + + /** + * Factory method to create permission given type. Default instance and + * action to ALL/*. + * + * @param type type of the permission + * @return instance of SecureServicePermission with type and default instance and action + */ + public static SecureServicePermission create(String type) { + return new SecureServicePermission(type, ALL, ALL); + } + + /** + * Instantiate permission given type, instance, and action. + * + * @param type type of the permission + * @param instance instance of the permission + * @param action action of the permission + */ + public SecureServicePermission(String type, String instance, String action) { + this.type = type; + this.instance = instance; + this.action = action; + } + + /** + * Instantiate permission given type from concatenated string. + * + * @param concatenatedString + * the string type|instance|action, less than 3 params can be + * provided (e.g. "permission-type-cl", "permission-type-cl|dev", + * "permission-type-cl|dev|update" ) + */ + public SecureServicePermission(String concatenatedString) { + String[] userInfo = concatenatedString.split("[|]"); + // We should have at least 1 string + this.type = userInfo[0]; + this.instance = (userInfo.length > 1 ? userInfo[1] : ALL); + this.action = (userInfo.length > 2 ? userInfo[2] : ALL); + } + + /** + * Override toString - return permission in key format. + */ + @Override + public String toString() { + return getKey(); + } + + /** + * Return Permission in Key format = type, instance, and action separate by + * pipe character. + * + * @return permission in key format + */ + public String getKey() { + return type + "|" + instance + "|" + action; + } + + /** + * Return Permission in Key format = type, all instance, and action separate + * by pipe character. + * + * @return permission in key format + */ + public String getKeyAllInstance() { + return type + "|" + ALL + "|" + action; + } + + /** + * Return Permission in Key format = type, all instance, and all action + * separate by pipe character. + * + * @return permission in key format + */ + public String getKeyAllInstanceAction() { + return type + "|" + ALL + "|" + ALL; + } + + /** + * Return Permission in Key format = type, instance, and all action separate + * by pipe character. + * + * @return permission in key format + */ + public String getKeyAllAction() { + return type + "|" + instance + "|" + ALL; + } + + /** + * Returns the permission type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type of permission. + * + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * Returns the instance of permission. + * + * @return the instance + */ + public String getInstance() { + return instance; + } + + /** + * Sets the instance of permission. + * + * @param instance the instance to set + */ + public void setInstance(String instance) { + this.instance = instance; + } + + /** + * Returns the action of permission. + * + * @return the action + */ + public String getAction() { + return action; + } + + /** + * Sets the action of permission. + * + * @param action the action to set + */ + public void setAction(String action) { + this.action = action; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/authorization/SecureServicePermissionDeserializer.java b/src/main/java/org/onap/policy/clamp/authorization/SecureServicePermissionDeserializer.java new file mode 100644 index 000000000..0b178c256 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/authorization/SecureServicePermissionDeserializer.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.authorization; + + +import com.google.gson.Gson; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import java.lang.reflect.Type; + +public class SecureServicePermissionDeserializer implements JsonDeserializer { + + @Override + public SecureServicePermission deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + if (json.isJsonPrimitive()) { + return new SecureServicePermission(json.getAsString()); + } else { + // if not string try default deserialization + return new Gson().fromJson(json, SecureServicePermission.class); + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/authorization/UserService.java b/src/main/java/org/onap/policy/clamp/authorization/UserService.java new file mode 100644 index 000000000..c748a5a54 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/authorization/UserService.java @@ -0,0 +1,47 @@ +/*- + * ============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============================================ + * =================================================================== + */ + +package org.onap.policy.clamp.authorization; + + +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; + +/** + * User service used for authorization verification at the login page. Do not + * remove this class. + */ +@Controller +public class UserService { + + private SecurityContext securityContext = SecurityContextHolder.getContext(); + + /** + * REST service that returns the username. + * + * @return the user name + */ + public String getUser() { + return AuthorizationController.getPrincipalName(securityContext); + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/Application.java b/src/main/java/org/onap/policy/clamp/clds/Application.java new file mode 100644 index 000000000..79247ca63 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/Application.java @@ -0,0 +1,182 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Enumeration; +import org.apache.catalina.connector.Connector; +import org.onap.policy.clamp.clds.util.ClampVersioning; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.util.PassDecoder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@ComponentScan(basePackages = { "org.onap.policy.clamp" }) +@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class }) +@EnableJpaRepositories(basePackages = { "org.onap.policy.clamp" }) +@EntityScan(basePackages = { "org.onap.policy.clamp" }) +@EnableTransactionManagement +@EnableConfigurationProperties +@EnableAsync +@EnableScheduling +@EnableJpaAuditing +public class Application extends SpringBootServletInitializer { + + protected static final EELFLogger eelfLogger = EELFManager.getInstance().getLogger(Application.class); + // This settings is an additional one to Spring config, + // only if we want to have an additional port automatically redirected to + // HTTPS + @Value("${server.http-to-https-redirection.port:none}") + private String httpRedirectedPort; + /** + * This 8080 is the default port used by spring if this parameter is not + * specified in application.properties. + */ + @Value("${server.port:8080}") + private String springServerPort; + @Value("${server.ssl.key-store:none}") + private String sslKeystoreFile; + + @Autowired + private Environment env; + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + public static void main(String[] args) { + // Start the Spring application + SpringApplication.run(Application.class, args); + } + + /** + * This method is used to declare the camel servlet. + * + * @return A servlet bean + * @throws IOException IO Exception + */ + @Bean + public ServletRegistrationBean camelServletRegistrationBean() throws IOException { + eelfLogger.info(ResourceFileUtils.getResourceAsString("boot-message.txt") + "(v" + + ClampVersioning.getCldsVersionFromProps() + ")" + System.getProperty("line.separator") + + getSslExpirationDate()); + ServletRegistrationBean registration = new ServletRegistrationBean(new ClampServlet(), "/restservices/clds/*"); + registration.setName("CamelServlet"); + return registration; + } + + /** + * This method is used by Spring to create the servlet container factory. + * + * @return The TomcatEmbeddedServletContainerFactory just created + */ + @Bean + public ServletWebServerFactory getEmbeddedServletContainerFactory() { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); + if (!"none".equals(httpRedirectedPort) && !"none".equals(sslKeystoreFile)) { + // Automatically redirect to HTTPS + tomcat = new TomcatEmbeddedServletContainerFactoryRedirection(); + Connector newConnector = createRedirectConnector(Integer.parseInt(springServerPort)); + if (newConnector != null) { + tomcat.addAdditionalTomcatConnectors(newConnector); + } + } + return tomcat; + } + + private Connector createRedirectConnector(int redirectSecuredPort) { + if (redirectSecuredPort <= 0) { + eelfLogger.warn("HTTP port redirection to HTTPS is disabled because the HTTPS port is 0 (random port) or -1" + + " (Connector disabled)"); + return null; + } + Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); + connector.setScheme("http"); + connector.setSecure(false); + connector.setPort(Integer.parseInt(httpRedirectedPort)); + connector.setRedirectPort(redirectSecuredPort); + return connector; + } + + private String getSslExpirationDate() throws IOException { + StringBuilder result = new StringBuilder(" :: SSL Certificates :: "); + try { + if (env.getProperty("server.ssl.key-store") != null) { + + KeyStore keystore = KeyStore.getInstance(env.getProperty("server.ssl.key-store-type")); + String password = PassDecoder.decode(env.getProperty("server.ssl.key-store-password"), + env.getProperty("clamp.config.keyFile")); + String keyStore = env.getProperty("server.ssl.key-store"); + InputStream is = ResourceFileUtils.getResourceAsStream(keyStore.replaceAll("classpath:", "")); + keystore.load(is, password.toCharArray()); + + Enumeration aliases = keystore.aliases(); + while (aliases.hasMoreElements()) { + String alias = aliases.nextElement(); + if ("X.509".equals(keystore.getCertificate(alias).getType())) { + result.append("* " + alias + " expires " + + ((X509Certificate) keystore.getCertificate(alias)).getNotAfter() + + System.getProperty("line.separator")); + } + } + } else { + result.append("* NONE HAS been configured"); + } + } catch (CertificateException | NoSuchAlgorithmException | KeyStoreException e) { + eelfLogger.warn("SSL certificate access error ", e); + + } + return result.toString(); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/ClampInUserAuditorAware.java b/src/main/java/org/onap/policy/clamp/clds/ClampInUserAuditorAware.java new file mode 100644 index 000000000..939cea49c --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/ClampInUserAuditorAware.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds; + +import java.util.Optional; +import org.onap.policy.clamp.authorization.AuthorizationController; +import org.springframework.data.domain.AuditorAware; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +@Component +public class ClampInUserAuditorAware implements AuditorAware { + + @Override + public Optional getCurrentAuditor() { + return Optional.of(AuthorizationController.getPrincipalName(SecurityContextHolder.getContext())); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/ClampServlet.java b/src/main/java/org/onap/policy/clamp/clds/ClampServlet.java new file mode 100644 index 000000000..801f59c31 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/ClampServlet.java @@ -0,0 +1,137 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import java.security.Principal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.camel.component.servlet.CamelHttpTransportServlet; +import org.onap.policy.clamp.authorization.SecureServicePermission; +import org.springframework.context.ApplicationContext; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; +import org.springframework.web.context.support.WebApplicationContextUtils; + +public class ClampServlet extends CamelHttpTransportServlet { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = -4198841134910211542L; + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(ClampServlet.class); + private static final String PERM_INSTANCE = "clamp.config.security.permission.instance"; + private static final String PERM_CL = "clamp.config.security.permission.type.cl"; + private static final String PERM_TEMPLATE = "clamp.config.security.permission.type.template"; + private static final String PERM_VF = "clamp.config.security.permission.type.filter.vf"; + private static final String PERM_MANAGE = "clamp.config.security.permission.type.cl.manage"; + private static final String PERM_TOSCA = "clamp.config.security.permission.type.tosca"; + private static final String AUTHENTICATION_CLASS = "clamp.config.security.authentication.class"; + private static final String READ = "read"; + private static final String UPDATE = "update"; + + private static List permissionList; + + private synchronized List loadDynamicAuthenticationClasses() { + return Arrays.stream(WebApplicationContextUtils.getWebApplicationContext(getServletContext()) + .getEnvironment().getProperty(AUTHENTICATION_CLASS).split(",")).map(className -> className.trim()) + .collect(Collectors.toList()); + } + + private synchronized List getPermissionList() { + if (permissionList == null) { + permissionList = new ArrayList<>(); + ApplicationContext applicationContext = WebApplicationContextUtils + .getWebApplicationContext(getServletContext()); + String cldsPermissionInstance = applicationContext.getEnvironment().getProperty(PERM_INSTANCE); + permissionList.add(SecureServicePermission.create(applicationContext.getEnvironment().getProperty(PERM_CL), + cldsPermissionInstance, READ)); + permissionList.add(SecureServicePermission.create(applicationContext.getEnvironment().getProperty(PERM_CL), + cldsPermissionInstance, UPDATE)); + permissionList.add(SecureServicePermission.create( + applicationContext.getEnvironment().getProperty(PERM_TEMPLATE), cldsPermissionInstance, READ)); + permissionList.add(SecureServicePermission.create( + applicationContext.getEnvironment().getProperty(PERM_TEMPLATE), cldsPermissionInstance, UPDATE)); + permissionList.add(SecureServicePermission.create(applicationContext.getEnvironment().getProperty(PERM_VF), + cldsPermissionInstance, "*")); + permissionList.add(SecureServicePermission + .create(applicationContext.getEnvironment().getProperty(PERM_MANAGE), cldsPermissionInstance, "*")); + permissionList.add(SecureServicePermission + .create(applicationContext.getEnvironment().getProperty(PERM_TOSCA), cldsPermissionInstance, READ)); + permissionList.add(SecureServicePermission + .create(applicationContext.getEnvironment().getProperty(PERM_TOSCA), + cldsPermissionInstance, UPDATE)); + } + return permissionList; + } + + /** + * When AAF is enabled, request object will contain a cadi Wrapper, so queries + * to isUserInRole will invoke a http call to AAF server. + */ + @Override + protected void doService(HttpServletRequest request, HttpServletResponse response) { + Principal principal = request.getUserPrincipal(); + if (principal != null && loadDynamicAuthenticationClasses().stream() + .anyMatch(className -> className.equals(principal.getClass().getName()))) { + // When AAF is enabled, there is a need to provision the permissions to Spring + // system + List grantedAuths = new ArrayList<>(); + for (SecureServicePermission perm : getPermissionList()) { + String permString = perm.toString(); + if (request.isUserInRole(permString)) { + grantedAuths.add(new SimpleGrantedAuthority(permString)); + } + } + Authentication auth = new UsernamePasswordAuthenticationToken(new User(principal.getName(), "", + grantedAuths), "", grantedAuths); + SecurityContextHolder.getContext().setAuthentication(auth); + } + try { + super.doService(request, response); + } catch (ServletException | IOException ioe) { + logger.error("Exception caught when executing doService in servlet", ioe); + try { + response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value()); + } catch (IOException e) { + logger.error("Exception caught when executing HTTP sendError in servlet", e); + } + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java b/src/main/java/org/onap/policy/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java new file mode 100644 index 000000000..f66a09c41 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/TomcatEmbeddedServletContainerFactoryRedirection.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds; + +import org.apache.catalina.Context; +import org.apache.tomcat.util.descriptor.web.SecurityCollection; +import org.apache.tomcat.util.descriptor.web.SecurityConstraint; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; + +/** + * This class is a factory that redirects by default all HTTP to HTTPS + * connector. It is used by the Application.java class and defined in a Spring + * Bean. + * In order to do this, the method postProcessContext has been overridden to + * provide another behavior. + */ +public class TomcatEmbeddedServletContainerFactoryRedirection extends TomcatServletWebServerFactory { + + /** + * This method is there to force the automatic redirection of all calls done + * on the tomcat server to a Secure connection. + */ + @Override + protected void postProcessContext(Context context) { + SecurityConstraint securityConstraint = new SecurityConstraint(); + securityConstraint.setUserConstraint("CONFIDENTIAL"); + SecurityCollection collection = new SecurityCollection(); + collection.addPattern("/*"); + securityConstraint.addCollection(collection); + context.addConstraint(securityConstraint); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/client/CdsServices.java b/src/main/java/org/onap/policy/clamp/clds/client/CdsServices.java new file mode 100644 index 000000000..ff79ef413 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/client/CdsServices.java @@ -0,0 +1,227 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.clds.client; + +import static java.lang.Boolean.parseBoolean; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.util.Date; +import java.util.Map; +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.builder.ExchangeBuilder; +import org.onap.policy.clamp.clds.exception.cds.CdsParametersException; +import org.onap.policy.clamp.clds.model.cds.CdsBpWorkFlowListResponse; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.LoggingUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * This class implements the communication with CDS for the service inventory. + */ +@Component +public class CdsServices { + + @Autowired + CamelContext camelContext; + + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CdsServices.class); + + private static final String TYPE = "type"; + private static final String PROPERTIES = "properties"; + private static final String LIST = "list"; + + /** + * Constructor. + */ + @Autowired + public CdsServices() { + } + + + /** + * Query CDS to get blueprint's workflow list. + * + * @param blueprintName CDS blueprint name + * @param blueprintVersion CDS blueprint version + * @return CdsBpWorkFlowListResponse CDS blueprint's workflow list + */ + public CdsBpWorkFlowListResponse getBlueprintWorkflowList(String blueprintName, String blueprintVersion) { + LoggingUtils.setTargetContext("CDS", "getBlueprintWorkflowList"); + + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext) + .withProperty("blueprintName", blueprintName).withProperty("blueprintVersion", blueprintVersion) + .build(); + + Exchange exchangeResponse = camelContext.createProducerTemplate() + .send("direct:get-blueprint-workflow-list", myCamelExchange); + + if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { + String cdsResponse = (String) exchangeResponse.getIn().getBody(); + logger.info("getBlueprintWorkflowList, response from CDS:" + cdsResponse); + LoggingUtils.setResponseContext("0", "Get Blueprint workflow list", this.getClass().getName()); + Date startTime = new Date(); + LoggingUtils.setTimeContext(startTime, new Date()); + return JsonUtils.GSON_JPA_MODEL.fromJson(cdsResponse, CdsBpWorkFlowListResponse.class); + } else { + logger.error("CDS getBlueprintWorkflowList FAILED"); + return null; + } + + } + + /** + * Query CDS to get input properties of workflow. + * + * @param blueprintName CDS blueprint name + * @param blueprintVersion CDS blueprint name + * @param workflow CDS blueprint's workflow + * @return input properties in json format + */ + public JsonObject getWorkflowInputProperties(String blueprintName, String blueprintVersion, + String workflow) { + LoggingUtils.setTargetContext("CDS", "getWorkflowInputProperties"); + + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext) + .withBody(getCdsPayloadForWorkFlow(blueprintName, blueprintVersion, workflow)) + .build(); + + Exchange exchangeResponse = camelContext.createProducerTemplate() + .send("direct:get-blueprint-workflow-input-properties", myCamelExchange); + + if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { + String cdsResponse = (String) exchangeResponse.getIn().getBody(); + logger.info("getWorkflowInputProperties, response from CDS:" + cdsResponse); + LoggingUtils.setResponseContext("0", "Get Blueprint workflow input properties", this.getClass().getName()); + Date startTime = new Date(); + LoggingUtils.setTimeContext(startTime, new Date()); + return parseCdsResponse(cdsResponse); + } else { + logger.error("CDS getWorkflowInputProperties FAILED"); + return null; + } + } + + protected JsonObject parseCdsResponse(String response) { + JsonObject root = JsonParser.parseString(response).getAsJsonObject(); + JsonObject inputs = root.getAsJsonObject("workFlowData").getAsJsonObject("inputs"); + JsonObject dataTypes = root.getAsJsonObject("dataTypes"); + + JsonObject workFlowProperties = new JsonObject(); + workFlowProperties.add("inputs", getInputProperties(inputs, dataTypes, new JsonObject())); + return workFlowProperties; + } + + private JsonObject getInputProperties(JsonObject inputs, JsonObject dataTypes, + JsonObject inputObject) { + if (inputs == null) { + return inputObject; + } + + for (Map.Entry entry : inputs.entrySet()) { + String key = entry.getKey(); + JsonObject inputProperty = inputs.getAsJsonObject(key); + String type = inputProperty.get(TYPE).getAsString(); + if (isComplexType(type, dataTypes)) { + inputObject.add(key, handleComplexType(type, dataTypes)); + } else if (LIST.equalsIgnoreCase(type)) { + handleListType(key, inputProperty, dataTypes, inputObject); + } else if (isInputParam(inputProperty)) { + inputObject.add(key, entry.getValue()); + } + } + return inputObject; + } + + private void handleListType(String propertyName, + JsonObject inputProperty, + JsonObject dataTypes, + JsonObject inputObject) { + if (inputProperty.get("entry_schema") == null) { + throw new CdsParametersException("Entry schema is null for " + propertyName); + } + + String type = inputProperty.get("entry_schema").getAsJsonObject().get( + TYPE).getAsString(); + if (dataTypes.get(type) != null) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty(TYPE, LIST); + jsonObject.add(PROPERTIES, getPropertiesObject(type, dataTypes)); + inputObject.add(propertyName, jsonObject); + } else if (isInputParam(inputProperty)) { + inputObject.add(propertyName, inputProperty); + } + } + + private JsonObject handleComplexType(String key, JsonObject dataTypes) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty(TYPE, "object"); + jsonObject.add(PROPERTIES, getPropertiesObject(key, dataTypes)); + return jsonObject; + } + + private JsonObject getPropertiesObject(String key, JsonObject dataTypes) { + JsonObject properties = dataTypes.get(key).getAsJsonObject().get(PROPERTIES).getAsJsonObject(); + JsonObject object = new JsonObject(); + getInputProperties(properties, dataTypes, object); + return object; + } + + private boolean isComplexType(String type, JsonObject dataTypes) { + if (dataTypes == null) { + return false; + } + return dataTypes.get(type) != null; + } + + private boolean isInputParam(JsonObject inputProperty) { + JsonElement inputParam = inputProperty.get("input-param"); + if (inputParam == null) { + return false; + } + return parseBoolean(inputParam.getAsString()); + } + + /** + * Creates payload to query CDS to get workflow input properties. + * + * @param blueprintName CDS blueprint name + * @param version CDS blueprint version + * @param workflow CDS blueprint workflow + * @return returns payload in json format + */ + public String getCdsPayloadForWorkFlow(String blueprintName, String version, String workflow) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("blueprintName", blueprintName); + jsonObject.addProperty("version", version); + jsonObject.addProperty("returnContent", "json"); + jsonObject.addProperty("workflowName", workflow); + jsonObject.addProperty("specType", "TOSCA"); + return jsonObject.toString(); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/client/DcaeInventoryServices.java b/src/main/java/org/onap/policy/clamp/clds/client/DcaeInventoryServices.java new file mode 100644 index 000000000..fed061e7d --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/client/DcaeInventoryServices.java @@ -0,0 +1,139 @@ +/*- + * ============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============================================ + * Modifications copyright (c) 2018 Nokia + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.client; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import java.util.Date; +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.builder.ExchangeBuilder; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.model.dcae.DcaeInventoryResponse; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.LoggingUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * This class implements the communication with DCAE for the service inventory. + */ +@Component +public class DcaeInventoryServices { + + @Autowired + CamelContext camelContext; + + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeInventoryServices.class); + protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); + protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); + public static final String DCAE_INVENTORY_URL = "dcae.inventory.url"; + public static final String DCAE_INVENTORY_RETRY_INTERVAL = "dcae.intentory.retry.interval"; + public static final String DCAE_INVENTORY_RETRY_LIMIT = "dcae.intentory.retry.limit"; + private final ClampProperties refProp; + + /** + * Constructor. + */ + @Autowired + public DcaeInventoryServices(ClampProperties refProp) { + this.refProp = refProp; + } + + private int getTotalCountFromDcaeInventoryResponse(String responseStr) throws ParseException { + JSONParser parser = new JSONParser(); + Object obj0 = parser.parse(responseStr); + JSONObject jsonObj = (JSONObject) obj0; + Long totalCount = (Long) jsonObj.get("totalCount"); + return totalCount.intValue(); + } + + private DcaeInventoryResponse getItemsFromDcaeInventoryResponse(String responseStr) throws ParseException { + JSONParser parser = new JSONParser(); + Object obj0 = parser.parse(responseStr); + JSONObject jsonObj = (JSONObject) obj0; + JSONArray itemsArray = (JSONArray) jsonObj.get("items"); + JSONObject dcaeServiceType0 = (JSONObject) itemsArray.get(0); + return JsonUtils.GSON.fromJson(dcaeServiceType0.toString(), DcaeInventoryResponse.class); + } + + /** + * DO a query to DCAE to get some Information. + * + * @param artifactName The artifact Name + * @param serviceUuid The service UUID + * @param resourceUuid The resource UUID + * @return The DCAE inventory for the artifact in DcaeInventoryResponse + * @throws IOException In case of issues with the stream + * @throws ParseException In case of issues with the Json parsing + */ + public DcaeInventoryResponse getDcaeInformation(String artifactName, String serviceUuid, String resourceUuid) + throws IOException, ParseException, InterruptedException { + LoggingUtils.setTargetContext("DCAE", "getDcaeInformation"); + + int retryInterval = 0; + int retryLimit = 1; + if (refProp.getStringValue(DCAE_INVENTORY_RETRY_LIMIT) != null) { + retryLimit = Integer.valueOf(refProp.getStringValue(DCAE_INVENTORY_RETRY_LIMIT)); + } + if (refProp.getStringValue(DCAE_INVENTORY_RETRY_INTERVAL) != null) { + retryInterval = Integer.valueOf(refProp.getStringValue(DCAE_INVENTORY_RETRY_INTERVAL)); + } + for (int i = 0; i < retryLimit; i++) { + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext) + .withProperty("blueprintResourceId", resourceUuid).withProperty("blueprintServiceId", serviceUuid) + .withProperty("blueprintName", artifactName).build(); + metricsLogger.info("Attempt n°" + i + " to contact DCAE inventory"); + + Exchange exchangeResponse = camelContext.createProducerTemplate() + .send("direct:get-dcae-blueprint-inventory", myCamelExchange); + + if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { + String dcaeResponse = (String) exchangeResponse.getIn().getBody(); + int totalCount = getTotalCountFromDcaeInventoryResponse(dcaeResponse); + metricsLogger.info("getDcaeInformation complete: totalCount returned=" + totalCount); + if (totalCount > 0) { + logger.info("getDcaeInformation, answer from DCAE inventory:" + dcaeResponse); + LoggingUtils.setResponseContext("0", "Get Dcae Information success", this.getClass().getName()); + Date startTime = new Date(); + LoggingUtils.setTimeContext(startTime, new Date()); + return getItemsFromDcaeInventoryResponse(dcaeResponse); + } else { + logger.info("Dcae inventory totalCount returned is 0, so waiting " + retryInterval + + "ms before retrying ..."); + // wait for a while and try to connect to DCAE again + Thread.sleep(retryInterval); + } + } + } + logger.warn("Dcae inventory totalCount returned is still 0, after " + retryLimit + " attempts, returning NULL"); + return null; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/client/PolicyEngineServices.java b/src/main/java/org/onap/policy/clamp/clds/client/PolicyEngineServices.java new file mode 100644 index 000000000..bc6a68286 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/client/PolicyEngineServices.java @@ -0,0 +1,226 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.client; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.builder.ExchangeBuilder; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.sdc.controller.installer.BlueprintMicroService; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelsService; +import org.onap.policy.clamp.policy.pdpgroup.PdpGroup; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; + + +/** + * The class implements the communication with the Policy Engine to retrieve + * policy models (tosca). It mainly delegates the physical calls to Camel + * engine. + */ +@Component +public class PolicyEngineServices { + private final CamelContext camelContext; + + private final PolicyModelsService policyModelsService; + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyEngineServices.class); + private static int retryInterval = 0; + private static int retryLimit = 1; + + public static final String POLICY_RETRY_INTERVAL = "policy.retry.interval"; + public static final String POLICY_RETRY_LIMIT = "policy.retry.limit"; + + /** + * Default constructor. + * + * @param camelContext Camel context bean + * @param clampProperties ClampProperties bean + * @param policyModelsService policyModel service + */ + @Autowired + public PolicyEngineServices(CamelContext camelContext, ClampProperties clampProperties, + PolicyModelsService policyModelsService) { + this.camelContext = camelContext; + this.policyModelsService = policyModelsService; + if (clampProperties.getStringValue(POLICY_RETRY_LIMIT) != null) { + retryLimit = Integer.parseInt(clampProperties.getStringValue(POLICY_RETRY_LIMIT)); + } + if (clampProperties.getStringValue(POLICY_RETRY_INTERVAL) != null) { + retryInterval = Integer.parseInt(clampProperties.getStringValue(POLICY_RETRY_INTERVAL)); + } + } + + /** + * This method query Policy engine and create a PolicyModel object with type and version. + * If the policy already exist in the db it returns the existing one. + * + * @param policyType The policyType id + * @param policyVersion The policy version of that type + * @return A PolicyModel created from policyEngine data or null if nothing is found on policyEngine + */ + public PolicyModel createPolicyModelFromPolicyEngine(String policyType, String policyVersion) { + PolicyModel policyModelFound = policyModelsService.getPolicyModel(policyType, policyVersion); + if (policyModelFound == null) { + String policyTosca = this.downloadOnePolicy(policyType, policyVersion); + if (policyTosca != null && !policyTosca.isEmpty()) { + return policyModelsService.savePolicyModelInNewTransaction( + new PolicyModel(policyType, policyTosca, policyVersion)); + } else { + logger.error("Policy not found in the Policy Engine, returning null: " + policyType + + "/" + policyVersion); + return null; + } + } else { + logger.info("Skipping policy model download as it exists already in the database " + policyType + + "/" + policyVersion); + return policyModelFound; + } + } + + /** + * This method query Policy engine and create a PolicyModel object with type and version. + * + * @param microService microservice object instance + * @return A PolicyModel created from policyEngine data + */ + public PolicyModel createPolicyModelFromPolicyEngine(BlueprintMicroService microService) { + return createPolicyModelFromPolicyEngine(microService.getModelType(), microService.getModelVersion()); + } + + /** + * This method synchronize the clamp database and the policy engine. + * So it creates the required PolicyModel. + */ + public void synchronizeAllPolicies() { + LinkedHashMap loadedYaml; + loadedYaml = new Yaml().load(downloadAllPolicies()); + if (loadedYaml == null || loadedYaml.isEmpty()) { + logger.warn("getAllPolicyType yaml returned by policy engine could not be decoded, as it's null or empty"); + return; + } + + LinkedHashMap policyTypesMap = (LinkedHashMap) loadedYaml + .get("policy_types"); + policyTypesMap.forEach((key, value) -> + this.createPolicyModelFromPolicyEngine(key, + ((String) ((LinkedHashMap) value).get("version")))); + } + + /** + * This method can be used to download all policy types + data types defined in + * policy engine. + * + * @return A yaml containing all policy Types and all data types + */ + public String downloadAllPolicies() { + return callCamelRoute(ExchangeBuilder.anExchange(camelContext).build(), "direct:get-all-policy-models", + "Get all policies"); + } + + /** + * This method can be used to download a policy tosca model on the engine. + * + * @param policyType The policy type (id) + * @param policyVersion The policy version + * @return A string with the whole policy tosca model + */ + public String downloadOnePolicy(String policyType, String policyVersion) { + logger.info("Downloading the policy model " + policyType + "/" + policyVersion); + DumperOptions options = new DumperOptions(); + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN); + options.setIndent(4); + options.setPrettyFlow(true); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + Yaml yamlParser = new Yaml(options); + String responseBody = callCamelRoute( + ExchangeBuilder.anExchange(camelContext).withProperty("policyModelName", policyType) + .withProperty("policyModelVersion", policyVersion).build(), "direct:get-policy-model", + "Get one policy"); + + if (responseBody == null || responseBody.isEmpty()) { + logger.warn("getPolicyModel returned by policy engine could not be decoded, as it's null or empty"); + return null; + } + + return yamlParser.dump((Map) yamlParser.load(responseBody)); + } + + /** + * This method can be used to download all Pdp Groups data from policy engine. + */ + public void downloadPdpGroups() { + String responseBody = + callCamelRoute(ExchangeBuilder.anExchange(camelContext).build(), "direct:get-all-pdp-groups", + "Get Pdp Groups"); + + if (responseBody == null || responseBody.isEmpty()) { + logger.warn("getPdpGroups returned by policy engine could not be decoded, as it's null or empty"); + return; + } + + JsonObject jsonObj = JsonUtils.GSON.fromJson(responseBody, JsonObject.class); + + List pdpGroupList = new LinkedList<>(); + JsonArray itemsArray = (JsonArray) jsonObj.get("groups"); + + for (com.google.gson.JsonElement jsonElement : itemsArray) { + JsonObject item = (JsonObject) jsonElement; + PdpGroup pdpGroup = JsonUtils.GSON.fromJson(item.toString(), PdpGroup.class); + pdpGroupList.add(pdpGroup); + } + + policyModelsService.updatePdpGroupInfo(pdpGroupList); + } + + private String callCamelRoute(Exchange exchange, String camelFlow, String logMsg) { + for (int i = 0; i < retryLimit; i++) { + Exchange exchangeResponse = camelContext.createProducerTemplate().send(camelFlow, exchange); + if (Integer.valueOf(200).equals(exchangeResponse.getIn().getHeader("CamelHttpResponseCode"))) { + return (String) exchangeResponse.getIn().getBody(); + } else { + logger.info(logMsg + " query " + retryInterval + "ms before retrying ..."); + // wait for a while and try to connect to DCAE again + try { + Thread.sleep(retryInterval); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + return ""; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/AafConfiguration.java b/src/main/java/org/onap/policy/clamp/clds/config/AafConfiguration.java new file mode 100644 index 000000000..30ba6e6ae --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/AafConfiguration.java @@ -0,0 +1,66 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config; + +import javax.servlet.Filter; +import org.onap.policy.clamp.clds.filter.ClampCadiFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("clamp-aaf-authentication") +public class AafConfiguration { + + /** + * Method to return clamp cadi filter. + * + * @return Filter + */ + @Bean(name = "cadiFilter") + public Filter cadiFilter() { + return new ClampCadiFilter(); + } + + /** + * Method to register cadi filter. + * + * @return FilterRegistrationBean + */ + @Bean + public FilterRegistrationBean cadiFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(cadiFilter()); + registration.addUrlPatterns("/restservices/clds/v1/user/*"); + registration.addUrlPatterns("/restservices/clds/v2/dictionary/*"); + registration.addUrlPatterns("/restservices/clds/v2/templates/*"); + registration.addUrlPatterns("/restservices/clds/v2/clampInformation/*"); + registration.addUrlPatterns("/restservices/clds/v2/policyToscaModels/*"); + registration.addUrlPatterns("/restservices/clds/v2/loop/*"); + registration.setName("cadiFilter"); + registration.setOrder(0); + return registration; + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/config/CamelConfiguration.java b/src/main/java/org/onap/policy/clamp/clds/config/CamelConfiguration.java new file mode 100644 index 000000000..9431f40e8 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/CamelConfiguration.java @@ -0,0 +1,134 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + */ + +package org.onap.policy.clamp.clds.config; + +import java.io.IOException; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http4.HttpClientConfigurer; +import org.apache.camel.component.http4.HttpComponent; +import org.apache.camel.model.rest.RestBindingMode; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.BasicHttpClientConnectionManager; +import org.onap.policy.clamp.clds.util.ClampVersioning; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.util.PassDecoder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Component +public class CamelConfiguration extends RouteBuilder { + + @Autowired + CamelContext camelContext; + + @Autowired + private Environment env; + + private void configureDefaultSslProperties() throws IOException { + if (env.getProperty("server.ssl.trust-store") != null) { + URL storeResource = Thread.currentThread().getContextClassLoader() + .getResource(env.getProperty("server.ssl.trust-store").replaceFirst("classpath:", "")); + System.setProperty("javax.net.ssl.trustStore", storeResource.getPath()); + String keyFile = env.getProperty("clamp.config.keyFile"); + String trustStorePass = PassDecoder.decode(env.getProperty("server.ssl.trust-store-password"), + keyFile); + System.setProperty("javax.net.ssl.trustStorePassword", trustStorePass); + System.setProperty("javax.net.ssl.trustStoreType", "jks"); + System.setProperty("ssl.TrustManagerFactory.algorithm", "PKIX"); + storeResource = Thread.currentThread().getContextClassLoader() + .getResource(env.getProperty("server.ssl.key-store").replaceFirst("classpath:", "")); + System.setProperty("javax.net.ssl.keyStore", storeResource.getPath()); + + String keyStorePass = PassDecoder.decode(env.getProperty("server.ssl.key-store-password"), + keyFile); + System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass); + System.setProperty("javax.net.ssl.keyStoreType", env.getProperty("server.ssl.key-store-type")); + } + } + + private void registerTrustStore() + throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException, CertificateException, IOException { + if (env.getProperty("server.ssl.trust-store") != null) { + KeyStore truststore = KeyStore.getInstance("JKS"); + String keyFile = env.getProperty("clamp.config.keyFile"); + String password = PassDecoder.decode(env.getProperty("server.ssl.trust-store-password"), keyFile); + truststore.load( + ResourceFileUtils.getResourceAsStream(env.getProperty("server.ssl.trust-store")), + password.toCharArray()); + + TrustManagerFactory trustFactory = TrustManagerFactory.getInstance("PKIX"); + trustFactory.init(truststore); + SSLContext sslcontext = SSLContext.getInstance("TLS"); + sslcontext.init(null, trustFactory.getTrustManagers(), null); + SSLSocketFactory factory = new SSLSocketFactory(sslcontext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + SchemeRegistry registry = new SchemeRegistry(); + final Scheme scheme = new Scheme("https4", 443, factory); + registry.register(scheme); + ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory(); + HttpComponent http4 = camelContext.getComponent("https4", HttpComponent.class); + http4.setHttpClientConfigurer(new HttpClientConfigurer() { + + @Override + public void configureHttpClient(HttpClientBuilder builder) { + builder.setSSLSocketFactory(factory); + Registry registry = RegistryBuilder.create() + .register("https", factory).register("http", plainsf).build(); + builder.setConnectionManager(new BasicHttpClientConnectionManager(registry)); + } + }); + } + } + + @Override + public void configure() + throws KeyManagementException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { + restConfiguration().component("servlet").bindingMode(RestBindingMode.json).jsonDataFormat("clamp-gson") + .dataFormatProperty("prettyPrint", "true")// .enableCORS(true) + // turn on swagger api-doc + .apiContextPath("api-doc").apiVendorExtension(true).apiProperty("api.title", "Clamp Rest API") + .apiProperty("api.version", ClampVersioning.getCldsVersionFromProps()) + .apiProperty("base.path", "/restservices/clds/"); + + // camelContext.setTracing(true); + + configureDefaultSslProperties(); + registerTrustStore(); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/ClampProperties.java b/src/main/java/org/onap/policy/clamp/clds/config/ClampProperties.java new file mode 100644 index 000000000..f11e16733 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/ClampProperties.java @@ -0,0 +1,105 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config; + +import java.io.IOException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * Holds Clamp properties and add some functionalities. + */ +@Component +public class ClampProperties { + + @Autowired + private ApplicationContext appContext; + @Autowired + private Environment env; + public static final String CONFIG_PREFIX = "clamp.config."; + + /** + * get property value. + * + * @param key The first key + * @return The string with the value + */ + public String getStringValue(String key) { + return env.getProperty(CONFIG_PREFIX + key); + } + + /** + * get property value for a combo key (key1 + "." + key2). If not found just use + * key1. + * + * @param key1 The first key + * @param key2 The second key after a dot + * @return The string with the value + */ + public String getStringValue(String key1, String key2) { + String value = getStringValue(key1 + "." + key2); + if (value == null || value.length() == 0) { + value = getStringValue(key1); + } + return value; + } + + /** + * Return the file content. The value obtained from the clds-reference file will + * be used as a filename. + * + * @param key The key that will be used to access the clds-reference file + * @return File content in String + * @throws IOException In case of issues with the JSON parser + */ + public String getFileContent(String key) throws IOException { + String fileReference = getStringValue(key); + return (fileReference != null) ? getFileContentFromPath(fileReference) : null; + } + + /** + * Return the file content. First try with combo key (key1 + "." + key2), + * otherwise default to just key1. The value obtained from the clds-reference + * file will be used as a filename. + * + * @param key1 The first key + * @param key2 The second key after a dot + * @return File content in String + * @throws IOException In case of issues with the JSON parser + */ + public String getFileContent(String key1, String key2) throws IOException { + String fileReference = getStringValue(key1, key2); + return (fileReference != null) ? getFileContentFromPath(fileReference) : null; + } + + private String getFileContentFromPath(String filepath) throws IOException { + URL url = appContext.getResource(filepath).getURL(); + return IOUtils.toString(url, StandardCharsets.UTF_8); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoder.java b/src/main/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoder.java new file mode 100644 index 000000000..20d7143fb --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoder.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds.config; + +import com.google.gson.JsonParseException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import org.apache.commons.io.IOUtils; +import org.onap.policy.clamp.authorization.CldsUser; +import org.onap.policy.clamp.clds.exception.CldsUsersException; +import org.onap.policy.clamp.clds.util.JsonUtils; + +public class CldsUserJsonDecoder { + + private CldsUserJsonDecoder() { + } + + /** + * This method decodes the JSON file provided to a CldsUser Array. The stream is + * closed after this call, this is not possible to reuse it. + * + * @param cldsUsersFile + * The inputStream containing the users json file + * @return CldsUser[] Array containing a list of the user defined in the JSON + * file + */ + public static CldsUser[] decodeJson(InputStream cldsUsersFile) { + try { + return decodeJson(IOUtils.toString(cldsUsersFile, StandardCharsets.UTF_8.name())); + } catch (IOException e) { + throw new CldsUsersException("Exception occurred during the decoding of the clds-users.json", e); + } + } + + /** + * This method decodes the JSON string to a CldsUser Array. + * + * @param cldsUsersString JSON string + * @return CldsUser[] Array containing a list of the user defined in the JSON + */ + public static CldsUser[] decodeJson(String cldsUsersString) { + try { + // the ObjectMapper readValue method closes the stream no need to do + // it + return JsonUtils.GSON.fromJson(cldsUsersString, CldsUser[].class); + } catch (JsonParseException e) { + throw new CldsUsersException("Exception occurred during the decoding of the clds-users.json", e); + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/DefaultDictionaryElements.java b/src/main/java/org/onap/policy/clamp/clds/config/DefaultDictionaryElements.java new file mode 100644 index 000000000..27cf0b941 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/DefaultDictionaryElements.java @@ -0,0 +1,167 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config; + +import javax.annotation.PostConstruct; +import org.onap.policy.clamp.tosca.Dictionary; +import org.onap.policy.clamp.tosca.DictionaryElement; +import org.onap.policy.clamp.tosca.DictionaryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("default-dictionary-elements") +public class DefaultDictionaryElements { + + @Autowired + private DictionaryService dictionaryService; + + /** + * Init method. + */ + @PostConstruct + public void init() { + preProvisionDefaultActors(); + preProvisionDefaultOperations(); + } + + private void preProvisionDefaultActors() { + // Set up dictionary elements + Dictionary actorDictionary = new Dictionary(); + actorDictionary.setName("DefaultActors"); + actorDictionary.setSecondLevelDictionary(0); + actorDictionary.setSubDictionaryType(""); + + DictionaryElement elementSo = new DictionaryElement(); + elementSo.setName("SO"); + elementSo.setShortName("SO"); + elementSo.setType("string"); + elementSo.setDescription("SO component"); + actorDictionary.addDictionaryElements(elementSo); + + DictionaryElement elementSdnc = new DictionaryElement(); + elementSdnc.setName("SDNC"); + elementSdnc.setShortName("SDNC"); + elementSdnc.setType("string"); + elementSdnc.setDescription("SDNC component"); + actorDictionary.addDictionaryElements(elementSdnc); + + DictionaryElement elementAppc = new DictionaryElement(); + elementAppc.setName("APPC"); + elementAppc.setShortName("APPC"); + elementAppc.setType("string"); + elementAppc.setDescription("APPC component"); + actorDictionary.addDictionaryElements(elementAppc); + + DictionaryElement elementVfc = new DictionaryElement(); + elementVfc.setName("VFC"); + elementVfc.setShortName("VFC"); + elementVfc.setType("string"); + elementVfc.setDescription("VFC component"); + actorDictionary.addDictionaryElements(elementVfc); + + DictionaryElement elementSdnr = new DictionaryElement(); + elementSdnr.setName("SDNR"); + elementSdnr.setShortName("SDNR"); + elementSdnr.setType("string"); + elementSdnr.setDescription("SDNR component"); + actorDictionary.addDictionaryElements(elementSdnr); + + dictionaryService.saveOrUpdateDictionary(actorDictionary); + } + + private void preProvisionDefaultOperations() { + // Set up dictionary elements + Dictionary operationDictionary = new Dictionary(); + operationDictionary.setName("DefaultOperations"); + operationDictionary.setSecondLevelDictionary(0); + operationDictionary.setSubDictionaryType(""); + + DictionaryElement elementRestart = new DictionaryElement(); + elementRestart.setName("Restart"); + elementRestart.setShortName("Restart (APPC operation)"); + elementRestart.setType("string"); + elementRestart.setDescription("APPC operation"); + operationDictionary.addDictionaryElements(elementRestart); + + DictionaryElement elementRebuild = new DictionaryElement(); + elementRebuild.setName("Rebuild"); + elementRebuild.setShortName("Rebuild (APPC operation)"); + elementRebuild.setType("string"); + elementRebuild.setDescription("APPC operation"); + operationDictionary.addDictionaryElements(elementRebuild); + + DictionaryElement elementMigrate = new DictionaryElement(); + elementMigrate.setName("Migrate"); + elementMigrate.setShortName("Migrate (APPC operation)"); + elementMigrate.setType("string"); + elementMigrate.setDescription("APPC operation"); + operationDictionary.addDictionaryElements(elementMigrate); + + DictionaryElement elementHealthCheck = new DictionaryElement(); + elementHealthCheck.setName("Health-Check"); + elementHealthCheck.setShortName("Health-Check (APPC operation)"); + elementHealthCheck.setType("string"); + elementHealthCheck.setDescription("APPC operation"); + operationDictionary.addDictionaryElements(elementHealthCheck); + + DictionaryElement elementModifyConfig = new DictionaryElement(); + elementModifyConfig.setName("ModifyConfig"); + elementModifyConfig.setShortName("ModifyConfig (APPC/VFC operation)"); + elementModifyConfig.setType("string"); + elementModifyConfig.setDescription("APPC/VFC operation"); + operationDictionary.addDictionaryElements(elementModifyConfig); + + DictionaryElement elementVfModuleCreate = new DictionaryElement(); + elementVfModuleCreate.setName("VF Module Create"); + elementVfModuleCreate.setShortName("VF Module Create (SO operation)"); + elementVfModuleCreate.setType("string"); + elementVfModuleCreate.setDescription("SO operation"); + operationDictionary.addDictionaryElements(elementVfModuleCreate); + + DictionaryElement elementVfModuleDelete = new DictionaryElement(); + elementVfModuleDelete.setName("VF Module Delete"); + elementVfModuleDelete.setShortName("VF Module Delete (SO operation)"); + elementVfModuleDelete.setType("string"); + elementVfModuleDelete.setDescription("SO operation"); + operationDictionary.addDictionaryElements(elementVfModuleDelete); + + DictionaryElement elementReroute = new DictionaryElement(); + elementReroute.setName("Reroute"); + elementReroute.setShortName("Reroute (SDNC operation)"); + elementReroute.setType("string"); + elementReroute.setDescription("SDNC operation"); + operationDictionary.addDictionaryElements(elementReroute); + + DictionaryElement elementBandwidthOnDemand = new DictionaryElement(); + elementBandwidthOnDemand.setName("BandwidthOnDemand"); + elementBandwidthOnDemand.setShortName("BandwidthOnDemand (SDNC operation)"); + elementBandwidthOnDemand.setType("string"); + elementBandwidthOnDemand.setDescription("SDNC operation"); + operationDictionary.addDictionaryElements(elementBandwidthOnDemand); + + dictionaryService.saveOrUpdateDictionary(operationDictionary); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/DefaultUserConfiguration.java b/src/main/java/org/onap/policy/clamp/clds/config/DefaultUserConfiguration.java new file mode 100644 index 000000000..015868141 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/DefaultUserConfiguration.java @@ -0,0 +1,138 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds.config; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import org.onap.policy.clamp.authorization.CldsUser; +import org.onap.policy.clamp.clds.exception.CldsConfigException; +import org.onap.policy.clamp.clds.exception.CldsUsersException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +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.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + * This class is used to enable the HTTP authentication to login. It requires a + * specific JSON file containing the user definition + * (classpath:clds/clds-users.json). + */ +@Configuration +@EnableWebSecurity +@Profile("clamp-default-user") +public class DefaultUserConfiguration extends WebSecurityConfigurerAdapter { + + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DefaultUserConfiguration.class); + + private static final String SETUP_WEB_USERS_EXCEPTION_MSG = "Exception occurred during the " + + " setup of the Web users in memory"; + @Autowired + private ClampProperties refProp; + @Value("${clamp.config.security.permission.type.cl:permission-type-cl}") + private String cldsPersmissionTypeCl; + @Value("${CLDS_PERMISSION_INSTANCE:dev}") + private String cldsPermissionInstance; + @Value("${clamp.config.security.encoder:bcrypt}") + private String cldsEncoderMethod; + @Value("${clamp.config.security.encoder.bcrypt.strength:10}") + private Integer cldsBcryptEncoderStrength; + + /** + * This method configures on which URL the authorization will be enabled. + */ + @Override + protected void configure(HttpSecurity http) { + try { + http.csrf().disable().httpBasic().and().authorizeRequests().antMatchers("/restservices/clds/v1/user/**") + .authenticated().anyRequest().permitAll().and().sessionManagement() + .maximumSessions(1); + + } catch (Exception e) { + logger.error(SETUP_WEB_USERS_EXCEPTION_MSG, e); + throw new CldsUsersException(SETUP_WEB_USERS_EXCEPTION_MSG, e); + } + } + + /** + * This method is called by the framework and is used to load all the users + * defined in cldsUsersFile variable (this file path can be configured in the + * application.properties). + * + * @param auth authentication manager builder + */ + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) { + // configure algorithm used for password hashing + final PasswordEncoder passwordEncoder = getPasswordEncoder(); + + try { + CldsUser[] usersList = loadUsers(); + // no users defined + if (null == usersList) { + logger.warn("No users defined. Users should be defined under clds-users.json"); + return; + } + for (CldsUser user : usersList) { + auth.inMemoryAuthentication().withUser(user.getUser()).password(user.getPassword()) + .authorities(user.getPermissionsString()).and().passwordEncoder(passwordEncoder); + } + } catch (Exception e) { + logger.error(SETUP_WEB_USERS_EXCEPTION_MSG, e); + throw new CldsUsersException(SETUP_WEB_USERS_EXCEPTION_MSG, e); + } + } + + /** + * This method loads physically the JSON file and convert it to an Array of + * CldsUser. + * + * @return The array of CldsUser + * @throws IOException In case of the file is not found + */ + private CldsUser[] loadUsers() throws IOException { + logger.info("Load from clds-users.properties"); + return CldsUserJsonDecoder.decodeJson(refProp.getFileContent("files.cldsUsers")); + } + + /** + * This methods returns the chosen encoder for password hashing. + */ + private PasswordEncoder getPasswordEncoder() { + if ("bcrypt".equals(cldsEncoderMethod)) { + return new BCryptPasswordEncoder(cldsBcryptEncoderStrength); + } else { + throw new CldsConfigException( + "Invalid clamp.config.security.encoder value. 'bcrypt' is the only option at this time."); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/config/SslConfig.java b/src/main/java/org/onap/policy/clamp/clds/config/SslConfig.java new file mode 100644 index 000000000..329cb4bed --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/SslConfig.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config; + +import java.io.IOException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.util.PassDecoder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.server.Ssl; +import org.springframework.boot.web.server.SslStoreProvider; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; + +@Configuration +@Profile("clamp-ssl-config") +public class SslConfig { + @Autowired + private Environment env; + + @Bean + WebServerFactoryCustomizer tomcatCustomizer(ServerProperties serverProperties, + ResourceLoader resourceLoader) { + return (tomcat) -> tomcat.setSslStoreProvider(new SslStoreProvider() { + @Override + public KeyStore getKeyStore() throws KeyStoreException, + NoSuchAlgorithmException, CertificateException, IOException { + KeyStore keystore = KeyStore.getInstance(env.getProperty("server.ssl.key-store-type")); + String password = PassDecoder.decode(env.getProperty("server.ssl.key-store-password"), + env.getProperty("clamp.config.keyFile")); + keystore.load(ResourceFileUtils.getResourceAsStream(env.getProperty("server.ssl.key-store")), + password.toCharArray()); + return keystore; + } + + @Override + public KeyStore getTrustStore() throws KeyStoreException, + NoSuchAlgorithmException, CertificateException, IOException { + KeyStore truststore = KeyStore.getInstance("JKS"); + String password = PassDecoder.decode(env.getProperty("server.ssl.trust-store-password"), + env.getProperty("clamp.config.keyFile")); + truststore.load( + ResourceFileUtils.getResourceAsStream(env.getProperty("server.ssl.trust-store")), + password.toCharArray()); + return truststore; + } + }); + } + + @Bean + WebServerFactoryCustomizer tomcatSslCustomizer(ServerProperties serverProperties, + ResourceLoader resourceLoader) { + return (tomcat) -> tomcat.setSsl(new Ssl() { + @Override + public String getKeyPassword() { + String password = PassDecoder.decode(env.getProperty("server.ssl.key-password"), + env.getProperty("clamp.config.keyFile")); + return password; + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/config/SystemPropertiesLoader.java b/src/main/java/org/onap/policy/clamp/clds/config/SystemPropertiesLoader.java new file mode 100644 index 000000000..3e2e62b66 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/SystemPropertiesLoader.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.util.Properties; +import javax.annotation.Resource; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.stereotype.Component; + +@Component +public class SystemPropertiesLoader implements ApplicationListener { + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(SystemPropertiesLoader.class); + + @Resource(name = "mapper") + private Properties myTranslator; + + @Override + public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { + logger.info("Loading additional JVM properties:" + myTranslator.toString()); + System.getProperties().putAll(myTranslator); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcControllersConfiguration.java b/src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcControllersConfiguration.java new file mode 100644 index 000000000..4748edf6d --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcControllersConfiguration.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds.config.sdc; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.PostConstruct; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcParametersException; +import org.onap.policy.clamp.clds.util.JsonUtils; +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; + +/** + * 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. + */ +public class SdcControllersConfiguration { + + private static final String CONTROLLER_SUBTREE_KEY = "sdc-connections"; + @Autowired + protected ApplicationContext appContext; + /** + * The file name that will be loaded by Spring. + */ + @Value("${clamp.config.files.sdcController:'classpath:/clds/sdc-controllers-config.json'}") + protected String sdcControllerFile; + /** + * The root of the JSON. + */ + private JsonObject jsonRootNode; + + /** + * Loads configuration from SDC controller config file. + * + * @throws IOException IO Exception + */ + @PostConstruct + public void loadConfiguration() throws IOException { + Resource resource = appContext.getResource(sdcControllerFile); + // Try to load json tree + jsonRootNode = JsonUtils.GSON.fromJson(new InputStreamReader( + resource.getInputStream(), StandardCharsets.UTF_8), + JsonObject.class); + } + + public SdcSingleControllerConfiguration getSdcSingleControllerConfiguration(String controllerName) { + return getAllDefinedControllers().get(controllerName); + } + + /** + * This method reads all Controllers configurations and returns them. + * + * @return A list of controller Names defined in the config + */ + public Map getAllDefinedControllers() { + Map result = new HashMap<>(); + if (jsonRootNode.get(CONTROLLER_SUBTREE_KEY) != null) { + jsonRootNode.get(CONTROLLER_SUBTREE_KEY).getAsJsonObject().entrySet().forEach( + entry -> result.put(entry.getKey(), + new SdcSingleControllerConfiguration(entry.getValue().getAsJsonObject(), entry.getKey()))); + } else { + throw new SdcParametersException( + CONTROLLER_SUBTREE_KEY + " key not found in the file: " + sdcControllerFile); + } + return result; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java b/src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java new file mode 100644 index 000000000..0bbbf19dc --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java @@ -0,0 +1,290 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config.sdc; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.apache.commons.codec.DecoderException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcParametersException; +import org.onap.policy.clamp.clds.util.CryptoUtils; +import org.onap.sdc.api.consumer.IConfiguration; + +/** + * This class maps the SDC config JSON for one controller. + */ +public class SdcSingleControllerConfiguration implements IConfiguration { + + private static final EELFLogger logger = EELFManager.getInstance() + .getLogger(SdcSingleControllerConfiguration.class); + /** + * The sdc Controller name corresponding. + */ + private String sdcControllerName; + /** + * The root of the JSON. + */ + private JsonObject jsonRootNode; + // All keys that can be present in the JSON + public static final String CONSUMER_GROUP_ATTRIBUTE_NAME = "consumerGroup"; + public static final String CONSUMER_ID_ATTRIBUTE_NAME = "consumerId"; + public static final String ENVIRONMENT_NAME_ATTRIBUTE_NAME = "environmentName"; + public static final String SDC_KEY_ATTRIBUTE_NAME = "password"; + public static final String POLLING_INTERVAL_ATTRIBUTE_NAME = "pollingInterval"; + public static final String RELEVANT_ARTIFACT_TYPES_ATTRIBUTE_NAME = "relevantArtifactTypes"; + public static final String USER_ATTRIBUTE_NAME = "user"; + public static final String SDC_ADDRESS_ATTRIBUTE_NAME = "sdcAddress"; + public static final String POLLING_TIMEOUT_ATTRIBUTE_NAME = "pollingTimeout"; + public static final String ACTIVATE_SERVER_TLS_AUTH = "activateServerTLSAuth"; + public static final String KEY_STORE_KEY = "keyStorePassword"; + public static final String KEY_STORE_PATH = "keyStorePath"; + public static final String MESSAGE_BUS_ADDRESSES = "messageBusAddresses"; + private String errorMessageKeyNotFound; + /** + * Supported artifact types. + */ + public static final String HEAT = "HEAT"; + public static final String HEAT_ARTIFACT = "HEAT_ARTIFACT"; + public static final String HEAT_ENV = "HEAT_ENV"; + public static final String HEAT_NESTED = "HEAT_NESTED"; + public static final String HEAT_NET = "HEAT_NET"; + public static final String HEAT_VOL = "HEAT_VOL"; + public static final String OTHER = "OTHER"; + public static final String TOSCA_CSAR = "TOSCA_CSAR"; + public static final String VF_MODULES_METADATA = "VF_MODULES_METADATA"; + private static final String[] SUPPORTED_ARTIFACT_TYPES = { + TOSCA_CSAR, VF_MODULES_METADATA + }; + public static final List SUPPORTED_ARTIFACT_TYPES_LIST = Collections + .unmodifiableList(Arrays.asList(SUPPORTED_ARTIFACT_TYPES)); + + /** + * This constructor builds a SdcSingleControllerConfiguration from the + * corresponding json. + * + * @param jsonNode + * The JSON node + * @param controllerName + * The controller name that must appear in the JSON + */ + public SdcSingleControllerConfiguration(JsonObject jsonNode, String controllerName) { + jsonRootNode = jsonNode; + setSdcControllerName(controllerName); + testAllRequiredParameters(); + } + + public String getSdcControllerName() { + return sdcControllerName; + } + + /** + * Sets SDC controller name. + * + * @param controllerName SDC controller name + */ + public void setSdcControllerName(String controllerName) { + this.sdcControllerName = controllerName; + errorMessageKeyNotFound = " parameter cannot be found in config file for controller name" + sdcControllerName; + testAllRequiredParameters(); + } + + private String getStringConfig(String key) { + if (jsonRootNode != null && jsonRootNode.get(key) != null) { + String config = jsonRootNode.get(key).getAsString(); + return config.isEmpty() ? null : config; + } + return null; + } + + private Integer getIntConfig(String key) { + if (jsonRootNode != null && jsonRootNode.get(key) != null) { + return jsonRootNode.get(key).getAsInt(); + } else { + return 0; + } + } + + private String getEncryptedStringConfig(String key) throws GeneralSecurityException, DecoderException { + if (jsonRootNode != null && jsonRootNode.get(key) != null) { + return jsonRootNode.get(key).getAsString().isEmpty() ? null + : CryptoUtils.decrypt(jsonRootNode.get(key).getAsString()); + } + return null; + } + + @Override + public java.lang.Boolean isUseHttpsWithDmaap() { + return false; + } + + @Override + public String getConsumerGroup() { + if (jsonRootNode != null && jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME) != null) { + String config = jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).getAsString(); + return "NULL".equals(config) || config.isEmpty() ? null : config; + } + return null; + } + + @Override + public String getConsumerID() { + return getStringConfig(CONSUMER_ID_ATTRIBUTE_NAME); + } + + @Override + public String getEnvironmentName() { + return getStringConfig(ENVIRONMENT_NAME_ATTRIBUTE_NAME); + } + + @Override + public String getPassword() { + try { + return getEncryptedStringConfig(SDC_KEY_ATTRIBUTE_NAME); + } catch (GeneralSecurityException | DecoderException e) { + logger.error("Unable to decrypt the SDC password", e); + return null; + } + } + + @Override + public int getPollingInterval() { + return getIntConfig(POLLING_INTERVAL_ATTRIBUTE_NAME); + } + + @Override + public List getRelevantArtifactTypes() { + // DO not return the Static List SUPPORTED_ARTIFACT_TYPES_LIST because + // the ASDC Client could try to modify it !!! + return Arrays.asList(SUPPORTED_ARTIFACT_TYPES); + } + + @Override + public String getUser() { + return getStringConfig(USER_ATTRIBUTE_NAME); + } + + @Override + public String getAsdcAddress() { + return getStringConfig(SDC_ADDRESS_ATTRIBUTE_NAME); + } + + @Override + public int getPollingTimeout() { + return getIntConfig(POLLING_TIMEOUT_ATTRIBUTE_NAME); + } + + @Override + public boolean activateServerTLSAuth() { + if (jsonRootNode != null && jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH) != null + && jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH).isJsonPrimitive()) { + return jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH).getAsBoolean(); + } else { + return false; + } + } + + @Override + public String getKeyStorePassword() { + try { + return getEncryptedStringConfig(KEY_STORE_KEY); + } catch (GeneralSecurityException | DecoderException e) { + logger.error("Unable to decrypt the SDC password", e); + return null; + } + } + + @Override + public String getKeyStorePath() { + return getStringConfig(KEY_STORE_PATH); + } + + /** + * This method can be used to validate all required parameters are well + * there. + */ + public void testAllRequiredParameters() { + // Special case for this attribute that can be null from + // getConsumerGroup + if (jsonRootNode == null) { + throw new SdcParametersException("Json is null for controller " + this.getSdcControllerName()); + } + if (this.getConsumerGroup() == null && (jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME) == null + || !"NULL".equals(jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).getAsString()))) { + throw new SdcParametersException(CONSUMER_GROUP_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getConsumerID() == null || this.getConsumerID().isEmpty()) { + throw new SdcParametersException(CONSUMER_ID_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getEnvironmentName() == null || this.getEnvironmentName().isEmpty()) { + throw new SdcParametersException(ENVIRONMENT_NAME_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getAsdcAddress() == null || this.getAsdcAddress().isEmpty()) { + throw new SdcParametersException(SDC_ADDRESS_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getMsgBusAddress() == null || this.getMsgBusAddress().isEmpty()) { + throw new SdcParametersException(MESSAGE_BUS_ADDRESSES + errorMessageKeyNotFound); + } + if (this.getPassword() == null || this.getPassword().isEmpty()) { + throw new SdcParametersException(SDC_KEY_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getPollingInterval() == 0) { + throw new SdcParametersException(POLLING_INTERVAL_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getPollingTimeout() == 0) { + throw new SdcParametersException(POLLING_TIMEOUT_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getRelevantArtifactTypes() == null || this.getRelevantArtifactTypes().isEmpty()) { + throw new SdcParametersException(RELEVANT_ARTIFACT_TYPES_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + if (this.getUser() == null || this.getUser().isEmpty()) { + throw new SdcParametersException(USER_ATTRIBUTE_NAME + errorMessageKeyNotFound); + } + } + + /** + * The flag allows the client to receive metadata for all resources of the + * service regardless of the artifacts associated to them. Setting the flag + * to false will preserve legacy behavior. + */ + @Override + public boolean isFilterInEmptyResources() { + return false; + } + + @Override + public List getMsgBusAddress() { + List addressesList = new ArrayList<>(); + if (jsonRootNode != null && jsonRootNode.get(MESSAGE_BUS_ADDRESSES) != null) { + jsonRootNode.get(MESSAGE_BUS_ADDRESSES).getAsJsonArray().forEach(k -> addressesList.add(k.getAsString())); + return addressesList; + } else { + return addressesList; + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/config/spring/CldsConfiguration.java b/src/main/java/org/onap/policy/clamp/clds/config/spring/CldsConfiguration.java new file mode 100644 index 000000000..72f09ce13 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/spring/CldsConfiguration.java @@ -0,0 +1,55 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config.spring; + +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.PropertiesFactoryBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("clamp-default") +public class CldsConfiguration { + + @Autowired + private ApplicationContext appContext; + @Autowired + private ClampProperties refProp; + + + /** + * This loads the file system.properties. + * + * @return The PropertiesFactoryBean + */ + @Bean(name = "mapper") + public PropertiesFactoryBean mapper() { + PropertiesFactoryBean bean = new PropertiesFactoryBean(); + bean.setLocation(appContext.getResource(refProp.getStringValue("files.systemProperties"))); + return bean; + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/config/spring/SdcControllerConfiguration.java b/src/main/java/org/onap/policy/clamp/clds/config/spring/SdcControllerConfiguration.java new file mode 100644 index 000000000..6005b0d39 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/config/spring/SdcControllerConfiguration.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.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.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.config.sdc.SdcControllersConfiguration; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcControllerException; +import org.onap.policy.clamp.clds.sdc.controller.SdcSingleController; +import org.onap.policy.clamp.clds.sdc.controller.SdcSingleControllerStatus; +import org.onap.policy.clamp.loop.CsarInstaller; +import org.springframework.beans.factory.annotation.Autowired; +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; +import org.springframework.scheduling.annotation.Scheduled; + +@Configuration +@Profile("clamp-sdc-controller") +public class SdcControllerConfiguration { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcControllerConfiguration.class); + private List sdcControllersList = new ArrayList<>(); + private final ClampProperties clampProp; + private final CsarInstaller csarInstaller; + + @Autowired + public SdcControllerConfiguration(ClampProperties clampProp, + @Qualifier("csarInstaller") CsarInstaller csarInstaller) { + this.clampProp = clampProp; + this.csarInstaller = csarInstaller; + } + + /** + * Loads SDC controller configuration. + */ + @PostConstruct + public void loadSdcControllers() { + SdcControllersConfiguration sdcControllersConfig = getSdcControllersConfiguration(); + sdcControllersConfig.getAllDefinedControllers().forEach((key, value) -> { + logger.info("Creating controller instance:" + key); + SdcSingleController sdcController = new SdcSingleController(clampProp, csarInstaller, value, null); + sdcControllersList.add(sdcController); + }); + } + + /** + * Checks whether all SDC controllers defined are up and running. + */ + @Scheduled(fixedRate = 120000) + public void checkAllSdcControllers() { + logger.info("Checking that all SDC Controllers defined are up and running"); + for (SdcSingleController controller : sdcControllersList) { + try { + if (SdcSingleControllerStatus.STOPPED.equals(controller.getControllerStatus())) { + controller.initSdc(); + } + } catch (SdcControllerException e) { + logger.error("Exception caught when booting sdc controller", e); + } + } + logger.info("SDC Controllers check completed"); + } + + /** + * Closes all SDC Controller and the SDC Client. + */ + @PreDestroy + public void killSdcControllers() { + sdcControllersList.forEach(e -> { + try { + e.closeSdc(); + } catch (SdcControllerException e1) { + logger.error("Exception caught when stopping sdc controller", e1); + } + }); + } + + @Bean(name = "sdcControllersConfiguration") + public SdcControllersConfiguration getSdcControllersConfiguration() { + return new SdcControllersConfiguration(); + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/CldsConfigException.java b/src/main/java/org/onap/policy/clamp/clds/exception/CldsConfigException.java new file mode 100644 index 000000000..ef1ced0a3 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/CldsConfigException.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception; + +/** + * New exception to CldsUser errors. + * + */ +public class CldsConfigException extends RuntimeException { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = 5958873136187918505L; + + /** + * This constructor can be used to create a new CldsConfigException. + * + * @param message + * A string message detailing the problem + * @param ex + * The exception sent by the code + */ + public CldsConfigException(String message, Throwable ex) { + super(message, ex); + } + + /** + * This constructor can be used to create a new CldsConfigException. Use + * this constructor only if you are creating a new exception stack, not if + * an exception was already raised by another code. + * + * @param message + * A string message detailing the problem + */ + public CldsConfigException(String message) { + super(message); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/CldsUsersException.java b/src/main/java/org/onap/policy/clamp/clds/exception/CldsUsersException.java new file mode 100644 index 000000000..4d4855b6f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/CldsUsersException.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception; + +/** + * New exception to CldsUser errors. + * + */ +public class CldsUsersException extends RuntimeException { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = 933535057227505342L; + + /** + * This constructor can be used to create a new CldsUsersException. + * + * @param message + * A string message detailing the problem + * @param ex + * The exception sent by the code + */ + public CldsUsersException(String message, Throwable ex) { + super(message, ex); + } + + /** + * This constructor can be used to create a new CldsUsersException. Use this + * constructor only if you are creating a new exception stack, not if an + * exception was already raised by another code. + * + * @param message + * A string message detailing the problem + */ + public CldsUsersException(String message) { + super(message); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/NotAuthorizedException.java b/src/main/java/org/onap/policy/clamp/clds/exception/NotAuthorizedException.java new file mode 100644 index 000000000..73c117932 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/NotAuthorizedException.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception; + +/** + * New exception to request errors. + * + */ +public class NotAuthorizedException extends RuntimeException { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = -5738167530541646123L; + + /** + * This constructor can be used to create a new CldsConfigException. + * + * @param message + * A string message detailing the problem + * @param ex + * The exception sent by the code + */ + public NotAuthorizedException(String message, Throwable ex) { + super(message, ex); + } + + /** + * This constructor can be used to create a new CldsConfigException. Use this + * constructor only if you are creating a new exception stack, not if an + * exception was already raised by another code. + * + * @param message + * A string message detailing the problem + */ + public NotAuthorizedException(String message) { + super(message); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/cds/CdsParametersException.java b/src/main/java/org/onap/policy/clamp/clds/exception/cds/CdsParametersException.java new file mode 100644 index 000000000..b4a013eb4 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/cds/CdsParametersException.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.clds.exception.cds; + +/** + * Exception while parsing CDS response. + */ +public class CdsParametersException extends RuntimeException { + + /** + * serialization id. + */ + private static final long serialVersionUID = 8425657297510362736L; + + /** + * This constructor can be used to create a new CdsParametersException. + * + * @param message The message to dump + */ + public CdsParametersException(final String message) { + super(message); + } + + /** + * This constructor can be used to create a new CdsParametersException. + * + * @param message The message to dump + * @param cause The Throwable cause object + */ + public CdsParametersException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/dcae/DcaeDeploymentException.java b/src/main/java/org/onap/policy/clamp/clds/exception/dcae/DcaeDeploymentException.java new file mode 100644 index 000000000..78c2c6331 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/dcae/DcaeDeploymentException.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception.dcae; + +/** + * New exception to capture DCAE communication errors. + * + */ +public class DcaeDeploymentException extends RuntimeException { + + /** + * Generated ID. + */ + private static final long serialVersionUID = 8452294782552680243L; + + /** + * This constructor can be used to create a new DcaeDeploymentException. + * + * @param message + * A string message detailing the problem + * @param ex + * The exception sent by the code + */ + public DcaeDeploymentException(String message, Throwable ex) { + super(message, ex); + } + + /** + * This constructor can be used to create a new DcaeDeploymentException. Use + * this constructor only if you are creating a new exception stack, not if + * an exception was already raised by another code. + * + * @param message + * A string message detailing the problem + */ + public DcaeDeploymentException(String message) { + super(message); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/BlueprintParserException.java b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/BlueprintParserException.java new file mode 100644 index 000000000..6939fdf06 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/BlueprintParserException.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception.sdc.controller; + +/** + * Exception during blueprint parsing. + */ +public class BlueprintParserException extends Exception { + + /** + * Serial ID. + */ + private static final long serialVersionUID = -3044162346353623199L; + + /** + * This constructor can be used to create a new SdcDownloadException. + * + * @param message The message to dump + */ + public BlueprintParserException(final String message) { + super(message); + } + + /** + * This constructor can be used to create a new SdcDownloadException. + * + * @param message The message to dump + * @param cause The Throwable cause object + */ + public BlueprintParserException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/CsarHandlerException.java b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/CsarHandlerException.java new file mode 100644 index 000000000..e3f16f908 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/CsarHandlerException.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception.sdc.controller; + +/** + * Exception during Csar operations. + */ +public class CsarHandlerException extends Exception { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = -7628640776124409155L; + + /** + * This constructor can be used to create a new CsarHandlerException. + * + * @param message The message to dump + */ + public CsarHandlerException(final String message) { + super(message); + } + + /** + * This constructor can be used to create a new CsarHandlerException. + * + * @param message The message to dump + * @param cause The Throwable cause object + */ + public CsarHandlerException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java new file mode 100644 index 000000000..1202ec199 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcArtifactInstallerException.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception.sdc.controller; + +/** + * Exception during SDC artifact installation. + */ +public class SdcArtifactInstallerException extends Exception { + + /** + * serialization id. + */ + private static final long serialVersionUID = 4095937499475915021L; + + /** + * This constructor can be used to create a new SdcArtifactInstallerException. + * + * @param message The message to dump + */ + public SdcArtifactInstallerException(final String message) { + super(message); + } + + /** + * This constructor can be used to create a new SdcArtifactInstallerException. + * + * @param message The message to dump + * @param cause The Throwable cause object + */ + public SdcArtifactInstallerException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcControllerException.java b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcControllerException.java new file mode 100644 index 000000000..e391ee7e8 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcControllerException.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception.sdc.controller; + +/** + * Exception of the SDC controller. + */ +public class SdcControllerException extends Exception { + + /** + * serialization id. + */ + private static final long serialVersionUID = -4236006447255525130L; + + /** + * This constructor can be used to create a new SdcControllerException. + * + * @param message The message to dump + */ + public SdcControllerException(final String message) { + super(message); + } + + /** + * This constructor can be used to create a new SdcControllerException. + * + * @param message The message to dump + * @param cause The Throwable cause object + */ + public SdcControllerException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcDownloadException.java b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcDownloadException.java new file mode 100644 index 000000000..3c0240ef3 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcDownloadException.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception.sdc.controller; + +/** + * Exception during download from SDC. + */ +public class SdcDownloadException extends Exception { + + /** + * serialization id. + */ + private static final long serialVersionUID = -5276848693231134901L; + + /** + * This constructor can be used to create a new SdcDownloadException. + * + * @param message The message to dump + */ + public SdcDownloadException(final String message) { + super(message); + } + + /** + * This constructor can be used to create a new SdcDownloadException. + * + * @param message The message to dump + * @param cause The Throwable cause object + */ + public SdcDownloadException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcParametersException.java b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcParametersException.java new file mode 100644 index 000000000..fe573882f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/exception/sdc/controller/SdcParametersException.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.exception.sdc.controller; + +/** + * Exception of the SDC controller. + */ +public class SdcParametersException extends RuntimeException { + + /** + * serialization id. + */ + private static final long serialVersionUID = 8425657297510362736L; + + /** + * This constructor can be used to create a new SdcParametersException. + * + * @param message The message to dump + */ + public SdcParametersException(final String message) { + super(message); + } + + /** + * This constructor can be used to create a new SdcParametersException. + * + * @param message The message to dump + * @param cause The Throwable cause object + */ + public SdcParametersException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/filter/ClampCadiFilter.java b/src/main/java/org/onap/policy/clamp/clds/filter/ClampCadiFilter.java new file mode 100644 index 000000000..6fa8ecb2b --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/filter/ClampCadiFilter.java @@ -0,0 +1,190 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.filter; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.StandardCopyOption; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.onap.aaf.cadi.config.Config; +import org.onap.aaf.cadi.filter.CadiFilter; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; + +public class ClampCadiFilter extends CadiFilter { + private static final EELFLogger logger = EELFManager.getInstance().getLogger(ClampCadiFilter.class); + + @Autowired + private ApplicationContext appContext; + + @Value("${server.ssl.key-store:#{null}}") + private String keyStore; + + @Value("${server.ssl.key-store-password:#{null}}") + private String keyStorePass; + + @Value("${server.ssl.trust-store:#{null}}") + private String trustStore; + + @Value("${server.ssl.trust-store-password:#{null}}") + private String trustStorePass; + + @Value("${server.ssl.key-alias:clamp@clamp.onap.org}") + private String alias; + + @Value("${clamp.config.keyFile:#{null}}") + private String keyFile; + + @Value("${clamp.config.cadi.cadiLoglevel:#{null}}") + private String cadiLoglevel; + + @Value("${clamp.config.cadi.cadiLatitude:#{null}}") + private String cadiLatitude; + + @Value("${clamp.config.cadi.cadiLongitude:#{null}}") + private String cadiLongitude; + + @Value("${clamp.config.cadi.aafLocateUrl:#{null}}") + private String aafLocateUrl; + + @Value("${clamp.config.cadi.oauthTokenUrl:#{null}}") + private String oauthTokenUrl; + + @Value("${clamp.config.cadi.oauthIntrospectUrl:#{null}}") + private String oauthIntrospectUrl; + + @Value("${clamp.config.cadi.aafEnv:#{null}}") + private String aafEnv; + + @Value("${clamp.config.cadi.aafUrl:#{null}}") + private String aafUrl; + + @Value("${clamp.config.cadi.cadiX509Issuers:#{null}}") + private String cadiX509Issuers; + + @Value("${clamp.config.caCerts:#{null}}") + private String caCertsPath; + + private void checkIfNullProperty(String key, String value) { + /* + * When value is null, so not defined in application.properties set nothing in + * System properties + */ + if (value != null) { + /* + * Ensure that any properties already defined in System.prop by JVM params won't + * be overwritten by Spring application.properties values + */ + System.setProperty(key, System.getProperty(key, value)); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // set some properties in System so that Cadi filter will find its config + // The JVM values set will always overwrite the Spring ones. + checkIfNullProperty(Config.CADI_KEYFILE, convertSpringToPath(keyFile)); + checkIfNullProperty(Config.CADI_LOGLEVEL, cadiLoglevel); + checkIfNullProperty(Config.CADI_LATITUDE, cadiLatitude); + checkIfNullProperty(Config.CADI_LONGITUDE, cadiLongitude); + + checkIfNullProperty(Config.AAF_LOCATE_URL, aafLocateUrl); + checkIfNullProperty(Config.AAF_OAUTH2_TOKEN_URL, oauthTokenUrl); + checkIfNullProperty(Config.AAF_OAUTH2_INTROSPECT_URL, oauthIntrospectUrl); + + checkIfNullProperty(Config.AAF_ENV, aafEnv); + checkIfNullProperty(Config.AAF_URL, aafUrl); + checkIfNullProperty(Config.CADI_X509_ISSUERS, cadiX509Issuers); + checkIfNullProperty(Config.CADI_KEYSTORE, convertSpringToPath(keyStore)); + checkIfNullProperty(Config.CADI_TRUSTSTORE, convertSpringToPath(trustStore)); + checkIfNullProperty(Config.CADI_ALIAS, alias); + checkIfNullProperty(Config.CADI_KEYSTORE_PASSWORD, keyStorePass); + checkIfNullProperty(Config.CADI_TRUSTSTORE_PASSWORD, trustStorePass); + + super.init(filterConfig); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + try { + String certHeader = ((HttpServletRequest) request).getHeader("X-SSL-Cert"); + if (certHeader != null) { + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + X509Certificate cert = (X509Certificate) certificateFactory + .generateCertificate(new ByteArrayInputStream( + URLDecoder.decode(certHeader, StandardCharsets.UTF_8.toString()).getBytes())); + X509Certificate caCert = (X509Certificate) certificateFactory + .generateCertificate(new ByteArrayInputStream( + ResourceFileUtils.getResourceAsString(this.caCertsPath).getBytes())); + + X509Certificate[] certifArray = ((X509Certificate[]) request + .getAttribute("javax.servlet.request.X509Certificate")); + if (certifArray == null) { + certifArray = new X509Certificate[] { cert, caCert }; + request.setAttribute("javax.servlet.request.X509Certificate", certifArray); + } else { + certifArray[0] = cert; + certifArray[1] = caCert; + } + } + + } catch (CertificateException e) { + logger.error("Unable to inject the X.509 certificate", e); + } + super.doFilter(request, response, chain); + } + + private String convertSpringToPath(String fileName) { + try (InputStream ioFile = appContext.getResource(fileName).getInputStream()) { + if (!fileName.contains("file:")) { + File targetFile = new File(appContext.getResource(fileName).getFilename()); + java.nio.file.Files.copy(ioFile, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + return targetFile.getPath(); + } else { + return appContext.getResource(fileName).getFile().getPath(); + } + } catch (IOException e) { + logger.error("Unable to open and copy the file: " + fileName, e); + return null; + } + + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/model/ClampInformation.java b/src/main/java/org/onap/policy/clamp/clds/model/ClampInformation.java new file mode 100644 index 000000000..5708cb6ec --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/model/ClampInformation.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model; + +import com.google.gson.annotations.Expose; +import java.util.ArrayList; +import java.util.List; +import org.onap.policy.clamp.clds.util.ClampVersioning; + +public class ClampInformation { + @Expose + private String userName; + @Expose + private String cldsVersion = ClampVersioning.getCldsVersionFromProps(); + @Expose + List allPermissions = new ArrayList<>(); + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getCldsVersion() { + return cldsVersion; + } + + public void setCldsVersion(String cldsVersion) { + this.cldsVersion = cldsVersion; + } + + public List getAllPermissions() { + return allPermissions; + } + + public void setAllPermissions(List allPermissions) { + this.allPermissions = allPermissions; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/model/CldsHealthCheck.java b/src/main/java/org/onap/policy/clamp/clds/model/CldsHealthCheck.java new file mode 100644 index 000000000..c814a628d --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/model/CldsHealthCheck.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model; + +import com.google.gson.annotations.Expose; + +public class CldsHealthCheck { + @Expose + private String healthCheckComponent; + @Expose + private String healthCheckStatus; + @Expose + private String description; + + public String getHealthCheckComponent() { + return healthCheckComponent; + } + + public void setHealthCheckComponent(String healthCheckComponent) { + this.healthCheckComponent = healthCheckComponent; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getHealthCheckStatus() { + return healthCheckStatus; + } + + public void setHealthCheckStatus(String healthCheckStatus) { + this.healthCheckStatus = healthCheckStatus; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java b/src/main/java/org/onap/policy/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java new file mode 100644 index 000000000..a3b42524e --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/model/cds/CdsBpWorkFlowListResponse.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.clds.model.cds; + +import com.google.gson.annotations.Expose; +import java.util.LinkedList; +import java.util.List; + +/** + * This class maps the CDS response to a pojo. + */ +public class CdsBpWorkFlowListResponse { + + @Expose + private String blueprintName; + + @Expose + private String version; + + @Expose + private List workflows = new LinkedList(); + + public String getBlueprintName() { + return blueprintName; + } + + public void setBlueprintName(String blueprintName) { + this.blueprintName = blueprintName; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public List getWorkflows() { + return workflows; + } + + public void setWorkflows(List workflows) { + this.workflows = workflows; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryCache.java b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryCache.java new file mode 100644 index 000000000..a69d1a353 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryCache.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model.dcae; + +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.ConcurrentHashMap; + +/** + * This class stores the multiple DcaeInventoryResponse coming back from DCAE. + * The structure is a map of list indexed by asdcServiceId. The list is sorted + * by asdcResourceId. Therefore it's possible to retrieve all the loops defined + * in the DCAE inventory and created by DCAE Mod. + */ +public class DcaeInventoryCache { + + private static Map> blueprintsMap = new ConcurrentHashMap<>(); + + /** + * Add Dcae inventory response. + * + * @param inventoryResponse the Dcae inventory response + */ + public void addDcaeInventoryResponse(DcaeInventoryResponse inventoryResponse) { + Set responsesSet = blueprintsMap.get(inventoryResponse.getAsdcServiceId()); + if (responsesSet == null) { + responsesSet = new TreeSet<>(); + blueprintsMap.put(inventoryResponse.getAsdcServiceId(), responsesSet); + } + responsesSet.add(inventoryResponse); + } + + public Set getAllLoopIds() { + return this.blueprintsMap.keySet(); + } + + public Set getAllBlueprintsPerLoopId(String loopId) { + return blueprintsMap.getOrDefault(loopId, new TreeSet<>()); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponse.java b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponse.java new file mode 100644 index 000000000..72ae61359 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponse.java @@ -0,0 +1,102 @@ + +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model.dcae; + +import com.google.gson.annotations.Expose; + +/** + * This class maps the DCAE inventory answer to a nice pojo. + */ +public class DcaeInventoryResponse implements Comparable { + + @Expose + private String typeName; + + @Expose + private String typeId; + + @Expose + private String blueprintTemplate; + + /** + * This field will be used to know all blueprints associated a loop. + */ + @Expose + private String asdcServiceId; + + /** + * This field will be used to know to order of each blueprint microservice in a + * loop. + */ + @Expose + private String asdcResourceId; + + public String getTypeName() { + return typeName; + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } + + public String getTypeId() { + return typeId; + } + + public void setTypeId(String typeId) { + this.typeId = typeId; + } + + public String getBlueprintTemplate() { + return blueprintTemplate; + } + + public void setBlueprintTemplate(String blueprintTemplate) { + this.blueprintTemplate = blueprintTemplate; + } + + public String getAsdcServiceId() { + return asdcServiceId; + } + + public void setAsdcServiceId(String asdcServiceId) { + this.asdcServiceId = asdcServiceId; + } + + public String getAsdcResourceId() { + return asdcResourceId; + } + + public void setAsdcResourceId(String asdcResourceId) { + this.asdcResourceId = asdcResourceId; + } + + @Override + public int compareTo(DcaeInventoryResponse otherResponse) { + int thisResourceId = Integer.parseInt(this.asdcResourceId); + int otherResourceId = Integer.parseInt(otherResponse.getAsdcResourceId()); + return (thisResourceId < otherResourceId ? -1 : (thisResourceId > otherResourceId ? 1 : 0)); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeLinks.java b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeLinks.java new file mode 100644 index 000000000..4d6e544da --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeLinks.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model.dcae; + +import com.google.gson.annotations.Expose; + +public class DcaeLinks { + @Expose + private String self; + @Expose + private String status; + @Expose + private String uninstall; + + public String getSelf() { + return self; + } + + public void setSelf(String self) { + this.self = self; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUninstall() { + return uninstall; + } + + public void setUninstall(String uninstall) { + this.uninstall = uninstall; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeOperationStatusResponse.java b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeOperationStatusResponse.java new file mode 100644 index 000000000..9389a51fc --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/model/dcae/DcaeOperationStatusResponse.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model.dcae; + +import com.google.gson.annotations.Expose; + +/** + * This class maps the DCAE deployment handler response to a nice pojo. + */ +public class DcaeOperationStatusResponse { + + @Expose + private String operationType; + + @Expose + private String status; + + @Expose + private String requestId; + + @Expose + private String error; + + @Expose + private DcaeLinks links; + + public String getOperationType() { + return operationType; + } + + public void setOperationType(String operationType) { + this.operationType = operationType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public DcaeLinks getLinks() { + return links; + } + + public void setLinks(DcaeLinks links) { + this.links = links; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/DistributionStatusMessage.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/DistributionStatusMessage.java new file mode 100644 index 000000000..ca46c6d31 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/DistributionStatusMessage.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller; + +import org.onap.sdc.api.consumer.IDistributionStatusMessage; +import org.onap.sdc.utils.DistributionStatusEnum; + +public class DistributionStatusMessage implements IDistributionStatusMessage { + + private String artifactUrl; + private String consumerId; + private String distributionId; + private DistributionStatusEnum distributionStatus; + private long timestamp; + + /** + * Distribution status message constructor. + * + * @param artifactUrl + * Url of specific SDC artifact(resource) + * @param consumerId + * Unique ID of SDC component instance + * @param distributionId + * Distribution ID published in the distribution notification. + * @param distributionStatusEnum + * Status to send in the message + * @param timestamp + * Timestamp of the message + */ + public DistributionStatusMessage(final String artifactUrl, final String consumerId, final String distributionId, + final DistributionStatusEnum distributionStatusEnum, final long timestamp) { + this.artifactUrl = artifactUrl; + this.consumerId = consumerId; + this.distributionId = distributionId; + this.distributionStatus = distributionStatusEnum; + this.timestamp = timestamp; + } + + @Override + public String getArtifactURL() { + return artifactUrl; + } + + @Override + public String getConsumerID() { + return consumerId; + } + + @Override + public String getDistributionID() { + return distributionId; + } + + @Override + public DistributionStatusEnum getStatus() { + return distributionStatus; + } + + @Override + public long getTimestamp() { + return timestamp; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleController.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleController.java new file mode 100644 index 000000000..4ca6b1cf4 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleController.java @@ -0,0 +1,433 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018-2019 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============================================ + * Modifications copyright (c) 2018 Nokia + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.util.Date; +import java.util.Map.Entry; +import java.util.concurrent.ThreadLocalRandom; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.config.sdc.SdcSingleControllerConfiguration; +import org.onap.policy.clamp.clds.exception.sdc.controller.BlueprintParserException; +import org.onap.policy.clamp.clds.exception.sdc.controller.CsarHandlerException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcControllerException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcDownloadException; +import org.onap.policy.clamp.clds.sdc.controller.installer.BlueprintArtifact; +import org.onap.policy.clamp.clds.sdc.controller.installer.CsarHandler; +import org.onap.policy.clamp.clds.util.LoggingUtils; +import org.onap.policy.clamp.loop.CsarInstaller; +import org.onap.sdc.api.IDistributionClient; +import org.onap.sdc.api.consumer.IComponentDoneStatusMessage; +import org.onap.sdc.api.consumer.IDistributionStatusMessage; +import org.onap.sdc.api.consumer.INotificationCallback; +import org.onap.sdc.api.notification.IArtifactInfo; +import org.onap.sdc.api.notification.INotificationData; +import org.onap.sdc.api.results.IDistributionClientDownloadResult; +import org.onap.sdc.api.results.IDistributionClientResult; +import org.onap.sdc.impl.DistributionClientFactory; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.utils.DistributionActionResultEnum; +import org.onap.sdc.utils.DistributionStatusEnum; + +/** + * This class handles one sdc controller defined in the config. + */ +public class SdcSingleController { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcSingleController.class); + private boolean isSdcClientAutoManaged = false; + private CsarInstaller csarInstaller; + private ClampProperties refProp; + /** + * The constant CONFIG_SDC_FOLDER. + */ + public static final String CONFIG_SDC_FOLDER = "sdc.csarFolder"; + private int nbOfNotificationsOngoing = 0; + private SdcSingleControllerStatus controllerStatus = SdcSingleControllerStatus.STOPPED; + private SdcSingleControllerConfiguration sdcConfig; + private IDistributionClient distributionClient; + + /** + * Inner class for Notification callback. + */ + private final class SdcNotificationCallBack implements INotificationCallback { + + private SdcSingleController sdcController; + + /** + * Instantiates a new Sdc notification call back. + * + * @param controller the controller + */ + SdcNotificationCallBack(SdcSingleController controller) { + sdcController = controller; + } + + /** + * This method can be called multiple times at the same moment. The controller + * must be thread safe ! + */ + @Override + public void activateCallback(INotificationData notificationData) { + Date startTime = new Date(); + logger.info("Receive a callback notification in SDC, nb of resources: " + + notificationData.getResources().size()); + sdcController.treatNotification(notificationData); + LoggingUtils.setTimeContext(startTime, new Date()); + LoggingUtils.setResponseContext("0", "SDC Notification received and processed successfully", + this.getClass().getName()); + } + } + + /** + * Gets nb of notifications ongoing. + * + * @return the nb of notifications ongoing + */ + public int getNbOfNotificationsOngoing() { + return nbOfNotificationsOngoing; + } + + private void changeControllerStatusIdle() { + if (this.nbOfNotificationsOngoing > 1) { + --this.nbOfNotificationsOngoing; + } else { + this.nbOfNotificationsOngoing = 0; + this.controllerStatus = SdcSingleControllerStatus.IDLE; + } + } + + /** + * Change controller status. + * + * @param newControllerStatus the new controller status + */ + protected final synchronized void changeControllerStatus(SdcSingleControllerStatus newControllerStatus) { + switch (newControllerStatus) { + case BUSY: + ++this.nbOfNotificationsOngoing; + this.controllerStatus = newControllerStatus; + break; + case IDLE: + this.changeControllerStatusIdle(); + break; + default: + this.controllerStatus = newControllerStatus; + break; + } + } + + /** + * Gets controller status. + * + * @return the controller status + */ + public final synchronized SdcSingleControllerStatus getControllerStatus() { + return this.controllerStatus; + } + + /** + * Instantiates a new Sdc single controller. + * + * @param clampProp the clamp prop + * @param csarInstaller the csar installer + * @param sdcSingleConfig the sdc single config + * @param distributionClient the distribution client + */ + public SdcSingleController(ClampProperties clampProp, CsarInstaller csarInstaller, + SdcSingleControllerConfiguration sdcSingleConfig, + IDistributionClient distributionClient) { + this.distributionClient = distributionClient; + isSdcClientAutoManaged = (distributionClient == null); + this.sdcConfig = sdcSingleConfig; + this.refProp = clampProp; + this.csarInstaller = csarInstaller; + } + + /** + * This method initializes the SDC Controller and the SDC Client. + * + * @throws SdcControllerException It throws an exception if the SDC Client + * cannot be instantiated or if an init attempt + * is done when already initialized + */ + public void initSdc() throws SdcControllerException { + logger.info("Attempt to initialize the SDC Controller: " + sdcConfig.getSdcControllerName()); + if (this.getControllerStatus() != SdcSingleControllerStatus.STOPPED) { + throw new SdcControllerException("The controller is already initialized, call the closeSDC method first"); + } + if (distributionClient == null) { + distributionClient = DistributionClientFactory.createDistributionClient(); + } + IDistributionClientResult result = distributionClient.init(sdcConfig, new SdcNotificationCallBack(this)); + if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) { + logger.error("SDC distribution client init failed with reason:" + result.getDistributionMessageResult()); + this.changeControllerStatus(SdcSingleControllerStatus.STOPPED); + throw new SdcControllerException("Initialization of the SDC Controller failed with reason: " + + result.getDistributionMessageResult()); + } + logger.info("SDC Controller successfully initialized: " + sdcConfig.getSdcControllerName()); + logger.info("Attempt to start the SDC Controller: " + sdcConfig.getSdcControllerName()); + result = this.distributionClient.start(); + if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) { + logger.error("SDC distribution client start failed with reason:" + result.getDistributionMessageResult()); + this.changeControllerStatus(SdcSingleControllerStatus.STOPPED); + throw new SdcControllerException( + "Startup of the SDC Controller failed with reason: " + result.getDistributionMessageResult()); + } + logger.info("SDC Controller successfully started: " + sdcConfig.getSdcControllerName()); + this.changeControllerStatus(SdcSingleControllerStatus.IDLE); + } + + /** + * This method closes the SDC Controller and the SDC Client. + * + * @throws SdcControllerException It throws an exception if the SDC Client + * cannot be closed because it's currently BUSY + * in processing notifications. + */ + public void closeSdc() throws SdcControllerException { + if (this.getControllerStatus() == SdcSingleControllerStatus.BUSY) { + throw new SdcControllerException("Cannot close the SDC controller as it's currently in BUSY state"); + } + if (this.distributionClient != null) { + this.distributionClient.stop(); + // If auto managed we can set it to Null, SdcController controls it. + // In the other case the client of this class has specified it, so + // we can't reset it + if (isSdcClientAutoManaged) { + // Next init will initialize it with a new SDC Client + this.distributionClient = null; + } + } + this.changeControllerStatus(SdcSingleControllerStatus.STOPPED); + } + + private void sendAllNotificationForCsarHandler(INotificationData notificationData, CsarHandler csar, + NotificationType notificationType, + DistributionStatusEnum distributionStatus, String errorMessage) { + if (csar != null) { + // Notify for the CSAR + this.sendSdcNotification(notificationType, csar.getArtifactElement().getArtifactURL(), + sdcConfig.getConsumerID(), notificationData.getDistributionID(), distributionStatus, errorMessage, + System.currentTimeMillis()); + // Notify for all VF resources found + for (Entry blueprint : csar.getMapOfBlueprints().entrySet()) { + // Normally always 1 artifact in resource for Clamp as we + // specified + // only VF_METADATA type + this.sendSdcNotification(notificationType, + blueprint.getValue().getResourceAttached().getArtifacts().get(0).getArtifactURL(), + sdcConfig.getConsumerID(), notificationData.getDistributionID(), distributionStatus, + errorMessage, System.currentTimeMillis()); + } + } else { + this.sendSdcNotification(notificationType, null, sdcConfig.getConsumerID(), + notificationData.getDistributionID(), distributionStatus, errorMessage, System.currentTimeMillis()); + } + } + + /** + * This method processes the notification received from Sdc. + * + * @param notificationData The INotificationData + */ + public void treatNotification(INotificationData notificationData) { + CsarHandler csar = null; + try { + // wait for a random time, so that 2 running Clamp will not treat + // the same Notification at the same time + Thread.sleep(ThreadLocalRandom.current().nextInt(1, 10) * 1000L); + logger.info("Notification received for service UUID:" + notificationData.getServiceUUID()); + this.changeControllerStatus(SdcSingleControllerStatus.BUSY); + csar = new CsarHandler(notificationData, this.sdcConfig.getSdcControllerName(), + refProp.getStringValue(CONFIG_SDC_FOLDER)); + csar.save(downloadTheArtifact(csar.getArtifactElement())); + if (csarInstaller.isCsarAlreadyDeployed(csar)) { + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DOWNLOAD, + DistributionStatusEnum.ALREADY_DOWNLOADED, null); + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, + DistributionStatusEnum.ALREADY_DEPLOYED, null); + } else { + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DOWNLOAD, + DistributionStatusEnum.DOWNLOAD_OK, null); + csarInstaller.installTheCsar(csar); + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, + DistributionStatusEnum.DEPLOY_OK, null); + } + this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_OK, null); + } catch (SdcArtifactInstallerException | SdcToscaParserException e) { + logger.error("SdcArtifactInstallerException exception caught during the notification processing", e); + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, + DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); + this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); + } catch (SdcDownloadException | CsarHandlerException e) { + logger.error("SdcDownloadException exception caught during the notification processing", e); + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DOWNLOAD, + DistributionStatusEnum.DOWNLOAD_ERROR, e.getMessage()); + this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); + } catch (InterruptedException e) { + logger.error("Interrupt exception caught during the notification processing", e); + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, + DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); + this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); + Thread.currentThread().interrupt(); + } catch (BlueprintParserException e) { + logger.error("BlueprintParser exception caught during the notification processing", e); + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, + DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); + this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); + } catch (RuntimeException e) { + logger.error("Unexpected exception caught during the notification processing", e); + sendAllNotificationForCsarHandler(notificationData, csar, NotificationType.DEPLOY, + DistributionStatusEnum.DEPLOY_ERROR, e.getMessage()); + this.sendComponentStatus(notificationData, DistributionStatusEnum.COMPONENT_DONE_ERROR, e.getMessage()); + } finally { + this.changeControllerStatus(SdcSingleControllerStatus.IDLE); + } + } + + private enum NotificationType { + /** + * Download notification type. + */ + DOWNLOAD, + /** + * Deploy notification type. + */ + DEPLOY + } + + private IDistributionClientDownloadResult downloadTheArtifact(IArtifactInfo artifact) throws SdcDownloadException { + logger.info("Trying to download the artifact : " + artifact.getArtifactURL() + " UUID: " + + artifact.getArtifactUUID()); + IDistributionClientDownloadResult downloadResult; + try { + downloadResult = distributionClient.download(artifact); + if (null == downloadResult) { + logger.info("downloadResult is Null for: " + artifact.getArtifactUUID()); + return null; + } + } catch (RuntimeException e) { + throw new SdcDownloadException("Exception caught when downloading the artifact", e); + } + if (DistributionActionResultEnum.SUCCESS.equals(downloadResult.getDistributionActionResult())) { + logger.info("Successfully downloaded the artifact " + artifact.getArtifactURL() + " UUID " + + artifact.getArtifactUUID() + "Size of payload " + downloadResult.getArtifactPayload().length); + } else { + throw new SdcDownloadException("Artifact " + artifact.getArtifactName() + + " could not be downloaded from SDC URL " + artifact.getArtifactURL() + " UUID " + + artifact.getArtifactUUID() + ")" + System.lineSeparator() + "Error message is " + + downloadResult.getDistributionMessageResult() + System.lineSeparator()); + } + return downloadResult; + } + + private void sendSdcNotification(NotificationType notificationType, String artifactUrl, String consumerId, + String distributionId, DistributionStatusEnum status, String errorReason, + long timestamp) { + String event = "Sending " + notificationType.name() + "(" + status.name() + ")" + + " notification to SDC for artifact:" + artifactUrl; + if (errorReason != null) { + event = event + "(" + errorReason + ")"; + } + logger.info(event); + String action = ""; + try { + IDistributionStatusMessage message = new DistributionStatusMessage(artifactUrl, consumerId, distributionId, + status, timestamp); + switch (notificationType) { + case DOWNLOAD: + this.sendDownloadStatus(message, errorReason); + action = "sendDownloadStatus"; + break; + case DEPLOY: + this.sendDeploymentStatus(message, errorReason); + action = "sendDeploymentdStatus"; + break; + default: + break; + } + } catch (RuntimeException e) { + logger.warn("Unable to send the SDC Notification (" + action + ") due to an exception", e); + } + logger.info("SDC Notification sent successfully(" + action + ")"); + } + + private void sendComponentStatus(INotificationData notificationData, DistributionStatusEnum status, + String errorReason) { + try { + IComponentDoneStatusMessage message = new IComponentDoneStatusMessage() { + + @Override public String getDistributionID() { + return notificationData.getDistributionID(); + } + + @Override public String getConsumerID() { + return sdcConfig.getConsumerID(); + } + + @Override public long getTimestamp() { + return System.currentTimeMillis(); + } + + @Override public DistributionStatusEnum getStatus() { + return status; + } + + @Override public String getComponentName() { + return sdcConfig.getUser(); + } + }; + + if (errorReason != null) { + this.distributionClient.sendComponentDoneStatus(message, errorReason); + } else { + this.distributionClient.sendComponentDoneStatus(message); + } + } catch (RuntimeException e) { + logger.warn("Unable to send the SDC Notification (" + status.name() + ") due to an exception", e); + } + logger.info("SDC Notification sent successfully(" + status.name() + ")"); + } + + private void sendDownloadStatus(IDistributionStatusMessage message, String errorReason) { + if (errorReason != null) { + this.distributionClient.sendDownloadStatus(message, errorReason); + } else { + this.distributionClient.sendDownloadStatus(message); + } + } + + private void sendDeploymentStatus(IDistributionStatusMessage message, String errorReason) { + if (errorReason != null) { + this.distributionClient.sendDeploymentStatus(message, errorReason); + } else { + this.distributionClient.sendDeploymentStatus(message); + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleControllerStatus.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleControllerStatus.java new file mode 100644 index 000000000..fe269c486 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/SdcSingleControllerStatus.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller; + +public enum SdcSingleControllerStatus { + STOPPED, IDLE, BUSY +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintArtifact.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintArtifact.java new file mode 100644 index 000000000..df81cfb0c --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintArtifact.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller.installer; + +import org.onap.sdc.api.notification.IResourceInstance; + +/** + * This class is useful to store the information concerning + * blueprint artifact extracted from SDC CSAR. + */ +public class BlueprintArtifact { + + private String dcaeBlueprint; + private String blueprintArtifactName; + private String blueprintInvariantServiceUuid; + private IResourceInstance resourceAttached; + + public String getDcaeBlueprint() { + return dcaeBlueprint; + } + + public void setDcaeBlueprint(String dcaeBlueprint) { + this.dcaeBlueprint = dcaeBlueprint; + } + + public String getBlueprintArtifactName() { + return blueprintArtifactName; + } + + public void setBlueprintArtifactName(String blueprintArtifactName) { + this.blueprintArtifactName = blueprintArtifactName; + } + + public String getBlueprintInvariantServiceUuid() { + return blueprintInvariantServiceUuid; + } + + public void setBlueprintInvariantServiceUuid(String blueprintInvariantServiceUuid) { + this.blueprintInvariantServiceUuid = blueprintInvariantServiceUuid; + } + + public IResourceInstance getResourceAttached() { + return resourceAttached; + } + + public void setResourceAttached(IResourceInstance resourceAttached) { + this.resourceAttached = resourceAttached; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintMicroService.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintMicroService.java new file mode 100644 index 000000000..519a24f46 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintMicroService.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia 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============================================ + * Modifications copyright (c) 2019-2020 AT&T + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller.installer; + +import java.util.Objects; + +public class BlueprintMicroService { + private final String name; + private final String modelType; + private final String inputFrom; + private final String modelVersion; + + /** + * The Micro service constructor. + * + * @param name The name in String + * @param modelType The model type + * @param inputFrom Comes from (single chained) + */ + public BlueprintMicroService(String name, String modelType, String inputFrom, String modelVersion) { + this.name = name; + this.inputFrom = inputFrom; + this.modelType = modelType; + this.modelVersion = modelVersion; + } + + public String getName() { + return name; + } + + public String getModelType() { + return modelType; + } + + public String getInputFrom() { + return inputFrom; + } + + /** + * modelVerrsion getter. + * + * @return the modelVersion + */ + public String getModelVersion() { + return modelVersion; + } + + @Override + public String toString() { + return "MicroService {" + "name='" + name + '\'' + ", modelType='" + modelType + '\'' + ", inputFrom='" + + inputFrom + '\'' + ", modelVersion='" + modelVersion + '\'' + '}'; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + BlueprintMicroService that = (BlueprintMicroService) obj; + return name.equals(that.name) && modelType.equals(that.modelType) && inputFrom.equals(that.inputFrom) + && modelVersion.equals(that.modelVersion); + } + + @Override + public int hashCode() { + return Objects.hash(name, modelType, inputFrom, modelVersion); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParser.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParser.java new file mode 100644 index 000000000..ada47992a --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParser.java @@ -0,0 +1,220 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia 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============================================ + * Modifications copyright (c) 2019 AT&T + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller.installer; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.util.AbstractMap; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.json.JSONObject; +import org.onap.policy.clamp.clds.exception.sdc.controller.BlueprintParserException; +import org.yaml.snakeyaml.Yaml; + +public class BlueprintParser { + + static final String TCA = "TCA"; + private static final String NODE_TEMPLATES = "node_templates"; + private static final String DCAE_NODES = "dcae.nodes."; + private static final String DCAE_NODES_POLICY = ".nodes.policy"; + private static final String TYPE = "type"; + private static final String PROPERTIES = "properties"; + private static final String NAME = "name"; + private static final String INPUT = "inputs"; + private static final String GET_INPUT = "get_input"; + private static final String POLICY_MODEL_ID = "policy_model_id"; + private static final String POLICY_MODEL_VERSION = "policy_model_version"; + private static final String RELATIONSHIPS = "relationships"; + private static final String CLAMP_NODE_RELATIONSHIPS_GETS_INPUT_FROM = "clamp_node.relationships.gets_input_from"; + private static final String TARGET = "target"; + public static final String DEFAULT_VERSION = "1.0.0"; + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(BlueprintParser.class); + + private BlueprintParser() { + + } + + /** + * Get all micro services from blueprint. + * + * @param blueprintString the blueprint in a String + * @return A set of MircoService + * @throws BlueprintParserException In case of issues with the parsing + */ + public static Set getMicroServices(String blueprintString) throws BlueprintParserException { + Set microServices = new HashSet<>(); + JsonObject blueprintJson = BlueprintParser.convertToJson(blueprintString); + JsonObject nodeTemplateList = blueprintJson.get(NODE_TEMPLATES).getAsJsonObject(); + JsonObject inputList = blueprintJson.get(INPUT).getAsJsonObject(); + + for (Entry entry : nodeTemplateList.entrySet()) { + JsonObject nodeTemplate = entry.getValue().getAsJsonObject(); + if (!nodeTemplate.get(TYPE).getAsString().contains(DCAE_NODES_POLICY) + && nodeTemplate.get(TYPE).getAsString().contains(DCAE_NODES)) { + BlueprintMicroService microService = getNodeRepresentation(entry, nodeTemplateList, inputList); + if (!microService.getModelType().isBlank()) { + microServices.add(microService); + } else { + logger.warn("Microservice " + microService.getName() + + " will NOT be used by CLAMP as the model type is not defined or has not been found"); + } + } + } + logger.debug("Those microservices have been found in the blueprint:" + microServices); + return microServices; + } + + /** + * Does a fallback to TCA. + * + * @return The list of microservices + */ + public static List fallbackToOneMicroService() { + return Collections.singletonList( + new BlueprintMicroService(TCA, "onap.policies.monitoring.cdap.tca.hi.lo.app", "", DEFAULT_VERSION)); + } + + static String getName(Entry entry) { + String microServiceYamlName = entry.getKey(); + JsonObject ob = entry.getValue().getAsJsonObject(); + if (ob.has(PROPERTIES)) { + JsonObject properties = ob.get(PROPERTIES).getAsJsonObject(); + if (properties.has(NAME)) { + return properties.get(NAME).getAsString(); + } + } + return microServiceYamlName; + } + + static String getInput(Entry entry) { + JsonObject ob = entry.getValue().getAsJsonObject(); + if (ob.has(RELATIONSHIPS)) { + JsonArray relationships = ob.getAsJsonArray(RELATIONSHIPS); + for (JsonElement element : relationships) { + String target = getTarget(element.getAsJsonObject()); + if (!target.isEmpty()) { + return target; + } + } + } + return ""; + } + + static String findPropertyInRelationshipsArray(String propertyName, JsonArray relationshipsArray, + JsonObject blueprintNodeTemplateList, JsonObject blueprintInputList) throws BlueprintParserException { + for (JsonElement elem : relationshipsArray) { + if (blueprintNodeTemplateList.get(elem.getAsJsonObject().get(TARGET).getAsString()) == null) { + throw new BlueprintParserException( + "The Target mentioned in the blueprint is not a known entry in the blueprint: " + + elem.getAsJsonObject().get(TARGET).getAsString()); + } else { + String property = getPropertyValue(propertyName, + new AbstractMap.SimpleEntry( + elem.getAsJsonObject().get(TARGET).getAsString(), blueprintNodeTemplateList + .get(elem.getAsJsonObject().get(TARGET).getAsString()).getAsJsonObject()), + blueprintNodeTemplateList, blueprintInputList); + if (!property.isEmpty()) { + return property; + } + } + } + return ""; + } + + static String getDirectOrInputPropertyValue(String propertyName, JsonObject blueprintInputList, + JsonObject nodeTemplateContent) { + JsonObject properties = nodeTemplateContent.get(PROPERTIES).getAsJsonObject(); + if (properties.has(propertyName)) { + if (properties.get(propertyName).isJsonObject()) { + // it's a blueprint parameter + return blueprintInputList + .get(properties.get(propertyName).getAsJsonObject().get(GET_INPUT).getAsString()) + .getAsJsonObject().get("default").getAsString(); + } else { + // It's a direct value + return properties.get(propertyName).getAsString(); + } + } + return ""; + } + + static String getPropertyValue(String propertyName, Entry nodeTemplateEntry, + JsonObject blueprintNodeTemplateList, JsonObject blueprintIputList) throws BlueprintParserException { + JsonObject nodeTemplateContent = nodeTemplateEntry.getValue().getAsJsonObject(); + // Search first in this node template + if (nodeTemplateContent.has(PROPERTIES)) { + String propValue = getDirectOrInputPropertyValue(propertyName, blueprintIputList, nodeTemplateContent); + if (!propValue.isBlank()) { + return propValue; + } + } + // Or it's may be defined in a relationship + if (nodeTemplateContent.has(RELATIONSHIPS)) { + return findPropertyInRelationshipsArray(propertyName, + nodeTemplateContent.get(RELATIONSHIPS).getAsJsonArray(), blueprintNodeTemplateList, + blueprintIputList); + } + return ""; + } + + static BlueprintMicroService getNodeRepresentation(Entry nodeTemplateEntry, + JsonObject blueprintNodeTemplateList, JsonObject blueprintInputList) throws BlueprintParserException { + String modelIdFound = getPropertyValue(POLICY_MODEL_ID, nodeTemplateEntry, blueprintNodeTemplateList, + blueprintInputList); + String versionFound = getPropertyValue(POLICY_MODEL_VERSION, nodeTemplateEntry, blueprintNodeTemplateList, + blueprintInputList); + if (modelIdFound.isBlank()) { + logger.warn("policy_model_id is not defined for the node template:" + nodeTemplateEntry.getKey()); + } + if (versionFound.isBlank()) { + logger.warn("policy_model_version is not defined (setting it to a default value) for the node template:" + + nodeTemplateEntry.getKey()); + } + return new BlueprintMicroService(getName(nodeTemplateEntry), modelIdFound, getInput(nodeTemplateEntry), + !versionFound.isBlank() ? versionFound : DEFAULT_VERSION); + } + + private static String getTarget(JsonObject elementObject) { + if (elementObject.has(TYPE) && elementObject.has(TARGET) + && elementObject.get(TYPE).getAsString().equals(CLAMP_NODE_RELATIONSHIPS_GETS_INPUT_FROM)) { + return elementObject.get(TARGET).getAsString(); + } + return ""; + } + + private static JsonObject convertToJson(String yamlString) { + Map map = new Yaml().load(yamlString); + return new Gson().fromJson(new JSONObject(map).toString(), JsonObject.class); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGenerator.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGenerator.java new file mode 100644 index 000000000..10e7a56a4 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGenerator.java @@ -0,0 +1,90 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller.installer; + +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.springframework.stereotype.Component; + +@Component +public class ChainGenerator { + + ChainGenerator() { + } + + /** + * Get list of microservices chain. + * + * @param input A set of microservices + * @return The list of microservice chained + */ + public List getChainOfMicroServices(Set input) { + LinkedList returnList = new LinkedList<>(); + if (preValidate(input)) { + LinkedList theList = new LinkedList<>(); + for (BlueprintMicroService ms : input) { + insertNodeTemplateIntoChain(ms, theList); + } + if (postValidate(theList)) { + returnList = theList; + } + } + return returnList; + } + + private boolean preValidate(Set input) { + List noInputs = input.stream().filter(ms -> "".equals(ms.getInputFrom())) + .collect(Collectors.toList()); + return noInputs.size() == 1; + } + + private boolean postValidate(LinkedList microServices) { + for (int i = 1; i < microServices.size() - 1; i++) { + BlueprintMicroService prev = microServices.get(i - 1); + BlueprintMicroService current = microServices.get(i); + if (!current.getInputFrom().equals(prev.getName())) { + return false; + } + } + return true; + } + + private void insertNodeTemplateIntoChain(BlueprintMicroService microServicetoInsert, + LinkedList chainOfMicroServices) { + int insertIndex = 0; + for (int i = 0; i < chainOfMicroServices.size(); i++) { + BlueprintMicroService current = chainOfMicroServices.get(i); + if (microServicetoInsert.getName().equals(current.getInputFrom())) { + insertIndex = i; + break; + } else if (current.getName().equals(microServicetoInsert.getInputFrom())) { + insertIndex = i + 1; + break; + } + } + chainOfMicroServices.add(insertIndex, microServicetoInsert); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandler.java b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandler.java new file mode 100644 index 000000000..436e594ce --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandler.java @@ -0,0 +1,219 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller.installer; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import org.apache.commons.io.IOUtils; +import org.codehaus.plexus.util.StringUtils; +import org.onap.policy.clamp.clds.exception.sdc.controller.CsarHandlerException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; +import org.onap.sdc.api.notification.IArtifactInfo; +import org.onap.sdc.api.notification.INotificationData; +import org.onap.sdc.api.notification.IResourceInstance; +import org.onap.sdc.api.results.IDistributionClientDownloadResult; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; + +/** + * CsarDescriptor that will be used to deploy file in CLAMP file system. Some + * methods can also be used to get some data from it. + */ +public class CsarHandler { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarHandler.class); + private IArtifactInfo artifactElement; + private String csarFilePath; + private String controllerName; + private SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); + private ISdcCsarHelper sdcCsarHelper; + private Map mapOfBlueprints = new HashMap<>(); + public static final String CSAR_TYPE = "TOSCA_CSAR"; + public static final String BLUEPRINT_TYPE = "DCAE_INVENTORY_BLUEPRINT"; + private INotificationData sdcNotification; + public static final String RESOURCE_INSTANCE_NAME_PREFIX = "/Artifacts/Resources/"; + public static final String RESOURCE_INSTANCE_NAME_SUFFIX = "/Deployment/"; + public static final String POLICY_DEFINITION_NAME_SUFFIX = "Definitions/policies.yml"; + public static final String DATA_DEFINITION_NAME_SUFFIX = "Definitions/data.yml"; + public static final String DATA_DEFINITION_KEY = "data_types:"; + + /** + * Constructor for CsarHandler taking sdc notification in input. + */ + public CsarHandler(INotificationData data, String controller, String clampCsarPath) throws CsarHandlerException { + this.sdcNotification = data; + this.controllerName = controller; + this.artifactElement = searchForUniqueCsar(data); + this.csarFilePath = buildFilePathForCsar(artifactElement, clampCsarPath); + } + + private String buildFilePathForCsar(IArtifactInfo artifactElement, String clampCsarPath) { + return clampCsarPath + "/" + controllerName + "/" + artifactElement.getArtifactName(); + } + + private IArtifactInfo searchForUniqueCsar(INotificationData notificationData) throws CsarHandlerException { + List serviceArtifacts = notificationData.getServiceArtifacts(); + for (IArtifactInfo artifact : serviceArtifacts) { + if (artifact.getArtifactType().equals(CSAR_TYPE)) { + return artifact; + } + } + throw new CsarHandlerException("Unable to find a CSAR in the Sdc Notification"); + } + + /** + * This saves the notification to disk and database. + * + * @param resultArtifact The artifact to install + * @throws SdcArtifactInstallerException In case of issues with the installation + * @throws SdcToscaParserException In case of issues with the parsing of + * the CSAR + */ + public synchronized void save(IDistributionClientDownloadResult resultArtifact) + throws SdcArtifactInstallerException, SdcToscaParserException { + try { + logger.info("Writing CSAR file to: " + csarFilePath + " UUID " + artifactElement.getArtifactUUID() + ")"); + Path path = Paths.get(csarFilePath); + Files.createDirectories(path.getParent()); + // Create or replace the file + try (OutputStream out = Files.newOutputStream(path)) { + out.write(resultArtifact.getArtifactPayload(), 0, resultArtifact.getArtifactPayload().length); + } + sdcCsarHelper = factory.getSdcCsarHelper(csarFilePath); + this.loadDcaeBlueprint(); + } catch (IOException e) { + throw new SdcArtifactInstallerException( + "Exception caught when trying to write the CSAR on the file system to " + csarFilePath, e); + } + } + + private IResourceInstance searchForResourceByInstanceName(String blueprintResourceInstanceName) + throws SdcArtifactInstallerException { + for (IResourceInstance resource : this.sdcNotification.getResources()) { + String filteredString = resource.getResourceInstanceName().replaceAll("-", ""); + filteredString = filteredString.replaceAll(" ", ""); + if (filteredString.equalsIgnoreCase(blueprintResourceInstanceName)) { + return resource; + } + } + throw new SdcArtifactInstallerException("Error when searching for " + blueprintResourceInstanceName + + " as ResourceInstanceName in Sdc notification and did not find it"); + } + + private void loadDcaeBlueprint() throws IOException, SdcArtifactInstallerException { + try (ZipFile zipFile = new ZipFile(csarFilePath)) { + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + if (!entry.isDirectory() && entry.getName().contains(BLUEPRINT_TYPE)) { + BlueprintArtifact blueprintArtifact = new BlueprintArtifact(); + blueprintArtifact.setBlueprintArtifactName( + entry.getName().substring(entry.getName().lastIndexOf('/') + 1, entry.getName().length())); + blueprintArtifact + .setBlueprintInvariantServiceUuid(this.getSdcNotification().getServiceInvariantUUID()); + try (InputStream stream = zipFile.getInputStream(entry)) { + blueprintArtifact.setDcaeBlueprint(IOUtils.toString(stream, StandardCharsets.UTF_8)); + } + blueprintArtifact.setResourceAttached(searchForResourceByInstanceName(entry.getName().substring( + entry.getName().indexOf(RESOURCE_INSTANCE_NAME_PREFIX) + + RESOURCE_INSTANCE_NAME_PREFIX.length(), + entry.getName().indexOf(RESOURCE_INSTANCE_NAME_SUFFIX)))); + this.mapOfBlueprints.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); + logger.info("Found a blueprint entry in the CSAR " + blueprintArtifact.getBlueprintArtifactName() + + " for resource instance Name " + + blueprintArtifact.getResourceAttached().getResourceInstanceName()); + } + } + logger.info(this.mapOfBlueprints.size() + " blueprint(s) will be converted to closed loop"); + } + } + + public IArtifactInfo getArtifactElement() { + return artifactElement; + } + + public String getFilePath() { + return csarFilePath; + } + + public String setFilePath(String newPath) { + return csarFilePath = newPath; + } + + public synchronized ISdcCsarHelper getSdcCsarHelper() { + return sdcCsarHelper; + } + + public INotificationData getSdcNotification() { + return sdcNotification; + } + + public Map getMapOfBlueprints() { + return mapOfBlueprints; + } + + /** + * Get the whole policy model Yaml. It combines the content of policies.yaml and + * data.yaml. + * + * @return The whole policy model yaml + * @throws IOException The IO Exception + */ + public Optional getPolicyModelYaml() throws IOException { + String result = null; + try (ZipFile zipFile = new ZipFile(csarFilePath)) { + ZipEntry entry = zipFile.getEntry(POLICY_DEFINITION_NAME_SUFFIX); + if (entry != null) { + ZipEntry data = zipFile.getEntry(DATA_DEFINITION_NAME_SUFFIX); + if (data != null) { + String dataStr = IOUtils.toString(zipFile.getInputStream(data), StandardCharsets.UTF_8); + String dataStrWithoutHeader = dataStr.substring(dataStr.indexOf(DATA_DEFINITION_KEY)); + String policyStr = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8); + StringUtils.chomp(policyStr); + result = policyStr.concat(dataStrWithoutHeader); + } else { + result = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8); + } + } else { + logger.info("Policy model not found inside the CSAR file: " + csarFilePath); + } + return Optional.ofNullable(result); + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/service/CldsHealthcheckService.java b/src/main/java/org/onap/policy/clamp/clds/service/CldsHealthcheckService.java new file mode 100644 index 000000000..02481494a --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/service/CldsHealthcheckService.java @@ -0,0 +1,81 @@ +/*- + * ============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============================================ + * =================================================================== + */ + +package org.onap.policy.clamp.clds.service; + +import java.util.Date; +import org.onap.policy.clamp.clds.model.CldsHealthCheck; +import org.onap.policy.clamp.clds.util.LoggingUtils; +import org.onap.policy.clamp.clds.util.OnapLogConstants; +import org.onap.policy.clamp.loop.LoopController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.event.Level; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +/** + * Service to retrieve the Health Check of the clds application. + * + */ +@Component +public class CldsHealthcheckService { + + @Autowired + private LoopController loopController; + + protected static final Logger logger = LoggerFactory.getLogger(CldsHealthcheckService.class); + + /** + * REST service that retrieves clds healthcheck information. + * + * @return CldsHealthCheck class containing healthcheck info + */ + public CldsHealthCheck gethealthcheck() { + CldsHealthCheck cldsHealthCheck = new CldsHealthCheck(); + Date startTime = new Date(); + LoggingUtils util = new LoggingUtils(logger); + LoggingUtils.setRequestContext("CldsService: GET healthcheck", "Clamp-Health-Check"); + LoggingUtils.setTimeContext(startTime, new Date()); + try { + loopController.getLoopNames(); + cldsHealthCheck.setHealthCheckComponent("CLDS-APP"); + cldsHealthCheck.setHealthCheckStatus("UP"); + cldsHealthCheck.setDescription("OK"); + LoggingUtils.setResponseContext("0", "Get healthcheck success", + this.getClass().getName()); + util.exiting(HttpStatus.OK.value(), "Healthcheck success", Level.INFO, + OnapLogConstants.ResponseStatus.COMPLETE); + } catch (Exception e) { + logger.error("CLAMP application Heath check failed", e); + LoggingUtils.setResponseContext("999", "Get healthcheck failed", + this.getClass().getName()); + cldsHealthCheck.setHealthCheckComponent("CLDS-APP"); + cldsHealthCheck.setHealthCheckStatus("DOWN"); + cldsHealthCheck.setDescription("NOT-OK"); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Healthcheck failed", Level.INFO, + OnapLogConstants.ResponseStatus.ERROR); + } + return cldsHealthCheck; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/JsonEditorSchemaConstants.java b/src/main/java/org/onap/policy/clamp/clds/tosca/JsonEditorSchemaConstants.java new file mode 100644 index 000000000..32f328079 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/JsonEditorSchemaConstants.java @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca; + +public class JsonEditorSchemaConstants { + + //Data types in JSON Schema + public static final String TYPE_OBJECT = "object"; + public static final String TYPE_ARRAY = "array"; + public static final String TYPE_MAP = "map"; + public static final String TYPE_STRING = "string"; + public static final String TYPE_INTEGER = "integer"; + public static final String TYPE_DATE_TIME = "datetime"; + + //Key elements in JSON Schema + public static final String TYPE = "type"; + public static final String TITLE = "title"; + public static final String REQUIRED = "required"; + public static final String DEFAULT = "default"; + public static final String ENUM = "enum"; + public static final String ENUM_TITLES = "enum_titles"; + public static final String OPTIONS = "options"; + public static final String FORMAT = "format"; + public static final String ITEMS = "items"; + public static final String PROPERTIES = "properties"; + public static final String PROPERTY_ORDER = "propertyOrder"; + public static final String VALUES = "values"; + public static final String HEADER_TEMPLATE = "headerTemplate"; + public static final String HEADER_TEMPLATE_VALUE = "{{self.name}}"; + + public static final String MINIMUM = "minimum"; + public static final String MAXIMUM = "maximum"; + public static final String MIN_LENGTH = "minLength"; + public static final String MAX_LENGTH = "maxLength"; + public static final String EXCLUSIVE_MINIMUM = "exclusiveMinimum"; + public static final String EXCLUSIVE_MAXIMUM = "exclusiveMaximum"; + public static final String MINITEMS = "minItems"; + public static final String MAXITEMS = "maxItems"; + + public static final String CUSTOM_KEY_FORMAT = "format"; + public static final String CUSTOM_KEY_FORMAT_TABS_TOP = "tabs-top"; + public static final String CUSTOM_KEY_FORMAT_TABS = "tabs"; + public static final String CUSTOM_KEY_FORMAT_INPUT = "input"; + public static final String FORMAT_SELECT = "select"; + public static final String UNIQUE_ITEMS = "uniqueItems"; + public static final String TRUE = "true"; + public static final String QSSCHEMA = "qschema"; + public static final String TYPE_QBLDR = "qbldr"; + + public static final String ID = "id"; + public static final String LABEL = "label"; + public static final String OPERATORS = "operators"; + public static final String FILTERS = "filters"; + + public static final String SCHEMA = "schema"; + public static final String CURRENT_VALUES = "currentValues"; + + public static final String PLUGIN = "plugin"; + public static final String DATE_TIME_PICKER = "datetimepicker"; + public static final String VALIDATION = "validation"; + public static final String DATE_TIME_FORMAT = "YYYY/MM/DD HH:mm:ss"; + public static final String INPUT_EVENT = "input_event"; + public static final String DP_CHANGE = "dp.change"; + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/ToscaSchemaConstants.java b/src/main/java/org/onap/policy/clamp/clds/tosca/ToscaSchemaConstants.java new file mode 100644 index 000000000..c2b5d5963 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/ToscaSchemaConstants.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca; + +public class ToscaSchemaConstants { + + // Data types in TOSCA Schema + public static final String TYPE_LIST = "list"; + public static final String TYPE_MAP = "map"; + public static final String TYPE_STRING = "string"; + public static final String TYPE_INTEGER = "integer"; + public static final String TYPE_NUMBER = "number"; + public static final String TYPE_DATE_TIME = "datetime"; + public static final String TYPE_FLOAT = "float"; + public static final String TYPE_BOOLEAN = "boolean"; + public static final String TYPE_USER_DEFINED = "userDefined"; + + // Key elements in Tosca + public static final String NODE_TYPES = "policy_types"; + public static final String DATA_TYPES = "data_types"; + public static final String TYPE = "type"; + public static final String DESCRIPTION = "description"; + public static final String DEFAULT = "default"; + public static final String PROPERTIES = "properties"; + public static final String REQUIRED = "required"; + public static final String ENTRY_SCHEMA = "entry_schema"; + + public static final String METADATA = "metadata"; + public static final String METADATA_POLICY_MODEL_TYPE = "policy_model_type"; + public static final String METADATA_ACRONYM = "acronym"; + public static final String METADATA_ELEMENT_NAME = "element_name"; + public static final String METADATA_HEADER_TEMPLATE = "header_template"; + public static final String METADATA_CLAMP_POSSIBLE_VALUES = "clamp_possible_values"; + + // Constraints + public static final String CONSTRAINTS = "constraints"; + public static final String VALID_VALUES = "valid_values"; + public static final String EQUAL = "equal"; + public static final String GREATER_THAN = "greater_than"; + public static final String GREATER_OR_EQUAL = "greater_or_equal"; + public static final String LESS_THAN = "less_than"; + public static final String LESS_OR_EQUAL = "less_or_equal"; + public static final String IN_RANGE = "in_range"; + public static final String LENGTH = "length"; + public static final String MIN_LENGTH = "min_length"; + public static final String MAX_LENGTH = "max_length"; + public static final String PATTERN = "pattern"; + + // Prefix for policy nodes + public static final String POLICY_NODE = "onap.policies."; + + // Prefix for data nodes + public static final String POLICY_DATA = "onap.datatypes."; + + // Prefix for dictionary elements + public static final String DICTIONARY = "Dictionary:"; + + // Custom Elements that must exist in the Tosca models + public static final String NAME = "name"; + public static final String CONTEXT = "context"; + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertor.java b/src/main/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertor.java new file mode 100644 index 000000000..d6b0a031f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertor.java @@ -0,0 +1,780 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.stream.Collectors; +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.tosca.Dictionary; +import org.onap.policy.clamp.tosca.DictionaryElement; +import org.onap.policy.clamp.tosca.DictionaryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.yaml.snakeyaml.Yaml; + +/** + * Tosca Model Yaml parser and convertor to JSON Schema consumable for JSON + * Editor. + * + */ +@Component +public class ToscaYamlToJsonConvertor { + + @Autowired + private DictionaryService dictionaryService; + + @Autowired + private ClampProperties refProp; + + private int simpleTypeOrder = 1000; + private int complexTypeOrder = 10000; + private int complexSimpleTypeOrder = 1; + + private int incrementSimpleTypeOrder() { + return simpleTypeOrder++; + } + + private int incrementComplexTypeOrder() { + return complexTypeOrder = complexTypeOrder + 10000; + } + + private int incrementComplexSimpleTypeOrder() { + complexSimpleTypeOrder++; + return complexTypeOrder + complexSimpleTypeOrder; + } + + /** + * Parses Tosca YAML string and Converts to JsonObject. + * + * @param yamlString YAML string + * @return JsonObject + */ + public JsonObject validateAndConvertToJson(String yamlString) { + + Yaml yaml = new Yaml(); + LinkedHashMap loadedYaml = yaml.load(yamlString); + if (loadedYaml == null) { + return null; + } + + JSONObject jsonObject = new JSONObject(loadedYaml); + return new Gson().fromJson(jsonObject.toString(), JsonObject.class); + } + + /** + * return the values by looking up the key in the Toscsa JSON object. + * + * @param obj Tosca Json Object + * @param key the parameter key to look up + * @return the value for the provided key + */ + public String getValueFromMetadata(JsonObject obj, String key) { + JsonElement jsonElement = obj.get(ToscaSchemaConstants.NODE_TYPES); + if (jsonElement.isJsonObject()) { + Iterator> itr = + jsonElement.getAsJsonObject().entrySet().iterator(); + while (itr.hasNext()) { + Entry entry = itr.next(); + if (entry.getValue() != null && entry.getValue().isJsonObject() + && entry.getValue().getAsJsonObject().has(ToscaSchemaConstants.METADATA)) { + JsonObject metadatas = entry.getValue().getAsJsonObject() + .get(ToscaSchemaConstants.METADATA).getAsJsonObject(); + if (metadatas.has(key)) { + return metadatas.get(key).getAsString(); + } + } + } + } + return null; + } + + /** + * Parses Tosca YAML string. + * + * @param yamlString YAML string + * @param modelTypeToUse The model type that must be used to obtain the Json + * Schema + * @return JSON string + */ + public String parseToscaYaml(String yamlString, String modelTypeToUse) { + + Yaml yaml = new Yaml(); + LinkedHashMap loadedYaml = yaml.load(yamlString); + if (loadedYaml == null) { + return ""; + } + LinkedHashMap nodeTypes = new LinkedHashMap<>(); + LinkedHashMap dataNodes = new LinkedHashMap<>(); + JSONObject jsonParentObject = new JSONObject(); + JSONObject jsonTempObject = new JSONObject(); + parseNodeAndDataType(loadedYaml, nodeTypes, dataNodes); + populateJsonEditorObject(loadedYaml, nodeTypes, dataNodes, jsonParentObject, jsonTempObject, + modelTypeToUse); + + String headerTemplate = getValueFromMetadata(validateAndConvertToJson(yamlString), + ToscaSchemaConstants.METADATA_HEADER_TEMPLATE); + if (headerTemplate != null) { + jsonParentObject.put(JsonEditorSchemaConstants.HEADER_TEMPLATE, + JsonEditorSchemaConstants.HEADER_TEMPLATE_VALUE); + } + if (jsonTempObject.length() > 0) { + jsonParentObject = jsonTempObject; + } + JSONObject jsonEditorObject = new JSONObject(); + jsonEditorObject.put(JsonEditorSchemaConstants.SCHEMA, jsonParentObject); + return jsonEditorObject.toString(); + } + + // Parse node_type and data_type + @SuppressWarnings("unchecked") + private void parseNodeAndDataType(LinkedHashMap map, + LinkedHashMap nodeTypes, LinkedHashMap dataNodes) { + map.entrySet().stream().forEach(n -> { + if (n.getKey().contains(ToscaSchemaConstants.NODE_TYPES) + && n.getValue() instanceof Map) { + parseNodeAndDataType((LinkedHashMap) n.getValue(), nodeTypes, + dataNodes); + } else if (n.getKey().contains(ToscaSchemaConstants.DATA_TYPES) + && n.getValue() instanceof Map) { + parseNodeAndDataType((LinkedHashMap) n.getValue(), nodeTypes, + dataNodes); + } else if (n.getKey().contains(ToscaSchemaConstants.POLICY_NODE)) { + nodeTypes.put(n.getKey(), n.getValue()); + } else if (n.getKey().contains(ToscaSchemaConstants.POLICY_DATA)) { + dataNodes.put(n.getKey(), n.getValue()); + } + }); + } + + @SuppressWarnings("unchecked") + private void populateJsonEditorObject(LinkedHashMap map, + LinkedHashMap nodeTypes, LinkedHashMap dataNodes, + JSONObject jsonParentObject, JSONObject jsonTempObject, String modelTypeToUse) { + + Map jsonEntrySchema = new HashMap<>(); + jsonParentObject.put(JsonEditorSchemaConstants.TYPE, JsonEditorSchemaConstants.TYPE_OBJECT); + if (nodeTypes.get(modelTypeToUse) instanceof Map) { + ((LinkedHashMap) nodeTypes.get(modelTypeToUse)).entrySet() + .forEach(ntElement -> { + if (ntElement.getKey().equalsIgnoreCase(ToscaSchemaConstants.PROPERTIES)) { + JSONArray rootNodeArray = new JSONArray(); + if (ntElement.getValue() instanceof Map) { + ((LinkedHashMap) ntElement.getValue()).entrySet() + .forEach((ntPropertiesElement) -> { + boolean isListNode = false; + parseDescription( + (LinkedHashMap) ntPropertiesElement + .getValue(), + jsonParentObject); + LinkedHashMap parentPropertiesMap = + (LinkedHashMap) ntPropertiesElement + .getValue(); + if (parentPropertiesMap.containsKey(ToscaSchemaConstants.TYPE) + && ((String) parentPropertiesMap + .get(ToscaSchemaConstants.TYPE)) + .contains(ToscaSchemaConstants.TYPE_MAP) + && parentPropertiesMap + .containsKey(ToscaSchemaConstants.ENTRY_SCHEMA)) { + parentPropertiesMap = + (LinkedHashMap) parentPropertiesMap + .get(ToscaSchemaConstants.ENTRY_SCHEMA); + isListNode = true; + } + if (parentPropertiesMap.containsKey(ToscaSchemaConstants.TYPE) + && ((String) parentPropertiesMap + .get(ToscaSchemaConstants.TYPE)) + .contains(ToscaSchemaConstants.POLICY_DATA)) { + ((LinkedHashMap) dataNodes.get( + parentPropertiesMap.get(ToscaSchemaConstants.TYPE))) + .entrySet().stream().forEach(pmap -> { + if (pmap.getKey().equalsIgnoreCase( + ToscaSchemaConstants.PROPERTIES)) { + parseToscaProperties( + ToscaSchemaConstants.POLICY_NODE, + (LinkedHashMap) pmap + .getValue(), + jsonParentObject, rootNodeArray, + jsonEntrySchema, dataNodes, + incrementSimpleTypeOrder()); + } + }); + } + if (isListNode) { + jsonTempObject.put(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_ARRAY); + parseDescription( + (LinkedHashMap) ntPropertiesElement + .getValue(), + jsonTempObject); + jsonTempObject.put(JsonEditorSchemaConstants.ITEMS, + jsonParentObject); + jsonTempObject.put(JsonEditorSchemaConstants.FORMAT, + JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_TABS); + jsonTempObject.put(JsonEditorSchemaConstants.UNIQUE_ITEMS, + JsonEditorSchemaConstants.TRUE); + } + }); + } + } + }); + } + } + + @SuppressWarnings("unchecked") + private void parseToscaProperties(String parentKey, LinkedHashMap propertiesMap, + JSONObject jsonDataNode, JSONArray array, Map jsonEntrySchema, + LinkedHashMap dataNodes, final int order) { + JSONObject jsonPropertyNode = new JSONObject(); + propertiesMap.entrySet().stream().forEach(p -> { + // Populate JSON Array for "required" key + + if (p.getValue() instanceof Map) { + LinkedHashMap nodeMap = + (LinkedHashMap) p.getValue(); + if (nodeMap.containsKey(ToscaSchemaConstants.REQUIRED) + && ((boolean) nodeMap.get(ToscaSchemaConstants.REQUIRED))) { + array.put(p.getKey()); + } + // if(nodeMap.containsKey(ToscaSchemaConstants.CONSTRAINTS)) + parseToscaChildNodeMap(p.getKey(), nodeMap, jsonPropertyNode, jsonEntrySchema, + dataNodes, array, incrementSimpleTypeOrder()); + } + }); + jsonDataNode.put(JsonEditorSchemaConstants.REQUIRED, array); + jsonDataNode.put(JsonEditorSchemaConstants.PROPERTIES, jsonPropertyNode); + } + + @SuppressWarnings("unchecked") + private void parseToscaPropertiesForType(String parentKey, + LinkedHashMap propertiesMap, JSONObject jsonDataNode, JSONArray array, + Map jsonEntrySchema, LinkedHashMap dataNodes, + boolean isType, int order) { + JSONObject jsonPropertyNode = new JSONObject(); + + propertiesMap.entrySet().stream().forEach(p -> { + // array.put(p.getKey()); + boolean overWriteArray = false; + if (p.getValue() instanceof Map) { + LinkedHashMap nodeMap = + (LinkedHashMap) p.getValue(); + if (!(parentKey.contains(ToscaSchemaConstants.ENTRY_SCHEMA) + || parentKey.contains(ToscaSchemaConstants.POLICY_NODE)) + && nodeMap.containsKey(ToscaSchemaConstants.TYPE) + && (((String) nodeMap.get(ToscaSchemaConstants.TYPE)) + .contains(ToscaSchemaConstants.POLICY_DATA))) { + overWriteArray = true; + } + if (nodeMap.containsKey(ToscaSchemaConstants.REQUIRED) + && ((boolean) nodeMap.get(ToscaSchemaConstants.REQUIRED))) { + array.put(p.getKey()); + } + parseToscaChildNodeMap(p.getKey(), nodeMap, jsonPropertyNode, jsonEntrySchema, + dataNodes, array, order); + } + }); + jsonDataNode.put(JsonEditorSchemaConstants.REQUIRED, array); + jsonDataNode.put(JsonEditorSchemaConstants.PROPERTIES, jsonPropertyNode); + } + + private void parseToscaChildNodeMap(String childObjectKey, + LinkedHashMap childNodeMap, JSONObject jsonPropertyNode, + Map jsonEntrySchema, LinkedHashMap dataNodes, + JSONArray array, int order) { + JSONObject childObject = new JSONObject(); + // JSONArray childArray = new JSONArray(); + parseDescription(childNodeMap, childObject); + parseTypes(childObjectKey, childNodeMap, childObject, jsonEntrySchema, dataNodes, array, + order); + parseConstraints(childNodeMap, childObject); + parseMetadataPossibleValues(childNodeMap, childObject); + parseEntrySchema(childNodeMap, childObject, jsonPropertyNode, jsonEntrySchema, dataNodes); + + jsonPropertyNode.put(childObjectKey, childObject); + order++; + + } + + private void parseEntrySchema(LinkedHashMap childNodeMap, + JSONObject childObject, JSONObject jsonPropertyNode, + Map jsonEntrySchema, LinkedHashMap dataNodes) { + if (childNodeMap.get(ToscaSchemaConstants.ENTRY_SCHEMA) != null) { + if (childNodeMap.get(ToscaSchemaConstants.ENTRY_SCHEMA) instanceof Map) { + LinkedHashMap entrySchemaMap = + (LinkedHashMap) childNodeMap + .get(ToscaSchemaConstants.ENTRY_SCHEMA); + entrySchemaMap.entrySet().stream().forEach(entry -> { + if (entry.getKey().equalsIgnoreCase(ToscaSchemaConstants.TYPE) + && entry.getValue() != null) { + String entrySchemaType = (String) entry.getValue(); + if (entrySchemaType.contains(ToscaSchemaConstants.POLICY_DATA)) { + JSONArray array = new JSONArray(); + if (jsonEntrySchema.get(entrySchemaType) != null) { + // Already traversed + JSONObject entrySchemaObject = jsonEntrySchema.get(entrySchemaType); + attachEntrySchemaJsonObject(childObject, entrySchemaObject, + JsonEditorSchemaConstants.TYPE_OBJECT); + } else if (dataNodes.containsKey(entrySchemaType)) { + + JSONObject entrySchemaObject = new JSONObject(); + // Need to traverse + ((LinkedHashMap) dataNodes.get(entrySchemaType)) + .entrySet().stream().forEach(pmap -> { + if (pmap.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.PROPERTIES)) { + parseToscaProperties(ToscaSchemaConstants.ENTRY_SCHEMA, + (LinkedHashMap) pmap.getValue(), + entrySchemaObject, array, jsonEntrySchema, + dataNodes, incrementComplexTypeOrder()); + jsonEntrySchema.put(entrySchemaType, entrySchemaObject); + dataNodes.remove(entrySchemaType); + attachEntrySchemaJsonObject(childObject, + entrySchemaObject, + JsonEditorSchemaConstants.TYPE_OBJECT); + } + + }); + } + } else if (entrySchemaType + .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING) + || entrySchemaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER) + || entrySchemaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_FLOAT)) { + JSONObject entrySchemaObject = new JSONObject(); + parseConstraints(entrySchemaMap, entrySchemaObject); + parseMetadataPossibleValues(entrySchemaMap, entrySchemaObject); + String jsontype = JsonEditorSchemaConstants.TYPE_STRING; + if (entrySchemaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER) + || entrySchemaType + .equalsIgnoreCase(ToscaSchemaConstants.TYPE_FLOAT)) { + jsontype = JsonEditorSchemaConstants.TYPE_INTEGER; + } + if (childNodeMap.get(ToscaSchemaConstants.TYPE) != null) { + // Only known value of type is String for now + if (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) { + String typeValue = + (String) childNodeMap.get(ToscaSchemaConstants.TYPE); + if (typeValue + .equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { + // Custom key for JSON Editor and UI rendering + childObject.put(JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT, + JsonEditorSchemaConstants.FORMAT_SELECT); + // childObject.put(JsonEditorSchemaConstants.UNIQUE_ITEMS, + // JsonEditorSchemaConstants.TRUE); + } + } + } + attachEntrySchemaJsonObject(childObject, entrySchemaObject, jsontype); + } + } + }); + } + } + } + + private void attachEntrySchemaJsonObject(JSONObject childObject, JSONObject entrySchemaObject, + String dataType) { + + entrySchemaObject.put(JsonEditorSchemaConstants.TYPE, dataType); + childObject.put(JsonEditorSchemaConstants.ITEMS, entrySchemaObject); + } + + @SuppressWarnings("unchecked") + private void attachTypeJsonObject(JSONObject childObject, JSONObject typeObject) { + Iterator keys = typeObject.keys(); + while (keys.hasNext()) { + String key = keys.next(); + childObject.put(key, typeObject.get(key)); + } + } + + /* + * private String parseKey(String toscaKey, String lookupString) { return + * toscaKey.substring(toscaKey.indexOf(lookupString) + lookupString.length(), + * toscaKey.length()); } + */ + + private void parseDescription(LinkedHashMap childNodeMap, + JSONObject childObject) { + if (childNodeMap.get(ToscaSchemaConstants.DESCRIPTION) != null) { + childObject.put(JsonEditorSchemaConstants.TITLE, + childNodeMap.get(ToscaSchemaConstants.DESCRIPTION)); + } + } + + private void parseTypes(String childObjectKey, LinkedHashMap childNodeMap, + JSONObject childObject, Map jsonEntrySchema, + LinkedHashMap dataNodes, JSONArray array, int order) { + if (childNodeMap.get(ToscaSchemaConstants.TYPE) != null) { + // Only known value of type is String for now + if (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) { + childObject.put(JsonEditorSchemaConstants.PROPERTY_ORDER, order); + String typeValue = (String) childNodeMap.get(ToscaSchemaConstants.TYPE); + if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER)) { + childObject.put(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_INTEGER); + + } else if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_FLOAT)) { + childObject.put(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_INTEGER); + } else if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { + childObject.put(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_ARRAY); + // Custom key for JSON Editor and UI rendering + childObject.put(JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT, + JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_TABS_TOP); + childObject.put(JsonEditorSchemaConstants.UNIQUE_ITEMS, + JsonEditorSchemaConstants.TRUE); + } else if (typeValue.equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP)) { + childObject.put(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_OBJECT); + } else if (typeValue.contains(ToscaSchemaConstants.POLICY_DATA)) { + JSONArray childArray = new JSONArray(); + + if (jsonEntrySchema.get(typeValue) != null) { + // Already traversed + JSONObject entrySchemaObject = jsonEntrySchema.get(typeValue); + attachTypeJsonObject(childObject, entrySchemaObject); + } else if (dataNodes.containsKey(typeValue)) { + JSONObject entrySchemaObject = new JSONObject(); + // Need to traverse + JSONArray jsonArray = new JSONArray(); + ((LinkedHashMap) dataNodes.get(typeValue)).entrySet() + .stream().forEach(pmap -> { + if (pmap.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.PROPERTIES)) { + parseToscaPropertiesForType(childObjectKey, + (LinkedHashMap) pmap.getValue(), + entrySchemaObject, childArray, jsonEntrySchema, dataNodes, + true, incrementComplexSimpleTypeOrder()); + jsonEntrySchema.put(typeValue, entrySchemaObject); + dataNodes.remove(typeValue); + attachTypeJsonObject(childObject, entrySchemaObject); + } + }); + } + } else { + childObject.put(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_STRING); + } + } + if (childNodeMap.get(ToscaSchemaConstants.DEFAULT) != null) { + childObject.put(JsonEditorSchemaConstants.DEFAULT, + childNodeMap.get(ToscaSchemaConstants.DEFAULT)); + } + } + } + + private void parseConstraints(LinkedHashMap childNodeMap, + JSONObject childObject) { + if (childNodeMap.containsKey(ToscaSchemaConstants.CONSTRAINTS) + && childNodeMap.get(ToscaSchemaConstants.CONSTRAINTS) != null) { + List> constraintsList = + (List>) childNodeMap + .get(ToscaSchemaConstants.CONSTRAINTS); + constraintsList.stream().forEach(c -> { + if (c instanceof Map) { + c.entrySet().stream().forEach(constraint -> { + if (constraint.getKey().equalsIgnoreCase(ToscaSchemaConstants.MIN_LENGTH) + || constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.GREATER_OR_EQUAL)) { + // For String min_lenghth is minimum length whereas for number, it will + // be + // minimum or greater than to the defined value + if (childNodeMap.containsKey(ToscaSchemaConstants.TYPE) + && (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) + && ((String) childNodeMap.get(ToscaSchemaConstants.TYPE)) + .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { + childObject.put(JsonEditorSchemaConstants.MIN_LENGTH, + constraint.getValue()); + } else { + childObject.put(JsonEditorSchemaConstants.MINIMUM, + constraint.getValue()); + } + } else if (constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.MAX_LENGTH) + || constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.LESS_OR_EQUAL)) { + // For String max_lenghth is maximum length whereas for number, it will + // be + // maximum or less than the defined value + if (childNodeMap.containsKey(ToscaSchemaConstants.TYPE) + && (childNodeMap.get(ToscaSchemaConstants.TYPE) instanceof String) + && ((String) childNodeMap.get(ToscaSchemaConstants.TYPE)) + .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { + childObject.put(JsonEditorSchemaConstants.MAX_LENGTH, + constraint.getValue()); + } else { + childObject.put(JsonEditorSchemaConstants.MAXIMUM, + constraint.getValue()); + } + } else if (constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.LESS_THAN)) { + childObject.put(JsonEditorSchemaConstants.EXCLUSIVE_MAXIMUM, + constraint.getValue()); + } else if (constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.GREATER_THAN)) { + childObject.put(JsonEditorSchemaConstants.EXCLUSIVE_MINIMUM, + constraint.getValue()); + } else if (constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.IN_RANGE)) { + if (constraint.getValue() instanceof ArrayList) { + if (childNodeMap.containsKey(ToscaSchemaConstants.TYPE) + && (childNodeMap + .get(ToscaSchemaConstants.TYPE) instanceof String) + && ((String) childNodeMap.get(ToscaSchemaConstants.TYPE)) + .equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { + childObject.put(JsonEditorSchemaConstants.MIN_LENGTH, + ((ArrayList) constraint.getValue()).get(0)); + childObject.put(JsonEditorSchemaConstants.MAX_LENGTH, + ((ArrayList) constraint.getValue()).get(1)); + } else { + childObject.put(JsonEditorSchemaConstants.MINIMUM, + ((ArrayList) constraint.getValue()).get(0)); + childObject.put(JsonEditorSchemaConstants.MAXIMUM, + ((ArrayList) constraint.getValue()).get(1)); + } + + } + } else if (constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.VALID_VALUES)) { + JSONArray validValuesArray = new JSONArray(); + + if (constraint.getValue() instanceof ArrayList) { + boolean processDictionary = + ((ArrayList) constraint.getValue()).stream().anyMatch( + value -> (value instanceof String && ((String) value) + .contains(ToscaSchemaConstants.DICTIONARY))); + if (!processDictionary) { + ((ArrayList) constraint.getValue()).stream() + .forEach(value -> { + validValuesArray.put(value); + }); + childObject.put(JsonEditorSchemaConstants.ENUM, + validValuesArray); + } else { + ((ArrayList) constraint.getValue()).stream() + .forEach(value -> { + if ((value instanceof String && ((String) value) + .contains(ToscaSchemaConstants.DICTIONARY))) { + processDictionaryElements(childObject, + (String) value); + } + + }); + + } + } + + } + }); + } + }); + } + } + + private void parseMetadataPossibleValues(LinkedHashMap childNodeMap, + JSONObject childObject) { + if (childNodeMap.containsKey(ToscaSchemaConstants.METADATA) + && childNodeMap.get(ToscaSchemaConstants.METADATA) != null) { + LinkedHashMap metadataMap = + (LinkedHashMap) childNodeMap.get(ToscaSchemaConstants.METADATA); + if (metadataMap instanceof Map) { + metadataMap.entrySet().stream().forEach(constraint -> { + if (constraint.getKey() + .equalsIgnoreCase(ToscaSchemaConstants.METADATA_CLAMP_POSSIBLE_VALUES)) { + JSONArray validValuesArray = new JSONArray(); + + if (constraint.getValue() instanceof ArrayList) { + boolean processDictionary = ((ArrayList) constraint.getValue()) + .stream().anyMatch(value -> (value instanceof String + && ((String) value).contains(ToscaSchemaConstants.DICTIONARY))); + if (processDictionary) { + ((ArrayList) constraint.getValue()).stream().forEach(value -> { + if ((value instanceof String && ((String) value) + .contains(ToscaSchemaConstants.DICTIONARY))) { + processDictionaryElements(childObject, (String) value); + } + + }); + + } + } + + } + }); + } + } + } + + private void processDictionaryElements(JSONObject childObject, String dictionaryReference) { + if (dictionaryReference.contains("#")) { + String[] dictionaryKeyArray = dictionaryReference + .substring(dictionaryReference.indexOf(ToscaSchemaConstants.DICTIONARY) + 11, + dictionaryReference.length()) + .split("#"); + // We support only one # as of now. + List cldsDictionaryElements = null; + List subDictionaryElements = null; + if (dictionaryKeyArray != null && dictionaryKeyArray.length == 2) { + cldsDictionaryElements = dictionaryService.getDictionary(dictionaryKeyArray[0]) + .getDictionaryElements().stream().collect(Collectors.toList()); + subDictionaryElements = dictionaryService.getDictionary(dictionaryKeyArray[1]) + .getDictionaryElements().stream().collect(Collectors.toList()); + + if (cldsDictionaryElements != null) { + List subCldsDictionaryNames = subDictionaryElements.stream() + .map(DictionaryElement::getShortName).collect(Collectors.toList()); + JSONArray jsonArray = new JSONArray(); + + Optional.ofNullable(cldsDictionaryElements).get().stream().forEach(c -> { + JSONObject jsonObject = new JSONObject(); + if (c.getSubDictionary() != null) { + Dictionary subDictionary = + dictionaryService.getDictionary(c.getSubDictionary()); + if (subDictionary != null + && !subDictionary.getDictionaryElements().isEmpty()) { + + jsonObject.put(JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_INPUT, + JsonEditorSchemaConstants.FORMAT_SELECT); + + List shortNames = new ArrayList<>(); + subDictionary.getDictionaryElements().stream().forEach(c1 -> { + shortNames.add(c1.getShortName()); + }); + jsonObject.put(JsonEditorSchemaConstants.VALUES, shortNames); + } + } + jsonObject.put(JsonEditorSchemaConstants.TYPE, getJsonType(c.getType())); + + if (c.getType() != null + && (c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING) + || c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME) + || c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP))) { + jsonObject.put(JsonEditorSchemaConstants.MIN_LENGTH, 1); + + if (c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME)) { + jsonObject.put(JsonEditorSchemaConstants.PLUGIN, + JsonEditorSchemaConstants.DATE_TIME_PICKER); + jsonObject.put(JsonEditorSchemaConstants.INPUT_EVENT, + JsonEditorSchemaConstants.DP_CHANGE); + JSONObject formatJsonObject = new JSONObject(); + formatJsonObject.put(JsonEditorSchemaConstants.FORMAT, + JsonEditorSchemaConstants.DATE_TIME_FORMAT); + jsonObject.put(JsonEditorSchemaConstants.VALIDATION, + formatJsonObject); + } + } + + jsonObject.put(JsonEditorSchemaConstants.ID, c.getName()); + jsonObject.put(JsonEditorSchemaConstants.LABEL, c.getShortName()); + jsonObject.put(JsonEditorSchemaConstants.OPERATORS, subCldsDictionaryNames); + jsonArray.put(jsonObject); + });; + JSONObject filterObject = new JSONObject(); + filterObject.put(JsonEditorSchemaConstants.FILTERS, jsonArray); + + childObject.put(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_QBLDR); + // TO invoke validation on such parameters + childObject.put(JsonEditorSchemaConstants.MIN_LENGTH, 1); + childObject.put(JsonEditorSchemaConstants.QSSCHEMA, filterObject); + + } + } + } else { + String dictionaryKey = dictionaryReference.substring( + dictionaryReference.indexOf(ToscaSchemaConstants.DICTIONARY) + 11, + dictionaryReference.length()); + + if (dictionaryKey != null) { + if (dictionaryKey.contains(ToscaSchemaConstants.TYPE_USER_DEFINED)) { + childObject.put(JsonEditorSchemaConstants.ENUM, new ArrayList<>()); + // Add Enum titles for generated translated values during + // JSON instance generation + JSONObject enumTitles = new JSONObject(); + enumTitles.put(JsonEditorSchemaConstants.ENUM_TITLES, new ArrayList<>()); + childObject.put(JsonEditorSchemaConstants.OPTIONS, enumTitles); + } else { + List cldsDictionaryElements = + dictionaryService.getDictionary(dictionaryKey).getDictionaryElements() + .stream().collect(Collectors.toList()); + if (cldsDictionaryElements != null) { + List cldsDictionaryNames = new ArrayList<>(); + List cldsDictionaryFullNames = new ArrayList<>(); + cldsDictionaryElements.stream().forEach(c -> { + // Json type will be translated before Policy creation + if (c.getType() != null && !c.getType().equalsIgnoreCase("json")) { + cldsDictionaryFullNames.add(c.getName()); + } + cldsDictionaryNames.add(c.getShortName()); + }); + + if (!cldsDictionaryFullNames.isEmpty()) { + childObject.put(JsonEditorSchemaConstants.ENUM, + cldsDictionaryFullNames); + // Add Enum titles for generated translated values during JSON instance + // generation + JSONObject enumTitles = new JSONObject(); + enumTitles.put(JsonEditorSchemaConstants.ENUM_TITLES, + cldsDictionaryNames); + childObject.put(JsonEditorSchemaConstants.OPTIONS, enumTitles); + } else { + childObject.put(JsonEditorSchemaConstants.ENUM, cldsDictionaryNames); + } + + } + } + } + } + } + + private String getJsonType(String toscaType) { + String jsonType = null; + if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER) + || toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_NUMBER)) { + jsonType = JsonEditorSchemaConstants.TYPE_INTEGER; + } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME)) { + jsonType = JsonEditorSchemaConstants.TYPE_DATE_TIME; + } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { + jsonType = JsonEditorSchemaConstants.TYPE_ARRAY; + } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP)) { + jsonType = JsonEditorSchemaConstants.TYPE_MAP; + } else { + jsonType = JsonEditorSchemaConstants.TYPE_STRING; + } + return jsonType; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java new file mode 100644 index 000000000..3505c8b86 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupport.java @@ -0,0 +1,98 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import java.io.IOException; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParser; +import org.onap.policy.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParserWithDictionarySupport; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateManager; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.service.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ToscaConverterWithDictionarySupport { + + private static final EELFLogger logger = + EELFManager.getInstance().getLogger(ToscaConverterWithDictionarySupport.class); + + private ClampProperties clampProperties; + private ToscaMetadataParser metadataParser; + + /** + * Constructor with Spring support. + * + * @param clampProperties Clamp Spring properties + * @param metadataParser Metadata parser + */ + @Autowired + public ToscaConverterWithDictionarySupport(ClampProperties clampProperties, + ToscaMetadataParserWithDictionarySupport metadataParser) { + this.clampProperties = clampProperties; + this.metadataParser = metadataParser; + } + + /** + * This method converts a tosca file to a json schema. + * It uses some parameters specified in the application.properties. + * + * @param toscaFile The tosca file as String + * @param policyTypeToDecode The policy type to decode + * @param serviceModel The service model associated so that the clamp enrichment could be done if required by + * the tosca model + * @return A json object being a json schema + */ + public JsonObject convertToscaToJsonSchemaObject(String toscaFile, String policyTypeToDecode, + Service serviceModel) { + try { + return new JsonTemplateManager(toscaFile, + clampProperties.getFileContent("tosca.converter.default.datatypes"), + clampProperties.getFileContent("tosca.converter.json.schema.templates")) + .getJsonSchemaForPolicyType(policyTypeToDecode, Boolean.parseBoolean(clampProperties.getStringValue( + "tosca.converter.dictionary.support.enabled")) ? metadataParser : null, serviceModel); + } catch (IOException | UnknownComponentException e) { + logger.error("Unable to convert the tosca properly, exception caught during the decoding", + e); + return new JsonObject(); + } + } + + /** + * This method converts a tosca file to a json schema. + * It uses some parameters specified in the application.properties. + * + * @param toscaFile The tosca file as String + * @param policyTypeToDecode The policy type to decode + * @param serviceModel The service Model so that clamp enrichment could be done if required by tosca model + * @return A String containing the json schema + */ + public String convertToscaToJsonSchemaString(String toscaFile, String policyTypeToDecode, Service serviceModel) { + return JsonUtils.GSON.toJson(this.convertToscaToJsonSchemaObject(toscaFile, policyTypeToDecode, serviceModel)); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/UnknownComponentException.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/UnknownComponentException.java new file mode 100644 index 000000000..fb684b57b --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/UnknownComponentException.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +public class UnknownComponentException extends Exception { + public UnknownComponentException(String nameEntry) { + this.getWrongName(nameEntry); + } + + public String getWrongName(String nameEntry) { + return "Unknown Component: " + nameEntry; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ArrayField.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ArrayField.java new file mode 100644 index 000000000..9834c78e7 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ArrayField.java @@ -0,0 +1,72 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.elements; + +import com.google.gson.JsonArray; +import java.util.ArrayList; + +public class ArrayField { + + private ArrayList complexFields; + + /** + * Constructor from arraryList. + * + * @param arrayProperties the array properties + */ + public ArrayField(ArrayList arrayProperties) { + this.complexFields = arrayProperties; + } + + /** + * Each LinkedHashMap is parsed to extract the Array and each of its value. They are casted for the JsonObject. + * + * @return JsonArray + */ + public JsonArray deploy() { + + JsonArray subPropertyValuesArray = new JsonArray(); + for (Object arrayElement : complexFields) { + //Cast for each Primitive Type + String typeValue = arrayElement.getClass().getSimpleName(); + switch (typeValue) { + case "String": + subPropertyValuesArray.add((String) arrayElement); + break; + case "Boolean": + subPropertyValuesArray.add((Boolean) arrayElement); + break; + case "Double": + subPropertyValuesArray.add((Number) arrayElement); + break; + case "Integer": + subPropertyValuesArray.add((Number) arrayElement); + break; + default: + break; + } + } + return subPropertyValuesArray; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/Constraint.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/Constraint.java new file mode 100644 index 000000000..b41042abe --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/Constraint.java @@ -0,0 +1,222 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.elements; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map.Entry; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplate; + +public class Constraint { + + private LinkedHashMap constraints; + private JsonTemplate jsonTemplate; + + public Constraint(LinkedHashMap constraints, JsonTemplate jsonTemplate) { + this.jsonTemplate = jsonTemplate; + this.constraints = constraints; + } + + /** + * Deploy the linkedhashmap which contains the constraints, to extract them one to one. + * + * @param jsonSchema The json Schema + * @param typeProperty The ype property + * @return the json object + */ + public JsonObject deployConstraints(JsonObject jsonSchema, String typeProperty) { + for (Entry constraint : constraints.entrySet()) { + this.parseConstraint(jsonSchema, constraint.getKey(), constraint.getValue(), typeProperty); + } + return jsonSchema; + } + + /** + * Each case of Tosca constraints below parse specifically the field in the JsonObject. + * + * @param jsonSchema Json Schema + * @param nameConstraint Name constraint + * @param valueConstraint value constraint + * @param typeProperty Type Property + */ + @SuppressWarnings("unchecked") + public void parseConstraint(JsonObject jsonSchema, String nameConstraint, Object valueConstraint, + String typeProperty) { + switch (nameConstraint) { + case "equal": + checkTemplateField("const", jsonSchema, valueConstraint); + break; + case "greater_than": + checkTemplateField("exclusiveMinimum", jsonSchema, valueConstraint); + break; + case "greater_or_equal": + checkTemplateField("minimum", jsonSchema, valueConstraint); + break; + case "less_than": + checkTemplateField("exclusiveMaximum", jsonSchema, valueConstraint); + break; + case "less_or_equal": + checkTemplateField("maximum", jsonSchema, valueConstraint); + break; + case "in_range": + ArrayList limitValues = (ArrayList) valueConstraint; + checkTemplateField("minimum", jsonSchema, limitValues.get(0)); + checkTemplateField("maximum", jsonSchema, limitValues.get(1)); + break; + case "pattern": + jsonSchema.addProperty(nameConstraint, (String) valueConstraint); + break; + case "length": + this.getSpecificLength(jsonSchema, valueConstraint, typeProperty); + break; + case "min_length": + String[] prefixValues = nameConstraint.split("_"); + this.getLimitValue(jsonSchema, valueConstraint, typeProperty, prefixValues[0]); + break; + case "max_length": + String[] maxtab = nameConstraint.split("_"); + this.getLimitValue(jsonSchema, valueConstraint, typeProperty, maxtab[0]); + break; + default://valid_value + this.getValueArray(jsonSchema, valueConstraint, typeProperty); + break; + } + + } + + /** + * To be done. + * + * @param jsonSchema json schema + * @param fieldValue field value + * @param typeProperty For the complex components, get a specific number of items/properties + */ + public void getSpecificLength(JsonObject jsonSchema, Object fieldValue, String typeProperty) { + switch (typeProperty.toLowerCase()) { + case "string": + checkTemplateField("minLength", jsonSchema, fieldValue); + checkTemplateField("maxLength", jsonSchema, fieldValue); + break; + case "array": + if (fieldValue.equals(1) && jsonTemplate.hasFields("uniqueItems")) { + jsonSchema.addProperty("uniqueItems", true); + } else { + checkTemplateField("minItems", jsonSchema, fieldValue); + checkTemplateField("maxItems", jsonSchema, fieldValue); + } + break; + default:// Map && List + checkTemplateField("minProperties", jsonSchema, fieldValue); + checkTemplateField("maxProperties", jsonSchema, fieldValue); + break; + } + + } + + /** + * To be done. + * + * @param jsonSchema json schema + * @param fieldValue field value + * @param typeProperty type property + * @param side Get the limits fieldValue for the properties : depend of the type of the component + */ + public void getLimitValue(JsonObject jsonSchema, Object fieldValue, String typeProperty, String side) { + switch (typeProperty) { + case "string": + if (side.equals("min")) { + checkTemplateField("minLength", jsonSchema, fieldValue); + } else { + checkTemplateField("maxLength", jsonSchema, fieldValue); + } + break; + default:// Array + if (side.equals("min")) { + checkTemplateField("minItems", jsonSchema, fieldValue); + } else { + checkTemplateField("maxItems", jsonSchema, fieldValue); + } + break; + } + + } + + /** + * To be done. + * + * @param jsonSchema Json schema + * @param fieldValue field value + * @param typeProperty Get as Enum the valid values for the property + */ + public void getValueArray(JsonObject jsonSchema, Object fieldValue, String typeProperty) { + if (jsonTemplate.hasFields("enum")) { + JsonArray enumeration = new JsonArray(); + if (typeProperty.equals("string") || typeProperty.equals("String")) { + ArrayList arrayValues = (ArrayList) fieldValue; + for (String arrayItem : arrayValues) { + enumeration.add(arrayItem); + } + jsonSchema.add("enum", enumeration); + } else { + ArrayList arrayValues = (ArrayList) fieldValue; + for (Number arrayItem : arrayValues) { + enumeration.add(arrayItem); + } + jsonSchema.add("enum", enumeration); + } + } + } + + /** + * To be done. + * + * @param field Field + * @param jsonSchema Json schema + * @param fieldValue Simple way to avoid code duplication + */ + public void checkTemplateField(String field, JsonObject jsonSchema, Object fieldValue) { + if (jsonTemplate.hasFields(field)) { + String typeField = fieldValue.getClass().getSimpleName(); + switch (typeField) { + case "String": + jsonSchema.addProperty(field, (String) fieldValue); + break; + case "Integer": + jsonSchema.addProperty(field, (Integer) fieldValue); + break; + case "Number": + jsonSchema.addProperty(field, (Number) fieldValue); + break; + case "Boolean": + jsonSchema.addProperty(field, (Boolean) fieldValue); + break; + default: + break; + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElement.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElement.java new file mode 100644 index 000000000..0c531e9d0 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElement.java @@ -0,0 +1,121 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.elements; + +import java.util.ArrayList; +import java.util.LinkedHashMap; + +public class ToscaElement { + + /** + * name parameter is used as "key", in the LinkedHashMap of Components. + */ + private String name; + private String derivedFrom; + private String version; + private String typeVersion; + private String description; + private LinkedHashMap properties; + + public ToscaElement() { + } + + /** + * Constructor. + * + * @param name name + * @param derivedFrom derivedFrom + * @param description description + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + public ToscaElement(String name, String derivedFrom, String description) { + super(); + this.name = name; + this.derivedFrom = derivedFrom; + this.description = description; + this.properties = new LinkedHashMap(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDerivedFrom() { + return derivedFrom; + } + + public void setDerivedFrom(String derivedFrom) { + this.derivedFrom = derivedFrom; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getTypeVersion() { + return typeVersion; + } + + public void setTypeVersion(String typeVersion) { + this.typeVersion = typeVersion; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LinkedHashMap getProperties() { + return properties; + } + + public void setProperties(LinkedHashMap properties) { + this.properties = properties; + } + + public void addProperties(ToscaElementProperty toscaElementProperty) { + this.properties.put(toscaElementProperty.getName(), toscaElementProperty); + } + + public ArrayList propertiesNames() { + return new ArrayList<>(properties.keySet()); + } + + @Override + public String toString() { + return name + ": " + description + ", version: " + version + ", nb de properties: " + properties.size() + + System.getProperty("line.separator") + propertiesNames(); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElementProperty.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElementProperty.java new file mode 100644 index 000000000..4db8b0356 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/elements/ToscaElementProperty.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.elements; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplate; + +public class ToscaElementProperty { + + /** + * name parameter is used as "key", in the LinkedHashMap of Components. + */ + private String name; + private LinkedHashMap items; + + /** + * Constructor. + * + * @param name the name + * @param items the items + */ + public ToscaElementProperty(String name, LinkedHashMap items) { + super(); + this.name = name; + this.items = items; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LinkedHashMap getItems() { + return items; + } + + public void setItems(LinkedHashMap items) { + this.items = items; + } + + /** + * For each primitive value, requires to get each field Value and cast it and add it in a Json. + * + * @param fieldsContent field + * @param fieldName field + * @param value value + */ + public void addFieldToJson(JsonObject fieldsContent, String fieldName, Object value) { + if (value != null) { + String typeValue = value.getClass().getSimpleName(); + switch (typeValue) { + case "String": + fieldsContent.addProperty(fieldName, (String) value); + break; + case "Boolean": + fieldsContent.addProperty(fieldName, (Boolean) value); + break; + case "Double": + fieldsContent.addProperty(fieldName, (Number) value); + break; + case "Integer": + fieldsContent.addProperty(fieldName, (Integer) value); + break; + default: + fieldsContent.add(fieldName, parseArray((ArrayList) value)); + break; + } + } + } + + /** + * If a field value is an Array, create an Instance of ArrayField to insert if in the JsonObject. + * + * @param arrayProperties array pro + * @return a json array + */ + public JsonArray parseArray(ArrayList arrayProperties) { + JsonArray arrayContent = new JsonArray(); + ArrayList arrayComponent = new ArrayList<>(); + for (Object itemArray : arrayProperties) { + arrayComponent.add(itemArray); + } + ArrayField af = new ArrayField(arrayComponent); + arrayContent = af.deploy(); + return arrayContent; + } + + /** + * Create an instance of Constraint, to extract the values and add it to the Json (according to the type + * * of the current property). + * + * @param json a json + * @param constraints constraints + * @param jsonTemplate template + */ + @SuppressWarnings("unchecked") + public void addConstraintsAsJson(JsonObject json, ArrayList constraints, JsonTemplate jsonTemplate) { + for (Object constraint : constraints) { + if (constraint instanceof LinkedHashMap) { + LinkedHashMap valueConstraint = (LinkedHashMap) constraint; + Constraint constraintParser = new Constraint(valueConstraint, jsonTemplate); + constraintParser.deployConstraints(json, (String) getItems().get("type")); + } + } + + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java new file mode 100644 index 000000000..e18af7188 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataExecutor.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.execution; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.PostConstruct; +import org.onap.policy.clamp.clds.tosca.update.execution.cds.ToscaMetadataCdsProcess; +import org.onap.policy.clamp.clds.tosca.update.execution.target.ToscaMetadataTargetProcess; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.tosca.DictionaryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * This class is used to execute a code based on a key found in the metadata section. + */ +@Component +public class ToscaMetadataExecutor { + + private static final EELFLogger logger = + EELFManager.getInstance().getLogger(ToscaMetadataExecutor.class); + + @Autowired + private DictionaryService dictionaryService; + + private Map mapOfProcesses = new HashMap<>(); + + /** + * This method executes the required process specified in processInfo. + * + * @param processInfo A String containing the process to execute, like "cds/param1:value1/param2:value2" + * @param childObject The jsonObject + * @param serviceModel The service model associated to do clamp enrichment + */ + public void executeTheProcess(String processInfo, JsonObject childObject, Service serviceModel) { + String[] processParameters = (processInfo + "/ ").split("/"); + logger.info("Executing the Tosca clamp process " + processParameters[0] + " with parameters " + + processParameters[1].trim()); + mapOfProcesses.get(processParameters[0].trim()) + .executeProcess(processParameters[1].trim(), childObject, serviceModel); + } + + /** + * Init method. + */ + @PostConstruct + public void init() { + mapOfProcesses.put("CDS", new ToscaMetadataCdsProcess()); + mapOfProcesses.put("CSAR_RESOURCES", new ToscaMetadataTargetProcess()); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java new file mode 100644 index 000000000..a1275229d --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/ToscaMetadataProcess.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.execution; + +import com.google.gson.JsonObject; +import org.onap.policy.clamp.loop.service.Service; + +/** + * This code is the interface that must be implemented to have a tosca process. + */ +public abstract class ToscaMetadataProcess { + + /** + * This method add some elements to the JsonObject childObject passed in argument. + * The process can take multiple parameters in arguments. + * + * @param parameters The parameters required by the process + * @param childObject The Json Object modified by the current process + * @param serviceModel The service model associated to do clamp enrichment + */ + public abstract void executeProcess(String parameters, JsonObject childObject, Service serviceModel); +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java new file mode 100644 index 000000000..bd3a1cb13 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.java @@ -0,0 +1,221 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.execution.cds; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.util.Map; +import java.util.Set; +import org.onap.policy.clamp.clds.tosca.ToscaSchemaConstants; +import org.onap.policy.clamp.clds.tosca.ToscaSchemaConstants; +import org.onap.policy.clamp.clds.tosca.update.execution.ToscaMetadataProcess; +import org.onap.policy.clamp.loop.service.Service; + + +/** + * This class is there to add the JsonObject for CDS in the json Schema according to what is found in the Tosca model. + */ +public class ToscaMetadataCdsProcess extends ToscaMetadataProcess { + + @Override + public void executeProcess(String parameters, JsonObject childObject, Service serviceModel) { + switch (parameters) { + case "actor": + JsonArray jsonArray = new JsonArray(); + jsonArray.add("CDS"); + addToJsonArray(childObject, "enum", jsonArray); + break; + case "payload": + generatePayload(childObject, serviceModel); + break; + case "operation": + generateOperation(childObject, serviceModel); + break; + default: + } + } + + private static void generatePayload(JsonObject childObject, Service serviceModel) { + JsonArray schemaAnyOf = new JsonArray(); + schemaAnyOf.addAll(createBlankEntry()); + schemaAnyOf.addAll(generatePayloadPerResource("VF", serviceModel)); + schemaAnyOf.addAll(generatePayloadPerResource("PNF", serviceModel)); + addToJsonArray(childObject, "anyOf", schemaAnyOf); + } + + private static void generateOperation(JsonObject childObject, Service serviceModel) { + generateOperationPerResource(childObject, "VF", serviceModel); + generateOperationPerResource(childObject, "PNF", serviceModel); + } + + private static void generateOperationPerResource(JsonObject childObject, String resourceName, + Service serviceModel) { + JsonArray schemaEnum = new JsonArray(); + JsonArray schemaTitle = new JsonArray(); + for (Map.Entry entry : serviceModel.getResourceDetails().getAsJsonObject(resourceName) + .entrySet()) { + JsonObject controllerProperties = entry.getValue().getAsJsonObject() + .getAsJsonObject("controllerProperties"); + if (controllerProperties != null && controllerProperties.getAsJsonObject("workflows") != null) { + for (String workflowsEntry : controllerProperties.getAsJsonObject("workflows").keySet()) { + schemaEnum.add(workflowsEntry); + schemaTitle.add(workflowsEntry + " (CDS operation)"); + } + } + } + addToJsonArray(childObject, "enum", schemaEnum); + if (childObject.get("options") == null) { + JsonObject optionsSection = new JsonObject(); + childObject.add("options", optionsSection); + } + addToJsonArray(childObject.getAsJsonObject("options"), "enum_titles", schemaTitle); + + } + + private static JsonArray generatePayloadPerResource(String resourceName, + Service serviceModel) { + JsonArray schemaAnyOf = new JsonArray(); + + for (Map.Entry entry : serviceModel.getResourceDetails().getAsJsonObject(resourceName) + .entrySet()) { + JsonObject controllerProperties = entry.getValue().getAsJsonObject() + .getAsJsonObject("controllerProperties"); + if (controllerProperties != null && controllerProperties.getAsJsonObject("workflows") != null) { + for (Map.Entry workflowsEntry : controllerProperties.getAsJsonObject("workflows") + .entrySet()) { + JsonObject obj = new JsonObject(); + obj.addProperty("title", workflowsEntry.getKey()); + obj.add("properties", + createInputPropertiesForPayload(workflowsEntry.getValue().getAsJsonObject(), + controllerProperties, + workflowsEntry.getKey())); + schemaAnyOf.add(obj); + } + } + } + return schemaAnyOf; + } + + private static JsonArray createBlankEntry() { + JsonArray result = new JsonArray(); + JsonObject blankObject = new JsonObject(); + blankObject.addProperty("title", "User defined"); + blankObject.add("properties", new JsonObject()); + result.add(blankObject); + return result; + } + + private static JsonObject createAnyOfJsonProperty(String name, + String defaultValue, + boolean readOnlyFlag) { + JsonObject result = new JsonObject(); + result.addProperty("title", name); + result.addProperty("type", "string"); + result.addProperty("default", defaultValue); + result.addProperty("readOnly", readOnlyFlag); + return result; + } + + private static void addToJsonArray(JsonObject childObject, String section, JsonArray value) { + if (childObject.getAsJsonArray(section) != null) { + childObject.getAsJsonArray(section).addAll(value); + } else { + childObject.add(section, value); + } + } + + /** + * Returns the properties of payload based on the cds work flows. + * + * @param workFlow cds work flows to update payload + * @param controllerProperties cds properties to get blueprint name and + * version + * @param workFlowName work flow name + * @return returns the properties of payload + */ + public static JsonObject createInputPropertiesForPayload(JsonObject workFlow, + JsonObject controllerProperties, + String workFlowName) { + String artifactName = controllerProperties.get("sdnc_model_name").getAsString(); + String artifactVersion = controllerProperties.get("sdnc_model_version").getAsString(); + JsonObject inputs = workFlow.getAsJsonObject("inputs"); + JsonObject jsonObject = new JsonObject(); + jsonObject.add("artifact_name", createAnyOfJsonProperty( + "artifact name", artifactName, true)); + jsonObject.add("artifact_version", createAnyOfJsonProperty( + "artifact version", artifactVersion, true)); + jsonObject.add("mode", createAnyOfJsonProperty( + "mode", "async", false)); + jsonObject.add("data", createDataProperty(inputs, workFlowName)); + return jsonObject; + } + + private static JsonObject createDataProperty(JsonObject inputs, String workFlowName) { + JsonObject data = new JsonObject(); + data.addProperty("title", "data"); + data.addProperty("type", "string"); + data.addProperty("format", "textarea"); + JsonObject defaultValue = new JsonObject(); + addDefaultValueForData(inputs, defaultValue, workFlowName); + data.addProperty("default", defaultValue.toString()); + return data; + } + + private static void addDefaultValueForData(JsonObject inputs, + JsonObject defaultValue, + String workFlowName) { + Set> entrySet = inputs.entrySet(); + for (Map.Entry entry : entrySet) { + String key = entry.getKey(); + JsonObject inputProperty = inputs.getAsJsonObject(key); + if (key.equalsIgnoreCase(workFlowName + "-properties")) { + addDefaultValueForData(entry.getValue().getAsJsonObject().get("properties") + .getAsJsonObject(), defaultValue, workFlowName); + } else if ("object".equalsIgnoreCase(inputProperty.get(ToscaSchemaConstants.TYPE).getAsString())) { + JsonObject object = new JsonObject(); + addDefaultValueForData(entry.getValue().getAsJsonObject().get("properties") + .getAsJsonObject(), object, workFlowName); + defaultValue.add(entry.getKey(), object); + } else if (ToscaSchemaConstants.TYPE_LIST.equalsIgnoreCase(inputProperty.get(ToscaSchemaConstants.TYPE) + .getAsString())) { + defaultValue.add(entry.getKey(), handleListType(entry.getValue().getAsJsonObject(), workFlowName)); + } else { + defaultValue.addProperty(entry.getKey(), ""); + } + } + } + + private static JsonArray handleListType(JsonObject inputs, + String workFlowName) { + + JsonObject object = new JsonObject(); + if (inputs.get("properties") != null) { + addDefaultValueForData(inputs.get("properties").getAsJsonObject(), object, workFlowName); + } + JsonArray arr = new JsonArray(); + arr.add(object); + return arr; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java new file mode 100644 index 000000000..f4ca9909b --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/execution/target/ToscaMetadataTargetProcess.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.execution.target; + +import com.google.gson.JsonObject; +import org.onap.policy.clamp.clds.tosca.update.execution.ToscaMetadataProcess; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.policy.operational.OperationalPolicyRepresentationBuilder; + +/** + * This class is there to add the JsonObject for CDS in the json Schema according to what is found in the Tosca model. + */ +public class ToscaMetadataTargetProcess extends ToscaMetadataProcess { + + @Override + public void executeProcess(String parameters, JsonObject childObject, Service serviceModel) { + childObject.add("anyOf", OperationalPolicyRepresentationBuilder.createAnyOfArray(serviceModel, false)); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java new file mode 100644 index 000000000..c7cc7e7fa --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaConverterToJsonSchema.java @@ -0,0 +1,343 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.parser; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map.Entry; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElement; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElementProperty; +import org.onap.policy.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParser; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplate; +import org.onap.policy.clamp.loop.service.Service; + +public class ToscaConverterToJsonSchema { + private LinkedHashMap components; + private LinkedHashMap templates; + + private ToscaMetadataParser metadataParser; + + private Service serviceModel; + + /** + * Constructor. + * + * @param toscaElementsMap All the tosca elements found (policy type + data types + native tosca datatypes) + * @param jsonSchemaTemplates All Json schema templates to use + * @param metadataParser The metadata parser to use for metadata section + * @param serviceModel The service model for clamp enrichment + */ + public ToscaConverterToJsonSchema(LinkedHashMap toscaElementsMap, + LinkedHashMap jsonSchemaTemplates, + ToscaMetadataParser metadataParser, Service serviceModel) { + this.components = toscaElementsMap; + this.templates = jsonSchemaTemplates; + this.metadataParser = metadataParser; + this.serviceModel = serviceModel; + } + + /** + * For a given component, launch process to parse it in Json. + * + * @param toscaElementKey name components + * @return return + */ + public JsonObject getJsonSchemaOfToscaElement(String toscaElementKey) { + return this.getFieldAsObject(getToscaElement(toscaElementKey)); + } + + /** + * Return the classical/general fields of the component, & launch the properties deployment. + * + * @param toscaElement the compo + * @return a json object + */ + public JsonObject getFieldAsObject(ToscaElement toscaElement) { + + JsonObject globalFields = new JsonObject(); + if (templates.get("object").hasFields("title")) { + globalFields.addProperty("title", toscaElement.getName()); + } + if (templates.get("object").hasFields("type")) { + globalFields.addProperty("type", "object"); + } + if (templates.get("object").hasFields("description")) { + if (toscaElement.getDescription() != null) { + globalFields.addProperty("description", toscaElement.getDescription()); + } + } + if (templates.get("object").hasFields("required")) { + globalFields.add("required", this.getRequirements(toscaElement.getName())); + } + if (templates.get("object").hasFields("properties")) { + globalFields.add("properties", this.deploy(toscaElement.getName())); + } + return globalFields; + } + + /** + * Get the required properties of the Component, including the parents properties requirements. + * + * @param nameComponent name component + * @return a json array + */ + public JsonArray getRequirements(String nameComponent) { + JsonArray requirements = new JsonArray(); + ToscaElement toParse = components.get(nameComponent); + //Check for a father component, and launch the same process + if (!toParse.getDerivedFrom().equals("tosca.datatypes.Root") + && !toParse.getDerivedFrom().equals("tosca.policies.Root")) { + requirements.addAll(getRequirements(toParse.getDerivedFrom())); + } + //Each property is checked, and add to the requirement array if it's required + Collection properties = toParse.getProperties().values(); + for (ToscaElementProperty toscaElementProperty : properties) { + if (toscaElementProperty.getItems().containsKey("required") + && toscaElementProperty.getItems().get("required").equals(true)) { + requirements.add(toscaElementProperty.getName()); + } + } + return requirements; + } + + /** + * The beginning of the recursive process. Get the parents (or not) to launch the same process, and otherwise + * deploy and parse the properties. + * + * @param nameComponent name component + * @return a json object + */ + public JsonObject deploy(String nameComponent) { + JsonObject jsonSchema = new JsonObject(); + ToscaElement toParse = components.get(nameComponent); + //Check for a father component, and launch the same process + if (!toParse.getDerivedFrom().equals("tosca.datatypes.Root") + && !toParse.getDerivedFrom().equals("tosca.policies.Root")) { + jsonSchema = this.getParent(toParse.getDerivedFrom()); + } + //For each component property, check if its a complex properties (a component) or not. In that case, + //launch the analyse of the property. + for (Entry property : toParse.getProperties().entrySet()) { + if (getToscaElement((String) property.getValue().getItems().get("type")) != null) { + jsonSchema.add(property.getValue().getName(), + this.getJsonSchemaOfToscaElement((String) property.getValue().getItems().get("type"))); + } else { + jsonSchema.add(property.getValue().getName(), this.complexParse(property.getValue())); + } + } + return jsonSchema; + } + + /** + * If a component has a parent, it is deploy in the same way. + * + * @param nameComponent name component + * @return a json object + */ + public JsonObject getParent(String nameComponent) { + return deploy(nameComponent); + } + + /** + * to be done. + * + * @param toscaElementProperty property + * @return a json object + */ + @SuppressWarnings("unchecked") + public JsonObject complexParse(ToscaElementProperty toscaElementProperty) { + JsonObject propertiesInJson = new JsonObject(); + JsonTemplate currentPropertyJsonTemplate; + String typeProperty = (String) toscaElementProperty.getItems().get("type"); + if (typeProperty.toLowerCase().equals("list") || typeProperty.toLowerCase().equals("map")) { + currentPropertyJsonTemplate = templates.get("object"); + } else { + String propertyType = (String) toscaElementProperty.getItems().get("type"); + currentPropertyJsonTemplate = templates.get(propertyType.toLowerCase()); + } + //Each "special" field is analysed, and has a specific treatment + for (String propertyField : toscaElementProperty.getItems().keySet()) { + switch (propertyField) { + case "type": + if (currentPropertyJsonTemplate.hasFields(propertyField)) { + String fieldtype = (String) toscaElementProperty.getItems().get(propertyField); + switch (fieldtype.toLowerCase()) { + case "list": + propertiesInJson.addProperty("type", "array"); + break; + case "map": + propertiesInJson.addProperty("type", "object"); + break; + case "scalar-unit.time": + case "scalar-unit.frequency": + case "scalar-unit.size": + propertiesInJson.addProperty("type", "string"); + break; + case "timestamp": + propertiesInJson.addProperty("type", "string"); + propertiesInJson.addProperty("format", "date-time"); + break; + case "float": + propertiesInJson.addProperty("type", "number"); + break; + case "range": + propertiesInJson.addProperty("type", "integer"); + if (!checkConstraintPresence(toscaElementProperty, "greater_than") + && currentPropertyJsonTemplate.hasFields("exclusiveMinimum")) { + propertiesInJson.addProperty("exclusiveMinimum", false); + } + if (!checkConstraintPresence(toscaElementProperty, "less_than") + && currentPropertyJsonTemplate.hasFields("exclusiveMaximum")) { + propertiesInJson.addProperty("exclusiveMaximum", false); + } + break; + default: + propertiesInJson.addProperty("type", currentPropertyJsonTemplate.getName()); + break; + } + } + break; + case "metadata": + if (metadataParser != null) { + metadataParser.processAllMetadataElement(toscaElementProperty, serviceModel).entrySet() + .forEach((jsonEntry) -> { + propertiesInJson.add(jsonEntry.getKey(), + jsonEntry.getValue()); + + }); + } + break; + case "constraints": + toscaElementProperty.addConstraintsAsJson(propertiesInJson, + (ArrayList) toscaElementProperty.getItems().get("constraints"), + currentPropertyJsonTemplate); + break; + case "entry_schema": + //Here, a way to check if entry is a component (datatype) or a simple string + if (getToscaElement(this.extractSpecificFieldFromMap(toscaElementProperty, "entry_schema")) + != null) { + String nameComponent = this.extractSpecificFieldFromMap(toscaElementProperty, "entry_schema"); + ToscaConverterToJsonSchema child = new ToscaConverterToJsonSchema(components, templates, + metadataParser, serviceModel); + JsonObject propertiesContainer = new JsonObject(); + + switch ((String) toscaElementProperty.getItems().get("type")) { + case "map": // Get it as an object + JsonObject componentAsProperty = child.getJsonSchemaOfToscaElement(nameComponent); + propertiesContainer.add(nameComponent, componentAsProperty); + if (currentPropertyJsonTemplate.hasFields("properties")) { + propertiesInJson.add("properties", propertiesContainer); + } + break; + default://list : get it as an Array + JsonObject componentAsItem = child.getJsonSchemaOfToscaElement(nameComponent); + if (currentPropertyJsonTemplate.hasFields("properties")) { + propertiesInJson.add("items", componentAsItem); + propertiesInJson.addProperty("format", "tabs-top"); + } + break; + } + + } else if (toscaElementProperty.getItems().get("type").equals("list")) { + // Native cases + JsonObject itemContainer = new JsonObject(); + String valueInEntrySchema = + this.extractSpecificFieldFromMap(toscaElementProperty, "entry_schema"); + itemContainer.addProperty("type", valueInEntrySchema); + propertiesInJson.add("items", itemContainer); + propertiesInJson.addProperty("format", "tabs-top"); + } + // MAP Case, for now nothing + + break; + default: + //Each classical field : type, description, default.. + if (currentPropertyJsonTemplate.hasFields(propertyField) && !propertyField.equals("required")) { + toscaElementProperty.addFieldToJson(propertiesInJson, propertyField, + toscaElementProperty.getItems().get(propertyField)); + } + break; + } + } + return propertiesInJson; + } + + /** + * Look for a matching Component for the name parameter, in the components list. + * + * @param name the tosca element name to search for + * @return a tosca element + */ + public ToscaElement getToscaElement(String name) { + ToscaElement correspondingToscaElement = null; + if (components == null) { + return null; + } + for (ToscaElement toscaElement : components.values()) { + if (toscaElement.getName().equals(name)) { + correspondingToscaElement = toscaElement; + } + } + return correspondingToscaElement; + } + + /** + * Simple method to extract quickly a type field from particular property item. + * + * @param toscaElementProperty the property + * @param fieldName the fieldname + * @return a string + */ + @SuppressWarnings("unchecked") + public String extractSpecificFieldFromMap(ToscaElementProperty toscaElementProperty, String fieldName) { + LinkedHashMap entrySchemaFields = + (LinkedHashMap) toscaElementProperty.getItems().get(fieldName); + return entrySchemaFields.get("type"); + } + + /** + * Check if a constraint, for a specific property, is there. + * + * @param toscaElementProperty property + * @param nameConstraint name constraint + * @return a flag boolean + */ + public boolean checkConstraintPresence(ToscaElementProperty toscaElementProperty, String nameConstraint) { + boolean presentConstraint = false; + if (toscaElementProperty.getItems().containsKey("constraints")) { + ArrayList constraints = (ArrayList) toscaElementProperty.getItems().get("constraints"); + for (Object constraint : constraints) { + if (constraint instanceof LinkedHashMap) { + if (((LinkedHashMap) constraint).containsKey(nameConstraint)) { + presentConstraint = true; + } + } + } + } + return presentConstraint; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaElementParser.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaElementParser.java new file mode 100644 index 000000000..a3dd9c3e1 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/ToscaElementParser.java @@ -0,0 +1,103 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.parser; + +import java.util.LinkedHashMap; +import java.util.Map.Entry; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElement; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElementProperty; +import org.yaml.snakeyaml.Yaml; + +public class ToscaElementParser { + /** + * Constructor. + */ + private ToscaElementParser() { + } + + private static LinkedHashMap searchAllDataTypesAndPolicyTypes(String toscaYaml) { + LinkedHashMap> file = + (LinkedHashMap>) new Yaml().load(toscaYaml); + LinkedHashMap allDataTypesFound = file.get("data_types"); + LinkedHashMap allPolicyTypesFound = file.get("policy_types"); + LinkedHashMap allItemsFound = new LinkedHashMap<>(); + // Put the policies and datatypes in the same collection + allItemsFound = (allDataTypesFound == null) ? (new LinkedHashMap<>()) : allDataTypesFound; + allItemsFound.putAll(allPolicyTypesFound == null ? new LinkedHashMap<>() : allPolicyTypesFound); + return allItemsFound; + } + + private static LinkedHashMap searchAllNativeToscaDataTypes(String toscaNativeYaml) { + return ((LinkedHashMap>) new Yaml().load(toscaNativeYaml)) + .get("data_types"); + } + + /** + * Yaml Parse gets raw policies and datatypes, in different sections : necessary to extract + * all entities and put them at the same level. + * + * @param toscaYaml the tosca model content + * @param nativeToscaYaml the tosca native datatype content + * @return a map of Tosca Element containing all tosca elements found (policy types and datatypes) + */ + public static LinkedHashMap searchAllToscaElements(String toscaYaml, + String nativeToscaYaml) { + LinkedHashMap allItemsFound = searchAllDataTypesAndPolicyTypes(toscaYaml); + allItemsFound.putAll(searchAllNativeToscaDataTypes(nativeToscaYaml)); + return parseAllItemsFound(allItemsFound); + } + + /** + * With all the component, get as Map, Components and Components properties are created. + * + * @param allMaps maps + */ + private static LinkedHashMap parseAllItemsFound(LinkedHashMap allMaps) { + LinkedHashMap allItemsFound = new LinkedHashMap(); + //Component creations, from the file maps + for (Entry itemToParse : allMaps.entrySet()) { + LinkedHashMap componentBody = (LinkedHashMap) itemToParse.getValue(); + ToscaElement toscaElement = + new ToscaElement(itemToParse.getKey(), (String) componentBody.get("derived_from"), + (String) componentBody.get("description")); + //If policy, version and type_version : + if (componentBody.get("type_version") != null) { + toscaElement.setVersion((String) componentBody.get("type_version")); + toscaElement.setTypeVersion((String) componentBody.get("type_version")); + } + //Properties creation, from the map + if (componentBody.get("properties") != null) { + LinkedHashMap properties = + (LinkedHashMap) componentBody.get("properties"); + for (Entry itemToProperty : properties.entrySet()) { + ToscaElementProperty toscaElementProperty = new ToscaElementProperty(itemToProperty.getKey(), + (LinkedHashMap) itemToProperty.getValue()); + toscaElement.addProperties(toscaElementProperty); + } + } + allItemsFound.put(toscaElement.getName(), toscaElement); + } + return allItemsFound; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java new file mode 100644 index 000000000..b2568b79f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParser.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.parser.metadata; + +import com.google.gson.JsonObject; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElementProperty; +import org.onap.policy.clamp.loop.service.Service; + +public interface ToscaMetadataParser { + JsonObject processAllMetadataElement(ToscaElementProperty toscaElementProperty, Service serviceModel); +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java new file mode 100644 index 000000000..049018ae0 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/parser/metadata/ToscaMetadataParserWithDictionarySupport.java @@ -0,0 +1,211 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.parser.metadata; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Optional; +import org.onap.policy.clamp.clds.tosca.JsonEditorSchemaConstants; +import org.onap.policy.clamp.clds.tosca.ToscaSchemaConstants; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElementProperty; +import org.onap.policy.clamp.clds.tosca.update.execution.ToscaMetadataExecutor; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.tosca.DictionaryElement; +import org.onap.policy.clamp.tosca.DictionaryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ToscaMetadataParserWithDictionarySupport implements ToscaMetadataParser { + + @Autowired + private ToscaMetadataExecutor toscaMetadataExecutor; + + @Autowired + private DictionaryService dictionaryService; + + /** + * This method is used to start the processing of the metadata field. + * + * @param toscaElementProperty The property metadata as Json Object + * @return The jsonObject structure that must be added to the json schema + */ + public JsonObject processAllMetadataElement(ToscaElementProperty toscaElementProperty, Service serviceModel) { + if (dictionaryService != null) { + return parseMetadataPossibleValues(toscaElementProperty.getItems(), dictionaryService, serviceModel, + toscaMetadataExecutor); + } else { + return null; + } + } + + private static JsonObject parseMetadataPossibleValues(LinkedHashMap childNodeMap, + DictionaryService dictionaryService, Service serviceModel, + ToscaMetadataExecutor toscaMetadataExecutor) { + JsonObject childObject = new JsonObject(); + if (childNodeMap.containsKey(ToscaSchemaConstants.METADATA) + && childNodeMap.get(ToscaSchemaConstants.METADATA) != null) { + ((LinkedHashMap) childNodeMap.get(ToscaSchemaConstants.METADATA)).forEach((key, + value) -> { + if (key.equalsIgnoreCase(ToscaSchemaConstants.METADATA_CLAMP_POSSIBLE_VALUES)) { + String[] multipleValues = ((String) value).split(","); + for (String multipleValue : multipleValues) { + if (multipleValue.contains(ToscaSchemaConstants.DICTIONARY)) { + processDictionaryElements(multipleValue, childObject, dictionaryService); + } + if (multipleValue.contains("ClampExecution:")) { + executeClampProcess(multipleValue.replaceAll("ClampExecution:", ""), childObject, + serviceModel, toscaMetadataExecutor); + } + } + + } + }); + } + return childObject; + } + + private static void executeClampProcess(String processInfo, JsonObject childObject, Service serviceModel, + ToscaMetadataExecutor toscaMetadataExecutor) { + toscaMetadataExecutor.executeTheProcess(processInfo, childObject, serviceModel); + } + + /** + * For dictionary with multiple levels (defined by #). + * + * @param dictionaryKeyArray the array containing the different elements + * @param childObject the structure getting the new entries + * @param dictionaryService the dictionary service bean + */ + private static void processComplexDictionaryElements(String[] dictionaryKeyArray, JsonObject childObject, + DictionaryService dictionaryService) { + // We support only one # as of now. + List dictionaryElements = null; + if (dictionaryKeyArray.length == 2) { + dictionaryElements = new ArrayList<>(dictionaryService.getDictionary(dictionaryKeyArray[0]) + .getDictionaryElements()); + JsonArray subDictionaryNames = new JsonArray(); + new ArrayList(dictionaryService.getDictionary(dictionaryKeyArray[1]) + .getDictionaryElements()).forEach(elem -> subDictionaryNames.add(elem.getShortName())); + + JsonArray jsonArray = new JsonArray(); + + Optional.of(dictionaryElements).get().forEach(c -> { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty(JsonEditorSchemaConstants.TYPE, getJsonType(c.getType())); + if (c.getType() != null + && c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) { + jsonObject.addProperty(JsonEditorSchemaConstants.MIN_LENGTH, 1); + + } + jsonObject.addProperty(JsonEditorSchemaConstants.ID, c.getName()); + jsonObject.addProperty(JsonEditorSchemaConstants.LABEL, c.getShortName()); + jsonObject.add(JsonEditorSchemaConstants.OPERATORS, subDictionaryNames); + jsonArray.add(jsonObject); + }); + + JsonObject filterObject = new JsonObject(); + filterObject.add(JsonEditorSchemaConstants.FILTERS, jsonArray); + + childObject.addProperty(JsonEditorSchemaConstants.TYPE, + JsonEditorSchemaConstants.TYPE_QBLDR); + // TO invoke validation on such parameters + childObject.addProperty(JsonEditorSchemaConstants.MIN_LENGTH, 1); + childObject.add(JsonEditorSchemaConstants.QSSCHEMA, filterObject); + + } + } + + /** + * For dictionary with single entry. + * + * @param dictionaryKeyArray the array containing the different elements + * @param childObject the structure getting the new entries + * @param dictionaryService the dictionary service bean + */ + private static void processSimpleDictionaryElements(String[] dictionaryKeyArray, JsonObject childObject, + DictionaryService dictionaryService) { + JsonArray dictionaryNames = new JsonArray(); + JsonArray dictionaryFullNames = new JsonArray(); + dictionaryService.getDictionary(dictionaryKeyArray[0]).getDictionaryElements().forEach(c -> { + // Json type will be translated before Policy creation + if (c.getType() != null && !c.getType().equalsIgnoreCase("json")) { + dictionaryFullNames.add(c.getName()); + } + dictionaryNames.add(c.getShortName()); + }); + + if (dictionaryFullNames.size() > 0) { + if (childObject.get(JsonEditorSchemaConstants.ENUM) != null) { + childObject.get(JsonEditorSchemaConstants.ENUM).getAsJsonArray().add(dictionaryFullNames); + } else { + childObject.add(JsonEditorSchemaConstants.ENUM, dictionaryFullNames); + } + // Add Enum titles for generated translated values during JSON instance + // generation + JsonObject enumTitles = new JsonObject(); + enumTitles.add(JsonEditorSchemaConstants.ENUM_TITLES, dictionaryNames); + if (childObject.get(JsonEditorSchemaConstants.OPTIONS) != null) { + childObject.get(JsonEditorSchemaConstants.OPTIONS).getAsJsonArray().add(enumTitles); + } else { + childObject.add(JsonEditorSchemaConstants.OPTIONS, enumTitles); + } + + } else { + if (childObject.get(JsonEditorSchemaConstants.ENUM) != null) { + childObject.get(JsonEditorSchemaConstants.ENUM).getAsJsonArray().add(dictionaryNames); + } else { + childObject.add(JsonEditorSchemaConstants.ENUM, dictionaryNames); + } + } + } + + private static void processDictionaryElements(String dictionaryReference, JsonObject childObject, + DictionaryService dictionaryService) { + String[] dictionaryKeyArray = + dictionaryReference.substring(dictionaryReference.indexOf(ToscaSchemaConstants.DICTIONARY) + 11, + dictionaryReference.length()).split("#"); + if (dictionaryKeyArray.length > 1) { + processComplexDictionaryElements(dictionaryKeyArray, childObject, dictionaryService); + } else { + processSimpleDictionaryElements(dictionaryKeyArray, childObject, dictionaryService); + } + } + + private static String getJsonType(String toscaType) { + String jsonType = null; + if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER)) { + jsonType = JsonEditorSchemaConstants.TYPE_INTEGER; + } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) { + jsonType = JsonEditorSchemaConstants.TYPE_ARRAY; + } else { + jsonType = JsonEditorSchemaConstants.TYPE_STRING; + } + return jsonType; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplate.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplate.java new file mode 100644 index 000000000..5c96f2c4a --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplate.java @@ -0,0 +1,223 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.templates; + +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.List; + +public class JsonTemplate { + + /** + * name parameter is used as "key", in the LinkedHashMap of Templates. + */ + private String name; + private List jsonTemplateFields; + + public JsonTemplate(String name) { + this.name = name; + this.jsonTemplateFields = new ArrayList<>(); + } + + public JsonTemplate(String name, List jsonTemplateFields) { + this.name = name; + this.jsonTemplateFields = jsonTemplateFields; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getJsonTemplateFields() { + return jsonTemplateFields; + } + + public void setJsonTemplateFields(List jsonTemplateFields) { + this.jsonTemplateFields = jsonTemplateFields; + } + + /** + * Search in fields if fieldName exists. + * + * @param fieldName The field name + * @return Ture if it exists, false otherwise + */ + public boolean hasFields(String fieldName) { + for (JsonTemplateField jsonTemplateField : this.getJsonTemplateFields()) { + if (jsonTemplateField.getTitle().equals(fieldName)) { + return true; + } + } + return false; + } + + /** + * Get a specific Field. + * + * @param fieldName The field name + * @return THe Field found + */ + public JsonTemplateField getSpecificField(String fieldName) { + for (JsonTemplateField jsonTemplateField : this.getJsonTemplateFields()) { + if (jsonTemplateField.getTitle().equals(fieldName)) { + return jsonTemplateField; + } + } + return null; + } + + public void addField(JsonTemplateField jsonTemplateField) { + jsonTemplateFields.add(jsonTemplateField); + } + + public void removeField(JsonTemplateField jsonTemplateField) { + jsonTemplateFields.remove(jsonTemplateField); + } + + /** + * Enable or disable the visibility. + * + * @param nameField THe field name + * @param state True or false + */ + public void setVisibility(String nameField, boolean state) { + for (JsonTemplateField jsonTemplateField : this.jsonTemplateFields) { + if (jsonTemplateField.getTitle().equals(nameField)) { + jsonTemplateField.setVisible(state); + } + } + } + + /** + * This method defines if a field is static or not. + * + * @param nameField The name of the field + * @param state true or false + */ + public void setStatic(String nameField, boolean state) { + for (JsonTemplateField jsonTemplateField : this.jsonTemplateFields) { + if (jsonTemplateField.getTitle().equals(nameField)) { + jsonTemplateField.setStaticValue(state); + } + } + } + + /** + * This method updates the value of a specfic field. + * + * @param nameField The name of the field + * @param newValue The new value as Object + */ + public void updateValueField(String nameField, Object newValue) { + for (JsonTemplateField jsonTemplateField : this.jsonTemplateFields) { + if (jsonTemplateField.getTitle().equals(nameField)) { + jsonTemplateField.setValue(newValue); + } + } + } + + /** + * Compare two templates : size and their contents. + * + * @param jsonTemplate the template + * @return a boolean + */ + public boolean checkFields(JsonTemplate jsonTemplate) { + boolean duplicateFields = false; + if (jsonTemplate.getJsonTemplateFields().size() == this.getJsonTemplateFields().size()) { + int countMatchingFields = 0; + //loop each component of first + for (JsonTemplateField jsonTemplateFieldToCheck : jsonTemplate.getJsonTemplateFields()) { + for (JsonTemplateField jsonTemplateField : this.getJsonTemplateFields()) { + if (jsonTemplateFieldToCheck.compareWithField(jsonTemplateField)) { + countMatchingFields++; + } + } + } + + if (jsonTemplate.getJsonTemplateFields().size() == countMatchingFields) { + duplicateFields = true; + } + } + return duplicateFields; + } + + /** + * This method gets the specific field status. + * + * @param field The field name + * @return true or false + */ + public boolean fieldStaticStatus(String field) { + if (this.hasFields(field) && this.getSpecificField(field).getStaticValue().equals(true) + && this.getSpecificField(field).getValue() != null) { + return true; + } + return false; + } + + public boolean isVisible(String field) { + return this.getSpecificField(field).getVisible(); + } + + /** + * Set the value of a property of the Field in the json. + * + * @param jsonSchema The Json schema + * @param fieldName The Field name + * @param value The value + */ + public void setValue(JsonObject jsonSchema, String fieldName, String value) { + if (isVisible(fieldName)) { + if (fieldStaticStatus(fieldName)) { + String defaultValue = (String) this.getSpecificField(fieldName).getValue(); + jsonSchema.addProperty(fieldName, defaultValue); + } else { + jsonSchema.addProperty(fieldName, value); + } + } + } + + /** + * Inject a static value in the json. + * + * @param jsonSchema The json schema object + * @param fieldName The field name + */ + public void injectStaticValue(JsonObject jsonSchema, String fieldName) { + if (isVisible(fieldName)) { + JsonTemplateField toInject = this.getSpecificField(fieldName); + jsonSchema.addProperty(fieldName, (String) toInject.getValue()); + } + } + + @Override + public String toString() { + return " templateFields : " + jsonTemplateFields; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateField.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateField.java new file mode 100644 index 000000000..d9fd11de2 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateField.java @@ -0,0 +1,149 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.templates; + +public class JsonTemplateField { + private String title; + private Object value; + private Boolean visible; + private Boolean staticValue; + + public JsonTemplateField(String title) { + this.title = title; + } + + /** + * Constructor. + * + * @param title The title + * @param value The value + * @param visible visible or not + * @param staticValue The static value + */ + public JsonTemplateField(String title, Object value, Boolean visible, Boolean staticValue) { + this.title = title; + this.value = value; + this.visible = visible; + this.staticValue = staticValue; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public Boolean getVisible() { + return visible; + } + + public void setVisible(Boolean visible) { + this.visible = visible; + } + + public Boolean getStaticValue() { + return staticValue; + } + + public void setStaticValue(Boolean staticValue) { + this.staticValue = staticValue; + } + + public String toString() { + return title + " " + value + " " + visible + " " + staticValue; + } + + /** + * This method compares two fields. + * + * @param otherField Compare the current object with the one specified + * @return true if they are totally equals, false otherwise + */ + public boolean compareWithField(Object otherField) { + if (this == otherField) { + return true; + } + if (otherField == null || getClass() != otherField.getClass()) { + return false; + } + + JsonTemplateField jsonTemplateField = (JsonTemplateField) otherField; + + if (title != null ? !title.equals(jsonTemplateField.title) : jsonTemplateField.title != null) { + return false; + } + if (value != null ? !value.equals(jsonTemplateField.value) : jsonTemplateField.value != null) { + return false; + } + if (visible != null ? !visible.equals(jsonTemplateField.visible) : jsonTemplateField.visible != null) { + return false; + } + return staticValue != null ? staticValue.equals(jsonTemplateField.staticValue) : + jsonTemplateField.staticValue == null; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + if (object == null || getClass() != object.getClass()) { + return false; + } + + JsonTemplateField jsonTemplateField = (JsonTemplateField) object; + + return title != null ? title.equals(jsonTemplateField.title) : jsonTemplateField.title == null; + } + + @Override + public int hashCode() { + return title != null ? title.hashCode() : 0; + } + + /** + * This method test the entire equality. + * + * @param jsonTemplateField1 object one + * @param jsonTemplateField2 object two + * @return true if they are totally equals (all attributes, false otherwise + */ + public static boolean fieldsEquals(JsonTemplateField jsonTemplateField1, JsonTemplateField jsonTemplateField2) { + return (jsonTemplateField2.getTitle().equals(jsonTemplateField1.getTitle()) + && jsonTemplateField2.getValue().equals(jsonTemplateField1.getValue()) + && jsonTemplateField2.getVisible().equals(jsonTemplateField1.getVisible()) + && jsonTemplateField2.getStaticValue().equals(jsonTemplateField1.getStaticValue())); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateManager.java b/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateManager.java new file mode 100644 index 000000000..1813d0786 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/tosca/update/templates/JsonTemplateManager.java @@ -0,0 +1,185 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update.templates; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.onap.policy.clamp.clds.tosca.update.UnknownComponentException; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElement; +import org.onap.policy.clamp.clds.tosca.update.parser.ToscaConverterToJsonSchema; +import org.onap.policy.clamp.clds.tosca.update.parser.ToscaElementParser; +import org.onap.policy.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParser; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.service.Service; + +public class JsonTemplateManager { + private LinkedHashMap jsonSchemaTemplates; + private LinkedHashMap toscaElements; + + /** + * Constructor. + * + * @param toscaYamlContent Policy Tosca Yaml content as string + * @param nativeToscaDatatypes The tosca yaml with tosca native datatypes + * @param jsonSchemaTemplates template properties as string + */ + public JsonTemplateManager(String toscaYamlContent, String nativeToscaDatatypes, String jsonSchemaTemplates) { + if (toscaYamlContent != null && !toscaYamlContent.isEmpty()) { + this.toscaElements = ToscaElementParser.searchAllToscaElements(toscaYamlContent, nativeToscaDatatypes); + this.jsonSchemaTemplates = initializeTemplates(jsonSchemaTemplates); + } else { + toscaElements = null; + } + } + + //GETTERS & SETTERS + public LinkedHashMap getToscaElements() { + return toscaElements; + } + + public void setToscaElements(LinkedHashMap toscaElements) { + this.toscaElements = toscaElements; + } + + public LinkedHashMap getJsonSchemaTemplates() { + return jsonSchemaTemplates; + } + + public void setJsonSchemaTemplates(LinkedHashMap jsonSchemaTemplates) { + this.jsonSchemaTemplates = jsonSchemaTemplates; + } + + /** + * Add a template. + * + * @param name name + * @param jsonTemplateFields fields + */ + public void addTemplate(String name, List jsonTemplateFields) { + JsonTemplate jsonTemplate = new JsonTemplate(name, jsonTemplateFields); + //If it is true, the operation does not have any interest : + // replace OR put two different object with the same body + if (!jsonSchemaTemplates.containsKey(jsonTemplate.getName()) || !this.hasTemplate(jsonTemplate)) { + this.jsonSchemaTemplates.put(jsonTemplate.getName(), jsonTemplate); + } + } + + /** + * By name, find and remove a given template. + * + * @param nameTemplate name template + */ + public void removeTemplate(String nameTemplate) { + this.jsonSchemaTemplates.remove(nameTemplate); + } + + /** + * Update Template : adding with true flag, removing with false. + * + * @param nameTemplate name template + * @param jsonTemplateField field name + * @param operation operation + */ + public void updateTemplate(String nameTemplate, JsonTemplateField jsonTemplateField, Boolean operation) { + // Operation = true && field is not present => add Field + if (operation + && !this.jsonSchemaTemplates.get(nameTemplate).getJsonTemplateFields().contains(jsonTemplateField)) { + this.jsonSchemaTemplates.get(nameTemplate).addField(jsonTemplateField); + } else if (!operation + && this.jsonSchemaTemplates.get(nameTemplate).getJsonTemplateFields().contains(jsonTemplateField)) { + // Operation = false && field is present => remove Field + this.jsonSchemaTemplates.get(nameTemplate).removeField(jsonTemplateField); + } + } + + /** + * Check if the JSONTemplates have the same bodies. + * + * @param jsonTemplate template + * @return a boolean + */ + public boolean hasTemplate(JsonTemplate jsonTemplate) { + boolean duplicateTemplate = false; + Collection templatesName = jsonSchemaTemplates.keySet(); + if (templatesName.contains(jsonTemplate.getName())) { + JsonTemplate existingJsonTemplate = jsonSchemaTemplates.get(jsonTemplate.getName()); + duplicateTemplate = existingJsonTemplate.checkFields(jsonTemplate); + } + return duplicateTemplate; + } + + /** + * For a given policy type, get a corresponding JsonObject from the tosca model. + * + * @param policyType The policy type in the tosca + * @param toscaMetadataParser The MetadataParser class that must be used if metadata section are encountered, + * if null they will be skipped + * @return an json object defining the equivalent json schema from the tosca for a given policy type + */ + public JsonObject getJsonSchemaForPolicyType(String policyType, ToscaMetadataParser toscaMetadataParser, + Service serviceModel) + throws UnknownComponentException { + ToscaConverterToJsonSchema + toscaConverterToJsonSchema = new ToscaConverterToJsonSchema(toscaElements, jsonSchemaTemplates, + toscaMetadataParser, serviceModel); + if (toscaConverterToJsonSchema.getToscaElement(policyType) == null) { + throw new UnknownComponentException(policyType); + } + return toscaConverterToJsonSchema.getJsonSchemaOfToscaElement(policyType); + } + + /** + * Create and complete several Templates from file.properties. + * + * @param jsonTemplates The template properties as String + * @return a map + */ + @SuppressWarnings("unused") + private LinkedHashMap initializeTemplates(String jsonTemplates) { + + LinkedHashMap generatedTemplates = new LinkedHashMap<>(); + JsonObject templates = JsonUtils.GSON.fromJson(jsonTemplates, JsonObject.class); + + for (Map.Entry templateAsJson : templates.entrySet()) { + JsonTemplate jsonTemplate = new JsonTemplate(templateAsJson.getKey()); + JsonObject templateBody = (JsonObject) templateAsJson.getValue(); + for (Map.Entry field : templateBody.entrySet()) { + String fieldName = field.getKey(); + JsonObject bodyFieldAsJson = (JsonObject) field.getValue(); + Object fieldValue = bodyFieldAsJson.get("defaultValue").getAsString(); + Boolean fieldVisible = bodyFieldAsJson.get("visible").getAsBoolean(); + Boolean fieldStatic = bodyFieldAsJson.get("static").getAsBoolean(); + JsonTemplateField + bodyJsonTemplateField = new JsonTemplateField(fieldName, fieldValue, fieldVisible, fieldStatic); + jsonTemplate.getJsonTemplateFields().add(bodyJsonTemplateField); + } + generatedTemplates.put(jsonTemplate.getName(), jsonTemplate); + } + return generatedTemplates; + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/clds/util/ClampVersioning.java b/src/main/java/org/onap/policy/clamp/clds/util/ClampVersioning.java new file mode 100644 index 000000000..0890615d9 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/util/ClampVersioning.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * Modifications copyright (c) 2018 Nokia + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.InputStream; +import java.util.Properties; + +/** + * This class give a way to know the Clamp version easily, the version in that + * file is set by maven at build time. + * + */ +public class ClampVersioning { + private static final String RESOURCE_NAME = "clds-version.properties"; + private static final String CLDS_VERSION_PROPERTY = "clds.version"; + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ClampVersioning.class); + + private ClampVersioning() { + } + + /** + * Returns Clds version from properties. + * + * @return Clds version from properties + */ + public static String getCldsVersionFromProps() { + String cldsVersion = ""; + Properties props = new Properties(); + try (InputStream resourceStream = ResourceFileUtils.getResourceAsStream(RESOURCE_NAME)) { + props.load(resourceStream); + cldsVersion = props.getProperty(CLDS_VERSION_PROPERTY); + } catch (Exception ex) { + LOGGER.error("Exception caught during the " + CLDS_VERSION_PROPERTY + " property reading", ex); + } + return cldsVersion; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/util/CryptoUtils.java b/src/main/java/org/onap/policy/clamp/clds/util/CryptoUtils.java new file mode 100644 index 000000000..01dd48763 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/util/CryptoUtils.java @@ -0,0 +1,168 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.common.base.Charsets; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; +import java.security.SecureRandom; +import java.util.Properties; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.lang3.ArrayUtils; + +/** + * CryptoUtils for encrypting/decrypting string based on a Key defined in + * application.properties (Spring config file). + */ +public final class CryptoUtils { + + /** + * Used to log CryptoUtils class. + */ + private static final EELFLogger logger = EELFManager.getInstance().getLogger(CryptoUtils.class); + // Openssl commands: + // Encrypt: echo -n "123456" | openssl aes-128-cbc -e -K + // -iv <16 Bytes iv (HEX), be careful it's 32 Hex Chars> | xxd -u -g100 + // Final result is to put in properties file is: IV + Outcome of openssl + // command + // ************************************************************ + // Decrypt: echo -n 'Encrypted string' | xxd -r -ps | openssl aes-128-cbc -d + // -K + // -iv <16 Bytes IV extracted from Encrypted String, be + // careful it's 32 Hex Chars> + /** + * Definition of encryption algorithm. + */ + private static final String ALGORITHM = "AES"; + + /** + * AES Encryption Key environment variable for external configuration. + */ + private static final String AES_ENCRYPTION_KEY = "AES_ENCRYPTION_KEY"; + + /** + * Detailed definition of encryption algorithm. + */ + private static final String ALGORITHM_DETAILS = ALGORITHM + "/CBC/PKCS5PADDING"; + private static final int IV_BLOCK_SIZE_IN_BITS = 128; + /** + * An Initial Vector of 16 Bytes, so 32 Hexadecimal Chars. + */ + private static final int IV_BLOCK_SIZE_IN_BYTES = IV_BLOCK_SIZE_IN_BITS / 8; + /** + * Key to read in the key.properties file. + */ + private static final String KEY_PARAM = "org.onap.policy.clamp.encryption.aes.key"; + private static final String PROPERTIES_FILE_NAME = "clds/key.properties"; + /** + * The SecretKeySpec created from the Base 64 String key. + */ + private static final SecretKeySpec SECRET_KEY_SPEC = readSecretKeySpec(PROPERTIES_FILE_NAME); + + /** + * Private constructor to avoid creating instances of util class. + */ + private CryptoUtils() { + } + + /** + * Encrypt a value based on the Clamp Encryption Key. + * + * @param value The value to encrypt + * @return The encrypted string + * @throws GeneralSecurityException In case of issue with the encryption + * @throws UnsupportedEncodingException In case of issue with the charset + * conversion + */ + public static String encrypt(String value) throws GeneralSecurityException { + Cipher cipher = Cipher.getInstance(ALGORITHM_DETAILS, "SunJCE"); + byte[] iv = new byte[IV_BLOCK_SIZE_IN_BYTES]; + SecureRandom.getInstance("SHA1PRNG").nextBytes(iv); + IvParameterSpec ivspec = new IvParameterSpec(iv); + cipher.init(Cipher.ENCRYPT_MODE, SECRET_KEY_SPEC, ivspec); + return Hex.encodeHexString(ArrayUtils.addAll(iv, cipher.doFinal(value.getBytes(Charsets.UTF_8)))); + } + + /** + * Decrypt a value based on the Clamp Encryption Key. + * + * @param message The encrypted string that must be decrypted using the Clamp + * Encryption Key + * @return The String decrypted + * @throws GeneralSecurityException In case of issue with the encryption + * @throws DecoderException In case of issue to decode the HexString + */ + public static String decrypt(String message) throws GeneralSecurityException, DecoderException { + byte[] encryptedMessage = Hex.decodeHex(message.toCharArray()); + Cipher cipher = Cipher.getInstance(ALGORITHM_DETAILS, "SunJCE"); + IvParameterSpec ivspec = new IvParameterSpec(ArrayUtils.subarray(encryptedMessage, 0, IV_BLOCK_SIZE_IN_BYTES)); + byte[] realData = ArrayUtils.subarray(encryptedMessage, IV_BLOCK_SIZE_IN_BYTES, encryptedMessage.length); + cipher.init(Cipher.DECRYPT_MODE, SECRET_KEY_SPEC, ivspec); + byte[] decrypted = cipher.doFinal(realData); + return new String(decrypted); + } + + /** + * Method used to generate the SecretKeySpec from a Base64 String. + * + * @param keyString The key as a string in Base 64 + * @return The SecretKeySpec created + * @throws DecoderException In case of issues with the decoding of Base64 + */ + private static SecretKeySpec getSecretKeySpec(String keyString) throws DecoderException { + byte[] key = Hex.decodeHex(keyString.toCharArray()); + return new SecretKeySpec(key, ALGORITHM); + } + + /** + * Reads SecretKeySpec from file specified by propertiesFileName. + * + * @param propertiesFileName File name with properties + * @return SecretKeySpec secret key spec read from propertiesFileName + */ + private static SecretKeySpec readSecretKeySpec(String propertiesFileName) { + Properties props = new Properties(); + try { + // Workaround fix to make encryption key configurable + // System environment variable takes precedence for over clds/key.properties + String encryptionKey = System.getenv(AES_ENCRYPTION_KEY); + if (encryptionKey != null && encryptionKey.trim().length() > 0) { + return getSecretKeySpec(encryptionKey); + } else { + props.load(ResourceFileUtils.getResourceAsStream(propertiesFileName)); + return getSecretKeySpec(props.getProperty(KEY_PARAM)); + } + } catch (IOException | DecoderException e) { + logger.error("Exception occurred during the key reading", e); + return null; + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/util/JsonUtils.java b/src/main/java/org/onap/policy/clamp/clds/util/JsonUtils.java new file mode 100644 index 000000000..d57ce2095 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/util/JsonUtils.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.time.Instant; +import org.onap.policy.clamp.authorization.SecureServicePermission; +import org.onap.policy.clamp.authorization.SecureServicePermissionDeserializer; +import org.onap.policy.clamp.dao.model.gson.converter.InstantDeserializer; +import org.onap.policy.clamp.dao.model.gson.converter.InstantSerializer; + +/** + * This class is used to access the GSON with restricted type access. + */ +public class JsonUtils { + + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(JsonUtils.class); + + public static final Gson GSON = new GsonBuilder() + .registerTypeAdapter(SecureServicePermission.class, new SecureServicePermissionDeserializer()).create(); + + public static final Gson GSON_JPA_MODEL = new GsonBuilder() + .registerTypeAdapter(Instant.class, new InstantSerializer()) + .registerTypeAdapter(Instant.class, new InstantDeserializer()).setPrettyPrinting() + .excludeFieldsWithoutExposeAnnotation().create(); + + private JsonUtils() { + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/util/LogMessages.java b/src/main/java/org/onap/policy/clamp/clds/util/LogMessages.java new file mode 100644 index 000000000..676206e0f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/util/LogMessages.java @@ -0,0 +1,36 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import com.att.eelf.i18n.EELFResolvableErrorEnum; +import com.att.eelf.i18n.EELFResourceManager; + +public enum LogMessages implements EELFResolvableErrorEnum { + LOGSERVICE_HELLO_MESSAGE, LOGSERVICE_EMAIL_ERROR, LOGSERVICE_EMAIL_CLASS, LOGSERVICE_EMAIL_CLASS_NULL, + PROCESS_INSTANCE_ID; + + static { + EELFResourceManager.loadMessageBundle("logmessages"); + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java b/src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java new file mode 100644 index 000000000..d7a158e73 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java @@ -0,0 +1,414 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.URLConnection; +import java.net.UnknownHostException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.TimeZone; +import java.util.UUID; +import javax.net.ssl.HttpsURLConnection; +import javax.servlet.http.HttpServletRequest; +import javax.validation.constraints.NotNull; +import org.onap.policy.clamp.authorization.AuthorizationController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.slf4j.event.Level; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * This class handles the special info that appear in the log, like RequestID, + * time context, ... + */ +public class LoggingUtils { + + protected static final Logger logger = LoggerFactory.getLogger(LoggingUtils.class); + + private static final DateFormat DATE_FORMAT = createDateFormat(); + + private static final String DATE_FORMATTER_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; + + /** String constant for messages ENTERING, EXITING, etc. */ + private static final String EMPTY_MESSAGE = ""; + + /** Logger delegate. */ + private Logger mlogger; + + /** Automatic UUID, overrideable per adapter or per invocation. */ + private static UUID sInstanceUUID = UUID.randomUUID(); + + /** + * Constructor. + */ + public LoggingUtils(final Logger loggerP) { + this.mlogger = checkNotNull(loggerP); + } + + /** + * Set request related logging variables in thread local data via MDC. + * + * @param service Service Name of API (ex. "PUT template") + * @param partner Partner name (client or user invoking API) + */ + public static void setRequestContext(String service, String partner) { + MDC.put("RequestId", UUID.randomUUID().toString()); + MDC.put("ServiceName", service); + MDC.put("PartnerName", partner); + // Defaulting to HTTP/1.1 protocol + MDC.put("Protocol", "HTTP/1.1"); + try { + MDC.put("ServerFQDN", InetAddress.getLocalHost().getCanonicalHostName()); + MDC.put("ServerIPAddress", InetAddress.getLocalHost().getHostAddress()); + } catch (UnknownHostException e) { + logger.error("Failed to initiate setRequestContext", e); + } + } + + /** + * Set time related logging variables in thread local data via MDC. + * + * @param beginTimeStamp Start time + * @param endTimeStamp End time + */ + public static void setTimeContext(@NotNull Date beginTimeStamp, @NotNull Date endTimeStamp) { + MDC.put("EntryTimestamp", generateTimestampStr(beginTimeStamp)); + MDC.put("EndTimestamp", generateTimestampStr(endTimeStamp)); + MDC.put("ElapsedTime", String.valueOf(endTimeStamp.getTime() - beginTimeStamp.getTime())); + } + + /** + * Set response related logging variables in thread local data via MDC. + * + * @param code Response code ("0" indicates success) + * @param description Response description + * @param className class name of invoking class + */ + public static void setResponseContext(String code, String description, String className) { + MDC.put("ResponseCode", code); + MDC.put("StatusCode", "0".equals(code) ? "COMPLETE" : "ERROR"); + MDC.put("ResponseDescription", description != null ? description : ""); + MDC.put("ClassName", className != null ? className : ""); + } + + /** + * Set target related logging variables in thread local data via MDC. + * + * @param targetEntity Target entity (an external/sub component, for ex. "sdc") + * @param targetServiceName Target service name (name of API invoked on target) + */ + public static void setTargetContext(String targetEntity, String targetServiceName) { + MDC.put("TargetEntity", targetEntity != null ? targetEntity : ""); + MDC.put("TargetServiceName", targetServiceName != null ? targetServiceName : ""); + } + + /** + * Set error related logging variables in thread local data via MDC. + * + * @param code Error code + * @param description Error description + */ + public static void setErrorContext(String code, String description) { + MDC.put("ErrorCode", code); + MDC.put("ErrorDescription", description != null ? description : ""); + } + + private static String generateTimestampStr(Date timeStamp) { + return DATE_FORMAT.format(timeStamp); + } + + /** + * Get a previously stored RequestID for the thread local data via MDC. If + * one was not previously stored, generate one, store it, and return that + * one. + * + * @return A string with the request ID + */ + public static String getRequestId() { + String requestId = MDC.get(OnapLogConstants.Mdcs.REQUEST_ID); + if (requestId == null || requestId.isEmpty()) { + requestId = UUID.randomUUID().toString(); + MDC.put(OnapLogConstants.Mdcs.REQUEST_ID, requestId); + } + return requestId; + } + + private static DateFormat createDateFormat() { + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + return dateFormat; + } + + /* ******************************************************************************************* + * Method for ONAP Application Logging Specification v1.2 + * *******************************************************************************************/ + + /** + * Report ENTERING marker. + * + * @param request non-null incoming request (wrapper) + * @param serviceName service name + */ + public void entering(HttpServletRequest request, String serviceName) { + // MDC.clear(); + checkNotNull(request); + // Extract MDC values from standard HTTP headers. + final String requestId = + defaultToUuid(request.getHeader(OnapLogConstants.Headers.REQUEST_ID)); + final String invocationId = + defaultToUuid(request.getHeader(OnapLogConstants.Headers.INVOCATION_ID)); + final String partnerName = + defaultToEmpty(request.getHeader(OnapLogConstants.Headers.PARTNER_NAME)); + + // Default the partner name to the user name used to login to clamp + if (partnerName.equalsIgnoreCase(EMPTY_MESSAGE)) { + MDC.put(OnapLogConstants.Mdcs.PARTNER_NAME, + AuthorizationController.getPrincipalName(SecurityContextHolder.getContext())); + } + + // Set standard MDCs. Override this entire method if you want to set + // others, OR set them BEFORE or AFTER the invocation of #entering, + // depending on where you need them to appear, OR extend the + // ServiceDescriptor to add them. + MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, ZonedDateTime.now(ZoneOffset.UTC) + .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO))); + MDC.put(OnapLogConstants.Mdcs.REQUEST_ID, requestId); + MDC.put(OnapLogConstants.Mdcs.INVOCATION_ID, invocationId); + MDC.put(OnapLogConstants.Mdcs.CLIENT_IP_ADDRESS, defaultToEmpty(request.getRemoteAddr())); + MDC.put(OnapLogConstants.Mdcs.SERVER_FQDN, defaultToEmpty(request.getServerName())); + MDC.put(OnapLogConstants.Mdcs.INSTANCE_UUID, defaultToEmpty(sInstanceUUID)); + + // Default the service name to the requestURI, in the event that + // no value has been provided. + if (serviceName == null || serviceName.equalsIgnoreCase(EMPTY_MESSAGE)) { + MDC.put(OnapLogConstants.Mdcs.SERVICE_NAME, request.getRequestURI()); + } else { + MDC.put(OnapLogConstants.Mdcs.SERVICE_NAME, serviceName); + } + + // Set the Response Status code to in progress + MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE, + OnapLogConstants.ResponseStatus.INPROGRESS.toString()); + setElapsedTime(); + + this.mlogger.info(OnapLogConstants.Markers.ENTRY, "Entering"); + } + + /** + * Report EXITING marker. + * + * + * @param code response code + * @param descrption response description + * @param severity response severity + * @param status response status code + */ + public void exiting(int code, String descrption, Level severity, + OnapLogConstants.ResponseStatus status) { + try { + + MDC.put(OnapLogConstants.Mdcs.RESPONSE_CODE, defaultToEmpty(code)); + MDC.put(OnapLogConstants.Mdcs.RESPONSE_DESCRIPTION, defaultToEmpty(descrption)); + MDC.put(OnapLogConstants.Mdcs.RESPONSE_SEVERITY, defaultToEmpty(severity)); + MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE, defaultToEmpty(status)); + + setElapsedTime(); + this.mlogger.info(OnapLogConstants.Markers.EXIT, "Exiting"); + } finally { + MDC.clear(); + } + } + + private void setElapsedTime() { + ZonedDateTime startTime = + ZonedDateTime.parse(MDC.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP), + DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneOffset.UTC)); + ZonedDateTime endTime = ZonedDateTime.now(ZoneOffset.UTC); + long duration = ChronoUnit.MILLIS.between(startTime, endTime); + MDC.put(OnapLogConstants.Mdcs.ELAPSED_TIME, String.valueOf(duration)); + } + + /** + * Get the property value. + * + * @param name The name of the property + * @return The value of the property + */ + public String getProperties(String name) { + return MDC.get(name); + } + + /** + * Report pending invocation with INVOKE marker, + * setting standard ONAP logging headers automatically. + * + * @param con The HTTP url connection + * @param targetEntity The target entity + * @param targetServiceName The target service name + * @return The HTTP url connection + */ + public HttpURLConnection invoke(final HttpURLConnection con, String targetEntity, + String targetServiceName) { + return this.invokeGeneric(con, targetEntity, targetServiceName); + } + + /** + * Report pending invocation with INVOKE marker, + * setting standard ONAP logging headers automatically. + * + * @param targetEntity The target entity + * @param targetServiceName The target service name + */ + public void invoke(String targetEntity, String targetServiceName) { + final String invocationId = UUID.randomUUID().toString(); + + invokeContext(targetEntity, targetServiceName, invocationId); + + // Log INVOKE*, with the invocationID as the message body. + // (We didn't really want this kind of behavior in the standard, + // but is it worse than new, single-message MDC?) + this.mlogger.info(OnapLogConstants.Markers.INVOKE, "INVOKE"); + this.mlogger.info(OnapLogConstants.Markers.INVOKE_SYNCHRONOUS + "{" + invocationId + "}"); + } + + /** + * Report pending invocation with INVOKE marker, + * setting standard ONAP logging headers automatically. + * + * @param con The HTTPS url connection + * @param targetEntity The target entity + * @param targetServiceName The target service name + * @return The HTTPS url connection + */ + public HttpsURLConnection invokeHttps(final HttpsURLConnection con, String targetEntity, + String targetServiceName) { + return this.invokeGeneric(con, targetEntity, targetServiceName); + } + + /** + * Report pending invocation with INVOKE-RETURN marker. + */ + public void invokeReturn() { + MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE, + OnapLogConstants.ResponseStatus.COMPLETE.toString()); + // Add the Invoke-return marker and clear the needed MDC + this.mlogger.info(OnapLogConstants.Markers.INVOKE_RETURN, "INVOKE-RETURN"); + invokeReturnContext(); + } + + /** + * Dependency-free nullcheck. + * + * @param in to be checked + * @param argument (and return) type + * @return input arg + */ + private static T checkNotNull(final T in) { + if (in == null) { + throw new NullPointerException(); + } + return in; + } + + /** + * Dependency-free string default. + * + * @param in to be filtered + * @return input string or null + */ + private static String defaultToEmpty(final Object in) { + if (in == null) { + return ""; + } + return in.toString(); + } + + /** + * Dependency-free string default. + * + * @param in to be filtered + * @return input string or null + */ + private static String defaultToUuid(final String in) { + if (in == null) { + return UUID.randomUUID().toString(); + } + return in; + } + + /** + * Set target related logging variables in thread local data via MDC. + * + * @param targetEntity Target entity (an external/sub component, for ex. "sdc") + * @param targetServiceName Target service name (name of API invoked on target) + * @param invocationId The invocation ID + */ + private void invokeContext(String targetEntity, String targetServiceName, String invocationId) { + MDC.put(OnapLogConstants.Mdcs.TARGET_ENTITY, defaultToEmpty(targetEntity)); + MDC.put(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME, defaultToEmpty(targetServiceName)); + MDC.put(OnapLogConstants.Mdcs.INVOCATIONID_OUT, invocationId); + MDC.put(OnapLogConstants.Mdcs.INVOKE_TIMESTAMP, ZonedDateTime.now(ZoneOffset.UTC) + .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO))); + } + + /** + * Clear target related logging variables in thread local data via MDC. + */ + private void invokeReturnContext() { + MDC.remove(OnapLogConstants.Mdcs.TARGET_ENTITY); + MDC.remove(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME); + MDC.remove(OnapLogConstants.Mdcs.INVOCATIONID_OUT); + MDC.remove(OnapLogConstants.Mdcs.INVOKE_TIMESTAMP); + MDC.remove(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE); + } + + private T invokeGeneric(final T con, String targetEntity, + String targetServiceName) { + final String invocationId = UUID.randomUUID().toString(); + + // Set standard HTTP headers on (southbound request) builder. + con.setRequestProperty(OnapLogConstants.Headers.REQUEST_ID, + defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.REQUEST_ID))); + con.setRequestProperty(OnapLogConstants.Headers.INVOCATION_ID, invocationId); + con.setRequestProperty(OnapLogConstants.Headers.PARTNER_NAME, + defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.PARTNER_NAME))); + + invokeContext(targetEntity, targetServiceName, invocationId); + + // Log INVOKE*, with the invocationID as the message body. + // (We didn't really want this kind of behavior in the standard, + // but is it worse than new, single-message MDC?) + this.mlogger.info(OnapLogConstants.Markers.INVOKE, ""); + this.mlogger.info(OnapLogConstants.Markers.INVOKE_SYNCHRONOUS + "{" + invocationId + "}"); + return con; + } +} diff --git a/src/main/java/org/onap/policy/clamp/clds/util/OnapLogConstants.java b/src/main/java/org/onap/policy/clamp/clds/util/OnapLogConstants.java new file mode 100644 index 000000000..78b16f1a0 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/util/OnapLogConstants.java @@ -0,0 +1,304 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; + +/** + * Constants for standard ONAP headers, MDCs, etc. + */ +public final class OnapLogConstants { + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // + // Constructors. + // + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + /** + * Hide and forbid construction. + */ + private OnapLogConstants() { + throw new UnsupportedOperationException(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // + // Inner classes. + // + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + /** + * Marker constants. + */ + public static final class Markers { + + /** Marker reporting invocation. */ + public static final Marker INVOKE = MarkerFactory.getMarker("INVOKE"); + + /** Marker reporting invocation return. */ + public static final Marker INVOKE_RETURN = MarkerFactory.getMarker("INVOKE-RETURN"); + + /** Marker reporting synchronous invocation. */ + public static final Marker INVOKE_SYNCHRONOUS = build("INVOKE", "SYNCHRONOUS"); + + /** Marker reporting asynchronous invocation. */ + public static final Marker INVOKE_ASYNCHRONOUS = build("INVOKE", "ASYNCHRONOUS"); + + /** Marker reporting entry into a component. */ + public static final Marker ENTRY = MarkerFactory.getMarker("ENTRY"); + + /** Marker reporting exit from a component. */ + public static final Marker EXIT = MarkerFactory.getMarker("EXIT"); + + /** + * Build nested, detached marker. + * + * @param m1 top token. + * @param m2 sub-token. + * @return detached Marker. + */ + private static Marker build(final String m1, final String m2) { + final Marker marker = MarkerFactory.getDetachedMarker(m1); + marker.add(MarkerFactory.getDetachedMarker(m2)); + return marker; + } + + /** + * Hide and forbid construction. + */ + private Markers() { + throw new UnsupportedOperationException(); + } + } + + /** + * MDC name constants. + */ + public static final class Mdcs { + + // Tracing. //////////////////////////////////////////////////////////// + + /** MDC correlating messages for an invocation. */ + public static final String INVOCATION_ID = "InvocationID"; + + public static final String SERVER_INVOCATION_ID = "ServerInvocationId"; + + public static final String CLIENT_INVOCATION_ID = "ClientInvocationId"; + + /** MDC correlating messages for a logical transaction. */ + public static final String REQUEST_ID = "RequestID"; + + /** MDC recording calling partner name. */ + public static final String PARTNER_NAME = "PartnerName"; + + /** MDC recording current service. */ + public static final String SERVICE_NAME = "ServiceName"; + + /** MDC recording target service. */ + public static final String TARGET_SERVICE_NAME = "TargetServiceName"; + + /** MDC recording InvocationID Out. */ + public static final String INVOCATIONID_OUT = "InvocationIDOut"; + + /** MDC recording target entity. */ + public static final String TARGET_ENTITY = "TargetEntity"; + + /** MDC recording target element. */ + public static final String TARGET_ELEMENT = "TargetElement"; + + /** MDC recording current service instance id. */ + public static final String SERVICE_INSTANCE_ID = "ServiceInstanceID"; + + /** MDC recording current instance id. */ + public static final String INSTANCE_UUID = "InstanceID"; + + // Network. //////////////////////////////////////////////////////////// + + /** MDC recording caller address. */ + public static final String CLIENT_IP_ADDRESS = "ClientIPAddress"; + + /** MDC recording server IP address. */ + public static final String SERVER_IP_ADDRESS = "ServerIPAddress"; + + /** MDC recording server FQDN. */ + public static final String SERVER_FQDN = "ServerFQDN"; + + /** MDC recording virtual server name. */ + public static final String VIRTUAL_SERVER_NAME = "VirtualServerName"; + + /** MDC recording context name. */ + public static final String CONTEXT_NAME = "ContextName"; + + /** + * MDC recording timestamp at the start of the current request, + * with the same scope as {@link #REQUEST_ID}. + * + *

+ * Open issues: + *

    + *
      + * Easily confused with {@link #INVOKE_TIMESTAMP}. + *
    + *
      + * No mechanism for propagation between components, e.g. via HTTP headers. + *
    + *
      + * Whatever mechanism we define, it's going to be costly. + *
    + *
+ *

+ */ + public static final String ENTRY_TIMESTAMP = "EntryTimestamp"; + + /** MDC recording timestamp at the start of the current invocation. */ + public static final String INVOKE_TIMESTAMP = "InvokeTimestamp"; + + /** MDC recording elapsed time. */ + public static final String ELAPSED_TIME = "ElapsedTime"; + + /** MDC recording log timestamp. */ + public static final String LOG_TIMESTAMP = "LogTimestamp"; + + // Outcomes. /////////////////////////////////////////////////////////// + + /** MDC reporting outcome code. */ + public static final String RESPONSE_CODE = "ResponseCode"; + + /** MDC reporting outcome description. */ + public static final String RESPONSE_DESCRIPTION = "ResponseDesc"; + + /** MDC reporting severity. */ + public static final String RESPONSE_SEVERITY = "Severity"; + + /** MDC reporting response status code. */ + public static final String RESPONSE_STATUS_CODE = "StatusCode"; + + /** MDC recording error code. */ + public static final String ERROR_CODE = "ErrorCode"; + + /** MDC recording error description. */ + public static final String ERROR_DESC = "ErrorDesc"; + + // Unsorted. /////////////////////////////////////////////////////////// + + /** + * Hide and forbid construction. + */ + private Mdcs() { + throw new UnsupportedOperationException(); + } + } + + /** + * Header name constants. + */ + public static final class Headers { + + /** HTTP X-ONAP-RequestID header. */ + public static final String REQUEST_ID = "X-ONAP-RequestID"; + + /** HTTP X-InvocationID header. */ + public static final String INVOCATION_ID = "X-ONAP-InvocationID"; + + /** HTTP X-ONAP-PartnerName header. */ + public static final String PARTNER_NAME = "X-ONAP-PartnerName"; + + /** + * Hide and forbid construction. + */ + private Headers() { + throw new UnsupportedOperationException(); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // + // Enums. + // + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + /** + * Response success or not, for setting StatusCode. + */ + public enum ResponseStatus { + + /** Success. */ + COMPLETE, + + /** Not. */ + ERROR, + + /** In Progress. */ + INPROGRESS + } + + /** + * Synchronous or asynchronous execution, for setting invocation marker. + */ + public enum InvocationMode { + + /** Synchronous, blocking. */ + SYNCHRONOUS("SYNCHRONOUS", Markers.INVOKE_SYNCHRONOUS), + + /** Asynchronous, non-blocking. */ + ASYNCHRONOUS("ASYNCHRONOUS", Markers.INVOKE_ASYNCHRONOUS); + + /** Enum value. */ + private String enumValue; + + /** Corresponding marker. */ + private Marker marker; + + /** + * Construct enum. + * + * @param enumValue enum value. + * @param marker corresponding Marker. + */ + InvocationMode(final String enumValue, final Marker marker) { + this.enumValue = enumValue; + this.marker = marker; + } + + /** + * Get Marker for enum. + * + * @return Marker. + */ + public Marker getMarker() { + return this.marker; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return this.enumValue; + } + } + +} diff --git a/src/main/java/org/onap/policy/clamp/clds/util/ResourceFileUtils.java b/src/main/java/org/onap/policy/clamp/clds/util/ResourceFileUtils.java new file mode 100644 index 000000000..cd4700277 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/clds/util/ResourceFileUtils.java @@ -0,0 +1,89 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Scanner; + +/** + * Utility methods supporting resources accesses. + */ +public final class ResourceFileUtils { + + /** + * getResourceAsStram supports the "file:" prefix as they use URL. + * So here we want to eliminate classpath: prefix, so that this class can get + * files from jar resource or file system. + */ + + private static final String CLASSPATH_PREFIX = "classpath:"; + + /** + * Private constructor to avoid creating instances of util class. + */ + private ResourceFileUtils() { + } + + /** + * Method to access a file from the jar resource folder or file system. + * Give the prefix "classpath:" so that it accesses the jar resource folder (default case) + * or the prefix "file:" so that it accesses the file system. + * + * @param fileName The path of the resource (no prefix it will be a classpath access, + * "classpath:/myfilename" or "file:/myfilename") + * @return The file as inputStream + */ + public static InputStream getResourceAsStream(String fileName) { + InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( + fileName.startsWith(CLASSPATH_PREFIX) ? fileName.replaceFirst(CLASSPATH_PREFIX, "") : fileName); + if (is == null) { + throw new IllegalArgumentException("Unable to find resource: " + fileName); + } + return is; + } + + /** + * Method to access a resource file as a string. + * Give the prefix "classpath:" so that it accesses the jar resource folder (default case) + * or the prefix "file:" so that it accesses the file system. + * + * @param fileName The path of the resource (no prefix it will be a classpath access, + * "classpath:/myfilename" or "file:/myfilename") + * @return The file as String + * @throws IOException In case of failure to find the file. + */ + public static String getResourceAsString(String fileName) throws IOException { + try (InputStream is = getResourceAsStream(fileName)) { + return streamToString(is); + } + } + + private static String streamToString(InputStream inputStream) { + try (Scanner scanner = new Scanner(inputStream)) { + Scanner delimitedScanner = scanner.useDelimiter("\\A"); + return delimitedScanner.hasNext() ? delimitedScanner.next() : ""; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/configuration/ClampGsonDataFormat.java b/src/main/java/org/onap/policy/clamp/configuration/ClampGsonDataFormat.java new file mode 100644 index 000000000..e5f12163e --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/configuration/ClampGsonDataFormat.java @@ -0,0 +1,170 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + */ + +package org.onap.policy.clamp.configuration; + +import com.google.gson.Gson; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import org.apache.camel.Exchange; +import org.apache.camel.spi.DataFormat; +import org.apache.camel.spi.DataFormatName; +import org.apache.camel.support.ServiceSupport; +import org.apache.camel.util.IOHelper; +import org.onap.policy.clamp.clds.util.JsonUtils; + +public class ClampGsonDataFormat extends ServiceSupport implements DataFormat, DataFormatName { + private Gson gson; + private Class unmarshalType; + private Type unmarshalGenericType; + private boolean contentTypeHeader = true; + + public ClampGsonDataFormat() { + this(Object.class); + } + + /** + * Use the default Gson {@link Gson} and with a custom unmarshal type. + * + * @param unmarshalType the custom unmarshal type + */ + public ClampGsonDataFormat(Class unmarshalType) { + this(null, unmarshalType); + } + + /** + * Use a custom Gson mapper and and unmarshal type. + * + * @param gson the custom mapper + * @param unmarshalType the custom unmarshal type + */ + public ClampGsonDataFormat(Gson gson, Class unmarshalType) { + this.gson = gson; + this.unmarshalType = unmarshalType; + } + + /** + * Use the default Gson {@link Gson} and with a custom unmarshal generic type. + * + * @param unmarshalGenericType the custom unmarshal generic type + */ + public ClampGsonDataFormat(Type unmarshalGenericType) { + this(null, unmarshalGenericType); + } + + /** + * Use a custom Gson mapper and and unmarshal token type. + * + * @param gson the custom mapper + * @param unmarshalGenericType the custom unmarshal generic type + */ + public ClampGsonDataFormat(Gson gson, Type unmarshalGenericType) { + this.gson = gson; + this.unmarshalGenericType = unmarshalGenericType; + } + + @Override + public String getDataFormatName() { + return "clamp-gson"; + } + + @Override + public void marshal(final Exchange exchange, final Object graph, final OutputStream stream) throws Exception { + try (final OutputStreamWriter osw = new OutputStreamWriter(stream, StandardCharsets.UTF_8); + final BufferedWriter writer = IOHelper.buffered(osw)) { + gson.toJson(graph, writer); + } + + if (contentTypeHeader) { + if (exchange.hasOut()) { + exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "application/json"); + } else { + exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); + } + } + } + + @Override + public Object unmarshal(final Exchange exchange, final InputStream stream) throws Exception { + try (final InputStreamReader isr = new InputStreamReader(stream, StandardCharsets.UTF_8); + final BufferedReader reader = IOHelper.buffered(isr)) { + if (unmarshalGenericType == null) { + return gson.fromJson(reader, unmarshalType); + } else { + return gson.fromJson(reader, unmarshalGenericType); + } + } + } + + @Override + protected void doStart() throws Exception { + if (gson == null) { + gson = JsonUtils.GSON_JPA_MODEL; + } + } + + @Override + protected void doStop() throws Exception { + // noop + } + + // Properties + // ------------------------------------------------------------------------- + + public Class getUnmarshalType() { + return this.unmarshalType; + } + + public void setUnmarshalType(Class unmarshalType) { + this.unmarshalType = unmarshalType; + } + + public Type getUnmarshalGenericType() { + return this.unmarshalGenericType; + } + + public void setUnmarshalGenericType(Type unmarshalGenericType) { + this.unmarshalGenericType = unmarshalGenericType; + } + + public boolean isContentTypeHeader() { + return contentTypeHeader; + } + + /** + * If enabled then Gson will set the Content-Type header to + * application/json when marshalling. + */ + public void setContentTypeHeader(boolean contentTypeHeader) { + this.contentTypeHeader = contentTypeHeader; + } + + public Gson getGson() { + return this.gson; + } +} diff --git a/src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantDeserializer.java b/src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantDeserializer.java new file mode 100644 index 000000000..db024e07a --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantDeserializer.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.dao.model.gson.converter; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import java.lang.reflect.Type; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; +import java.util.Locale; + +public class InstantDeserializer implements JsonDeserializer { + + DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.US) + .withZone(ZoneId.systemDefault()); + + @Override + public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { + return Instant.parse(json.getAsString()); + + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantSerializer.java b/src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantSerializer.java new file mode 100644 index 000000000..7208a472c --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/dao/model/gson/converter/InstantSerializer.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.dao.model.gson.converter; + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; +import java.time.Instant; +import java.time.format.DateTimeFormatter; + +public class InstantSerializer implements JsonSerializer { + + @Override + public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(DateTimeFormatter.ISO_INSTANT.format(src)); + } +} \ No newline at end of file diff --git a/src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java b/src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java new file mode 100644 index 000000000..d3aaa32a9 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonStringSqlTypeDescriptor.java @@ -0,0 +1,108 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.dao.model.jsontype; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import org.hibernate.type.descriptor.ValueBinder; +import org.hibernate.type.descriptor.ValueExtractor; +import org.hibernate.type.descriptor.WrapperOptions; +import org.hibernate.type.descriptor.java.JavaTypeDescriptor; +import org.hibernate.type.descriptor.sql.BasicBinder; +import org.hibernate.type.descriptor.sql.BasicExtractor; +import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; + +public class JsonStringSqlTypeDescriptor implements SqlTypeDescriptor { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = 1103168570216921981L; + + public static final JsonStringSqlTypeDescriptor INSTANCE = new JsonStringSqlTypeDescriptor(); + + @Override + public int getSqlType() { + return Types.OTHER; + } + + @Override + public boolean canBeRemapped() { + return true; + } + + @Override + public ValueBinder getBinder(JavaTypeDescriptor javaTypeDescriptor) { + return new BasicBinder(javaTypeDescriptor, this) { + @Override + protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) + throws SQLException { + st.setString(index, javaTypeDescriptor.unwrap(value, String.class, options)); + } + + @Override + protected void doBind(CallableStatement st, X value, String name, WrapperOptions options) + throws SQLException { + st.setString(name, javaTypeDescriptor.unwrap(value, String.class, options)); + } + }; + } + + @Override + public ValueExtractor getExtractor(JavaTypeDescriptor javaTypeDescriptor) { + return new BasicExtractor(javaTypeDescriptor, this) { + @Override + protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException { + return javaTypeDescriptor.wrap(extractJson(rs, name), options); + } + + @Override + protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException { + return javaTypeDescriptor.wrap(extractJson(statement, index), options); + } + + @Override + protected X doExtract(CallableStatement statement, String name, WrapperOptions options) + throws SQLException { + return javaTypeDescriptor.wrap(extractJson(statement, name), options); + } + }; + } + + protected Object extractJson(ResultSet rs, String name) throws SQLException { + return rs.getObject(name); + } + + protected Object extractJson(CallableStatement statement, int index) throws SQLException { + return statement.getObject(index); + } + + protected Object extractJson(CallableStatement statement, String name) throws SQLException { + return statement.getObject(name); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonTypeDescriptor.java b/src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonTypeDescriptor.java new file mode 100644 index 000000000..ed8464b14 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/dao/model/jsontype/JsonTypeDescriptor.java @@ -0,0 +1,105 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.dao.model.jsontype; + +import com.google.gson.JsonObject; +import java.io.Serializable; +import org.hibernate.type.descriptor.WrapperOptions; +import org.hibernate.type.descriptor.java.AbstractTypeDescriptor; +import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan; +import org.onap.policy.clamp.clds.util.JsonUtils; + +public class JsonTypeDescriptor extends AbstractTypeDescriptor { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = -3439698221196089003L; + + public static final JsonTypeDescriptor INSTANCE = new JsonTypeDescriptor(); + + /** + * Creates an instance of JsonTypeDescriptor. + */ + public JsonTypeDescriptor() { + super(JsonObject.class, new ImmutableMutabilityPlan() { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = 1169396106518110214L; + + @Override + public Serializable disassemble(JsonObject value) { + return JsonUtils.GSON_JPA_MODEL.toJson(value); + } + + @Override + public JsonObject assemble(Serializable cached) { + return JsonUtils.GSON_JPA_MODEL.fromJson((String) cached, JsonObject.class); + } + + }); + } + + @Override + public String toString(JsonObject value) { + return JsonUtils.GSON_JPA_MODEL.toJson(value); + } + + @Override + public JsonObject fromString(String string) { + return JsonUtils.GSON_JPA_MODEL.fromJson(string, JsonObject.class); + } + + @Override + public X unwrap(JsonObject value, Class type, WrapperOptions options) { + if (value == null) { + return null; + } + + if (String.class.isAssignableFrom(type)) { + return (X) toString(value); + } + + if (JsonObject.class.isAssignableFrom(type)) { + return (X) JsonUtils.GSON_JPA_MODEL.toJson(toString(value)); + } + throw unknownUnwrap(type); + } + + @Override + public JsonObject wrap(X value, WrapperOptions options) { + if (value == null) { + return null; + } + + if (String.class.isInstance(value)) { + return JsonUtils.GSON_JPA_MODEL.fromJson((String) value, JsonObject.class); + } + + throw unknownWrap(value.getClass()); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/dao/model/jsontype/StringJsonUserType.java b/src/main/java/org/onap/policy/clamp/dao/model/jsontype/StringJsonUserType.java new file mode 100644 index 000000000..4a7b65bb4 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/dao/model/jsontype/StringJsonUserType.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.dao.model.jsontype; + +import com.google.gson.JsonObject; +import org.hibernate.type.AbstractSingleColumnStandardBasicType; +import org.hibernate.type.descriptor.java.JavaTypeDescriptor; +import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; + +public class StringJsonUserType extends AbstractSingleColumnStandardBasicType { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = -7929809808079327767L; + + public StringJsonUserType() { + super(JsonStringSqlTypeDescriptor.INSTANCE, JsonTypeDescriptor.INSTANCE); + } + + public StringJsonUserType(SqlTypeDescriptor sqlTypeDescriptor, JavaTypeDescriptor javaTypeDescriptor) { + super(sqlTypeDescriptor, javaTypeDescriptor); + } + + @Override + public String getName() { + return "json"; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/flow/log/FlowLogOperation.java b/src/main/java/org/onap/policy/clamp/flow/log/FlowLogOperation.java new file mode 100644 index 000000000..d54b23b21 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/flow/log/FlowLogOperation.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.flow.log; + +import javax.servlet.http.HttpServletRequest; +import org.apache.camel.Exchange; +import org.onap.policy.clamp.clds.util.LoggingUtils; +import org.onap.policy.clamp.clds.util.OnapLogConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.event.Level; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +/** + * The Flow log operations. + */ +@Component +public class FlowLogOperation { + + protected static final Logger logger = LoggerFactory.getLogger(FlowLogOperation.class); + private LoggingUtils util = new LoggingUtils(logger); + + @Autowired + private HttpServletRequest request; + + /** + * Generate the entry log. + * + * @param serviceDesc + * The service description the loop name + */ + public void startLog(Exchange exchange, String serviceDesc) { + util.entering(request, serviceDesc); + exchange.setProperty(OnapLogConstants.Headers.REQUEST_ID, + util.getProperties(OnapLogConstants.Mdcs.REQUEST_ID)); + exchange.setProperty(OnapLogConstants.Headers.INVOCATION_ID, + util.getProperties(OnapLogConstants.Mdcs.INVOCATION_ID)); + exchange.setProperty(OnapLogConstants.Headers.PARTNER_NAME, + util.getProperties(OnapLogConstants.Mdcs.PARTNER_NAME)); + } + + /** + * Generate the exiting log. + */ + public void endLog() { + util.exiting(HttpStatus.OK.value(), "Successful", Level.INFO, + OnapLogConstants.ResponseStatus.COMPLETE); + } + + /** + * Generate the error exiting log. + */ + public void errorLog() { + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Failed", Level.INFO, + OnapLogConstants.ResponseStatus.ERROR); + } + + /** + * Generate the error exiting log. + */ + public void httpErrorLog() { + + } + + /** + * Generate the invoke log. + */ + public void invokeLog(String targetEntity, String targetServiceName) { + util.invoke(targetEntity, targetServiceName); + } + + /** + * Generate the invoke return marker. + */ + public void invokeReturnLog() { + util.invokeReturn(); + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/CsarInstaller.java b/src/main/java/org/onap/policy/clamp/loop/CsarInstaller.java new file mode 100644 index 000000000..753789a68 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/CsarInstaller.java @@ -0,0 +1,209 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Map.Entry; +import org.json.simple.parser.ParseException; +import org.onap.policy.clamp.clds.client.DcaeInventoryServices; +import org.onap.policy.clamp.clds.client.PolicyEngineServices; +import org.onap.policy.clamp.clds.exception.sdc.controller.BlueprintParserException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; +import org.onap.policy.clamp.clds.model.dcae.DcaeInventoryResponse; +import org.onap.policy.clamp.clds.sdc.controller.installer.BlueprintArtifact; +import org.onap.policy.clamp.clds.sdc.controller.installer.BlueprintMicroService; +import org.onap.policy.clamp.clds.sdc.controller.installer.BlueprintParser; +import org.onap.policy.clamp.clds.sdc.controller.installer.ChainGenerator; +import org.onap.policy.clamp.clds.sdc.controller.installer.CsarHandler; +import org.onap.policy.clamp.loop.cds.CdsDataInstaller; +import org.onap.policy.clamp.loop.service.CsarServiceInstaller; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.LoopTemplatesRepository; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.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. + */ +@Component +@Qualifier("csarInstaller") +public class CsarInstaller { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarInstaller.class); + + @Autowired + private PolicyModelsRepository policyModelsRepository; + + @Autowired + private LoopTemplatesRepository loopTemplatesRepository; + + @Autowired + private ChainGenerator chainGenerator; + + @Autowired + private DcaeInventoryServices dcaeInventoryService; + + @Autowired + private CsarServiceInstaller csarServiceInstaller; + + @Autowired + private CdsDataInstaller cdsDataInstaller; + + @Autowired + private PolicyEngineServices policyEngineServices; + + /** + * Verify whether Csar is deployed. + * + * @param csar The Csar Handler + * @return The flag indicating whether Csar is deployed + * @throws SdcArtifactInstallerException The SdcArtifactInstallerException + */ + public boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException { + boolean alreadyInstalled = csarServiceInstaller.isServiceAlreadyDeployed(csar); + + for (Entry blueprint : csar.getMapOfBlueprints().entrySet()) { + alreadyInstalled = alreadyInstalled + && loopTemplatesRepository.existsById(LoopTemplate.generateLoopTemplateName( + csar.getSdcNotification().getServiceName(), csar.getSdcNotification().getServiceVersion(), + blueprint.getValue().getResourceAttached().getResourceInstanceName(), + blueprint.getValue().getBlueprintArtifactName())); + } + return alreadyInstalled; + } + + /** + * Install the service and loop templates from the csar. + * + * @param csar The Csar Handler + * @throws SdcArtifactInstallerException The SdcArtifactInstallerException + * @throws InterruptedException The InterruptedException + * @throws BlueprintParserException In case of issues with the blueprint + * parsing + */ + public void installTheCsar(CsarHandler csar) + throws SdcArtifactInstallerException, InterruptedException, BlueprintParserException { + logger.info("Installing the CSAR " + csar.getFilePath()); + Service associatedService = csarServiceInstaller.installTheService(csar); + cdsDataInstaller.installCdsServiceProperties(csar, associatedService); + + installTheLoopTemplates(csar, associatedService); + logger.info("Successfully installed the CSAR " + csar.getFilePath()); + } + + /** + * Install the loop templates from the csar. + * + * @param csar The Csar Handler + * @param service The service object that is related to the loop + * @throws SdcArtifactInstallerException The SdcArtifactInstallerException + * @throws InterruptedException The InterruptedException + * @throws BlueprintParserException In case of issues with the blueprint + * parsing + */ + public void installTheLoopTemplates(CsarHandler csar, Service service) + throws SdcArtifactInstallerException, InterruptedException, BlueprintParserException { + try { + logger.info("Installing the Loops"); + for (Entry blueprint : csar.getMapOfBlueprints().entrySet()) { + logger.info("Processing blueprint " + blueprint.getValue().getBlueprintArtifactName()); + loopTemplatesRepository.save(createLoopTemplateFromBlueprint(csar, blueprint.getValue(), service)); + } + logger.info("Successfully installed the Loops "); + } catch (IOException e) { + throw new SdcArtifactInstallerException("Exception caught during the Loop installation in database", e); + } catch (ParseException e) { + throw new SdcArtifactInstallerException("Exception caught during the Dcae query to get ServiceTypeId", e); + } + } + + private LoopTemplate createLoopTemplateFromBlueprint(CsarHandler csar, BlueprintArtifact blueprintArtifact, + Service service) + throws IOException, ParseException, InterruptedException, BlueprintParserException, + SdcArtifactInstallerException { + LoopTemplate newLoopTemplate = new LoopTemplate(); + newLoopTemplate.setBlueprint(blueprintArtifact.getDcaeBlueprint()); + newLoopTemplate.setName(LoopTemplate.generateLoopTemplateName(csar.getSdcNotification().getServiceName(), + csar.getSdcNotification().getServiceVersion(), + blueprintArtifact.getResourceAttached().getResourceInstanceName(), + blueprintArtifact.getBlueprintArtifactName())); + List microServicesChain = chainGenerator + .getChainOfMicroServices(BlueprintParser.getMicroServices(blueprintArtifact.getDcaeBlueprint())); + if (microServicesChain.isEmpty()) { + microServicesChain = BlueprintParser.fallbackToOneMicroService(); + } + newLoopTemplate.setModelService(service); + newLoopTemplate.addLoopElementModels(createMicroServiceModels(blueprintArtifact, microServicesChain)); + newLoopTemplate.setMaximumInstancesAllowed(0); + DcaeInventoryResponse dcaeResponse = queryDcaeToGetServiceTypeId(blueprintArtifact); + newLoopTemplate.setDcaeBlueprintId(dcaeResponse.getTypeId()); + return newLoopTemplate; + } + + private HashSet createMicroServiceModels(BlueprintArtifact blueprintArtifact, + List microServicesChain) + throws SdcArtifactInstallerException { + HashSet newSet = new HashSet<>(); + for (BlueprintMicroService microService : microServicesChain) { + LoopElementModel loopElementModel = + new LoopElementModel(microService.getModelType(), LoopElementModel.MICRO_SERVICE_TYPE, + null); + newSet.add(loopElementModel); + PolicyModel newPolicyModel = policyEngineServices.createPolicyModelFromPolicyEngine(microService); + if (newPolicyModel != null) { + loopElementModel.addPolicyModel(newPolicyModel); + } else { + throw new SdcArtifactInstallerException( + "Unable to find the policy specified in the blueprint " + blueprintArtifact + .getBlueprintArtifactName() + ") on the Policy Engine:" + + microService.getModelType() + "/" + microService.getModelVersion()); + } + } + return newSet; + } + + /** + * Get the service blueprint Id in the Dcae inventory using the SDC UUID. + * + * @return The DcaeInventoryResponse object containing the dcae values + */ + private DcaeInventoryResponse queryDcaeToGetServiceTypeId(BlueprintArtifact blueprintArtifact) + throws IOException, ParseException, InterruptedException { + return dcaeInventoryService.getDcaeInformation(blueprintArtifact.getBlueprintArtifactName(), + blueprintArtifact.getBlueprintInvariantServiceUuid(), + blueprintArtifact.getResourceAttached().getResourceInvariantUUID()); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/Loop.java b/src/main/java/org/onap/policy/clamp/loop/Loop.java new file mode 100644 index 000000000..99d8d1e69 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/Loop.java @@ -0,0 +1,389 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.SortNatural; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.dao.model.jsontype.StringJsonUserType; +import org.onap.policy.clamp.loop.common.AuditEntity; +import org.onap.policy.clamp.loop.components.external.DcaeComponent; +import org.onap.policy.clamp.loop.components.external.ExternalComponent; +import org.onap.policy.clamp.loop.components.external.PolicyComponent; +import org.onap.policy.clamp.loop.deploy.DcaeDeployParameters; +import org.onap.policy.clamp.loop.log.LoopLog; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; + +@Entity +@Table(name = "loops") +@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) +public class Loop extends AuditEntity implements Serializable { + + /** + * The serial version id. + */ + private static final long serialVersionUID = -286522707701388642L; + + @Id + @Expose + @Column(nullable = false, name = "name", unique = true) + private String name; + + @Expose + @Column(name = "dcae_deployment_id") + private String dcaeDeploymentId; + + @Expose + @Column(name = "dcae_deployment_status_url") + private String dcaeDeploymentStatusUrl; + + @Expose + @Type(type = "json") + @Column(columnDefinition = "json", name = "global_properties_json") + private JsonObject globalPropertiesJson; + + @Expose + @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) + @JoinColumn(name = "service_uuid") + private Service modelService; + + @Expose + @Column(nullable = false, name = "last_computed_state") + @Enumerated(EnumType.STRING) + private LoopState lastComputedState; + + @Expose + @Transient + private final Map components = new HashMap<>(); + + @Expose + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop", orphanRemoval = true) + private Set operationalPolicies = new HashSet<>(); + + @Expose + @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) + @JoinTable(name = "loops_to_microservicepolicies", joinColumns = @JoinColumn(name = "loop_name"), + inverseJoinColumns = @JoinColumn(name = "microservicepolicy_name")) + private Set microServicePolicies = new HashSet<>(); + + @Expose + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop", orphanRemoval = true) + @SortNatural + private SortedSet loopLogs = new TreeSet<>(); + + @Expose + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) + @JoinColumn(name = "loop_template_name", nullable = false) + private LoopTemplate loopTemplate; + + private void initializeExternalComponents() { + this.addComponent(new PolicyComponent()); + this.addComponent(new DcaeComponent()); + } + + /** + * Public constructor. + */ + public Loop() { + initializeExternalComponents(); + } + + /** + * Constructor. + */ + public Loop(String name) { + this.name = name; + this.lastComputedState = LoopState.DESIGN; + this.globalPropertiesJson = new JsonObject(); + initializeExternalComponents(); + } + + /** + * This constructor creates a loop from a loop template. + * + * @param name The loop name + * @param loopTemplate The loop template from which a new loop instance must be created + */ + public Loop(String name, LoopTemplate loopTemplate, ToscaConverterWithDictionarySupport toscaConverter) { + this(name); + this.setLoopTemplate(loopTemplate); + this.setModelService(loopTemplate.getModelService()); + loopTemplate.getLoopElementModelsUsed().forEach(element -> { + if (LoopElementModel.MICRO_SERVICE_TYPE.equals(element.getLoopElementModel().getLoopElementType())) { + this.addMicroServicePolicy((MicroServicePolicy) element.getLoopElementModel() + .createPolicyInstance(this, toscaConverter)); + } else if (LoopElementModel.OPERATIONAL_POLICY_TYPE + .equals(element.getLoopElementModel().getLoopElementType())) { + this.addOperationalPolicy((OperationalPolicy) element.getLoopElementModel() + .createPolicyInstance(this, toscaConverter)); + } + }); + this.setGlobalPropertiesJson(DcaeDeployParameters.getDcaeDeploymentParametersInJson(this)); + } + + public String getName() { + return name; + } + + void setName(String name) { + this.name = name; + } + + public String getDcaeDeploymentId() { + return dcaeDeploymentId; + } + + void setDcaeDeploymentId(String dcaeDeploymentId) { + this.dcaeDeploymentId = dcaeDeploymentId; + } + + public String getDcaeDeploymentStatusUrl() { + return dcaeDeploymentStatusUrl; + } + + void setDcaeDeploymentStatusUrl(String dcaeDeploymentStatusUrl) { + this.dcaeDeploymentStatusUrl = dcaeDeploymentStatusUrl; + } + + public LoopState getLastComputedState() { + return lastComputedState; + } + + void setLastComputedState(LoopState lastComputedState) { + this.lastComputedState = lastComputedState; + } + + public Set getOperationalPolicies() { + return operationalPolicies; + } + + void setOperationalPolicies(Set operationalPolicies) { + this.operationalPolicies = operationalPolicies; + } + + public Set getMicroServicePolicies() { + return microServicePolicies; + } + + void setMicroServicePolicies(Set microServicePolicies) { + this.microServicePolicies = microServicePolicies; + } + + public JsonObject getGlobalPropertiesJson() { + return globalPropertiesJson; + } + + void setGlobalPropertiesJson(JsonObject globalPropertiesJson) { + this.globalPropertiesJson = globalPropertiesJson; + } + + public Set getLoopLogs() { + return loopLogs; + } + + void setLoopLogs(SortedSet loopLogs) { + this.loopLogs = loopLogs; + } + + /** + * This method adds an operational policy to the loop. + * + * @param opPolicy the operationalPolicy to add + */ + public void addOperationalPolicy(OperationalPolicy opPolicy) { + operationalPolicies.add(opPolicy); + opPolicy.setLoop(this); + } + + /** + * This method removes an operational policy to the loop. + * + * @param opPolicy the operationalPolicy to add + */ + public void removeOperationalPolicy(OperationalPolicy opPolicy) { + operationalPolicies.remove(opPolicy); + } + + /** + * This method adds an micro service policy to the loop. + * + * @param microServicePolicy the micro service to add + */ + public void addMicroServicePolicy(MicroServicePolicy microServicePolicy) { + microServicePolicies.add(microServicePolicy); + microServicePolicy.getUsedByLoops().add(this); + } + + public void addLog(LoopLog log) { + log.setLoop(this); + this.loopLogs.add(log); + } + + public Service getModelService() { + return modelService; + } + + void setModelService(Service modelService) { + this.modelService = modelService; + } + + public Map getComponents() { + refreshDcaeComponents(); + return components; + } + + public ExternalComponent getComponent(String componentName) { + refreshDcaeComponents(); + return this.components.get(componentName); + } + + public void addComponent(ExternalComponent component) { + this.components.put(component.getComponentName(), component); + } + + public LoopTemplate getLoopTemplate() { + return loopTemplate; + } + + public void setLoopTemplate(LoopTemplate loopTemplate) { + this.loopTemplate = loopTemplate; + } + + private void refreshDcaeComponents() { + if (!this.loopTemplate.getUniqueBlueprint()) { + this.components.remove("DCAE"); + for (MicroServicePolicy policy : this.microServicePolicies) { + if (!this.components.containsKey("DCAE_" + policy.getName())) { + this.addComponent(new DcaeComponent(policy.getName())); + } + } + } + } + + /** + * Return the operationalPolicy object with the opPolicyName. + * + * @param opPolicyName The operationalPolicy name + * @return The OperationalPolicy object found in loop object + */ + public OperationalPolicy getOperationalPolicy(String opPolicyName) { + for (OperationalPolicy operationalPolicy : this.getOperationalPolicies()) { + if (operationalPolicy.getName().equals(opPolicyName)) { + return operationalPolicy; + } + } + return null; + } + + /** + * Return the microServicePolicy object with the msPolicyName. + * + * @param msPolicyName The microServicePolicy name + * @return The MicroServicePolicy object found in loop object + */ + public MicroServicePolicy getMicroServicePolicy(String msPolicyName) { + for (MicroServicePolicy microServicePolicy : this.getMicroServicePolicies()) { + if (microServicePolicy.getName().equals(msPolicyName)) { + return microServicePolicy; + } + } + return null; + } + + /** + * Generate the loop name. + * + * @param serviceName The service name + * @param serviceVersion The service version + * @param resourceName The resource name + * @param blueprintFileName The blueprint file name + * @return The generated loop name + */ + public static String generateLoopName(String serviceName, String serviceVersion, String resourceName, + String blueprintFileName) { + StringBuilder buffer = new StringBuilder("LOOP_").append(serviceName).append("_v").append(serviceVersion) + .append("_").append(resourceName).append("_").append(blueprintFileName.replaceAll(".yaml", "")); + return buffer.toString().replace('.', '_').replaceAll(" ", ""); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Loop other = (Loop) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/LoopController.java b/src/main/java/org/onap/policy/clamp/loop/LoopController.java new file mode 100644 index 000000000..98459c909 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/LoopController.java @@ -0,0 +1,204 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.List; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicyService; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; + +@Controller +public class LoopController { + + private final LoopService loopService; + + private final ToscaConverterWithDictionarySupport toscaConverter; + + private final OperationalPolicyService operationalPolicyService; + + private final MicroServicePolicyService microServicePolicyService; + + private static final Type OPERATIONAL_POLICY_TYPE = new TypeToken>() { + }.getType(); + + private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken>() { + }.getType(); + + + /** + * Constructor. + * + * @param loopService loopService + * @param operationalPolicyService operationalPolicyService + * @param microServicePolicyService microServicePolicyService + * @param toscaConverter toscaConverter + */ + @Autowired + public LoopController(LoopService loopService, OperationalPolicyService operationalPolicyService, + MicroServicePolicyService microServicePolicyService, + ToscaConverterWithDictionarySupport toscaConverter) { + this.loopService = loopService; + this.toscaConverter = toscaConverter; + this.operationalPolicyService = operationalPolicyService; + this.microServicePolicyService = microServicePolicyService; + } + + public Loop createLoop(String loopName, String templateName) { + return loopService.createLoopFromTemplate(loopName, templateName); + } + + public List getLoopNames() { + return loopService.getClosedLoopNames(); + } + + public Loop getLoop(String loopName) { + return loopService.getLoop(loopName); + } + + /** + * Update the Operational Policy properties. + * + * @param loopName The loop name + * @param operationalPoliciesJson The new Operational Policy properties + * @return The updated loop + */ + public Loop updateOperationalPolicies(String loopName, JsonArray operationalPoliciesJson) { + List operationalPolicies = JsonUtils.GSON_JPA_MODEL.fromJson(operationalPoliciesJson, + OPERATIONAL_POLICY_TYPE); + return loopService.updateAndSaveOperationalPolicies(loopName, operationalPolicies); + } + + /** + * Update the whole array of MicroService policies properties. + * + * @param loopName The loop name + * @param microServicePoliciesJson The array of all MicroService policies + * properties + * @return The updated loop + */ + public Loop updateMicroservicePolicies(String loopName, JsonArray microServicePoliciesJson) { + List microservicePolicies = JsonUtils.GSON_JPA_MODEL.fromJson(microServicePoliciesJson, + MICROSERVICE_POLICY_TYPE); + return loopService.updateAndSaveMicroservicePolicies(loopName, microservicePolicies); + } + + /** + * Update the global properties. + * + * @param loopName The loop name + * @param globalProperties The updated global properties + * @return The updated loop + */ + public Loop updateGlobalPropertiesJson(String loopName, JsonObject globalProperties) { + return loopService.updateAndSaveGlobalPropertiesJson(loopName, globalProperties); + } + + /** + * This method add an operational policy to a loop instance. + * + * @param loopName The loop name + * @param policyType The policy model type + * @param policyVersion The policy model version + * @return The loop modified + */ + public Loop addOperationalPolicy(String loopName, String policyType, String policyVersion) throws IOException { + return loopService.addOperationalPolicy(loopName, policyType, policyVersion); + } + + /** + * This method removes an operational policy from a loop instance. + * + * @param loopName The loop name + * @param policyType The policy model type + * @param policyVersion The policy model version + * @return The loop modified + */ + public Loop removeOperationalPolicy(String loopName, String policyType, String policyVersion) { + return loopService.removeOperationalPolicy(loopName, policyType, policyVersion); + } + + /** + * This method deletes the loop. + * + * @param loopName The loop Name + */ + public void deleteLoop(String loopName) { + loopService.deleteLoop(loopName); + } + + /** + * Update one MicroService policy properties. + * + * @param loopName The loop name + * @param newMicroservicePolicy The new MicroService policy properties + * @return The updated MicroService policy + */ + public MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) { + return loopService.updateMicroservicePolicy(loopName, newMicroservicePolicy); + } + + /** + * Refresh the Operational Policy Json representation of the loop. + * + * @param loop The loop + * @param operationalPolicyName The operational policy name that needs a refresh + * @return The loop object + */ + public Loop refreshOperationalPolicyJsonRepresentation(Loop loop, String operationalPolicyName) { + for (OperationalPolicy operationalPolicy : loop.getOperationalPolicies()) { + if (operationalPolicy.getName().equals(operationalPolicyName)) { + this.operationalPolicyService + .refreshOperationalPolicyJsonRepresentation(operationalPolicy, toscaConverter); + } + } + return loop; + } + + /** + * Refresh the Config Policy Json representation of the loop. + * + * @param loop The loop + * @param microServicePolicyName The microservice policy name that needs a refresh + * @return The loop object + */ + public Loop refreshMicroServicePolicyJsonRepresentation(Loop loop, String microServicePolicyName) { + for (MicroServicePolicy microServicePolicy : loop.getMicroServicePolicies()) { + if (microServicePolicy.getName().equals(microServicePolicyName)) { + this.microServicePolicyService + .refreshMicroServicePolicyJsonRepresentation(microServicePolicy, toscaConverter, loop); + } + } + return loop; + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/LoopService.java b/src/main/java/org/onap/policy/clamp/loop/LoopService.java new file mode 100644 index 000000000..975011669 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/LoopService.java @@ -0,0 +1,190 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.List; +import java.util.Set; +import javax.persistence.EntityNotFoundException; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.loop.template.LoopTemplatesService; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelsService; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicyService; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class LoopService { + + @Autowired + private LoopsRepository loopsRepository; + + @Autowired + private MicroServicePolicyService microservicePolicyService; + + @Autowired + private OperationalPolicyService operationalPolicyService; + + @Autowired + private PolicyModelsService policyModelsService; + + @Autowired + private LoopTemplatesService loopTemplateService; + + @Autowired + private ToscaConverterWithDictionarySupport toscaConverter; + + Loop saveOrUpdateLoop(Loop loop) { + return loopsRepository.save(loop); + } + + List getClosedLoopNames() { + return loopsRepository.getAllLoopNames(); + } + + public Loop getLoop(String loopName) { + return loopsRepository.findById(loopName).orElse(null); + } + + public void deleteLoop(String loopName) { + loopsRepository.deleteById(loopName); + } + + /** + * Creates a Loop Instance from Loop Template Name. + * + * @param loopName Name of the Loop to be created + * @param templateName Loop Template to used for Loop + * @return Loop Instance + */ + public Loop createLoopFromTemplate(String loopName, String templateName) { + return loopsRepository + .save(new Loop(loopName, loopTemplateService.getLoopTemplate(templateName), toscaConverter)); + } + + /** + * This method is used to refresh the DCAE deployment status fields. + * + * @param loop The loop instance to be modified + * @param deploymentId The deployment ID as returned by DCAE + * @param deploymentUrl The Deployment URL as returned by DCAE + */ + public void updateDcaeDeploymentFields(Loop loop, String deploymentId, String deploymentUrl) { + loop.setDcaeDeploymentId(deploymentId); + loop.setDcaeDeploymentStatusUrl(deploymentUrl); + loopsRepository.saveAndFlush(loop); + } + + public void updateLoopState(Loop loop, String newState) { + loop.setLastComputedState(LoopState.valueOf(newState)); + loopsRepository.save(loop); + } + + /** + * This method add an operational policy to a loop instance. + * This creates an operational policy from the policy model info and not the loop element model + * + * @param loopName The loop name + * @param policyType The policy model type + * @param policyVersion The policy model version + * @return The loop modified + */ + Loop addOperationalPolicy(String loopName, String policyType, String policyVersion) throws IOException { + Loop loop = getLoop(loopName); + PolicyModel policyModel = policyModelsService.getPolicyModel(policyType, policyVersion); + Set opPolicySet = loop.getOperationalPolicies(); + for (OperationalPolicy opPolicy : opPolicySet) { + if (opPolicy.getPolicyModel().equals(policyModel)) { + throw new IllegalArgumentException( + "This type of Operational Policy is already added to the loop. Please choose another one."); + } + } + if (policyModel == null) { + return null; + } + loop.addOperationalPolicy( + new OperationalPolicy(loop, loop.getModelService(), policyModel, toscaConverter)); + return loopsRepository.saveAndFlush(loop); + } + + /** + * This method remove an operational policy to a loop instance. + * + * @param loopName The loop name + * @param policyType The policy model type + * @param policyVersion The policy model version + * @return The loop modified + */ + Loop removeOperationalPolicy(String loopName, String policyType, String policyVersion) { + Loop loop = getLoop(loopName); + PolicyModel policyModel = policyModelsService.getPolicyModel(policyType, policyVersion); + if (policyModel == null) { + return null; + } + for (OperationalPolicy opPolicy : loop.getOperationalPolicies()) { + if (opPolicy.getPolicyModel().getPolicyModelType().equals(policyType) + && opPolicy.getPolicyModel().getVersion().equals(policyVersion)) { + loop.removeOperationalPolicy(opPolicy); + break; + } + } + return loopsRepository.saveAndFlush(loop); + } + + Loop updateAndSaveOperationalPolicies(String loopName, List newOperationalPolicies) { + Loop loop = findClosedLoopByName(loopName); + Set newPolicies = operationalPolicyService.updatePolicies(loop, newOperationalPolicies); + loop.setOperationalPolicies(newPolicies); + return loopsRepository.save(loop); + } + + Loop updateAndSaveMicroservicePolicies(String loopName, List newMicroservicePolicies) { + Loop loop = findClosedLoopByName(loopName); + Set newPolicies = microservicePolicyService.updatePolicies(loop, newMicroservicePolicies); + loop.setMicroServicePolicies(newPolicies); + return loopsRepository.save(loop); + } + + Loop updateAndSaveGlobalPropertiesJson(String loopName, JsonObject newGlobalPropertiesJson) { + Loop loop = findClosedLoopByName(loopName); + loop.setGlobalPropertiesJson(newGlobalPropertiesJson); + return loopsRepository.save(loop); + } + + MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) { + Loop loop = findClosedLoopByName(loopName); + return microservicePolicyService.getAndUpdateMicroServicePolicy(loop, newMicroservicePolicy); + } + + private Loop findClosedLoopByName(String loopName) { + return loopsRepository.findById(loopName) + .orElseThrow(() -> new EntityNotFoundException("Couldn't find closed loop named: " + loopName)); + } +} + diff --git a/src/main/java/org/onap/policy/clamp/loop/LoopState.java b/src/main/java/org/onap/policy/clamp/loop/LoopState.java new file mode 100644 index 000000000..48d4487f0 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/LoopState.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +public enum LoopState { + DESIGN, SUBMITTED, DEPLOYED, RUNNING, STOPPED, IN_ERROR, WAITING; +} diff --git a/src/main/java/org/onap/policy/clamp/loop/LoopsRepository.java b/src/main/java/org/onap/policy/clamp/loop/LoopsRepository.java new file mode 100644 index 000000000..7b92ed584 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/LoopsRepository.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface LoopsRepository extends JpaRepository { + + @Query("SELECT loop.name FROM Loop as loop") + List getAllLoopNames(); +} diff --git a/src/main/java/org/onap/policy/clamp/loop/cds/CdsDataInstaller.java b/src/main/java/org/onap/policy/clamp/loop/cds/CdsDataInstaller.java new file mode 100644 index 000000000..68adb3887 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/cds/CdsDataInstaller.java @@ -0,0 +1,172 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.loop.cds; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import org.onap.policy.clamp.clds.client.CdsServices; +import org.onap.policy.clamp.clds.model.cds.CdsBpWorkFlowListResponse; +import org.onap.policy.clamp.clds.sdc.controller.installer.CsarHandler; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.service.ServicesRepository; +import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * This class installs the cds data in the service model properties. + * This can be refreshed later on by clicking on the button refresh, when recomputing the json schema. + */ +@Component +public class CdsDataInstaller { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(CdsDataInstaller.class); + + @Autowired + CdsServices cdsServices; + + @Autowired + ServicesRepository serviceRepository; + + public static final String CONTROLLER_PROPERTIES = "controllerProperties"; + public static final String SDNC_MODEL_NAME = "sdnc_model_name"; + public static final String SDNC_MODEL_VERSION = "sdnc_model_version"; + + /** + * This method installs the service model properties for CDS in the service object given in input. + * + * @param csar The csar from sdc + * @param service the service object already provisioned with csar data + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public Service installCdsServiceProperties(CsarHandler csar, Service service) { + // Iterate on all types defined in the tosca lib + for (SdcTypes type : SdcTypes.values()) { + JsonObject resourcesPropByType = service.getResourceByType(type.getValue()); + // For each type, get the metadata of each nodetemplate + for (NodeTemplate nodeTemplate : csar.getSdcCsarHelper().getServiceNodeTemplateBySdcType(type)) { + // get cds artifact information and save in resources Prop + if (SdcTypes.PNF == type || SdcTypes.VF == type) { + JsonObject controllerProperties = createCdsArtifactProperties( + String.valueOf(nodeTemplate.getPropertyValue(SDNC_MODEL_NAME)), + String.valueOf(nodeTemplate.getPropertyValue(SDNC_MODEL_VERSION))); + if (controllerProperties != null) { + resourcesPropByType.getAsJsonObject(nodeTemplate.getName()) + .add(CONTROLLER_PROPERTIES, controllerProperties); + logger.info("Successfully installed the CDS data in Service"); + } else { + logger.warn("Skipping CDS data installation in Service, as sdnc_model_name and " + + "sdnc_model_version are not provided in the CSAR"); + } + } + } + } + serviceRepository.save(service); + + return service; + } + + /** + * This method updates the service model properties for CDS in the service object given in input. + * + * @param service the service object already provisioned with csar data + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public Service updateCdsServiceProperties(Service service) { + // Iterate on all types defined in the tosca lib + for (SdcTypes type : SdcTypes.values()) { + JsonObject resourcesPropByType = service.getResourceByType(type.getValue()); + for (String resourceName : resourcesPropByType.keySet()) { + // get cds artifact information and save in resources Prop + if ((SdcTypes.PNF == type || SdcTypes.VF == type) && resourcesPropByType.getAsJsonObject(resourceName) + .getAsJsonObject(CONTROLLER_PROPERTIES) != null) { + JsonObject controllerProperties = + createCdsArtifactProperties(resourcesPropByType.getAsJsonObject(resourceName) + .getAsJsonObject(CONTROLLER_PROPERTIES).get(SDNC_MODEL_NAME) + .getAsString(), + resourcesPropByType.getAsJsonObject(resourceName) + .getAsJsonObject(CONTROLLER_PROPERTIES).get(SDNC_MODEL_VERSION) + .getAsString()); + if (controllerProperties != null) { + resourcesPropByType.getAsJsonObject(resourceName) + .add(CONTROLLER_PROPERTIES, controllerProperties); + } + } + } + } + serviceRepository.save(service); + logger.info("Successfully updated the CDS data in Service"); + return service; + } + + /** + * Retrieve CDS artifacts information from node template and save in resource object. + * + * @param sdncModelName sdnc model name + * @param sdncModelVersion sdnc model version + * @return Returns CDS artifacts information + */ + private JsonObject createCdsArtifactProperties(String sdncModelName, String sdncModelVersion) { + if (sdncModelName != null && !"null".equals(sdncModelName) + && sdncModelVersion != null && !"null".equals(sdncModelVersion)) { + JsonObject controllerProperties = new JsonObject(); + controllerProperties.addProperty(SDNC_MODEL_NAME, sdncModelName); + controllerProperties.addProperty(SDNC_MODEL_VERSION, sdncModelVersion); + + CdsBpWorkFlowListResponse response = + queryCdsToGetWorkFlowList(sdncModelName, sdncModelVersion); + if (response == null) { + return controllerProperties; + } + + JsonObject workFlowProps = new JsonObject(); + for (String workFlow : response.getWorkflows()) { + logger.info("Found CDS workflow " + workFlow + " for model name " + sdncModelName + " and version " + + sdncModelVersion); + JsonObject inputs = queryCdsToGetWorkFlowInputProperties(response.getBlueprintName(), + response.getVersion(), workFlow); + workFlowProps.add(workFlow, inputs); + } + + controllerProperties.add("workflows", workFlowProps); + return controllerProperties; + } + return null; + } + + + private CdsBpWorkFlowListResponse queryCdsToGetWorkFlowList(String artifactName, String artifactVersion) { + return cdsServices.getBlueprintWorkflowList(artifactName, artifactVersion); + } + + private JsonObject queryCdsToGetWorkFlowInputProperties(String artifactName, String artifactVersion, + String workFlow) { + return cdsServices.getWorkflowInputProperties(artifactName, artifactVersion, workFlow); + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/common/AuditEntity.java b/src/main/java/org/onap/policy/clamp/loop/common/AuditEntity.java new file mode 100644 index 000000000..92c795e90 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/common/AuditEntity.java @@ -0,0 +1,146 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.common; + +import com.google.gson.annotations.Expose; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +/** + * This class is the parent of the hibernate entities requiring to be audited. + */ +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public class AuditEntity { + + @Expose + @CreatedDate + @Column(name = "created_timestamp", nullable = false, updatable = false) + private Instant createdDate; + + @Expose + @LastModifiedDate + @Column(name = "updated_timestamp", nullable = false) + private Instant updatedDate; + + @Expose + @LastModifiedBy + @Column(name = "updated_by") + private String updatedBy; + + @Expose + @CreatedBy + @Column(name = "created_by") + private String createdBy; + + public Instant getCreatedDate() { + return createdDate; + } + + /** + * createdDate setter. + * + * @param createdDate The created Date object + */ + public void setCreatedDate(Instant createdDate) { + if (createdDate != null) { + this.createdDate = createdDate.truncatedTo(ChronoUnit.SECONDS); + } else { + this.createdDate = null; + } + } + + /** + * updatedDate getter. + * + * @return the updatedDate + */ + public Instant getUpdatedDate() { + return updatedDate; + } + + /** + * updatedDate setter. + * + * @param updatedDate updatedDate to set + */ + public void setUpdatedDate(Instant updatedDate) { + if (updatedDate != null) { + this.updatedDate = updatedDate.truncatedTo(ChronoUnit.SECONDS); + } else { + this.updatedDate = null; + } + } + + /** + * updatedBy getter. + * + * @return the updatedBy + */ + public String getUpdatedBy() { + return updatedBy; + } + + /** + * updatedBy setter. + * + * @param updatedBy the updatedBy + */ + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + /** + * createdBy getter. + * + * @return the createdBy + */ + public String getCreatedBy() { + return createdBy; + } + + /** + * createdBy setter. + * + * @param createdBy the createdBy to set + */ + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + /** + * Empty constructor. + */ + public AuditEntity() { + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/components/external/DcaeComponent.java b/src/main/java/org/onap/policy/clamp/loop/components/external/DcaeComponent.java new file mode 100644 index 000000000..1b36aab55 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/components/external/DcaeComponent.java @@ -0,0 +1,266 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.components.external; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; +import javax.persistence.Transient; +import org.apache.camel.Exchange; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.onap.policy.clamp.clds.model.dcae.DcaeInventoryResponse; +import org.onap.policy.clamp.clds.model.dcae.DcaeOperationStatusResponse; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; + +public class DcaeComponent extends ExternalComponent { + + @Transient + private static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeComponent.class); + + private static final String DCAE_DEPLOYMENT_PREFIX = "CLAMP_"; + private static final String DEPLOYMENT_PARAMETER = "dcaeDeployParameters"; + private static final String DCAE_SERVICETYPE_ID = "serviceTypeId"; + private static final String DCAE_INPUTS = "inputs"; + public static final String UNIQUE_BLUEPRINT_PARAMETERS = "uniqueBlueprintParameters"; + + private String name; + + public static final ExternalComponentState BLUEPRINT_DEPLOYED = new ExternalComponentState("BLUEPRINT_DEPLOYED", + "The DCAE blueprint has been found in the DCAE inventory but not yet instancianted for this loop"); + public static final ExternalComponentState PROCESSING_MICROSERVICE_INSTALLATION = new ExternalComponentState( + "PROCESSING_MICROSERVICE_INSTALLATION", "Clamp has requested DCAE to install the microservices " + + "defined in the DCAE blueprint and it's currently processing the request"); + public static final ExternalComponentState MICROSERVICE_INSTALLATION_FAILED = new ExternalComponentState( + "MICROSERVICE_INSTALLATION_FAILED", + "Clamp has requested DCAE to install the microservices defined in the DCAE blueprint and it failed"); + public static final ExternalComponentState MICROSERVICE_INSTALLED_SUCCESSFULLY = new ExternalComponentState( + "MICROSERVICE_INSTALLED_SUCCESSFULLY", + "Clamp has requested DCAE to install the DCAE blueprint and it has been installed successfully"); + public static final ExternalComponentState PROCESSING_MICROSERVICE_UNINSTALLATION = new ExternalComponentState( + "PROCESSING_MICROSERVICE_UNINSTALLATION", "Clamp has requested DCAE to uninstall the microservices " + + "defined in the DCAE blueprint and it's currently processing the request"); + public static final ExternalComponentState MICROSERVICE_UNINSTALLATION_FAILED = new ExternalComponentState( + "MICROSERVICE_UNINSTALLATION_FAILED", + "Clamp has requested DCAE to uninstall the microservices defined in the DCAE blueprint and it failed"); + public static final ExternalComponentState MICROSERVICE_UNINSTALLED_SUCCESSFULLY = new ExternalComponentState( + "MICROSERVICE_UNINSTALLED_SUCCESSFULLY", + "Clamp has requested DCAE to uninstall the DCAE blueprint and it has been uninstalled successfully"); + public static final ExternalComponentState IN_ERROR = new ExternalComponentState("IN_ERROR", + "There was an error during the request done to DCAE, look at the logs or try again"); + + public DcaeComponent() { + super(BLUEPRINT_DEPLOYED); + this.name = "DCAE"; + } + + public DcaeComponent(String name) { + super(BLUEPRINT_DEPLOYED); + this.name = "DCAE_" + name; + } + + @Override + public String getComponentName() { + return name; + } + + + /** + * Convert the json response to a DcaeOperationStatusResponse. + * + * @param responseBody The DCAE response Json paylaod + * @return The dcae object provisioned + */ + public static DcaeOperationStatusResponse convertDcaeResponse(String responseBody) { + if (responseBody != null && !responseBody.isEmpty()) { + return JsonUtils.GSON_JPA_MODEL.fromJson(responseBody, DcaeOperationStatusResponse.class); + } else { + return null; + } + } + + /** + * Generate the deployment id, it's random. + * + * @return The deployment id + */ + public static String generateDeploymentId() { + return DCAE_DEPLOYMENT_PREFIX + UUID.randomUUID(); + } + + /** + * This method prepare the url returned by DCAE to check the status if fine. It + * extracts it from the dcaeResponse. + * + * @param dcaeResponse The dcae response object + * @return the Right Url modified if needed + */ + public static String getStatusUrl(DcaeOperationStatusResponse dcaeResponse) { + return dcaeResponse.getLinks().getStatus().replaceAll("http:", "http4:").replaceAll("https:", "https4:"); + } + + /** + * Return the deploy payload for DCAE. + * + * @param loop The loop object + * @return The payload used to send deploy closed loop request + */ + public static String getDeployPayload(Loop loop) { + JsonObject globalProp = loop.getGlobalPropertiesJson(); + JsonObject deploymentProp = globalProp.getAsJsonObject(DEPLOYMENT_PARAMETER).getAsJsonObject( + UNIQUE_BLUEPRINT_PARAMETERS); + + String serviceTypeId = loop.getLoopTemplate().getDcaeBlueprintId(); + + JsonObject rootObject = new JsonObject(); + rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId); + if (deploymentProp != null) { + rootObject.add(DCAE_INPUTS, deploymentProp); + } + logger.info("DCAE Deploy payload for unique blueprint: " + rootObject.toString()); + return rootObject.toString(); + } + + /** + * Return the deploy payload for DCAE. + * + * @param loop The loop object + * @param microServicePolicy The micro service policy + * @return The payload used to send deploy closed loop request + */ + public static String getDeployPayload(Loop loop, MicroServicePolicy microServicePolicy) { + JsonObject globalProp = loop.getGlobalPropertiesJson(); + JsonObject deploymentProp = + globalProp.getAsJsonObject(DEPLOYMENT_PARAMETER).getAsJsonObject(microServicePolicy.getName()); + + String serviceTypeId = microServicePolicy.getDcaeBlueprintId(); + + JsonObject rootObject = new JsonObject(); + rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId); + if (deploymentProp != null) { + rootObject.add(DCAE_INPUTS, deploymentProp); + } + logger.info("DCAE Deploy payload for multiple blueprints: " + rootObject.toString()); + return rootObject.toString(); + } + + /** + * Return the uninstallation payload for DCAE. + * + * @param loop The loop object + * @return The payload in string (json) + */ + public static String getUndeployPayload(Loop loop) { + JsonObject rootObject = new JsonObject(); + rootObject.addProperty(DCAE_SERVICETYPE_ID, loop.getLoopTemplate().getDcaeBlueprintId()); + logger.info("DCAE Undeploy payload for unique blueprint: " + rootObject.toString()); + return rootObject.toString(); + } + + /** + * Return the uninstallation payload for DCAE. + * + * @param policy The microServicePolicy object + * @return The payload in string (json) + */ + public static String getUndeployPayload(MicroServicePolicy policy) { + JsonObject rootObject = new JsonObject(); + rootObject.addProperty(DCAE_SERVICETYPE_ID, policy.getDcaeBlueprintId()); + logger.info("DCAE Undeploy payload for multiple blueprints: " + rootObject.toString()); + return rootObject.toString(); + } + + @Override + public ExternalComponentState computeState(Exchange camelExchange) { + + DcaeOperationStatusResponse dcaeResponse = (DcaeOperationStatusResponse) camelExchange.getIn().getExchange() + .getProperty("dcaeResponse"); + + if (dcaeResponse == null) { + setState(BLUEPRINT_DEPLOYED); + } else { + if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus().equals("succeeded")) { + setState(MICROSERVICE_INSTALLED_SUCCESSFULLY); + } else { + if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus() + .equals("processing")) { + setState(PROCESSING_MICROSERVICE_INSTALLATION); + } else { + if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus() + .equals("failed")) { + setState(MICROSERVICE_INSTALLATION_FAILED); + } else { + if (dcaeResponse.getOperationType().equals("uninstall") + && dcaeResponse.getStatus().equals("succeeded")) { + setState(MICROSERVICE_UNINSTALLED_SUCCESSFULLY); + } else { + if (dcaeResponse.getOperationType().equals("uninstall") + && dcaeResponse.getStatus().equals("processing")) { + setState(PROCESSING_MICROSERVICE_UNINSTALLATION); + } else { + if (dcaeResponse.getOperationType().equals("uninstall") && dcaeResponse.getStatus() + .equals("failed")) { + setState(MICROSERVICE_UNINSTALLATION_FAILED); + } else { + setState(IN_ERROR); + } + } + } + } + } + } + } + return this.getState(); + } + + /** + * Convert the json response to a DcaeInventoryResponse. + * + * @param responseBody The DCAE response Json paylaod + * @return list of DcaeInventoryResponse + * @throws ParseException In case of issues with the Json parsing + */ + public static List convertToDcaeInventoryResponse(String responseBody) + throws ParseException { + JSONParser parser = new JSONParser(); + JSONObject jsonObj = (JSONObject) parser.parse(responseBody); + JSONArray itemsArray = (JSONArray) jsonObj.get("items"); + Iterator it = itemsArray.iterator(); + List inventoryResponseList = new LinkedList<>(); + while (it.hasNext()) { + JSONObject item = (JSONObject) it.next(); + DcaeInventoryResponse response = JsonUtils.GSON.fromJson(item.toString(), DcaeInventoryResponse.class); + inventoryResponseList.add(response); + } + return inventoryResponseList; + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponent.java b/src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponent.java new file mode 100644 index 000000000..ce7efe494 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponent.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.components.external; + +import com.google.gson.annotations.Expose; +import org.apache.camel.Exchange; + +/** + * Should be abstract but Gson can't instantiate it if it's an abstract. + */ +public class ExternalComponent { + @Expose + private ExternalComponentState componentState; + + public void setState(ExternalComponentState newState) { + this.componentState = newState; + } + + public ExternalComponentState getState() { + return this.componentState; + } + + public String getComponentName() { + return null; + } + + public ExternalComponentState computeState(Exchange camelExchange) { + return new ExternalComponentState("INIT", "no desc", 0); + } + + public ExternalComponent(ExternalComponentState initialState) { + setState(initialState); + } + + public ExternalComponent() { + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponentState.java b/src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponentState.java new file mode 100644 index 000000000..a57800025 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/components/external/ExternalComponentState.java @@ -0,0 +1,128 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.components.external; + +import com.google.gson.annotations.Expose; + +/** + * This is a transient state reflecting the deployment status of a component. It + * can be Policy, DCAE, or whatever... This is object is generic. Clamp is now + * stateless, so it triggers the different components at runtime, the status per + * component is stored here. The state level is used to re-compute the global + * state when multiple sub states are required for that computation (generally + * provided sequentially to the method computeState from the camel routes. + * + */ +public class ExternalComponentState implements Comparable { + @Expose + private String stateName; + @Expose + private String description; + private int stateLevel; + + /** + * Constructor taking stateName, description and its level. + * + * @param stateName The stateName in string + * @param description The description in string + * @param level The level, higher value has higher priority and can't be + * down-graded + */ + public ExternalComponentState(String stateName, String description, int level) { + this.stateName = stateName; + this.description = description; + this.stateLevel = level; + } + + public ExternalComponentState(String stateName, String description) { + this(stateName, description, 0); + } + + public ExternalComponentState() { + } + + public String getStateName() { + return stateName; + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return stateName; + } + + public int getLevel() { + return stateLevel; + } + + public void setLevel(int priority) { + this.stateLevel = priority; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((stateName == null) ? 0 : stateName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ExternalComponentState other = (ExternalComponentState) obj; + if (stateName == null) { + if (other.stateName != null) { + return false; + } + } else if (!stateName.equals(other.stateName)) { + return false; + } + return true; + } + + /** + * This method compares this object by using the level of them. + * + * @param stateToCompare The state to compare to the current object + * @return If the one given in input has a higher level than the current object + * it returns -1, 1 otherwise and 0 if equals. + */ + @Override + public int compareTo(ExternalComponentState stateToCompare) { + return Integer.compare(this.getLevel(), stateToCompare.getLevel()); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/components/external/PolicyComponent.java b/src/main/java/org/onap/policy/clamp/loop/components/external/PolicyComponent.java new file mode 100644 index 000000000..648463d78 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/components/external/PolicyComponent.java @@ -0,0 +1,196 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.components.external; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import javax.persistence.Transient; +import org.apache.camel.Exchange; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; + +public class PolicyComponent extends ExternalComponent { + + @Transient + private static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyComponent.class); + + public static final ExternalComponentState IN_ERROR = new ExternalComponentState("IN_ERROR", + "There was an error during the sending to policy, the policy engine may be corrupted or inconsistent", 100); + public static final ExternalComponentState NOT_SENT = new ExternalComponentState("NOT_SENT", + "The policies defined have NOT yet been created on the policy engine", 90); + public static final ExternalComponentState SENT = new ExternalComponentState("SENT", + "The policies defined have been created but NOT deployed on the policy engine", 50); + public static final ExternalComponentState SENT_AND_DEPLOYED = new ExternalComponentState("SENT_AND_DEPLOYED", + "The policies defined have been created and deployed on the policy engine", 10); + public static final ExternalComponentState UNKNOWN = new ExternalComponentState("UNKNOWN", + "The current status is not clear. Need to refresh the status to get the current status.", 0); + + /** + * Default constructor. + */ + public PolicyComponent() { + /* + * We assume it's good by default as we will receive the state for each policy + * on by one, each time we increase the level we can't decrease it anymore. + * That's why it starts with the lowest one SENT_AND_DEPLOYED. + */ + super(UNKNOWN); + } + + @Override + public String getComponentName() { + return "POLICY"; + } + + /** + * Generates the Json that must be sent to policy to add all policies to Active + * PDP group. + * + * @param loop the loop object + * @param action POST (to add policy to group) or DELETE (to delete policy from group) + * @return The json, payload to send + */ + public static String createPoliciesPayloadPdpGroup(Loop loop, String action) { + Map>> pdpGroupMap = new HashMap<>(); + for (OperationalPolicy opPolicy : loop.getOperationalPolicies()) { + updatePdpGroupMap(opPolicy.getPdpGroup(), opPolicy.getPdpSubgroup(), + opPolicy.getName(), + "1.0.0", pdpGroupMap); + } + + for (MicroServicePolicy msPolicy : loop.getMicroServicePolicies()) { + updatePdpGroupMap(msPolicy.getPdpGroup(), msPolicy.getPdpSubgroup(), + msPolicy.getName(), + "1.0.0", pdpGroupMap); + } + + String payload = new GsonBuilder().setPrettyPrinting().create() + .toJson(generateActivatePdpGroupPayload(pdpGroupMap, action)); + logger.info("PdpGroup policy payload: " + payload); + return payload; + } + + private static void updatePdpGroupMap(String pdpGroup, + String pdpSubGroup, + String policyName, + String policyVersion, + Map>> pdpGroupMap) { + JsonObject policyJson = new JsonObject(); + policyJson.addProperty("name", policyName); + policyJson.addProperty("version", policyVersion); + Map> pdpSubGroupMap; + List policyList; + if (pdpGroupMap.get(pdpGroup) == null) { + pdpSubGroupMap = new HashMap<>(); + policyList = new LinkedList<>(); + } else { + pdpSubGroupMap = pdpGroupMap.get(pdpGroup); + if (pdpSubGroupMap.get(pdpSubGroup) == null) { + policyList = new LinkedList<>(); + } else { + policyList = (List) pdpSubGroupMap.get(pdpSubGroup); + } + } + policyList.add(policyJson); + pdpSubGroupMap.put(pdpSubGroup, policyList); + pdpGroupMap.put(pdpGroup, pdpSubGroupMap); + } + + private static JsonObject generateActivatePdpGroupPayload( + Map>> pdpGroupMap, String action) { + JsonArray payloadArray = new JsonArray(); + for (Entry>> pdpGroupInfo : pdpGroupMap.entrySet()) { + JsonObject pdpGroupNode = new JsonObject(); + JsonArray subPdpArray = new JsonArray(); + pdpGroupNode.addProperty("name", pdpGroupInfo.getKey()); + pdpGroupNode.add("deploymentSubgroups", subPdpArray); + + for (Entry> pdpSubGroupInfo : pdpGroupInfo.getValue().entrySet()) { + JsonObject pdpSubGroupNode = new JsonObject(); + subPdpArray.add(pdpSubGroupNode); + pdpSubGroupNode.addProperty("pdpType", pdpSubGroupInfo.getKey()); + pdpSubGroupNode.addProperty("action", action); + + JsonArray policyArray = new JsonArray(); + pdpSubGroupNode.add("policies", policyArray); + + for (JsonObject policy : pdpSubGroupInfo.getValue()) { + policyArray.add(policy); + } + } + payloadArray.add(pdpGroupNode); + } + JsonObject jsonObject = new JsonObject(); + jsonObject.add("groups", payloadArray); + return jsonObject; + } + + private static ExternalComponentState findNewState(boolean found, boolean deployed) { + + ExternalComponentState newState = NOT_SENT; + if (found && deployed) { + newState = SENT_AND_DEPLOYED; + } else { + if (found) { + newState = SENT; + } else { + if (deployed) { + newState = IN_ERROR; + } + } + } + return newState; + } + + private static ExternalComponentState mergeStates(ExternalComponentState oldState, + ExternalComponentState newState) { + return (oldState.compareTo(newState) < 0) ? newState : oldState; + } + + /** + * This is a method that expect the results of the queries getPolicy and + * getPolicyDeployed for a unique policy (op, config, etc ...). It + * re-computes the global policy state for each policy results given. Therefore + * this method is called multiple times from the camel route and must be reset + * for a new global policy state retrieval. The state to compute the global + * policy state is stored in this class. + */ + @Override + public ExternalComponentState computeState(Exchange camelExchange) { + this.setState(mergeStates(this.getState(), + findNewState((boolean) camelExchange.getIn().getExchange().getProperty("policyFound"), + (boolean) camelExchange.getIn().getExchange().getProperty("policyDeployed")))); + return this.getState(); + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/deploy/DcaeDeployParameters.java b/src/main/java/org/onap/policy/clamp/loop/deploy/DcaeDeployParameters.java new file mode 100644 index 000000000..9d56f23c4 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/deploy/DcaeDeployParameters.java @@ -0,0 +1,113 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.deploy; + +import com.google.gson.JsonObject; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.loop.components.external.DcaeComponent; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.yaml.snakeyaml.Yaml; + +/** + * To decode the bluprint input parameters. + */ +public class DcaeDeployParameters { + + private static LinkedHashMap init(Loop loop) { + LinkedHashMap deploymentParamMap = new LinkedHashMap<>(); + Set microServiceList = loop.getMicroServicePolicies(); + + for (MicroServicePolicy microService : microServiceList) { + deploymentParamMap.put(microService.getName(), + generateDcaeDeployParameter(microService)); + } + return deploymentParamMap; + } + + private static JsonObject generateDcaeDeployParameter(MicroServicePolicy microService) { + return generateDcaeDeployParameter(microService.getLoopElementModel().getBlueprint(), + microService.getName()); + } + + private static JsonObject generateDcaeDeployParameter(String blueprint, String policyId) { + JsonObject deployJsonBody = new JsonObject(); + Yaml yaml = new Yaml(); + Map inputsNodes = ((Map) ((Map) yaml + .load(blueprint)).get("inputs")); + inputsNodes.entrySet().stream().filter(e -> !e.getKey().contains("policy_id")).forEach(elem -> { + Object defaultValue = ((Map) elem.getValue()).get("default"); + if (defaultValue != null) { + addPropertyToNode(deployJsonBody, elem.getKey(), defaultValue); + } else { + deployJsonBody.addProperty(elem.getKey(), ""); + } + }); + deployJsonBody.addProperty("policy_id", policyId); + return deployJsonBody; + } + + private static void addPropertyToNode(JsonObject node, String key, Object value) { + if (value instanceof String) { + node.addProperty(key, (String) value); + } else if (value instanceof Number) { + node.addProperty(key, (Number) value); + } else if (value instanceof Boolean) { + node.addProperty(key, (Boolean) value); + } else if (value instanceof Character) { + node.addProperty(key, (Character) value); + } else { + node.addProperty(key, JsonUtils.GSON.toJson(value)); + } + } + + /** + * Convert the object in Json. + * + * @return The deploymentParameters in Json + */ + public static JsonObject getDcaeDeploymentParametersInJson(Loop loop) { + JsonObject globalProperties = new JsonObject(); + JsonObject deployParamJson = new JsonObject(); + if (loop.getLoopTemplate().getUniqueBlueprint()) { + // Normally the unique blueprint could contain multiple microservices but then we can't guess + // the policy id params that will be used, so here we expect only one by default. + deployParamJson.add(DcaeComponent.UNIQUE_BLUEPRINT_PARAMETERS, + generateDcaeDeployParameter(loop.getLoopTemplate().getBlueprint(), + ((MicroServicePolicy) loop.getMicroServicePolicies().toArray()[0]).getName())); + + } else { + LinkedHashMap deploymentParamMap = init(loop); + for (Map.Entry mapElement : deploymentParamMap.entrySet()) { + deployParamJson.add(mapElement.getKey(), mapElement.getValue()); + } + } + globalProperties.add("dcaeDeployParameters", deployParamJson); + return globalProperties; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/log/LogType.java b/src/main/java/org/onap/policy/clamp/loop/log/LogType.java new file mode 100644 index 000000000..50f6571d6 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/log/LogType.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.log; + +public enum LogType { + INFO, WARNING, ERROR; +} diff --git a/src/main/java/org/onap/policy/clamp/loop/log/LoopLog.java b/src/main/java/org/onap/policy/clamp/loop/log/LoopLog.java new file mode 100644 index 000000000..00f7e1f41 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/log/LoopLog.java @@ -0,0 +1,193 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.log; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.onap.policy.clamp.loop.Loop; + +/** + * This class holds the logs created by the Clamp Backend. The Instant is always + * rounded to the nearest second as the nano seconds can't be stored in the + * database. The logs can be therefore exposed to the UI or the client doing + * some GET Loop on the backend. + * + */ +@Entity +@Table(name = "loop_logs") +public class LoopLog implements Serializable, Comparable { + /** + * The serial version ID. + */ + private static final long serialVersionUID = 1988276670074437631L; + + @Expose + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Expose + @Column(name = "log_type", nullable = false) + @Enumerated(EnumType.STRING) + private LogType logType; + + @Expose + @Column(name = "log_component", nullable = false) + private String logComponent; + + @Expose + @Column(name = "message", columnDefinition = "MEDIUMTEXT", nullable = false) + private String message; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "loop_id", nullable = false) + private Loop loop; + + @Expose + @Column(name = "log_instant", nullable = false) + private Instant logInstant = Instant.now().truncatedTo(ChronoUnit.SECONDS); + + public LoopLog() { + } + + /** + * Constructor For LoopLog taking message and logtype, logComponent and loop + * reference. + * + * @param message The message as string + * @param logType Type like INFO, WARN, DEBUG + * @param logComponent A String with DCAE, POLICY, CLAMP ,etc... + * @param loop The loop object that this log is about + */ + public LoopLog(String message, LogType logType, String logComponent, Loop loop) { + this.message = message; + this.logType = logType; + this.loop = loop; + this.logComponent = logComponent; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LogType getLogType() { + return logType; + } + + public void setLogType(LogType logType) { + this.logType = logType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Loop getLoop() { + return loop; + } + + public void setLoop(Loop loop) { + this.loop = loop; + } + + public Instant getLogInstant() { + return logInstant; + } + + public void setLogInstant(Instant logInstant) { + this.logInstant = logInstant.truncatedTo(ChronoUnit.SECONDS); + } + + public String getLogComponent() { + return logComponent; + } + + public void setLogComponent(String logComponent) { + this.logComponent = logComponent; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + LoopLog other = (LoopLog) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + return true; + } + + @Override + public int compareTo(LoopLog arg0) { + // Reverse it, so that by default we have the latest + if (getId() == null) { + return 1; + } + if (arg0.getId() == null) { + return -1; + } + return arg0.getId().compareTo(this.getId()); + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/log/LoopLogRepository.java b/src/main/java/org/onap/policy/clamp/loop/log/LoopLogRepository.java new file mode 100644 index 000000000..df1f3919e --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/log/LoopLogRepository.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.log; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LoopLogRepository extends JpaRepository { + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/log/LoopLogService.java b/src/main/java/org/onap/policy/clamp/loop/log/LoopLogService.java new file mode 100644 index 000000000..a2f133f2f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/log/LoopLogService.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.log; + +import org.onap.policy.clamp.loop.Loop; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class LoopLogService { + + private final LoopLogRepository repository; + + @Autowired + public LoopLogService(LoopLogRepository repository) { + this.repository = repository; + } + + public void addLog(String message, String logType, Loop loop) { + this.addLogForComponent(message, logType, "CLAMP", loop); + } + + public void addLogForComponent(String message, String logType, String component, Loop loop) { + loop.addLog(repository.save(new LoopLog(message, LogType.valueOf(logType), component, loop))); + } + + public boolean isExisting(Long logId) { + return repository.existsById(logId); + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/service/CsarServiceInstaller.java b/src/main/java/org/onap/policy/clamp/loop/service/CsarServiceInstaller.java new file mode 100644 index 000000000..1429d73c2 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/service/CsarServiceInstaller.java @@ -0,0 +1,129 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.loop.service; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import java.util.Map.Entry; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; +import org.onap.policy.clamp.clds.sdc.controller.installer.CsarHandler; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.elements.queries.EntityQuery; +import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; +import org.onap.sdc.tosca.parser.enums.EntityTemplateType; +import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.Property; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Component +@Qualifier("csarInstaller") +public class CsarServiceInstaller { + private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarServiceInstaller.class); + + @Autowired + ServicesRepository serviceRepository; + + /** + * Install the Service from the csar. + * + * @param csar The Csar Handler + * @return The service object + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public Service installTheService(CsarHandler csar) { + logger.info("Start to install the Service from csar"); + JsonObject serviceDetails = JsonUtils.GSON.fromJson( + JsonUtils.GSON.toJson(csar.getSdcCsarHelper().getServiceMetadataAllProperties()), JsonObject.class); + + // Add properties details for each type, VfModule, VF, VFC, .... + JsonObject resourcesProp = createServicePropertiesByType(csar); + resourcesProp.add("VFModule", createVfModuleProperties(csar)); + + Service modelService = new Service(serviceDetails, resourcesProp, + csar.getSdcNotification().getServiceVersion()); + + serviceRepository.save(modelService); + logger.info("Successfully installed the Service"); + return modelService; + } + + private JsonObject createServicePropertiesByType(CsarHandler csar) { + JsonObject resourcesProp = new JsonObject(); + // Iterate on all types defined in the tosca lib + for (SdcTypes type : SdcTypes.values()) { + JsonObject resourcesPropByType = new JsonObject(); + // For each type, get the metadata of each nodetemplate + for (NodeTemplate nodeTemplate : csar.getSdcCsarHelper().getServiceNodeTemplateBySdcType(type)) { + resourcesPropByType.add(nodeTemplate.getName(), + JsonUtils.GSON.toJsonTree(nodeTemplate.getMetaData().getAllProperties())); + } + resourcesProp.add(type.getValue(), resourcesPropByType); + } + return resourcesProp; + } + + private static JsonObject createVfModuleProperties(CsarHandler csar) { + JsonObject vfModuleProps = new JsonObject(); + // Loop on all Groups defined in the service (VFModule entries type: + // org.openecomp.groups.VfModule) + for (IEntityDetails entity : csar.getSdcCsarHelper().getEntity( + EntityQuery.newBuilder(EntityTemplateType.GROUP).build(), + TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE).build(), false)) { + // Get all metadata info + JsonObject allVfProps = (JsonObject) JsonUtils.GSON.toJsonTree(entity.getMetadata().getAllProperties()); + vfModuleProps.add(entity.getMetadata().getAllProperties().get("vfModuleModelName"), allVfProps); + // now append the properties section so that we can also have isBase, + // volume_group, etc ... fields under the VFmodule name + for (Entry additionalProp : entity.getProperties().entrySet()) { + allVfProps.add(additionalProp.getValue().getName(), + JsonUtils.GSON.toJsonTree(additionalProp.getValue().getValue())); + } + } + return vfModuleProps; + } + + /** + * Verify whether Service in Csar is deployed. + * + * @param csar The Csar Handler + * @return The flag indicating whether Service is deployed + * @throws SdcArtifactInstallerException The SdcArtifactInstallerException + */ + public boolean isServiceAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException { + boolean alreadyInstalled = true; + JsonObject serviceDetails = JsonUtils.GSON.fromJson( + JsonUtils.GSON.toJson(csar.getSdcCsarHelper().getServiceMetadataAllProperties()), JsonObject.class); + alreadyInstalled = serviceRepository.existsById(serviceDetails.get("UUID").getAsString()); + + return alreadyInstalled; + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/service/Service.java b/src/main/java/org/onap/policy/clamp/loop/service/Service.java new file mode 100644 index 000000000..b7442abc5 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/service/Service.java @@ -0,0 +1,169 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.service; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.dao.model.jsontype.StringJsonUserType; + +@Entity +@Table(name = "services") +@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) +public class Service implements Serializable { + + /** + * The serial version id. + */ + private static final long serialVersionUID = 1331119060272760758L; + + @Transient + private static final EELFLogger logger = EELFManager.getInstance().getLogger(Service.class); + + @Id + @Column(name = "service_uuid", unique = true) + private String serviceUuid; + + @Column(nullable = false, name = "name") + private String name; + + @Column(name = "version") + private String version; + + @Expose + @Type(type = "json") + @Column(columnDefinition = "json", name = "service_details") + private JsonObject serviceDetails; + + @Expose + @Type(type = "json") + @Column(columnDefinition = "json", name = "resource_details") + private JsonObject resourceDetails; + + /** + * Default constructor for serialization. + */ + public Service() { + } + + /** + * Constructor with string. + */ + public Service(String serviceDetails, String resourceDetails) { + JsonObject serviceDetailsJson = JsonUtils.GSON.fromJson(serviceDetails, JsonObject.class); + this.name = serviceDetailsJson.get("name").getAsString(); + this.serviceUuid = serviceDetailsJson.get("UUID").getAsString(); + this.serviceDetails = serviceDetailsJson; + this.resourceDetails = JsonUtils.GSON.fromJson(resourceDetails, JsonObject.class); + } + + /** + * Constructor with Json Object. + */ + public Service(JsonObject serviceDetails, JsonObject resourceDetails, String version) { + this.name = serviceDetails.get("name").getAsString(); + this.serviceUuid = serviceDetails.get("UUID").getAsString(); + this.serviceDetails = serviceDetails; + this.resourceDetails = resourceDetails; + this.version = version; + } + + public String getServiceUuid() { + return serviceUuid; + } + + public JsonObject getServiceDetails() { + return serviceDetails; + } + + public JsonObject getResourceDetails() { + return resourceDetails; + } + + public JsonObject getResourceByType(String type) { + return (JsonObject) resourceDetails.get(type); + } + + /** + * Name getter. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Version getter. + * + * @return the version + */ + public String getVersion() { + return version; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((serviceUuid == null) ? 0 : serviceUuid.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Service other = (Service) obj; + if (serviceUuid == null) { + if (other.serviceUuid != null) { + return false; + } + } else { + if (!serviceUuid.equals(other.serviceUuid)) { + return false; + } + } + return true; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/service/ServicesRepository.java b/src/main/java/org/onap/policy/clamp/loop/service/ServicesRepository.java new file mode 100644 index 000000000..62596a08e --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/service/ServicesRepository.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.service; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ServicesRepository extends JpaRepository { +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopElementModel.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopElementModel.java new file mode 100644 index 000000000..6eb3c7195 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopElementModel.java @@ -0,0 +1,295 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import org.hibernate.annotations.SortNatural; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.loop.common.AuditEntity; +import org.onap.policy.clamp.policy.Policy; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; + +/** + * This class represents a micro service/operational/... model for a loop template. + * So it's an element in the flow (a box shown in the loop). + */ + +@Entity +@Table(name = "loop_element_models") +public class LoopElementModel extends AuditEntity implements Serializable { + /** + * The serial version id. + */ + private static final long serialVersionUID = -286522707701376645L; + + @Id + @Expose + @Column(nullable = false, name = "name", unique = true) + private String name; + + @Expose + @Column(name = "dcae_blueprint_id") + private String dcaeBlueprintId; + + /** + * Here we store the blueprint coming from DCAE, it can be null if this is not a micro service model. + */ + @Column(columnDefinition = "MEDIUMTEXT", name = "blueprint_yaml") + private String blueprint; + + public static final String MICRO_SERVICE_TYPE = "MICRO_SERVICE_TYPE"; + public static final String OPERATIONAL_POLICY_TYPE = "OPERATIONAL_POLICY_TYPE"; + /** + * The type of element. + */ + @Expose + @Column(nullable = false, name = "loop_element_type") + private String loopElementType; + + /** + * This variable is used to display the micro-service name in the SVG. + */ + @Expose + @Column(name = "short_name") + private String shortName; + + /** + * This variable is used to store the type mentioned in the micro-service + * blueprint. + */ + @Expose + @ManyToMany( + fetch = FetchType.EAGER, + cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) + @JoinTable( + name = "loopelementmodels_to_policymodels", + joinColumns = @JoinColumn(name = "loop_element_name", referencedColumnName = "name"), + inverseJoinColumns = { + @JoinColumn(name = "policy_model_type", referencedColumnName = "policy_model_type"), + @JoinColumn(name = "policy_model_version", referencedColumnName = "version")}) + @SortNatural + private SortedSet policyModels = new TreeSet<>(); + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "loopElementModel", orphanRemoval = true) + private Set usedByLoopTemplates = new HashSet<>(); + + /** + * policyModels getter. + * + * @return the policyModel + */ + public SortedSet getPolicyModels() { + return policyModels; + } + + /** + * Method to add a new policyModel to the list. + * + * @param policyModel The policy model + */ + public void addPolicyModel(PolicyModel policyModel) { + policyModels.add(policyModel); + policyModel.getUsedByElementModels().add(this); + } + + /** + * name getter. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * name setter. + * + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * blueprint getter. + * + * @return the blueprint + */ + public String getBlueprint() { + return blueprint; + } + + /** + * blueprint setter. + * + * @param blueprint the blueprint to set + */ + public void setBlueprint(String blueprint) { + this.blueprint = blueprint; + } + + /** + * dcaeBlueprintId getter. + * + * @return the dcaeBlueprintId + */ + public String getDcaeBlueprintId() { + return dcaeBlueprintId; + } + + /** + * dcaeBlueprintId setter. + * + * @param dcaeBlueprintId the dcaeBlueprintId to set + */ + public void setDcaeBlueprintId(String dcaeBlueprintId) { + this.dcaeBlueprintId = dcaeBlueprintId; + } + + /** + * loopElementType getter. + * + * @return the loopElementType + */ + public String getLoopElementType() { + return loopElementType; + } + + /** + * loopElementType setter. + * + * @param loopElementType the loopElementType to set + */ + public void setLoopElementType(String loopElementType) { + this.loopElementType = loopElementType; + } + + /** + * shortName getter. + * + * @return the shortName + */ + public String getShortName() { + return shortName; + } + + /** + * * @param shortName the shortName to set. + */ + public void setShortName(String shortName) { + this.shortName = shortName; + } + + /** + * usedByLoopTemplates getter. + * + * @return the usedByLoopTemplates + */ + public Set getUsedByLoopTemplates() { + return usedByLoopTemplates; + } + + /** + * Default constructor for serialization. + */ + public LoopElementModel() { + } + + /** + * Constructor. + * + * @param name The name id + * @param loopElementType The type of loop element + * @param blueprint The blueprint defined for dcae that contains the + * policy type to use + */ + public LoopElementModel(String name, String loopElementType, String blueprint) { + this.name = name; + this.loopElementType = loopElementType; + this.blueprint = blueprint; + } + + /** + * Create a policy instance from the current loop element model. + * + * @return A Policy object. + */ + public Policy createPolicyInstance(Loop loop, ToscaConverterWithDictionarySupport toscaConverter) { + if (LoopElementModel.MICRO_SERVICE_TYPE.equals(this.getLoopElementType())) { + return new MicroServicePolicy(loop, loop.getModelService(), this, toscaConverter); + } else if (LoopElementModel.OPERATIONAL_POLICY_TYPE.equals(this.getLoopElementType())) { + return new OperationalPolicy(loop, loop.getModelService(), this, toscaConverter); + } else { + return null; + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + LoopElementModel other = (LoopElementModel) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopElementModelsRepository.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopElementModelsRepository.java new file mode 100644 index 000000000..d9b879d0f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopElementModelsRepository.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LoopElementModelsRepository extends JpaRepository { +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplate.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplate.java new file mode 100644 index 000000000..ab7367aaf --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplate.java @@ -0,0 +1,341 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import org.hibernate.annotations.SortNatural; +import org.onap.policy.clamp.loop.common.AuditEntity; +import org.onap.policy.clamp.loop.service.Service; + +@Entity +@Table(name = "loop_templates") +public class LoopTemplate extends AuditEntity implements Serializable { + + /** + * The serial version id. + */ + private static final long serialVersionUID = -286522707701388642L; + + @Id + @Expose + @Column(nullable = false, name = "name", unique = true) + private String name; + + @Expose + @Column(name = "dcae_blueprint_id") + private String dcaeBlueprintId; + + /** + * This field is used when we have a blueprint defining all microservices. The + * other option would be to have independent blueprint for each microservices. + * In that case they are stored in each MicroServiceModel + */ + @Column(columnDefinition = "MEDIUMTEXT", name = "blueprint_yaml") + private String blueprint; + + @Expose + @OneToMany( + cascade = CascadeType.ALL, + fetch = FetchType.EAGER, + mappedBy = "loopTemplate", + orphanRemoval = true) + @SortNatural + private SortedSet loopElementModelsUsed = new TreeSet<>(); + + @Expose + @ManyToOne( + fetch = FetchType.EAGER, + cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) + @JoinColumn(name = "service_uuid") + private Service modelService; + + @Expose + @Column(name = "maximum_instances_allowed") + private Integer maximumInstancesAllowed; + + @Expose + @Column(name = "unique_blueprint", columnDefinition = "boolean default false") + private boolean uniqueBlueprint; + + /** + * Type of Loop allowed to be created. + */ + @Expose + @Column(name = "allowed_loop_type") + @Convert(converter = LoopTypeConvertor.class) + private LoopType allowedLoopType = LoopType.CLOSED; + + /** + * name getter. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * name setter. + * + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * blueprint getter. + * + * @return the blueprint + */ + public String getBlueprint() { + return blueprint; + } + + /** + * dcaeBlueprintId getter. + * + * @return the dcaeBlueprintId + */ + public String getDcaeBlueprintId() { + return dcaeBlueprintId; + } + + /** + * dcaeBlueprintId setter. + * + * @param dcaeBlueprintId the dcaeBlueprintId to set + */ + public void setDcaeBlueprintId(String dcaeBlueprintId) { + this.dcaeBlueprintId = dcaeBlueprintId; + } + + /** + * blueprint setter. + * + * @param blueprint the blueprint to set + */ + public void setBlueprint(String blueprint) { + this.blueprint = blueprint; + if (blueprint == null) { + this.uniqueBlueprint = false; + } else { + this.uniqueBlueprint = true; + } + } + + /** + * loopElementModelsUsed getter. + * + * @return the loopElementModelsUsed + */ + public SortedSet getLoopElementModelsUsed() { + return loopElementModelsUsed; + } + + /** + * maximumInstancesAllowed getter. + * + * @return the maximumInstancesAllowed + */ + public Integer getMaximumInstancesAllowed() { + return maximumInstancesAllowed; + } + + /** + * maximumInstancesAllowed setter. + * + * @param maximumInstancesAllowed the maximumInstancesAllowed to set + */ + public void setMaximumInstancesAllowed(Integer maximumInstancesAllowed) { + this.maximumInstancesAllowed = maximumInstancesAllowed; + } + + /** + * allowedLoopType getter. + * + * @return the allowedLoopType Type of Loop allowed to be created + */ + public LoopType getAllowedLoopType() { + return allowedLoopType; + } + + /** + * allowedLoopType setter. + * + * @param allowedLoopType the allowedLoopType to set + */ + public void setAllowedLoopType(LoopType allowedLoopType) { + this.allowedLoopType = allowedLoopType; + } + + /** + * Add list of loopElements to the current template, each loopElementModel is + * added at the end of the list so the flowOrder is computed automatically. + * + * @param loopElementModels The loopElementModel set to add + */ + public void addLoopElementModels(Set loopElementModels) { + for (LoopElementModel loopElementModel : loopElementModels) { + addLoopElementModel(loopElementModel); + } + } + + /** + * Add a loopElement to the current template, the loopElementModel is added at + * the end of the list so the flowOrder is computed automatically. + * + * @param loopElementModel The loopElementModel to add + */ + public void addLoopElementModel(LoopElementModel loopElementModel) { + this.addLoopElementModel(loopElementModel, this.loopElementModelsUsed.size()); + } + + /** + * Add a loopElement model to the current template, the flow order must be + * specified manually. + * + * @param loopElementModel The loopElementModel to add + * @param listPosition The position in the flow + */ + public void addLoopElementModel(LoopElementModel loopElementModel, Integer listPosition) { + LoopTemplateLoopElementModel jointEntry = + new LoopTemplateLoopElementModel(this, loopElementModel, listPosition); + this.loopElementModelsUsed.add(jointEntry); + loopElementModel.getUsedByLoopTemplates().add(jointEntry); + } + + /** + * modelService getter. + * + * @return the modelService + */ + public Service getModelService() { + return modelService; + } + + /** + * modelService setter. + * + * @param modelService the modelService to set + */ + public void setModelService(Service modelService) { + this.modelService = modelService; + } + + /** + * uniqueBlueprint getter. + * + * @return the uniqueBlueprint + */ + public boolean getUniqueBlueprint() { + return uniqueBlueprint; + } + + /** + * Default constructor for serialization. + */ + public LoopTemplate() { + + } + + /** + * Constructor. + * + * @param name The loop template name id + * @param blueprint The blueprint containing all microservices (legacy + * case) + * @param maxInstancesAllowed The maximum number of instances that can be + * created from that template + * @param service The service associated to that loop template + */ + public LoopTemplate(String name, String blueprint, Integer maxInstancesAllowed, Service service) { + this.name = name; + this.setBlueprint(blueprint); + + this.maximumInstancesAllowed = maxInstancesAllowed; + this.modelService = service; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + LoopTemplate other = (LoopTemplate) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + + /** + * Generate the loop template name. + * + * @param serviceName The service name + * @param serviceVersion The service version + * @param resourceName The resource name + * @param blueprintFileName The blueprint file name + * @return The generated loop template name + */ + public static String generateLoopTemplateName(String serviceName, String serviceVersion, + String resourceName, String blueprintFileName) { + StringBuilder buffer = new StringBuilder("LOOP_TEMPLATE_").append(serviceName).append("_v") + .append(serviceVersion).append("_").append(resourceName).append("_") + .append(blueprintFileName.replaceAll(".yaml", "")); + return buffer.toString().replace('.', '_').replaceAll(" ", ""); + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModel.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModel.java new file mode 100644 index 000000000..c0b0c7d24 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModel.java @@ -0,0 +1,192 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.Table; + +@Entity +@Table(name = "looptemplates_to_loopelementmodels") +public class LoopTemplateLoopElementModel implements Serializable, Comparable { + + /** + * Serial ID. + */ + private static final long serialVersionUID = 5924989899078094245L; + + @EmbeddedId + private LoopTemplateLoopElementModelId loopTemplateLoopElementModelId; + + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("loopTemplateName") + @JoinColumn(name = "loop_template_name") + private LoopTemplate loopTemplate; + + @Expose + @ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }) + @MapsId("loopElementModelName") + @JoinColumn(name = "loop_element_model_name") + private LoopElementModel loopElementModel; + + @Expose + @Column(nullable = false, name = "flow_order") + private Integer flowOrder; + + /** + * Default constructor for serialization. + */ + public LoopTemplateLoopElementModel() { + + } + + /** + * Constructor. + * + * @param loopTemplate The loop template object + * @param loopElementModel The loopElementModel object + * @param flowOrder The position of the micro service in the flow + */ + public LoopTemplateLoopElementModel(LoopTemplate loopTemplate, LoopElementModel loopElementModel, + Integer flowOrder) { + this.loopTemplate = loopTemplate; + this.loopElementModel = loopElementModel; + this.flowOrder = flowOrder; + this.loopTemplateLoopElementModelId = new LoopTemplateLoopElementModelId(loopTemplate.getName(), + loopElementModel.getName()); + } + + /** + * loopTemplate getter. + * + * @return the loopTemplate + */ + public LoopTemplate getLoopTemplate() { + return loopTemplate; + } + + /** + * loopTemplate setter. + * + * @param loopTemplate the loopTemplate to set + */ + public void setLoopTemplate(LoopTemplate loopTemplate) { + this.loopTemplate = loopTemplate; + } + + /** + * loopElementModel getter. + * + * @return the loopElementModel + */ + public LoopElementModel getLoopElementModel() { + return loopElementModel; + } + + /** + * loopElementModel setter. + * + * @param loopElementModel the loopElementModel to set + */ + public void setLoopElementModel(LoopElementModel loopElementModel) { + this.loopElementModel = loopElementModel; + } + + /** + * flowOrder getter. + * + * @return the flowOrder + */ + public Integer getFlowOrder() { + return flowOrder; + } + + /** + * flowOrder setter. + * + * @param flowOrder the flowOrder to set + */ + public void setFlowOrder(Integer flowOrder) { + this.flowOrder = flowOrder; + } + + @Override + public int compareTo(LoopTemplateLoopElementModel arg0) { + // Reverse it, so that by default we have the latest + if (getFlowOrder() == null) { + return 1; + } + if (arg0.getFlowOrder() == null) { + return -1; + } + return arg0.getFlowOrder().compareTo(this.getFlowOrder()); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((loopTemplate == null) ? 0 : loopTemplate.hashCode()); + result = prime * result + ((loopElementModel == null) ? 0 : loopElementModel.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + LoopTemplateLoopElementModel other = (LoopTemplateLoopElementModel) obj; + if (loopTemplate == null) { + if (other.loopTemplate != null) { + return false; + } + } else if (!loopTemplate.equals(other.loopTemplate)) { + return false; + } + if (loopElementModel == null) { + if (other.loopElementModel != null) { + return false; + } + } else if (!loopElementModel.equals(other.loopElementModel)) { + return false; + } + return true; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModelId.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModelId.java new file mode 100644 index 000000000..9da8272bd --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplateLoopElementModelId.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +public class LoopTemplateLoopElementModelId implements Serializable { + + /** + * Serial ID. + */ + private static final long serialVersionUID = 4089888115504914773L; + + @Expose + @Column(name = "loop_template_name") + private String loopTemplateName; + + @Expose + @Column(name = "loop_element_model_name") + private String loopElementModelName; + + /** + * Default constructor for serialization. + */ + public LoopTemplateLoopElementModelId() { + + } + + /** + * Constructor. + * + * @param loopTemplateName The loop template name id + * @param microServiceModelName THe micro Service name id + */ + public LoopTemplateLoopElementModelId(String loopTemplateName, String microServiceModelName) { + this.loopTemplateName = loopTemplateName; + this.loopElementModelName = microServiceModelName; + } + + /** + * loopTemplateName getter. + * + * @return the loopTemplateName + */ + public String getLoopTemplateName() { + return loopTemplateName; + } + + /** + * loopTemplateName setter. + * + * @param loopTemplateName the loopTemplateName to set + */ + public void setLoopTemplateName(String loopTemplateName) { + this.loopTemplateName = loopTemplateName; + } + + /** + * microServiceModelName getter. + * + * @return the microServiceModelName + */ + public String getLoopElementModelName() { + return loopElementModelName; + } + + /** + * loopElementModelName setter. + * + * @param loopElementModelName the loopElementModelName to set + */ + public void setLoopElementModelName(String loopElementModelName) { + this.loopElementModelName = loopElementModelName; + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesRepository.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesRepository.java new file mode 100644 index 000000000..3993dee34 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesRepository.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface LoopTemplatesRepository extends JpaRepository { + + @Query("SELECT looptemplate.name FROM LoopTemplate as looptemplate") + List getAllLoopTemplateNames(); +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesService.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesService.java new file mode 100644 index 000000000..974cf3b5c --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopTemplatesService.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import java.util.List; +import org.onap.policy.clamp.clds.sdc.controller.installer.ChainGenerator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class LoopTemplatesService { + + private final LoopTemplatesRepository loopTemplatesRepository; + + @Autowired + ChainGenerator chainGenerator; + + /** + * Constructor. + */ + @Autowired + public LoopTemplatesService(LoopTemplatesRepository loopTemplatesRepository) { + this.loopTemplatesRepository = loopTemplatesRepository; + + } + + public LoopTemplate saveOrUpdateLoopTemplate(LoopTemplate loopTemplate) { + return loopTemplatesRepository.save(loopTemplate); + } + + public List getLoopTemplateNames() { + return loopTemplatesRepository.getAllLoopTemplateNames(); + } + + public List getAllLoopTemplates() { + return loopTemplatesRepository.findAll(); + } + + public LoopTemplate getLoopTemplate(String name) { + return loopTemplatesRepository.findById(name).orElse(null); + } + + public void deleteLoopTemplate(String name) { + loopTemplatesRepository.deleteById(name); + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopType.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopType.java new file mode 100644 index 000000000..eacfecb5e --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopType.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +/** + * Enums for AllowedLoopType in LoopTemplate enity. + * + */ +public enum LoopType { + OPEN("OPEN"), CLOSED("CLOSED"), HYBRID("HYBRID"); + + private String value; + + private LoopType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/LoopTypeConvertor.java b/src/main/java/org/onap/policy/clamp/loop/template/LoopTypeConvertor.java new file mode 100644 index 000000000..81ca18d57 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/LoopTypeConvertor.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import java.util.stream.Stream; +import javax.persistence.AttributeConverter; + +/** + * Attribute Converter to allow using LoopType Enum values in DB and Java classes. + * + */ +public class LoopTypeConvertor implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(LoopType loopType) { + if (loopType == null) { + return null; + } + return loopType.getValue(); + } + + @Override + public LoopType convertToEntityAttribute(String value) { + if (value == null) { + return null; + } + + return Stream.of(LoopType.values()).filter(c -> c.getValue().equals(value)).findFirst() + .orElseThrow(IllegalArgumentException::new); + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/PolicyModel.java b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModel.java new file mode 100644 index 000000000..2414377d7 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModel.java @@ -0,0 +1,282 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; +import org.onap.policy.clamp.dao.model.jsontype.StringJsonUserType; +import org.onap.policy.clamp.loop.common.AuditEntity; +import org.onap.policy.clamp.util.SemanticVersioning; + +/** + * This class represents the policy model tosca revision that we can have to a + * specific microservice. + */ +@Entity +@Table(name = "policy_models") +@IdClass(PolicyModelId.class) +@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) +public class PolicyModel extends AuditEntity implements Serializable, Comparable { + + /** + * The serial version id. + */ + private static final long serialVersionUID = -286522705701376645L; + + /** + * This variable is used to store the type mentioned in the micro-service + * blueprint. + */ + @Id + @Expose + @Column(nullable = false, name = "policy_model_type") + private String policyModelType; + + /** + * Semantic versioning on policy side. + */ + @Id + @Expose + @Column(name = "version", nullable = false) + private String version; + + @Column(columnDefinition = "MEDIUMTEXT", name = "policy_tosca") + private String policyModelTosca; + + @Expose + @Column(name = "policy_acronym") + private String policyAcronym; + + @ManyToMany(mappedBy = "policyModels", fetch = FetchType.EAGER) + private Set usedByElementModels = new HashSet<>(); + + @Expose + @Type(type = "json") + @Column(columnDefinition = "json", name = "policy_pdp_group") + private JsonObject policyPdpGroup; + + /** + * usedByElementModels getter. + * + * @return the usedByElementModels + */ + public Set getUsedByElementModels() { + return usedByElementModels; + } + + /** + * policyPdpGroup getter. + * + * @return the policyPdpGroup + */ + public JsonObject getPolicyPdpGroup() { + return policyPdpGroup; + } + + /** + * policyPdpGroup setter. + * + * @param policyPdpGroup the policyPdpGroup to set + */ + public void setPolicyPdpGroup(JsonObject policyPdpGroup) { + this.policyPdpGroup = policyPdpGroup; + } + + /** + * policyModelTosca getter. + * + * @return the policyModelTosca + */ + public String getPolicyModelTosca() { + return policyModelTosca; + } + + /** + * policyModelTosca setter. + * + * @param policyModelTosca the policyModelTosca to set + */ + public void setPolicyModelTosca(String policyModelTosca) { + this.policyModelTosca = policyModelTosca; + } + + /** + * policyModelType getter. + * + * @return the modelType + */ + public String getPolicyModelType() { + return policyModelType; + } + + /** + * policyModelType setter. + * + * @param modelType the modelType to set + */ + public void setPolicyModelType(String modelType) { + this.policyModelType = modelType; + } + + /** + * version getter. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * version setter. + * + * @param version the version to set + */ + public void setVersion(String version) { + // Try to convert it before + this.version = version; + } + + /** + * policyAcronym getter. + * + * @return the policyAcronym value + */ + public String getPolicyAcronym() { + return policyAcronym; + } + + /** + * policyAcronym setter. + * + * @param policyAcronym The policyAcronym to set + */ + public void setPolicyAcronym(String policyAcronym) { + this.policyAcronym = policyAcronym; + } + + /** + * Default constructor for serialization. + */ + public PolicyModel() { + } + + /** + * Constructor. + * + * @param policyType The policyType (referenced in the blueprint + * @param policyModelTosca The policy tosca model in yaml + * @param version the version like 1.0.0 + * @param policyAcronym Subtype for policy if it exists (could be used by UI) + */ + public PolicyModel(String policyType, String policyModelTosca, String version, + String policyAcronym) { + this.policyModelType = policyType; + this.policyModelTosca = policyModelTosca; + this.version = version; + this.policyAcronym = policyAcronym; + if (this.policyAcronym == null) { + this.policyAcronym = createDefaultPolicyAcronym(policyType); + } + } + + /** + * Constructor with acronym generated by default from policyType. + * + * @param policyType The policyType (referenced in the blueprint + * @param policyModelTosca The policy tosca model in yaml + * @param version the version like 1.0.0 + */ + public PolicyModel(String policyType, String policyModelTosca, String version) { + this(policyType, policyModelTosca, version, null); + } + + public static String createDefaultPolicyAcronym(String policyType) { + String[] policyNameArray = policyType.split("\\."); + return policyNameArray[policyNameArray.length - 1]; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((policyModelType == null) ? 0 : policyModelType.hashCode()); + result = prime * result + ((version == null) ? 0 : version.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + PolicyModel other = (PolicyModel) obj; + if (policyModelType == null) { + if (other.policyModelType != null) { + return false; + } + } else if (!policyModelType.equals(other.policyModelType)) { + return false; + } + if (version == null) { + if (other.version != null) { + return false; + } + } else if (!version.equals(other.version)) { + return false; + } + return true; + } + + @Override + public int compareTo(PolicyModel arg0) { + + if (this.getPolicyModelType().equals(arg0.getPolicyModelType())) { + // Reverse it, so that by default we have the latest in they are same model type + return SemanticVersioning.compare(arg0.getVersion(), this.version); + } else { + return this.getPolicyModelType().compareTo(arg0.getPolicyModelType()); + } + + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelId.java b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelId.java new file mode 100644 index 000000000..2591bd174 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelId.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; + +public class PolicyModelId implements Serializable { + + /** + * Serial Id. + */ + private static final long serialVersionUID = -2846526482064334745L; + + @Expose + private String policyModelType; + + @Expose + private String version; + + /** + * Default constructor for serialization. + */ + public PolicyModelId() { + + } + + /** + * Constructor. + */ + public PolicyModelId(String policyModelType, String version) { + this.policyModelType = policyModelType; + this.version = version; + } + + /** + * policyModelType getter. + * + * @return the policyModelType + */ + public String getPolicyModelType() { + return policyModelType; + } + + /** + * policyModelType setter. + * + * @param policyModelType the policyModelType to set + */ + public void setPolicyModelType(String policyModelType) { + this.policyModelType = policyModelType; + } + + /** + * version getter. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * version setter. + * + * @param version the version to set + */ + public void setVersion(String version) { + this.version = version; + } +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsRepository.java b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsRepository.java new file mode 100644 index 000000000..6ff7e3d0c --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsRepository.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface PolicyModelsRepository extends JpaRepository { + @Query("SELECT policymodel.policyModelType FROM PolicyModel as policymodel") + List getAllPolicyModelType(); + + List findByPolicyModelType(String policyModelType); +} diff --git a/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsService.java b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsService.java new file mode 100644 index 000000000..8670ab73e --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/loop/template/PolicyModelsService.java @@ -0,0 +1,173 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop.template; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.onap.policy.clamp.clds.tosca.ToscaSchemaConstants; +import org.onap.policy.clamp.clds.tosca.ToscaYamlToJsonConvertor; +import org.onap.policy.clamp.policy.pdpgroup.PdpGroup; +import org.onap.policy.clamp.util.SemanticVersioning; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class PolicyModelsService { + private final PolicyModelsRepository policyModelsRepository; + private ToscaYamlToJsonConvertor toscaYamlToJsonConvertor; + + @Autowired + public PolicyModelsService(PolicyModelsRepository policyModelrepo, + ToscaYamlToJsonConvertor convertor) { + policyModelsRepository = policyModelrepo; + toscaYamlToJsonConvertor = convertor; + } + + /** + * Save or Update Policy Model. + * + * @param policyModel The policyModel + * @return The Policy Model + */ + public PolicyModel saveOrUpdatePolicyModel(PolicyModel policyModel) { + return policyModelsRepository.saveAndFlush(policyModel); + } + + /** + * Verify whether Policy Model exist by ID. + * + * @param policyModelId The policyModel Id + * @return The flag indicates whether Policy Model exist + */ + public boolean existsById(PolicyModelId policyModelId) { + return policyModelsRepository.existsById(policyModelId); + } + + /** + * Creates or updates the Tosca Policy Model. + * + * @param policyModelTosca The Policymodel object + * @return The Policy Model created + */ + public PolicyModel createNewPolicyModelFromTosca(String policyModelTosca) { + JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(policyModelTosca); + String policyModelTypeFromTosca = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, + ToscaSchemaConstants.METADATA_POLICY_MODEL_TYPE); + Iterable models = getAllPolicyModelsByType(policyModelTypeFromTosca); + Collections.sort((List) models); + PolicyModel newPolicyModel = new PolicyModel(policyModelTypeFromTosca, policyModelTosca, + SemanticVersioning.incrementMajorVersion(((ArrayList) models).isEmpty() ? null + : ((ArrayList) models).get(0).getVersion()), + toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, + ToscaSchemaConstants.METADATA_ACRONYM)); + return saveOrUpdatePolicyModel(newPolicyModel); + } + + /** + * Update an existing Tosca Policy Model. + * + * @param policyModelType The policy Model type in Tosca yaml + * @param policyModelVersion The policy Version to update + * @param policyModelTosca The Policy Model tosca + * @return The Policy Model updated + */ + public PolicyModel updatePolicyModelTosca(String policyModelType, String policyModelVersion, + String policyModelTosca) { + JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(policyModelTosca); + PolicyModel thePolicyModel = getPolicyModel(policyModelType, policyModelVersion); + thePolicyModel.setPolicyAcronym(toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, + ToscaSchemaConstants.METADATA_ACRONYM)); + thePolicyModel.setPolicyModelTosca(policyModelTosca); + return saveOrUpdatePolicyModel(thePolicyModel); + } + + public List getAllPolicyModelTypes() { + return policyModelsRepository.getAllPolicyModelType(); + } + + public Iterable getAllPolicyModels() { + return policyModelsRepository.findAll(); + } + + public PolicyModel getPolicyModel(String type, String version) { + return policyModelsRepository.findById(new PolicyModelId(type, version)).orElse(null); + } + + public Iterable getAllPolicyModelsByType(String type) { + return policyModelsRepository.findByPolicyModelType(type); + } + + /** + * Retrieves the Tosca model Yaml string. + * + * @param type The Policy Model Type + * @param version The policy model version + * @return The Tosca model Yaml string + */ + public String getPolicyModelTosca(String type, String version) { + return policyModelsRepository.findById(new PolicyModelId(type, version)) + .orElse(new PolicyModel()).getPolicyModelTosca(); + } + + /** + * This method creates an PolicyModel in Db if it does not exist. + * + * @param policyModel The policyModel to save + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public PolicyModel savePolicyModelInNewTransaction(PolicyModel policyModel) { + return policyModelsRepository.saveAndFlush(policyModel); + } + + /** + * Update the Pdp Group info in Policy Model DB. + * + * @param pdpGroupList The list of Pdp Group info received from Policy Engine + */ + public void updatePdpGroupInfo(List pdpGroupList) { + List policyModelList = policyModelsRepository.findAll(); + for (PolicyModel policyModel : policyModelList) { + JsonArray supportedPdpGroups = new JsonArray(); + for (PdpGroup pdpGroup : pdpGroupList) { + JsonObject supportedPdpGroup = pdpGroup.getSupportedSubgroups( + policyModel.getPolicyModelType(), policyModel.getVersion()); + if (supportedPdpGroup != null) { + supportedPdpGroups.add(supportedPdpGroup); + } + } + + if (supportedPdpGroups.size() > 0) { + JsonObject supportedPdpJson = new JsonObject(); + supportedPdpJson.add("supportedPdpGroups", supportedPdpGroups); + policyModel.setPolicyPdpGroup(supportedPdpJson); + policyModelsRepository.saveAndFlush(policyModel); + } + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/Policy.java b/src/main/java/org/onap/policy/clamp/policy/Policy.java new file mode 100644 index 000000000..801183cab --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/Policy.java @@ -0,0 +1,287 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; +import java.io.UnsupportedEncodingException; +import java.util.Map; +import javax.persistence.Column; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; +import javax.persistence.ManyToOne; +import javax.persistence.MappedSuperclass; +import javax.persistence.Transient; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; +import org.json.JSONObject; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.dao.model.jsontype.StringJsonUserType; +import org.onap.policy.clamp.loop.common.AuditEntity; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.yaml.snakeyaml.Yaml; + +@MappedSuperclass +@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) +public abstract class Policy extends AuditEntity { + + @Transient + private static final EELFLogger logger = EELFManager.getInstance().getLogger(Policy.class); + + @Expose + @Type(type = "json") + @Column(columnDefinition = "json", name = "json_representation", nullable = false) + private JsonObject jsonRepresentation; + + @Expose + @Type(type = "json") + @Column(columnDefinition = "json", name = "configurations_json") + private JsonObject configurationsJson; + + /** + * This attribute can be null when the user add a policy on the loop instance, not the template. + * When null, It therefore indicates that this policy is not by default in the loop template. + */ + @Expose + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "loop_element_model_id") + private LoopElementModel loopElementModel; + + @Expose + @Column(name = "pdp_group") + private String pdpGroup; + + @Expose + @Column(name = "pdp_sub_group") + private String pdpSubgroup; + + @Expose + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumns({@JoinColumn(name = "policy_model_type", referencedColumnName = "policy_model_type"), + @JoinColumn(name = "policy_model_version", referencedColumnName = "version")}) + private PolicyModel policyModel; + + private JsonObject createJsonFromPolicyTosca() { + Map map = + new Yaml().load(this.getPolicyModel() != null ? this.getPolicyModel().getPolicyModelTosca() : ""); + JSONObject jsonObject = new JSONObject(map); + return new Gson().fromJson(jsonObject.toString(), JsonObject.class); + } + + /** + * This method create the policy payload that must be sent to PEF. + * + * @return A String containing the payload + * @throws UnsupportedEncodingException In case of failure + */ + public String createPolicyPayload() throws UnsupportedEncodingException { + JsonObject toscaJson = createJsonFromPolicyTosca(); + + JsonObject policyPayloadResult = new JsonObject(); + + policyPayloadResult.add("tosca_definitions_version", toscaJson.get("tosca_definitions_version")); + + JsonObject topologyTemplateNode = new JsonObject(); + policyPayloadResult.add("topology_template", topologyTemplateNode); + + JsonArray policiesArray = new JsonArray(); + topologyTemplateNode.add("policies", policiesArray); + + JsonObject thisPolicy = new JsonObject(); + policiesArray.add(thisPolicy); + + JsonObject policyDetails = new JsonObject(); + thisPolicy.add(this.getName(), policyDetails); + policyDetails.addProperty("type", this.getPolicyModel().getPolicyModelType()); + policyDetails.addProperty("type_version", this.getPolicyModel().getVersion()); + policyDetails.addProperty("version", this.getPolicyModel().getVersion()); + + JsonObject policyMetadata = new JsonObject(); + policyDetails.add("metadata", policyMetadata); + policyMetadata.addProperty("policy-id", this.getName()); + + policyDetails.add("properties", this.getConfigurationsJson()); + + String policyPayload = new GsonBuilder().setPrettyPrinting().create().toJson(policyPayloadResult); + logger.info("Policy payload: " + policyPayload); + return policyPayload; + } + + + /** + * Name getter. + * + * @return the name + */ + public abstract String getName(); + + /** + * Name setter. + */ + public abstract void setName(String name); + + /** + * jsonRepresentation getter. + * + * @return the jsonRepresentation + */ + public JsonObject getJsonRepresentation() { + return jsonRepresentation; + } + + /** + * jsonRepresentation setter. + * + * @param jsonRepresentation The jsonRepresentation to set + */ + public void setJsonRepresentation(JsonObject jsonRepresentation) { + this.jsonRepresentation = jsonRepresentation; + } + + /** + * Regenerate the Policy Json Representation. + * + * @param toscaConverter The tosca converter required to regenerate the json schema + * @param serviceModel The service model associated + */ + public abstract void updateJsonRepresentation(ToscaConverterWithDictionarySupport toscaConverter, + Service serviceModel); + + /** + * policyModel getter. + * + * @return the policyModel + */ + public PolicyModel getPolicyModel() { + return policyModel; + } + + /** + * policyModel setter. + * + * @param policyModel The new policyModel + */ + public void setPolicyModel(PolicyModel policyModel) { + this.policyModel = policyModel; + } + + /** + * configurationsJson getter. + * + * @return The configurationsJson + */ + public JsonObject getConfigurationsJson() { + return configurationsJson; + } + + /** + * configurationsJson setter. + * + * @param configurationsJson the configurationsJson to set + */ + public void setConfigurationsJson(JsonObject configurationsJson) { + this.configurationsJson = configurationsJson; + } + + /** + * loopElementModel getter. + * + * @return the loopElementModel + */ + public LoopElementModel getLoopElementModel() { + return loopElementModel; + } + + /** + * loopElementModel setter. + * + * @param loopElementModel the loopElementModel to set + */ + public void setLoopElementModel(LoopElementModel loopElementModel) { + this.loopElementModel = loopElementModel; + } + + /** + * pdpGroup getter. + * + * @return the pdpGroup + */ + public String getPdpGroup() { + return pdpGroup; + } + + /** + * pdpGroup setter. + * + * @param pdpGroup the pdpGroup to set + */ + public void setPdpGroup(String pdpGroup) { + this.pdpGroup = pdpGroup; + } + + /** + * pdpSubgroup getter. + * + * @return the pdpSubgroup + */ + public String getPdpSubgroup() { + return pdpSubgroup; + } + + /** + * pdpSubgroup setter. + * + * @param pdpSubgroup the pdpSubgroup to set + */ + public void setPdpSubgroup(String pdpSubgroup) { + this.pdpSubgroup = pdpSubgroup; + } + + /** + * Generate the policy name. + * + * @param policyType The policy type + * @param serviceName The service name + * @param serviceVersion The service version + * @param resourceName The resource name + * @param blueprintFilename The blueprint file name + * @return The generated policy name + */ + public static String generatePolicyName(String policyType, String serviceName, String serviceVersion, + String resourceName, String blueprintFilename) { + StringBuilder buffer = new StringBuilder(policyType).append("_").append(serviceName).append("_v") + .append(serviceVersion).append("_").append(resourceName).append("_") + .append(blueprintFilename.replaceAll(".yaml", "")); + return buffer.toString().replace('.', '_').replaceAll(" ", ""); + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/PolicyService.java b/src/main/java/org/onap/policy/clamp/policy/PolicyService.java new file mode 100644 index 000000000..35ffa2443 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/PolicyService.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy; + +import java.util.List; +import java.util.Set; +import org.onap.policy.clamp.loop.Loop; + +public interface PolicyService { + + Set updatePolicies(Loop loop, List newPolicies); + + boolean isExisting(String policyName); +} diff --git a/src/main/java/org/onap/policy/clamp/policy/downloader/PolicyEngineController.java b/src/main/java/org/onap/policy/clamp/policy/downloader/PolicyEngineController.java new file mode 100644 index 000000000..569678dc7 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/downloader/PolicyEngineController.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.downloader; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.time.Instant; +import org.json.simple.parser.ParseException; +import org.onap.policy.clamp.clds.client.PolicyEngineServices; +import org.onap.policy.clamp.loop.template.PolicyModelsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Scheduled; + +/** + * This class implements a periodic job that is done in the background to + * synchronize policy models available on the policy engine and the clamp + * database table PolicyModel. + */ +@Configuration +@Profile("clamp-policy-controller") +public class PolicyEngineController { + + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyEngineController.class); + protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); + protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); + public static final String POLICY_RETRY_INTERVAL = "policy.retry.interval"; + public static final String POLICY_RETRY_LIMIT = "policy.retry.limit"; + + private final PolicyEngineServices policyEngineServices; + + private Instant lastInstantExecuted; + + @Autowired + public PolicyEngineController(PolicyEngineServices policyEngineService, + PolicyModelsRepository policyModelsRepository) { + this.policyEngineServices = policyEngineService; + } + + @Scheduled(fixedRate = 300000) + public synchronized void synchronizeAllPolicies() { + policyEngineServices.synchronizeAllPolicies(); + lastInstantExecuted = Instant.now(); + } + + public Instant getLastInstantExecuted() { + return lastInstantExecuted; + } + + @Scheduled(fixedRate = 300000) + public synchronized void downloadPdpGroups() throws ParseException { + policyEngineServices.downloadPdpGroups(); + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicy.java b/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicy.java new file mode 100644 index 000000000..2e5db8e24 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicy.java @@ -0,0 +1,275 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.microservice; + +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import org.apache.commons.lang3.RandomStringUtils; +import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.dao.model.jsontype.StringJsonUserType; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.policy.Policy; + +@Entity +@Table(name = "micro_service_policies") +@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) +public class MicroServicePolicy extends Policy implements Serializable { + /** + * The serial version ID. + */ + private static final long serialVersionUID = 6271238288583332616L; + + @Expose + @Id + @Column(nullable = false, name = "name", unique = true) + private String name; + + @Expose + @Column(name = "context") + private String context; + + @Expose + @Column(name = "device_type_scope") + private String deviceTypeScope; + + @Expose + @Column(name = "shared", nullable = false) + private Boolean shared; + + @ManyToMany(mappedBy = "microServicePolicies", fetch = FetchType.EAGER) + private Set usedByLoops = new HashSet<>(); + + @Expose + @Column(name = "dcae_deployment_id") + private String dcaeDeploymentId; + + @Expose + @Column(name = "dcae_deployment_status_url") + private String dcaeDeploymentStatusUrl; + + @Expose + @Column(name = "dcae_blueprint_id") + private String dcaeBlueprintId; + + /** + * Constructor for serialization. + */ + public MicroServicePolicy() { + } + + /** + * The constructor that does not make use of ToscaYamlToJsonConvertor but take + * the jsonRepresentation instead. + * + * @param name The name of the MicroService + * @param policyModel The policy model type of the MicroService + * @param shared The flag indicate whether the MicroService is + * shared + * @param jsonRepresentation The UI representation in json format + * @param loopElementModel The loop element model from which this instance should be created + * @param pdpGroup The Pdp Group info + * @param pdpSubgroup The Pdp Subgroup info + */ + public MicroServicePolicy(String name, PolicyModel policyModel, Boolean shared, + JsonObject jsonRepresentation, LoopElementModel loopElementModel, String pdpGroup, + String pdpSubgroup) { + this.name = name; + this.setPolicyModel(policyModel); + this.shared = shared; + this.setJsonRepresentation(jsonRepresentation); + this.setLoopElementModel(loopElementModel); + this.setPdpGroup(pdpGroup); + this.setPdpSubgroup(pdpSubgroup); + } + + /** + * Constructor with tosca converter. + * + * @param loop The loop instance + * @param service The service model object + * @param loopElementModel The loop element model from which this microservice instance is created + * @param toscaConverter The tosca converter that will used to convert the tosca policy model + */ + public MicroServicePolicy(Loop loop, Service service, LoopElementModel loopElementModel, + ToscaConverterWithDictionarySupport toscaConverter) { + this(Policy.generatePolicyName("MICROSERVICE", service.getName(), service.getVersion(), + loopElementModel.getPolicyModels().first().getPolicyAcronym() + '_' + + loopElementModel.getPolicyModels().first().getVersion(), + RandomStringUtils.randomAlphanumeric(3)), + loopElementModel.getPolicyModels().first(), false, new JsonObject(), loopElementModel, null, null); + this.updateJsonRepresentation(toscaConverter, service); + } + + @Override + public String getName() { + return name; + } + + /** + * name setter. + * + * @param name the name to set + */ + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public void updateJsonRepresentation(ToscaConverterWithDictionarySupport toscaConverter, Service serviceModel) { + this.setJsonRepresentation( + toscaConverter.convertToscaToJsonSchemaObject(this.getPolicyModel().getPolicyModelTosca(), + this.getPolicyModel().getPolicyModelType(), serviceModel)); + } + + public Boolean getShared() { + return shared; + } + + void setShared(Boolean shared) { + this.shared = shared; + } + + public Set getUsedByLoops() { + return usedByLoops; + } + + void setUsedByLoops(Set usedBy) { + this.usedByLoops = usedBy; + } + + public String getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } + + public String getDeviceTypeScope() { + return deviceTypeScope; + } + + public void setDeviceTypeScope(String deviceTypeScope) { + this.deviceTypeScope = deviceTypeScope; + } + + /** + * dcaeDeploymentId getter. + * + * @return the dcaeDeploymentId + */ + public String getDcaeDeploymentId() { + return dcaeDeploymentId; + } + + /** + * dcaeDeploymentId setter. + * + * @param dcaeDeploymentId the dcaeDeploymentId to set + */ + public void setDcaeDeploymentId(String dcaeDeploymentId) { + this.dcaeDeploymentId = dcaeDeploymentId; + } + + /** + * dcaeDeploymentStatusUrl getter. + * + * @return the dcaeDeploymentStatusUrl + */ + public String getDcaeDeploymentStatusUrl() { + return dcaeDeploymentStatusUrl; + } + + /** + * dcaeDeploymentStatusUrl setter. + * + * @param dcaeDeploymentStatusUrl the dcaeDeploymentStatusUrl to set + */ + public void setDcaeDeploymentStatusUrl(String dcaeDeploymentStatusUrl) { + this.dcaeDeploymentStatusUrl = dcaeDeploymentStatusUrl; + } + + /** + * dcaeBlueprintId getter. + * + * @return the dcaeBlueprintId + */ + public String getDcaeBlueprintId() { + return dcaeBlueprintId; + } + + /** + * dcaeBlueprintId setter. + * + * @param dcaeBlueprintId the dcaeBlueprintId to set + */ + void setDcaeBlueprintId(String dcaeBlueprintId) { + this.dcaeBlueprintId = dcaeBlueprintId; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + MicroServicePolicy other = (MicroServicePolicy) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyRepository.java b/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyRepository.java new file mode 100644 index 000000000..2ce2c4f17 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyRepository.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.microservice; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MicroServicePolicyRepository extends JpaRepository { + +} diff --git a/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyService.java b/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyService.java new file mode 100644 index 000000000..b9871049e --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/microservice/MicroServicePolicyService.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.microservice; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.policy.PolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MicroServicePolicyService implements PolicyService { + + private final MicroServicePolicyRepository microServiceRepository; + + @Autowired + public MicroServicePolicyService(MicroServicePolicyRepository microServiceRepository) { + this.microServiceRepository = microServiceRepository; + } + + @Override + public Set updatePolicies(Loop loop, List newMicroservicePolicies) { + return newMicroservicePolicies.stream().map(policy -> getAndUpdateMicroServicePolicy(loop, policy)) + .collect(Collectors.toSet()); + } + + @Override + public boolean isExisting(String policyName) { + return microServiceRepository.existsById(policyName); + } + + /** + * Get and update the MicroService policy properties. + * + * @param loop The loop + * @param policy The new MicroService policy + * @return The updated MicroService policy + */ + public MicroServicePolicy getAndUpdateMicroServicePolicy(Loop loop, MicroServicePolicy policy) { + return microServiceRepository.save( + microServiceRepository + .findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop)) + .orElse(new MicroServicePolicy(policy.getName(), policy.getPolicyModel(), + policy.getShared(), policy.getJsonRepresentation(), null, policy.getPdpGroup(), + policy.getPdpSubgroup()))); + } + + private MicroServicePolicy updateMicroservicePolicyProperties(MicroServicePolicy oldPolicy, + MicroServicePolicy newPolicy, Loop loop) { + oldPolicy.setConfigurationsJson(newPolicy.getConfigurationsJson()); + if (!oldPolicy.getUsedByLoops().contains(loop)) { + oldPolicy.getUsedByLoops().add(loop); + } + oldPolicy.setPdpGroup(newPolicy.getPdpGroup()); + oldPolicy.setPdpSubgroup(newPolicy.getPdpSubgroup()); + return oldPolicy; + } + + /** + * Update the MicroService policy deployment related parameters. + * + * @param microServicePolicy The micro service policy + * @param deploymentId The deployment ID as returned by DCAE + * @param deploymentUrl The Deployment URL as returned by DCAE + */ + public void updateDcaeDeploymentFields(MicroServicePolicy microServicePolicy, String deploymentId, + String deploymentUrl) { + microServicePolicy.setDcaeDeploymentId(deploymentId); + microServicePolicy.setDcaeDeploymentStatusUrl(deploymentUrl); + microServiceRepository.saveAndFlush(microServicePolicy); + } + + + /** + * Api to refresh the MicroService Policy UI window. + * + * @param microServicePolicy The micro Service policy object + * @param toscaConverter The tosca converter required to convert the tosca model to json schema + * @param loop As a microservice object can belong to multiple loops, we need it here + */ + public void refreshMicroServicePolicyJsonRepresentation(MicroServicePolicy microServicePolicy, + ToscaConverterWithDictionarySupport toscaConverter, + Loop loop) { + microServicePolicy.updateJsonRepresentation(toscaConverter, loop.getModelService()); + this.microServiceRepository.saveAndFlush(microServicePolicy); + + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicy.java b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicy.java new file mode 100644 index 000000000..5b29f319c --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicy.java @@ -0,0 +1,218 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.policy.operational; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.apache.commons.lang3.RandomStringUtils; +import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.dao.model.jsontype.StringJsonUserType; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.policy.Policy; + +@Entity +@Table(name = "operational_policies") +@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)}) +public class OperationalPolicy extends Policy implements Serializable { + /** + * The serial version ID. + */ + private static final long serialVersionUID = 6117076450841538255L; + + @Transient + private static final EELFLogger logger = EELFManager.getInstance().getLogger(OperationalPolicy.class); + + @Id + @Expose + @Column(nullable = false, name = "name", unique = true) + private String name; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "loop_id", nullable = false) + private Loop loop; + + /** + * Constructor for serialization. + */ + public OperationalPolicy() { + } + + /** + * The constructor. + * + * @param name The name of the operational policy + * @param configurationsJson The operational policy property in the format of + * json + * @param jsonRepresentation The jsonObject defining the json schema + * @param policyModel The policy model associated if any, can be null + * @param loopElementModel The loop element from which this instance is supposed to be created + * @param pdpGroup The Pdp Group info + * @param pdpSubgroup The Pdp Subgroup info + */ + public OperationalPolicy(String name, JsonObject configurationsJson, + JsonObject jsonRepresentation, PolicyModel policyModel, + LoopElementModel loopElementModel, String pdpGroup, String pdpSubgroup) { + this.name = name; + this.setPolicyModel(policyModel); + this.setConfigurationsJson(configurationsJson); + this.setPdpGroup(pdpGroup); + this.setPdpSubgroup(pdpSubgroup); + this.setLoopElementModel(loopElementModel); + this.setJsonRepresentation(jsonRepresentation); + + } + + /** + * Create an operational policy from a loop element model. + * + * @param loop The parent loop + * @param service The loop service + * @param loopElementModel The loop element model + * @param toscaConverter The tosca converter that must be used to create the Json representation + */ + public OperationalPolicy(Loop loop, Service service, LoopElementModel loopElementModel, + ToscaConverterWithDictionarySupport toscaConverter) { + this(Policy.generatePolicyName("OPERATIONAL", service.getName(), service.getVersion(), + loopElementModel.getPolicyModels().first().getPolicyAcronym() + '_' + + loopElementModel.getPolicyModels().first().getVersion(), + RandomStringUtils.randomAlphanumeric(3)), new JsonObject(), + new JsonObject(), loopElementModel.getPolicyModels().first(), loopElementModel, null, null); + this.setLoop(loop); + this.updateJsonRepresentation(toscaConverter, service); + } + + /** + * Create an operational policy from a policy model. + * + * @param loop The parent loop + * @param service The loop service + * @param policyModel The policy model + * @param toscaConverter The tosca converter that must be used to create the Json representation + */ + public OperationalPolicy(Loop loop, Service service, PolicyModel policyModel, + ToscaConverterWithDictionarySupport toscaConverter) { + this(Policy.generatePolicyName("OPERATIONAL", service.getName(), service.getVersion(), + policyModel.getPolicyAcronym() + '_' + policyModel.getVersion(), + RandomStringUtils.randomAlphanumeric(3)), + new JsonObject(), + new JsonObject(), policyModel, null, null, null); + this.setLoop(loop); + this.updateJsonRepresentation(toscaConverter, service); + } + + public void setLoop(Loop loopName) { + this.loop = loopName; + } + + public Loop getLoop() { + return loop; + } + + @Override + public String getName() { + return name; + } + + /** + * name setter. + * + * @param name the name to set + */ + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public void updateJsonRepresentation(ToscaConverterWithDictionarySupport toscaConverter, Service serviceModel) { + { + this.setJsonRepresentation(new JsonObject()); + if (this.getPolicyModel() == null) { + return; + } + + // Generic Case + this.setJsonRepresentation(toscaConverter.convertToscaToJsonSchemaObject( + this.getPolicyModel().getPolicyModelTosca(), + this.getPolicyModel().getPolicyModelType(), serviceModel)); + + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + OperationalPolicy other = (OperationalPolicy) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (!name.equals(other.name)) { + return false; + } + } + return true; + } + + @Override + public String createPolicyPayload() throws UnsupportedEncodingException { + return super.createPolicyPayload(); + + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepository.java b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepository.java new file mode 100644 index 000000000..b0a33669a --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepository.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.operational; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface OperationalPolicyRepository extends JpaRepository { + void deleteByName(String policyName); +} diff --git a/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java new file mode 100644 index 000000000..8a1bb1abf --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java @@ -0,0 +1,350 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.policy.operational; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.service.Service; + +public class OperationalPolicyRepresentationBuilder { + + private static final EELFLogger logger = + EELFManager.getInstance().getLogger(OperationalPolicyRepresentationBuilder.class); + + public static final String PROPERTIES = "properties"; + public static final String ITEMS = "items"; + public static final String ANY_OF = "anyOf"; + public static final String TITLE = "title"; + public static final String RECIPE = "recipe"; + public static final String DEFAULT = "default"; + public static final String STRING = "string"; + public static final String TYPE = "type"; + public static final String TYPE_LIST = "list"; + public static final String TYPE_OBJECT = "object"; + public static final String TYPE_ARRAY = "array"; + + private OperationalPolicyRepresentationBuilder() { + throw new IllegalStateException("This is Utility class, not supposed to be initiated."); + } + + /** + * This method generates the operational policy json representation that will be + * used by ui for rendering. It uses the model (VF and VFModule) defined in the + * loop object to do so, so it's dynamic. It also uses the operational policy + * schema template defined in the resource folder. + * + * @param modelJson The loop model json + * @return The json representation + */ + public static JsonObject generateOperationalPolicySchema(Service modelJson) { + + JsonObject jsonSchema = null; + try { + jsonSchema = JsonUtils.GSON.fromJson( + ResourceFileUtils + .getResourceAsString("clds/json-schema/operational_policies/operational_policy.json"), + JsonObject.class); + jsonSchema.get(PROPERTIES).getAsJsonObject() + .get("operational_policy").getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("policies") + .getAsJsonObject().get(ITEMS).getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("target") + .getAsJsonObject().get(ANY_OF).getAsJsonArray().addAll(createAnyOfArray(modelJson, true)); + + // update CDS recipe and payload information to schema + JsonArray actors = jsonSchema.get(PROPERTIES).getAsJsonObject() + .get("operational_policy").getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("policies") + .getAsJsonObject().get(ITEMS).getAsJsonObject().get(PROPERTIES).getAsJsonObject().get("actor") + .getAsJsonObject().get(ANY_OF).getAsJsonArray(); + + for (JsonElement actor : actors) { + if ("CDS".equalsIgnoreCase(actor.getAsJsonObject().get(TITLE).getAsString())) { + actor.getAsJsonObject().get(PROPERTIES).getAsJsonObject().get(RECIPE).getAsJsonObject() + .get(ANY_OF).getAsJsonArray() + .addAll(createAnyOfArrayForCdsRecipe(modelJson)); + } + } + return jsonSchema; + } catch (IOException e) { + logger.error("Unable to generate the json schema because of an exception", e); + return new JsonObject(); + } + } + + private static JsonObject createSchemaProperty(String title, String type, String defaultValue, String readOnlyFlag, + String[] enumArray) { + JsonObject property = new JsonObject(); + property.addProperty(TITLE, title); + property.addProperty(TYPE, type); + property.addProperty(DEFAULT, defaultValue); + property.addProperty("readOnly", readOnlyFlag); + + if (enumArray != null) { + JsonArray jsonArray = new JsonArray(); + property.add("enum", jsonArray); + for (String val : enumArray) { + jsonArray.add(val); + } + } + return property; + } + + private static JsonArray createVnfSchema(Service modelService, boolean generateType) { + JsonArray vnfSchemaArray = new JsonArray(); + JsonObject modelVnfs = modelService.getResourceByType("VF"); + + for (Entry entry : modelVnfs.entrySet()) { + JsonObject vnfOneOfSchema = new JsonObject(); + vnfOneOfSchema.addProperty(TITLE, "VNF" + "-" + entry.getKey()); + JsonObject properties = new JsonObject(); + if (generateType) { + properties.add(TYPE, createSchemaProperty("Type", STRING, "VNF", "True", null)); + } + properties.add("resourceID", createSchemaProperty("Resource ID", STRING, + modelVnfs.get(entry.getKey()).getAsJsonObject().get("invariantUUID").getAsString(), "True", null)); + + vnfOneOfSchema.add(PROPERTIES, properties); + vnfSchemaArray.add(vnfOneOfSchema); + } + return vnfSchemaArray; + } + + private static JsonArray createBlankEntry() { + JsonArray result = new JsonArray(); + JsonObject blankObject = new JsonObject(); + blankObject.addProperty("title", "User defined"); + blankObject.add("properties", new JsonObject()); + result.add(blankObject); + return result; + } + + private static JsonArray createVfModuleSchema(Service modelService, boolean generateType) { + JsonArray vfModuleOneOfSchemaArray = new JsonArray(); + JsonObject modelVfModules = modelService.getResourceByType("VFModule"); + + for (Entry entry : modelVfModules.entrySet()) { + JsonObject vfModuleOneOfSchema = new JsonObject(); + vfModuleOneOfSchema.addProperty(TITLE, "VFMODULE" + "-" + entry.getKey()); + JsonObject properties = new JsonObject(); + if (generateType) { + properties.add(TYPE, createSchemaProperty("Type", STRING, "VFMODULE", "True", null)); + } + properties.add("resourceID", + createSchemaProperty("Resource ID", STRING, + modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelName").getAsString(), + "True", null)); + properties.add("modelInvariantId", + createSchemaProperty("Model Invariant Id (ModelInvariantUUID)", STRING, + modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelInvariantUUID") + .getAsString(), + "True", null)); + properties.add("modelVersionId", + createSchemaProperty("Model Version Id (ModelUUID)", STRING, + modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelUUID").getAsString(), + "True", null)); + properties.add("modelName", + createSchemaProperty("Model Name", STRING, + modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelName").getAsString(), + "True", null)); + properties.add("modelVersion", createSchemaProperty("Model Version", STRING, + modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelVersion").getAsString(), + "True", null)); + properties + .add("modelCustomizationId", + createSchemaProperty("Customization ID", STRING, + modelVfModules.get(entry.getKey()).getAsJsonObject() + .get("vfModuleModelCustomizationUUID").getAsString(), "True", + null)); + + vfModuleOneOfSchema.add(PROPERTIES, properties); + vfModuleOneOfSchemaArray.add(vfModuleOneOfSchema); + } + return vfModuleOneOfSchemaArray; + } + + /** + * Create an anyOf array of possible structure we may have for Target. + * + * @param modelJson The service object + * @return A JsonArray with everything inside + */ + public static JsonArray createAnyOfArray(Service modelJson, boolean generateType) { + JsonArray targetOneOfStructure = new JsonArray(); + // First entry must be user defined + targetOneOfStructure.addAll(createBlankEntry()); + targetOneOfStructure.addAll(createVnfSchema(modelJson, generateType)); + targetOneOfStructure.addAll(createVfModuleSchema(modelJson, generateType)); + return targetOneOfStructure; + } + + private static JsonArray createAnyOfArrayForCdsRecipe(Service modelJson) { + JsonArray anyOfStructure = new JsonArray(); + anyOfStructure.addAll(createAnyOfCdsRecipe(modelJson.getResourceDetails().getAsJsonObject("VF"))); + anyOfStructure.addAll(createAnyOfCdsRecipe(modelJson.getResourceDetails().getAsJsonObject("PNF"))); + return anyOfStructure; + } + + private static JsonArray createAnyOfCdsRecipe(JsonObject jsonObject) { + JsonArray schemaArray = new JsonArray(); + for (Entry entry : jsonObject.entrySet()) { + JsonObject controllerProperties = entry.getValue().getAsJsonObject() + .getAsJsonObject("controllerProperties"); + + if (controllerProperties != null && controllerProperties.getAsJsonObject("workflows") != null) { + JsonObject workflows = controllerProperties.getAsJsonObject("workflows"); + for (Entry workflowsEntry : workflows.entrySet()) { + JsonObject obj = new JsonObject(); + obj.addProperty(TITLE, workflowsEntry.getKey()); + obj.addProperty(TYPE, "object"); + obj.add(PROPERTIES, createPayloadProperty(workflowsEntry.getValue().getAsJsonObject(), + controllerProperties, workflowsEntry.getKey())); + schemaArray.add(obj); + } + + } + } + return schemaArray; + } + + private static JsonObject createPayloadProperty(JsonObject workFlow, + JsonObject controllerProperties, String workFlowName) { + JsonObject payload = new JsonObject(); + payload.addProperty(TITLE, "Payload"); + payload.addProperty(TYPE, "object"); + payload.add(PROPERTIES, createInputPropertiesForPayload(workFlow, controllerProperties, + workFlowName)); + JsonObject properties = new JsonObject(); + properties.add(RECIPE, createRecipeForCdsWorkflow(workFlowName)); + properties.add("payload", payload); + return properties; + } + + private static JsonObject createRecipeForCdsWorkflow(String workflow) { + JsonObject recipe = new JsonObject(); + recipe.addProperty(TITLE, RECIPE); + recipe.addProperty(TYPE, STRING); + recipe.addProperty(DEFAULT, workflow); + JsonObject options = new JsonObject(); + options.addProperty("hidden", true); + recipe.add("options", options); + return recipe; + } + + /** + * Returns the properties of payload based on the cds work flows. + * + * @param workFlow cds work flows to update payload + * @param controllerProperties cds properties to get blueprint name and + * version + * @param workFlowName work flow name + * @return returns the properties of payload + */ + public static JsonObject createInputPropertiesForPayload(JsonObject workFlow, + JsonObject controllerProperties, + String workFlowName) { + String artifactName = controllerProperties.get("sdnc_model_name").getAsString(); + String artifactVersion = controllerProperties.get("sdnc_model_version").getAsString(); + JsonObject inputs = workFlow.getAsJsonObject("inputs"); + JsonObject jsonObject = new JsonObject(); + jsonObject.add("artifact_name", createSchemaProperty( + "artifact name", STRING, artifactName, "True", null)); + jsonObject.add("artifact_version", createSchemaProperty( + "artifact version", STRING, artifactVersion, "True", null)); + jsonObject.add("mode", createCdsInputProperty( + "mode", STRING, "async", null)); + jsonObject.add("data", createDataProperty(inputs, workFlowName)); + return jsonObject; + } + + private static JsonObject createDataProperty(JsonObject inputs, String workflowName) { + JsonObject data = new JsonObject(); + data.addProperty(TITLE, "data"); + JsonObject dataObj = new JsonObject(); + addDataFields(inputs, dataObj, workflowName); + data.add(PROPERTIES, dataObj); + return data; + } + + private static void addDataFields(JsonObject inputs, + JsonObject dataObj, + String workFlowName) { + Set> entrySet = inputs.entrySet(); + for (Map.Entry entry : entrySet) { + String key = entry.getKey(); + JsonObject inputProperty = inputs.getAsJsonObject(key); + if (key.equalsIgnoreCase(workFlowName + "-properties")) { + addDataFields(entry.getValue().getAsJsonObject().get("properties").getAsJsonObject(), + dataObj, workFlowName); + } else { + dataObj.add(entry.getKey(), + createCdsInputProperty(key, inputProperty.get(TYPE).getAsString(), null, + entry.getValue().getAsJsonObject())); + } + } + } + + private static JsonObject createCdsInputProperty(String title, + String type, + String defaultValue, + JsonObject cdsProperty) { + JsonObject property = new JsonObject(); + property.addProperty(TITLE, title); + + if (TYPE_LIST.equalsIgnoreCase(type)) { + property.addProperty(TYPE, TYPE_ARRAY); + if (cdsProperty != null && cdsProperty.get(PROPERTIES) != null) { + JsonObject listProperties = new JsonObject(); + listProperties.add(PROPERTIES, getProperties(cdsProperty.get(PROPERTIES).getAsJsonObject())); + property.add(ITEMS, listProperties); + } + } else if (TYPE_OBJECT.equalsIgnoreCase(type)) { + property.addProperty(TYPE, TYPE_OBJECT); + property.add(PROPERTIES, getProperties(cdsProperty.get(PROPERTIES).getAsJsonObject())); + } else { + property.addProperty(TYPE, type); + } + + if (defaultValue != null) { + property.addProperty(DEFAULT, defaultValue); + } + return property; + } + + private static JsonObject getProperties(JsonObject inputProperties) { + if (inputProperties == null) { + return null; + } + JsonObject dataObject = new JsonObject(); + addDataFields(inputProperties, dataObject, null); + return dataObject; + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyService.java b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyService.java new file mode 100644 index 000000000..3f3f39b45 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/operational/OperationalPolicyService.java @@ -0,0 +1,94 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.operational; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.onap.policy.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.loop.template.PolicyModelsRepository; +import org.onap.policy.clamp.policy.PolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class OperationalPolicyService implements PolicyService { + + private final OperationalPolicyRepository operationalPolicyRepository; + + private final PolicyModelsRepository policyModelsRepository; + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(OperationalPolicyService.class); + + @Autowired + public OperationalPolicyService(OperationalPolicyRepository repository, + PolicyModelsRepository policyModelsRepository) { + this.operationalPolicyRepository = repository; + this.policyModelsRepository = policyModelsRepository; + } + + @Override + public Set updatePolicies(Loop loop, List operationalPolicies) { + return operationalPolicies + .parallelStream() + .map(policy -> + operationalPolicyRepository + .findById(policy.getName()) + .map(p -> setConfiguration(p, policy)) + .orElse(initializeMissingFields(loop, policy))) + .collect(Collectors.toSet()); + } + + @Override + public boolean isExisting(String policyName) { + return operationalPolicyRepository.existsById(policyName); + } + + private OperationalPolicy initializeMissingFields(Loop loop, OperationalPolicy policy) { + policy.setLoop(loop); + return policy; + } + + private OperationalPolicy setConfiguration(OperationalPolicy policy, OperationalPolicy newPolicy) { + policy.setConfigurationsJson(newPolicy.getConfigurationsJson()); + policy.setPdpGroup(newPolicy.getPdpGroup()); + policy.setPdpSubgroup(newPolicy.getPdpSubgroup()); + return policy; + } + + /** + * Api to refresh the Operational Policy UI window. + * + * @param operationalPolicy The operational policy object + * @param toscaConverter the tosca converter required to convert the tosca model to json schema + */ + public void refreshOperationalPolicyJsonRepresentation(OperationalPolicy operationalPolicy, + ToscaConverterWithDictionarySupport toscaConverter) { + operationalPolicy.updateJsonRepresentation(toscaConverter, operationalPolicy.getLoop().getModelService()); + this.operationalPolicyRepository.saveAndFlush(operationalPolicy); + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroup.java b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroup.java new file mode 100644 index 000000000..9cbeec109 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroup.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.pdpgroup; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; +import java.util.List; + +/** + * This class maps the get Pdp Group response to a nice pojo. + */ +public class PdpGroup { + + @Expose + private String name; + + @Expose + private String pdpGroupState; + + @Expose + private List pdpSubgroups; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPdpGroupState() { + return pdpGroupState; + } + + public void setPdpGroupState(String pdpGroupState) { + this.pdpGroupState = pdpGroupState; + } + + public List getPdpSubgroups() { + return pdpSubgroups; + } + + public void setPdpSubgroups(List pdpSubgroups) { + this.pdpSubgroups = pdpSubgroups; + } + + /** + * Get supported subGroups based on the defined policy type and version. + * @param policyType The policy type + * @param version The version + * @return The supported subGroup list in Json format + */ + public JsonObject getSupportedSubgroups(String policyType, String version) { + if (!pdpGroupState.equalsIgnoreCase("ACTIVE")) { + return null; + } + JsonArray supportedSubgroups = new JsonArray(); + for (PdpSubgroup subGroup : pdpSubgroups) { + if (subGroup.getSupportedPolicyTypes().contains(new PolicyModelKey(policyType, version))) { + supportedSubgroups.add(subGroup.getPdpType()); + } + } + if (supportedSubgroups.size() > 0) { + JsonObject supportedPdpGroup = new JsonObject(); + supportedPdpGroup.add(this.name, supportedSubgroups); + return supportedPdpGroup; + } + return null; + } +} diff --git a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpSubgroup.java b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpSubgroup.java new file mode 100644 index 000000000..890f90775 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpSubgroup.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.pdpgroup; + +import com.google.gson.annotations.Expose; +import java.util.List; + +/** + * This class maps the Policy get PDP Group response to a nice pojo. + */ +public class PdpSubgroup { + + @Expose + private String pdpType; + + @Expose + private List supportedPolicyTypes; + + public String getPdpType() { + return pdpType; + } + + public void setPdpType(String pdpType) { + this.pdpType = pdpType; + } + + public List getSupportedPolicyTypes() { + return supportedPolicyTypes; + } + + public void setSupportedPolicyTypes(List supportedPolicyTypes) { + this.supportedPolicyTypes = supportedPolicyTypes; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKey.java b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKey.java new file mode 100644 index 000000000..df92bfdf9 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKey.java @@ -0,0 +1,125 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.pdpgroup; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; + +public class PolicyModelKey implements Serializable { + + /** + * The serial version ID. + */ + private static final long serialVersionUID = 3307410842013230886L; + + @Expose + private String name; + + @Expose + private String version; + + /** + * Constructor. + */ + public PolicyModelKey(String name, String version) { + this.name = name; + this.version = version; + } + + /** + * name getter. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * name setter. + * + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * version getter. + * + * @return the version + */ + public String getVersion() { + return version; + } + + /** + * version setter. + * + * @param version the version to set + */ + public void setVersion(String version) { + this.version = version; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((version == null) ? 0 : version.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + PolicyModelKey other = (PolicyModelKey) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + if (!name.matches(other.name)) { + return false; + } + } + if (version == null) { + if (other.version != null) { + return false; + } + } else if (!version.equals(other.version)) { + return false; + } + return true; + } +} diff --git a/src/main/java/org/onap/policy/clamp/tosca/Dictionary.java b/src/main/java/org/onap/policy/clamp/tosca/Dictionary.java new file mode 100644 index 000000000..4b01d6902 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/tosca/Dictionary.java @@ -0,0 +1,219 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.tosca; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import org.onap.policy.clamp.loop.common.AuditEntity; + +/** + * Represents Dictionary. + */ + +@Entity +@Table(name = "dictionary") +public class Dictionary extends AuditEntity implements Serializable { + + /** + * The serial version id. + */ + private static final long serialVersionUID = -286522707701388645L; + + @Id + @Expose + @Column(nullable = false, name = "name", unique = true) + private String name; + + @Expose + @Column(name = "dictionary_second_level") + private int secondLevelDictionary = 0; + + @Expose + @Column(name = "dictionary_type") + private String subDictionaryType; + + @Expose + @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) + @JoinTable( + name = "dictionary_to_dictionaryelements", + joinColumns = @JoinColumn(name = "dictionary_name", referencedColumnName = "name"), + inverseJoinColumns = {@JoinColumn( + name = "dictionary_element_short_name", + referencedColumnName = "short_name")}) + private Set dictionaryElements = new HashSet<>(); + + /** + * name getter. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * name setter. + * + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * secondLevelDictionary getter. + * + * @return the secondLevelDictionary + */ + public int getSecondLevelDictionary() { + return secondLevelDictionary; + } + + /** + * secondLevelDictionary setter. + * + * @param secondLevelDictionary the secondLevelDictionary to set + */ + public void setSecondLevelDictionary(int secondLevelDictionary) { + this.secondLevelDictionary = secondLevelDictionary; + } + + /** + * subDictionaryType getter. + * + * @return the subDictionaryType + */ + public String getSubDictionaryType() { + return subDictionaryType; + } + + /** + * subDictionaryType setter. + * + * @param subDictionaryType the subDictionaryType to set + */ + public void setSubDictionaryType(String subDictionaryType) { + this.subDictionaryType = subDictionaryType; + } + + /** + * dictionaryElements getter. + * + * @return the dictionaryElements List of dictionary element + */ + public Set getDictionaryElements() { + return dictionaryElements; + } + + /** + * Method to add a new dictionaryElement to the list. + * + * @param dictionaryElement The dictionary element + */ + public void addDictionaryElements(DictionaryElement dictionaryElement) { + dictionaryElements.add(dictionaryElement); + dictionaryElement.getUsedByDictionaries().add(this); + } + + /** + * Method to set dictionaryElements. + * + * @param dictionaryElements The dictionary elements set + */ + public void setDictionaryElements(Set dictionaryElements) { + this.dictionaryElements = dictionaryElements; + } + + /** + * Method to delete a dictionaryElement from the list. + * + * @param dictionaryElement The dictionary element + */ + public void removeDictionaryElement(DictionaryElement dictionaryElement) { + dictionaryElements.remove(dictionaryElement); + dictionaryElement.getUsedByDictionaries().remove(this); + } + + /** + * Default Constructor. + */ + public Dictionary() { + + } + + /** + * Constructor. + * + * @param name The Dictionary name + * @param secondLevelDictionary defines if dictionary is a secondary level + * @param subDictionaryType defines the type of secondary level dictionary + */ + public Dictionary(String name, int secondLevelDictionary, String subDictionaryType) { + this.name = name; + this.secondLevelDictionary = secondLevelDictionary; + this.subDictionaryType = subDictionaryType; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Dictionary other = (Dictionary) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + +} diff --git a/src/main/java/org/onap/policy/clamp/tosca/DictionaryElement.java b/src/main/java/org/onap/policy/clamp/tosca/DictionaryElement.java new file mode 100644 index 000000000..ecf4b876c --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/tosca/DictionaryElement.java @@ -0,0 +1,254 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.tosca; + +import com.google.gson.annotations.Expose; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import org.onap.policy.clamp.loop.common.AuditEntity; + +/** + * Represents a Dictionary Item. + */ +@Entity +@Table(name = "dictionary_elements") +public class DictionaryElement extends AuditEntity implements Serializable { + + /** + * The serial version id. + */ + private static final long serialVersionUID = -286522707701388644L; + + @Id + @Expose + @Column(nullable = false, name = "short_name") + private String shortName; + + @Expose + @Column(nullable = false, name = "name") + private String name; + + @Expose + @Column(nullable = false, name = "description") + private String description; + + @Expose + @Column(nullable = false, name = "type") + private String type; + + @Expose + @Column(nullable = true, name = "subdictionary_name") + private String subDictionary; + + @ManyToMany(mappedBy = "dictionaryElements", fetch = FetchType.EAGER) + private Set usedByDictionaries = new HashSet<>(); + + /** + * name getter. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * name setter. + * + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * shortName getter. + * + * @return the shortName + */ + public String getShortName() { + return shortName; + } + + /** + * shortName setter. + * + * @param shortName the shortName to set + */ + public void setShortName(String shortName) { + this.shortName = shortName; + } + + /** + * description getter. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * description setter. + * + * @param description the description to set + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * type getter. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * type setter. + * + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * subDictionary getter. + * + * @return the subDictionary + */ + public String getSubDictionary() { + return subDictionary; + } + + /** + * subDictionary setter. + * + * @param subDictionary the subDictionary to set + */ + public void setSubDictionary(String subDictionary) { + this.subDictionary = subDictionary; + } + + /** + * usedByDictionaries getter. + * + * @return the usedByDictionaries + */ + public Set getUsedByDictionaries() { + return usedByDictionaries; + } + + /** + * usedByDictionaries setter. + * + * @param usedByDictionaries the usedByDictionaries to set + */ + public void setUsedByDictionaries(Set usedByDictionaries) { + this.usedByDictionaries = usedByDictionaries; + } + + /** + * Default Constructor. + */ + public DictionaryElement() { + } + + /** + * Constructor. + * + * @param name The Dictionary element name + * @param shortName The short name + * @param description The description + * @param type The type of element + * @param subDictionary The sub type + */ + public DictionaryElement(String name, String shortName, String description, String type, + String subDictionary) { + this.name = name; + this.shortName = shortName; + this.description = description; + this.type = type; + this.subDictionary = subDictionary; + } + + /** + * Constructor. + * + * @param name The Dictionary element name + * @param shortName The short name + * @param description The description + * @param type The type of element + * @param subDictionary The sub type + */ + public DictionaryElement(String name, String shortName, String description, String type, + String subDictionary, Set usedByDictionaries) { + this.name = name; + this.shortName = shortName; + this.description = description; + this.type = type; + this.subDictionary = subDictionary; + this.usedByDictionaries = usedByDictionaries; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((shortName == null) ? 0 : shortName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + DictionaryElement other = (DictionaryElement) obj; + if (shortName == null) { + if (other.shortName != null) { + return false; + } + } else if (!shortName.equals(other.shortName)) { + return false; + } + return true; + } +} diff --git a/src/main/java/org/onap/policy/clamp/tosca/DictionaryElementsRepository.java b/src/main/java/org/onap/policy/clamp/tosca/DictionaryElementsRepository.java new file mode 100644 index 000000000..0bc50fe1a --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/tosca/DictionaryElementsRepository.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.tosca; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface DictionaryElementsRepository extends JpaRepository { + +} diff --git a/src/main/java/org/onap/policy/clamp/tosca/DictionaryRepository.java b/src/main/java/org/onap/policy/clamp/tosca/DictionaryRepository.java new file mode 100644 index 000000000..a2f417d17 --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/tosca/DictionaryRepository.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.tosca; + +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface DictionaryRepository extends JpaRepository { + + @Query("SELECT dict.name FROM Dictionary as dict") + List getAllDictionaryNames(); + + @Query("SELECT dict.name FROM Dictionary as dict where dict.secondLevelDictionary = 1") + List getAllSecondaryLevelDictionaryNames(); + +} diff --git a/src/main/java/org/onap/policy/clamp/tosca/DictionaryService.java b/src/main/java/org/onap/policy/clamp/tosca/DictionaryService.java new file mode 100644 index 000000000..849d4baae --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/tosca/DictionaryService.java @@ -0,0 +1,141 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.tosca; + +import com.google.common.collect.Sets; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import javax.persistence.EntityNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DictionaryService { + + private final DictionaryRepository dictionaryRepository; + private final DictionaryElementsRepository dictionaryElementsRepository; + + /** + * Constructor. + */ + @Autowired + public DictionaryService(DictionaryRepository dictionaryRepository, + DictionaryElementsRepository dictionaryElementsRepository) { + this.dictionaryRepository = dictionaryRepository; + this.dictionaryElementsRepository = dictionaryElementsRepository; + + } + + public Dictionary saveOrUpdateDictionary(Dictionary dictionary) { + return dictionaryRepository.saveAndFlush(dictionary); + } + + /** + * Creates or Updates Dictionary Element. + * + * @param dictionaryName The Dictionary name + * @param dictionary The Dictionary object with dictionary elements + * @return updated Dictionary object with all dictionary elements + */ + public Dictionary saveOrUpdateDictionaryElement(String dictionaryName, Dictionary dictionary) { + Dictionary dict = getDictionary(dictionaryName); + + Set newDictionaryElements = dictionary.getDictionaryElements(); + + if (newDictionaryElements != null && !newDictionaryElements.isEmpty()) { + Set updatedDictionaryElements = newDictionaryElements.stream() + .map(dictionaryElement -> getAndUpdateDictionaryElement(dict, dictionaryElement)) + .collect(Collectors.toSet()); + + dict.getDictionaryElements().forEach(dictElement -> { + if (!updatedDictionaryElements.contains(dictElement)) { + updatedDictionaryElements.add(dictElement); + } + }); + dict.setDictionaryElements(updatedDictionaryElements); + } + return dictionaryRepository.saveAndFlush(dict); + + } + + private DictionaryElement getAndUpdateDictionaryElement(Dictionary dictionary, + DictionaryElement element) { + return dictionaryElementsRepository + .save(dictionaryElementsRepository.findById(element.getShortName()) + .map(p -> updateDictionaryElement(p, element, dictionary)) + .orElse(new DictionaryElement(element.getName(), element.getShortName(), + element.getDescription(), element.getType(), element.getSubDictionary(), + Sets.newHashSet(dictionary)))); + } + + public void deleteDictionary(Dictionary dictionary) { + dictionaryRepository.delete(dictionary); + } + + public void deleteDictionary(String dictionaryName) { + dictionaryRepository.deleteById(dictionaryName); + } + + public List getAllDictionaries() { + return dictionaryRepository.findAll(); + } + + public List getAllSecondaryLevelDictionaryNames() { + return dictionaryRepository.getAllSecondaryLevelDictionaryNames(); + } + + public Dictionary getDictionary(String dictionaryName) { + return dictionaryRepository.findById(dictionaryName).orElseThrow( + () -> new EntityNotFoundException("Couldn't find Dictionary named: " + dictionaryName)); + } + + /** + * Deletes a dictionary element from Dictionary by shortName. + * + * @param dictionaryName The dictionary name + * @param dictionaryElementShortName the dictionary Element Short name + */ + public void deleteDictionaryElement(String dictionaryName, String dictionaryElementShortName) { + if (dictionaryRepository.existsById(dictionaryName)) { + DictionaryElement element = + dictionaryElementsRepository.findById(dictionaryElementShortName).orElse(null); + if (element != null) { + Dictionary dict = getDictionary(dictionaryName); + dict.removeDictionaryElement(element); + dictionaryRepository.saveAndFlush(dict); + } + } + } + + private DictionaryElement updateDictionaryElement(DictionaryElement oldDictionaryElement, + DictionaryElement newDictionaryElement, Dictionary dictionary) { + oldDictionaryElement.setName(newDictionaryElement.getName()); + oldDictionaryElement.setDescription(newDictionaryElement.getDescription()); + oldDictionaryElement.setType(newDictionaryElement.getType()); + oldDictionaryElement.setSubDictionary(newDictionaryElement.getSubDictionary()); + oldDictionaryElement.getUsedByDictionaries().add(dictionary); + return oldDictionaryElement; + } +} diff --git a/src/main/java/org/onap/policy/clamp/util/PassDecoder.java b/src/main/java/org/onap/policy/clamp/util/PassDecoder.java new file mode 100644 index 000000000..f4b8ed4dc --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/util/PassDecoder.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + */ + +package org.onap.policy.clamp.util; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import org.onap.aaf.cadi.Symm; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; + +/** + * PassDecoder for decrypting the truststore and keystore password. + */ +public class PassDecoder { + /** + * Used to log PassDecoder class. + */ + private static final EELFLogger logger = EELFManager.getInstance().getLogger(PassDecoder.class); + + /** + * Decode the password. + * + * @param encryptedPass The encrypted password + * @param keyFileName The key file name in String + */ + public static String decode(String encryptedPass, String keyFileName) { + if (null == keyFileName) { + logger.debug("Key file is not defined, thus password will not be decrypted"); + return encryptedPass; + } + if (null == encryptedPass) { + logger.error("Encrypted password is not defined"); + return null; + } + try { + return Symm.obtain(ResourceFileUtils.getResourceAsStream(keyFileName)).depass(encryptedPass); + } catch (IOException e) { + logger.error("Exception occurred during the key decryption", e); + return null; + } + } +} diff --git a/src/main/java/org/onap/policy/clamp/util/SemanticVersioning.java b/src/main/java/org/onap/policy/clamp/util/SemanticVersioning.java new file mode 100644 index 000000000..58367193f --- /dev/null +++ b/src/main/java/org/onap/policy/clamp/util/SemanticVersioning.java @@ -0,0 +1,91 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.util; + +/** + * This class is the base class for object that requires semantic versioning. + * ... This class supports also a.b.c.d... etc ... as a version. + */ +public class SemanticVersioning { + public static final int BEFORE = -1; + public static final int EQUAL = 0; + public static final int AFTER = 1; + public static final String DEFAULT_VERSION = "1.0.0"; + + /** + * The compare method that compare arg0 to arg1. + * + * @param arg0 A version in string for semantic versioning (a.b.c.d...) + * @param arg1 A version in string for semantic versioning (a.b.c.d...) + * @return objects (arg0, arg1) given as parameters. It returns the value: 0: if + * (arg0==arg1) -1: if (arg0 < arg1) 1: if (arg0 > arg1) + */ + public static int compare(String arg0, String arg1) { + + if (arg0 == null && arg1 == null) { + return EQUAL; + } + if (arg0 == null) { + return BEFORE; + } + if (arg1 == null) { + return AFTER; + } + String[] arg0Array = arg0.split("\\."); + String[] arg1Array = arg1.split("\\."); + + int smalestStringLength = Math.min(arg0Array.length, arg1Array.length); + + for (int currentVersionIndex = + 0; currentVersionIndex < smalestStringLength; ++currentVersionIndex) { + if (Integer.parseInt(arg0Array[currentVersionIndex]) < Integer + .parseInt(arg1Array[currentVersionIndex])) { + return BEFORE; + } else if (Integer.parseInt(arg0Array[currentVersionIndex]) > Integer + .parseInt(arg1Array[currentVersionIndex])) { + return AFTER; + } + // equals, so do not return anything, continue + } + if (arg0Array.length == arg1Array.length) { + return EQUAL; + } else { + return Integer.compare(arg0Array.length, arg1Array.length); + } + } + + /** + * Method to increment a version from its current version. + * + * @param currentVersion The current Version + * @return the increment version string + */ + public static String incrementMajorVersion(String currentVersion) { + if (currentVersion == null || currentVersion.isEmpty()) { + return DEFAULT_VERSION; + } + String[] versionArray = currentVersion.split("\\."); + return String.valueOf(Integer.parseInt(versionArray[0]) + 1) + ".0.0"; + } +} diff --git a/src/main/resources/META-INF/resources/swagger.html b/src/main/resources/META-INF/resources/swagger.html index 6f6156c32..ab1d4fa1a 100644 --- a/src/main/resources/META-INF/resources/swagger.html +++ b/src/main/resources/META-INF/resources/swagger.html @@ -444,31 +444,31 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
  • 2. Paths
      -
    • 2.1. GET /v1/healthcheck +
    • 2.1. GET /v1/healthcheck
    • -
    • 2.2. GET /v1/user/getUser +
    • 2.2. GET /v1/user/getUser
    • -
    • 2.3. GET /v2/clampInformation +
    • 2.3. GET /v2/clampInformation
    • -
    • 2.4. GET /v2/dictionary +
    • 2.4. GET /v2/dictionary
    • -
    • 2.5. PUT /v2/dictionary +
    • 2.5. PUT /v2/dictionary
    • -
    • 2.6. GET /v2/dictionary/secondary/names +
    • 2.6. GET /v2/dictionary/secondary/names
    • -
    • 2.7. GET /v2/dictionary/{dictionaryName} +
    • 2.7. GET /v2/dictionary/{dictionaryName}
    • -
    • 2.8. PUT /v2/dictionary/{name} +
    • 2.8. PUT /v2/dictionary/{name}
    • -
    • 2.9. DELETE /v2/dictionary/{name} +
    • 2.9. DELETE /v2/dictionary/{name}
    • -
    • 2.10. DELETE /v2/dictionary/{name}/elements/{shortName} +
    • 2.10. DELETE /v2/dictionary/{name}/elements/{shortName}
    • -
    • 2.11. PUT /v2/loop/addOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion} +
    • 2.11. PUT /v2/loop/addOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion}
    • -
    • 2.12. POST /v2/loop/create/{loopName}?templateName={templateName} +
    • 2.12. POST /v2/loop/create/{loopName}?templateName={templateName}
    • -
    • 2.13. PUT /v2/loop/delete/{loopName} +
    • 2.13. PUT /v2/loop/delete/{loopName}
    • -
    • 2.14. PUT /v2/loop/deploy/{loopName} +
    • 2.14. PUT /v2/loop/deploy/{loopName}
    • -
    • 2.15. GET /v2/loop/getAllNames +
    • 2.15. GET /v2/loop/getAllNames
    • -
    • 2.16. GET /v2/loop/getstatus/{loopName} +
    • 2.16. GET /v2/loop/getstatus/{loopName}
    • -
    • 2.17. PUT /v2/loop/refreshMicroServicePolicyJsonSchema/{loopName}/{microServicePolicyName} +
    • 2.17. PUT /v2/loop/refreshMicroServicePolicyJsonSchema/{loopName}/{microServicePolicyName}
    • -
    • 2.18. PUT /v2/loop/refreshOperationalPolicyJsonSchema/{loopName}/{operationalPolicyName} +
    • 2.18. PUT /v2/loop/refreshOperationalPolicyJsonSchema/{loopName}/{operationalPolicyName}
    • -
    • 2.19. PUT /v2/loop/removeOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion}/{policyName} +
    • 2.19. PUT /v2/loop/removeOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion}/{policyName}
    • -
    • 2.20. PUT /v2/loop/restart/{loopName} +
    • 2.20. PUT /v2/loop/restart/{loopName}
    • -
    • 2.21. PUT /v2/loop/stop/{loopName} +
    • 2.21. PUT /v2/loop/stop/{loopName}
    • -
    • 2.22. PUT /v2/loop/submit/{loopName} +
    • 2.22. PUT /v2/loop/submit/{loopName}
    • -
    • 2.23. PUT /v2/loop/undeploy/{loopName} +
    • 2.23. PUT /v2/loop/undeploy/{loopName}
    • -
    • 2.24. POST /v2/loop/updateGlobalProperties/{loopName} +
    • 2.24. POST /v2/loop/updateGlobalProperties/{loopName}
    • -
    • 2.25. POST /v2/loop/updateMicroservicePolicy/{loopName} +
    • 2.25. POST /v2/loop/updateMicroservicePolicy/{loopName}
    • -
    • 2.26. POST /v2/loop/updateOperationalPolicies/{loopName} +
    • 2.26. POST /v2/loop/updateOperationalPolicies/{loopName}
    • -
    • 2.27. GET /v2/loop/{loopName} +
    • 2.27. GET /v2/loop/{loopName}
    • -
    • 2.28. POST /v2/policyToscaModels +
    • 2.28. POST /v2/policyToscaModels
    • -
    • 2.29. GET /v2/policyToscaModels +
    • 2.29. GET /v2/policyToscaModels
    • -
    • 2.30. GET /v2/policyToscaModels/yaml/{policyModelType}/{policyModelVersion} +
    • 2.30. GET /v2/policyToscaModels/yaml/{policyModelType}/{policyModelVersion}
    • -
    • 2.31. GET /v2/policyToscaModels/{policyModelType}/{policyModelVersion} +
    • 2.31. GET /v2/policyToscaModels/{policyModelType}/{policyModelVersion}
    • -
    • 2.32. PUT /v2/policyToscaModels/{policyModelType}/{policyModelVersion} +
    • 2.32. PUT /v2/policyToscaModels/{policyModelType}/{policyModelVersion}
    • -
    • 2.33. GET /v2/templates +
    • 2.33. GET /v2/templates
    • -
    • 2.34. GET /v2/templates/names +
    • 2.34. GET /v2/templates/names
    • -
    • 2.35. GET /v2/templates/{templateName} +
    • 2.35. GET /v2/templates/{templateName}
      • 2.35.1. Parameters
      • 2.35.2. Responses
      • @@ -723,13 +723,13 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b

        1.1. Version information

        -

        Version : 5.1.3-SNAPSHOT

        +

        Version : 5.1.5-SNAPSHOT

        1.2. URI scheme

        -

        Host : localhost:8443
        +

        Host : localhost:38837
        BasePath : /restservices/clds/
        Schemes : HTTP

        @@ -740,7 +740,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b

        2. Paths

        -

        2.1. GET /v1/healthcheck

        +

        2.1. GET /v1/healthcheck

        2.1.1. Responses

        @@ -777,7 +777,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -811,7 +811,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -848,7 +848,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -885,7 +885,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -957,7 +957,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -994,7 +994,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1056,7 +1056,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1134,7 +1134,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1193,7 +1193,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1258,7 +1258,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1332,7 +1332,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1404,7 +1404,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1453,7 +1453,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1515,7 +1515,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1552,7 +1552,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1614,7 +1614,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1682,7 +1682,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1750,7 +1750,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1830,7 +1830,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1892,7 +1892,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -1954,7 +1954,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2016,7 +2016,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2078,7 +2078,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2156,7 +2156,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2234,7 +2234,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2312,7 +2312,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2374,7 +2374,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2446,7 +2446,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2483,7 +2483,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2551,7 +2551,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2619,7 +2619,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2703,7 +2703,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2740,7 +2740,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -2777,7 +2777,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
        @@ -4197,7 +4197,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b diff --git a/src/main/resources/META-INF/services/org/apache/camel/dataformat/clamp-gson b/src/main/resources/META-INF/services/org/apache/camel/dataformat/clamp-gson index 3fa78e040..04caffa99 100644 --- a/src/main/resources/META-INF/services/org/apache/camel/dataformat/clamp-gson +++ b/src/main/resources/META-INF/services/org/apache/camel/dataformat/clamp-gson @@ -20,4 +20,4 @@ * =================================================================== */ -class=org.onap.clamp.configuration.ClampGsonDataFormat \ No newline at end of file +class=org.onap.policy.clamp.configuration.ClampGsonDataFormat \ No newline at end of file diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml index 505ea30d9..c43f3297d 100644 --- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml +++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml @@ -6,20 +6,20 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Loop')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" /> + uri="bean:org.onap.policy.clamp.loop.LoopController?method=getLoopNames()" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -33,26 +33,26 @@ - + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET Loop')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" /> + uri="bean:org.onap.policy.clamp.loop.LoopController?method=getLoop(${header.loopName})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -68,32 +68,32 @@ + type="com.google.gson.JsonObject" consumes="application/json" + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Update the global properties')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> ${body} + uri="bean:org.onap.policy.clamp.loop.LoopController?method=updateGlobalPropertiesJson(${header.loopName},${header.GlobalPropertiesJson})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('Global Properties UPDATED','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -108,36 +108,36 @@ + type="com.google.gson.JsonArray" consumes="application/json" + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Update operational policies')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> ${body} + uri="bean:org.onap.policy.clamp.loop.LoopController?method=updateOperationalPolicies(${header.loopName},${header.OperationalPoliciesArray})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('Operational policies UPDATED','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('UPDATE Operational policies request FAILED, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -150,39 +150,39 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Update Microservice policies')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> ${body} + uri="bean:org.onap.policy.clamp.loop.LoopController?method=updateMicroservicePolicy(${header.loopName},${exchangeProperty[MicroServicePolicyObject]})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('Micro Service policies UPDATED','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('UPDATE MicroService policy request FAILED, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -194,7 +194,7 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> @@ -204,32 +204,32 @@ true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'DCAE DEPLOY request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('DCAE DEPLOY request','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('DEPLOY request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('DEPLOY request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -241,38 +241,38 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'REFRESH Micro Service Policy UI request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.cds.CdsDataInstaller?method=updateCdsServiceProperties(${exchangeProperty[loopObject].getModelService()})" /> + uri="bean:org.onap.policy.clamp.loop.LoopController?method=refreshMicroServicePolicyJsonRepresentation(${exchangeProperty[loopObject]},${header.microServicePolicyName})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('REFRESH Micro Service policy request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('REFRESH Json schema request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -284,38 +284,38 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'REFRESH Operational Policy UI request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.cds.CdsDataInstaller?method=updateCdsServiceProperties(${exchangeProperty[loopObject].getModelService()})" /> + uri="bean:org.onap.policy.clamp.loop.LoopController?method=refreshOperationalPolicyJsonRepresentation(${exchangeProperty[loopObject]},${header.operationalPolicyName})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('REFRESH operational policy request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('REFRESH Json schema request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -327,7 +327,7 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> @@ -337,31 +337,31 @@ true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'DCAE UNDEPLOY request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('DCAE UNDEPLOY request','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('UNDEPLOY request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('UNDEPLOY request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -373,7 +373,7 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> @@ -383,31 +383,31 @@ true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*,'STOP request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('STOP request','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('STOP request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('STOP request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -419,7 +419,7 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> @@ -429,32 +429,32 @@ true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*,'RESTART request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('RESTART request','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('RESTART request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('RESTART request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -466,7 +466,7 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> @@ -476,12 +476,12 @@ true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'POLICY SUBMIT request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('POLICY SUBMIT request','INFO',${exchangeProperty[loopObject]})" /> false @@ -529,20 +529,20 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('SUBMIT request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('SUBMIT request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -563,12 +563,12 @@ true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*,'DELETE request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('DELETE request','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.loop.LoopController?method=deleteLoop(${header.loopName})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('DELETE request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -629,38 +629,38 @@ + outType="org.onap.policy.clamp.loop.Loop" produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET STATUS request')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('GET STATUS request','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('GET STATUS request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('GET STATUS request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> @@ -674,32 +674,32 @@ - + + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Add operational Policy')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.LoopController?method=addOperationalPolicy(${header.loopName},${header.policyType},${header.policyVersion})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('ADD OperationalPolicy request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('ADD OperationalPolicy request failed','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -711,14 +711,14 @@ - + + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'REMOVE operational Policy')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> ${header.policyName} @@ -735,22 +735,22 @@ + uri="bean:org.onap.policy.clamp.loop.LoopController?method=removeOperationalPolicy(${header.loopName},${header.policyType},${header.policyVersion})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('REMOVE OperationalPolicy request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('REMOVE OperationalPolicy request failed','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -762,33 +762,33 @@ + uri="/v2/loop/create/{loopName}?templateName={templateName}" + outType="org.onap.policy.clamp.loop.Loop" consumes="application/json" + produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Create Loop')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" /> + uri="bean:org.onap.policy.clamp.loop.LoopController?method=createLoop(${header.loopName}, ${header.templateName})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('CREATE Loop from template request failed','ERROR',${exchangeProperty[loopObject]})" /> 500 @@ -800,25 +800,25 @@ + outType="org.onap.policy.clamp.tosca.Dictionary" produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Dictionaries')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','read')" /> + uri="bean:org.onap.policy.clamp.tosca.DictionaryService?method=getAllDictionaries()" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -838,20 +838,20 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Secondary Dictionary Level Names')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','read')" /> + uri="bean:org.onap.policy.clamp.tosca.DictionaryService?method=getAllSecondaryLevelDictionaryNames()" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -865,26 +865,26 @@ + outType="org.onap.policy.clamp.tosca.Dictionary" produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Dictionary Elements for a Dictionary Name')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','read')" /> + uri="bean:org.onap.policy.clamp.tosca.DictionaryService?method=getDictionary(${header.dictionaryName})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -897,29 +897,29 @@ - + + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Add New or Update Dictionary')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','update')" /> ${body} + uri="bean:org.onap.policy.clamp.tosca.DictionaryService?method=saveOrUpdateDictionary(${exchangeProperty[DictionaryObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -934,30 +934,30 @@ + type="org.onap.policy.clamp.tosca.Dictionary" + outType="org.onap.policy.clamp.tosca.Dictionary" consumes="application/json" + produces="application/json"> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Add New or Update Dictionary Element')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','update')" /> ${body} + uri="bean:org.onap.policy.clamp.tosca.DictionaryService?method=saveOrUpdateDictionaryElement(${header.name}, ${exchangeProperty[DictionaryObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -976,20 +976,20 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Delete Dictionary')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','update')" /> + uri="bean:org.onap.policy.clamp.tosca.DictionaryService?method=deleteDictionary(${header.name})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1010,20 +1010,20 @@ excludePattern="name|shortName" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Delete Dictionary Element')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','update')" /> + uri="bean:org.onap.policy.clamp.tosca.DictionaryService?method=deleteDictionaryElement(${header.name}, ${header.shortName})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1038,26 +1038,26 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Tosca Policy Models')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','read')" /> + uri="bean:org.onap.policy.clamp.loop.template.PolicyModelsService?method=getAllPolicyModels()" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1071,27 +1071,27 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET Tosca Policy Model by Name/Version')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','read')" /> + uri="bean:org.onap.policy.clamp.loop.template.PolicyModelsService?method=getPolicyModelByType(${header.policyModelType},${header.policyModelVersion})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1111,20 +1111,20 @@ excludePattern="policyModelType|policyModelVersion" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET Tosca Policy Model Yaml String by Name/Version')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','read')" /> + uri="bean:org.onap.policy.clamp.loop.template.PolicyModelsService?method=getPolicyModelTosca(${header.policyModelType},${header.policyModelVersion})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1140,29 +1140,29 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Upload New or Update Tosca Policy Model')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','update')" /> ${body} + uri="bean:org.onap.policy.clamp.loop.template.PolicyModelsService?method=createNewPolicyModelFromTosca(${exchangeProperty[PolicyModelTosca]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1177,30 +1177,30 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Upload New or Update Tosca Policy Model')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'tosca','','update')" /> ${body} + uri="bean:org.onap.policy.clamp.loop.template.PolicyModelsService?method=updatePolicyModelTosca(${header.policyModelType},${policyModelVersion},${exchangeProperty[PolicyModelTosca]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1215,26 +1215,26 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Templates')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')" /> + uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getAllLoopTemplates()" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1248,27 +1248,27 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET a Template by NAME')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')" /> + uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getLoopTemplate(${header.templateName})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1287,20 +1287,20 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Loop Template Names')" /> + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')" /> + uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getLoopTemplateNames()" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()" /> java.lang.Exception true + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()" /> @@ -1313,10 +1313,10 @@ - + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=getClampInformation()" /> diff --git a/src/main/resources/clds/camel/rest/clds-services.xml b/src/main/resources/clds/camel/rest/clds-services.xml index ce52f31d6..61e1efbdc 100644 --- a/src/main/resources/clds/camel/rest/clds-services.xml +++ b/src/main/resources/clds/camel/rest/clds-services.xml @@ -1,10 +1,10 @@ + outType="org.onap.policy.clamp.clds.model.CldsHealthCheck"> - @@ -18,7 +18,7 @@ - + diff --git a/src/main/resources/clds/camel/routes/cds-flows.xml b/src/main/resources/clds/camel/routes/cds-flows.xml index 0e56970c2..73f8cb849 100644 --- a/src/main/resources/clds/camel/routes/cds-flows.xml +++ b/src/main/resources/clds/camel/routes/cds-flows.xml @@ -3,7 +3,7 @@ - + GET @@ -26,7 +26,7 @@ - + @@ -34,7 +34,7 @@ - + POST @@ -57,7 +57,7 @@ - + diff --git a/src/main/resources/clds/camel/routes/dcae-flows.xml b/src/main/resources/clds/camel/routes/dcae-flows.xml index 65849e9ae..1a0eb7b9a 100644 --- a/src/main/resources/clds/camel/routes/dcae-flows.xml +++ b/src/main/resources/clds/camel/routes/dcae-flows.xml @@ -20,7 +20,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Deploying the loop with multiple blueprints')"/> ${exchangeProperty[loopObject].getMicroServicePolicies()} @@ -34,11 +34,11 @@ false - - @@ -65,17 +65,17 @@ uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}&httpClient.connectTimeout=10000&httpClient.socketTimeout=300000&authenticationPreemptive=true&connectionClose=true"/> - - + uri="bean:org.onap.policy.clamp.policy.microservice.MicroServicePolicyService?method=updateDcaeDeploymentFields(${exchangeProperty[microServicePolicy]},${exchangeProperty[dcaeDeploymentId]},${exchangeProperty[dcaeStatusUrl]})"/> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLogForComponent('Deploy for the micro service: ${exchangeProperty[microServicePolicy].getName()} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}','INFO','DCAE',${exchangeProperty[loopObject]})"/> java.lang.Exception @@ -97,7 +97,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> @@ -107,13 +107,13 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Deploying the loop')"/> - - @@ -140,21 +140,21 @@ uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}&httpClient.connectTimeout=10000&httpClient.socketTimeout=300000&authenticationPreemptive=true&connectionClose=true"/> - - + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateDcaeDeploymentFields(${exchangeProperty[loopObject]},${exchangeProperty[dcaeDeploymentId]},${exchangeProperty[dcaeStatusUrl]})"/> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> DEPLOY loop status (Dep-id:${exchangeProperty[dcaeDeploymentId]}, @@ -189,7 +189,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Undeploying the loop with multiple blueprints')"/> ${exchangeProperty[loopObject].getMicroServicePolicies()} @@ -204,7 +204,7 @@ ${exchangeProperty[microServicePolicy].getDcaeDeploymentId()} != null - @@ -231,23 +231,23 @@ uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[microServicePolicy].getDcaeDeploymentId()}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}&httpClient.connectTimeout=10000&httpClient.socketTimeout=300000&authenticationPreemptive=true&connectionClose=true"/> - - + uri="bean:org.onap.policy.clamp.policy.microservice.MicroServicePolicyService?method=updateDcaeDeploymentFields(${exchangeProperty[microServicePolicy]},null,${exchangeProperty[dcaeStatusUrl]})"/> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLogForComponent('Undeploy for the micro service: ${exchangeProperty[microServicePolicy].getName()} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}','INFO','DCAE',${exchangeProperty[loopObject]})"/> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLogForComponent('Cannot Undeploy for the micro service: ${exchangeProperty[microServicePolicy].getName()}, the Deployment ID does not exist !','WARNING','DCAE',${exchangeProperty[loopObject]})"/> @@ -269,7 +269,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> @@ -278,7 +278,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Undeploying the loop')"/> ${exchangeProperty[loopObject].getDcaeDeploymentId()} @@ -286,7 +286,7 @@ - @@ -314,19 +314,19 @@ uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[loopObject].getDcaeDeploymentId()}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}&httpClient.connectTimeout=10000&httpClient.socketTimeout=300000&authenticationPreemptive=true&connectionClose=true"/> - - + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateDcaeDeploymentFields(${exchangeProperty[loopObject]},null,${exchangeProperty[dcaeStatusUrl]})"/> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> UNDEPLOY loop status @@ -341,7 +341,7 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('Cannot Undeploy for the loop: ${exchangeProperty[loopObject].getName()}, the Deployment ID does not exist !','WARNING',${exchangeProperty[loopObject]})"/> @@ -350,7 +350,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Getting Deployment status')"/> GET @@ -394,12 +394,12 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('GET DCAE deployment request failed, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})"/> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> DCAE deployment status @@ -415,7 +415,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Getting blueprint id in inventory')"/> GET @@ -440,7 +440,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> @@ -449,7 +449,7 @@ - + GET @@ -471,20 +471,20 @@ - ${exchangeProperty[dcaeResponseList]} - + ${body} - + - + diff --git a/src/main/resources/clds/camel/routes/loop-flows.xml b/src/main/resources/clds/camel/routes/loop-flows.xml index d0d552568..d5ab050cf 100644 --- a/src/main/resources/clds/camel/routes/loop-flows.xml +++ b/src/main/resources/clds/camel/routes/loop-flows.xml @@ -5,7 +5,7 @@ ${header.loopName} - + @@ -87,7 +87,7 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLogForComponent('Policy state set to: ${exchangeProperty[policyState].getStateName()}','INFO','POLICY',${exchangeProperty[loopObject]})" /> @@ -114,7 +114,7 @@ ${header.CamelHttpResponseCode} == 200 - @@ -126,7 +126,7 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLogForComponent('DCAE state set to: ${exchangeProperty[dcaeState].getStateName()} - message: ${exchangeProperty[dcaeResponse].getError()}','INFO','DCAE',${exchangeProperty[loopObject]})" /> ${exchangeProperty['loopObject'].getLoopTemplate().getUniqueBlueprint()} == false @@ -154,7 +154,7 @@ ${header.CamelHttpResponseCode} == 200 - @@ -166,7 +166,7 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLogForComponent('DCAE state set to: ${exchangeProperty[dcaeState].getStateName()} - message: ${exchangeProperty[dcaeResponse].getError()}','INFO','DCAE',${exchangeProperty[microServicePolicy]})" /> > @@ -182,7 +182,7 @@ == 'NOT_SENT' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'DESIGN')" /> ${exchangeProperty['dcaeState'].getStateName()} == 'IN_ERROR' or @@ -190,7 +190,7 @@ 'MICROSERVICE_INSTALLATION_FAILED' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'IN_ERROR')" /> ${exchangeProperty['dcaeState'].getStateName()} == @@ -198,7 +198,7 @@ ${exchangeProperty['policyState'].getStateName()} == 'IN_ERROR' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'IN_ERROR')" /> ${exchangeProperty['dcaeState'].getStateName()} == @@ -206,7 +206,7 @@ ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'RUNNING')" /> ${exchangeProperty['dcaeState'].getStateName()} == @@ -214,7 +214,7 @@ ${exchangeProperty['policyState'].getStateName()} == 'SENT' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'STOPPED')" /> ${exchangeProperty['dcaeState'].getStateName()} == @@ -223,7 +223,7 @@ ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'SUBMITTED')" /> ${exchangeProperty['dcaeState'].getStateName()} == @@ -233,7 +233,7 @@ ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'WAITING')" /> ${exchangeProperty['dcaeState'].getStateName()} == @@ -241,13 +241,13 @@ ${exchangeProperty['policyState'].getStateName()} != 'NOT_SENT' + uri="bean:org.onap.policy.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'DEPLOYED')" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('New loop state is: ${exchangeProperty[loopObject].getLastComputedState().toString()}','INFO',${exchangeProperty[loopObject]})" /> \ No newline at end of file diff --git a/src/main/resources/clds/camel/routes/policy-flows.xml b/src/main/resources/clds/camel/routes/policy-flows.xml index 9328ceb00..0ee386eb4 100644 --- a/src/main/resources/clds/camel/routes/policy-flows.xml +++ b/src/main/resources/clds/camel/routes/policy-flows.xml @@ -36,7 +36,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Get Policy')"/> GET @@ -65,12 +65,12 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('GET policy request failed, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> ${exchangeProperty[policyName]} GET Policy status @@ -90,7 +90,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the policy deployment in PDP')"/> GET @@ -119,12 +119,12 @@ + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('GET policy request failed, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> ${exchangeProperty[policyName]} GET Policy deployment status @@ -142,7 +142,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting all the policy models')"/> GET @@ -166,7 +166,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> @@ -176,7 +176,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the policy model')"/> GET @@ -200,7 +200,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> @@ -210,7 +210,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Policy')"/> ${exchangeProperty[policy].createPolicyPayload()} @@ -240,7 +240,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> ${exchangeProperty[policy].getName()} creation status @@ -260,7 +260,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Policy')"/> null @@ -290,7 +290,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> ${exchangeProperty[policy].getName()} removal status @@ -309,7 +309,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Add policies to PDP group')"/> ${exchangeProperty[loopObject].getComponent("POLICY").createPoliciesPayloadPdpGroup(exchangeProperty[loopObject],"POST")} @@ -341,7 +341,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> PDP Group push ALL status @@ -359,7 +359,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Remove policies from PDP group')"/> ${exchangeProperty[loopObject].getComponent("POLICY").createPoliciesPayloadPdpGroup(exchangeProperty[loopObject],"DELETE")} @@ -391,7 +391,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> PDP Group remove ALL status @@ -408,7 +408,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the PDP Group list')"/> GET @@ -432,7 +432,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> @@ -442,7 +442,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Removing one policy PDP group')"/> null @@ -489,7 +489,7 @@ + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/> diff --git a/src/main/resources/clds/camel/routes/utils-flows.xml b/src/main/resources/clds/camel/routes/utils-flows.xml index bbbc46a20..d5da4faee 100644 --- a/src/main/resources/clds/camel/routes/utils-flows.xml +++ b/src/main/resources/clds/camel/routes/utils-flows.xml @@ -14,11 +14,11 @@ ${exchangeProperty[logComponent]} == null + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLog('${exchangeProperty[logMessage]} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.policy.clamp.loop.log.LoopLogService?method=addLogForComponent('${exchangeProperty[logMessage]} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}','INFO','${exchangeProperty[logComponent]}',${exchangeProperty[loopObject]})" /> null diff --git a/src/main/resources/clds/key.properties b/src/main/resources/clds/key.properties index dda811040..dda2b87d0 100644 --- a/src/main/resources/clds/key.properties +++ b/src/main/resources/clds/key.properties @@ -1 +1 @@ -org.onap.clamp.encryption.aes.key=aa3871669d893c7fb8abbcda31b88b4f \ No newline at end of file +org.onap.policy.clamp.encryption.aes.key=aa3871669d893c7fb8abbcda31b88b4f \ No newline at end of file diff --git a/src/main/script/SelectNpmRepo.groovy b/src/main/script/SelectNpmRepo.groovy index 92371cfe9..797d2d003 100644 --- a/src/main/script/SelectNpmRepo.groovy +++ b/src/main/script/SelectNpmRepo.groovy @@ -21,7 +21,7 @@ * */ -package org.onap.clamp.clds.maven.scripts +package org.onap.policy.clamp.clds.maven.scripts println project.properties['clamp.project.version']; diff --git a/src/main/script/TagVersion.groovy b/src/main/script/TagVersion.groovy index ccfcca3c4..271e2967f 100644 --- a/src/main/script/TagVersion.groovy +++ b/src/main/script/TagVersion.groovy @@ -21,7 +21,7 @@ * */ -package org.onap.clamp.clds.maven.scripts +package org.onap.policy.clamp.maven.scripts println project.properties['clamp.project.version']; def versionArray; diff --git a/src/test/java/org/onap/clamp/clds/client/CdsServicesTest.java b/src/test/java/org/onap/clamp/clds/client/CdsServicesTest.java deleted file mode 100644 index 3d189cf71..000000000 --- a/src/test/java/org/onap/clamp/clds/client/CdsServicesTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.clds.client; - -import com.google.gson.JsonObject; -import java.io.IOException; -import org.junit.Test; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.skyscreamer.jsonassert.JSONAssert; - -public class CdsServicesTest { - - @Test - public void testParseCdsListTypeProperties() throws IOException { - String cdsResponse = ResourceFileUtils - .getResourceAsString("example/cds-response/vFW-CDS-resource-assignment-workflow.json"); - CdsServices services = new CdsServices(); - JsonObject output = services.parseCdsResponse(cdsResponse); - JSONAssert.assertEquals(ResourceFileUtils - .getResourceAsString("example/cds-response/vFW-CDS-resource-assignment-wf-expected-result.json"), - JsonUtils.GSON.toJson(output), true); - } - - @Test - public void testParseCdsResponse() throws IOException { - String cdsResponse = ResourceFileUtils - .getResourceAsString("example/cds-response/vFW-CDS-modify-config-workflow.json"); - CdsServices services = new CdsServices(); - JsonObject output = services.parseCdsResponse(cdsResponse); - JSONAssert.assertEquals(ResourceFileUtils - .getResourceAsString("example/cds-response/vFW-CDS-modify-config-wf-expected-result.json"), - JsonUtils.GSON.toJson(output), true); - } - -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java b/src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java deleted file mode 100644 index 7152ee11d..000000000 --- a/src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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============================================ - * Modifications copyright (c) 2018 Nokia - * =================================================================== - * - */ - -package org.onap.clamp.clds.config; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.onap.clamp.authorization.CldsUser; -import org.onap.clamp.clds.exception.CldsUsersException; - -public class CldsUserJsonDecoderTest { - - private String user1 = "admin1"; - private String user2 = "admin2"; - private String password = "5f4dcc3b5aa765d61d8327deb882cf99"; - private String[] normalPermissionsArray = { "permission-type-cl|dev|read", "permission-type-cl|dev|update", - "permission-type-cl-manage|dev|*", "permission-type-filter-vf|dev|*", "permission-type-template|dev|read", - "permission-type-template|dev|update" }; - private String[] incompletePermissionsArray = { "permission-type-cl|dev|*", "permission-type-cl|dev|*", - "permission-type-cl-manage|dev|*", "permission-type-filter-vf|dev|*", "permission-type-template|dev|read", - "permission-type-template|dev|update" }; - - @Test - public void testDecodingDoubleUsers() { - - // when - CldsUser[] usersArray = CldsUserJsonDecoder - .decodeJson(CldsUserJsonDecoderTest.class.getResourceAsStream("/clds/clds-users-two-users.json")); - - // then - assertThat(usersArray).hasSize(2); - assertThat(usersArray[0]).extracting(CldsUser::getUser, CldsUser::getPassword, CldsUser::getPermissionsString) - .containsExactly(user1, password, normalPermissionsArray); - - assertThat(usersArray[1]).extracting(CldsUser::getUser, CldsUser::getPassword, CldsUser::getPermissionsString) - .containsExactly(user2, password, normalPermissionsArray); - - } - - @Test - public void testDecodingNoPermission() { - // when - CldsUser[] usersArray = CldsUserJsonDecoder - .decodeJson(this.getClass().getResourceAsStream("/clds/clds-users-no-permission.json")); - - // then - assertThat(usersArray).hasSize(1); - CldsUser user = usersArray[0]; - assertThat(user.getUser()).isEqualTo(user1); - assertThat(user.getPassword()).isEqualTo(null); - assertThat(user.getPermissionsString()).isEmpty(); - } - - @Test - public void testDecodingIncompletePermissions() { - - // when - CldsUser[] usersArray = CldsUserJsonDecoder - .decodeJson(this.getClass().getResourceAsStream("/clds/clds-users-incomplete-permissions.json")); - - // then - assertThat(usersArray).hasSize(1); - CldsUser user = usersArray[0]; - assertThat(user.getUser()).isEqualTo(user1); - assertThat(user.getPassword()).isEqualTo(password); - assertThat(user.getPermissionsString()).isEqualTo(incompletePermissionsArray); - } - - @Test(expected = CldsUsersException.class) - public void shouldThrowCldsUsersException() { - // when - CldsUserJsonDecoder.decodeJson(this.getClass().getResourceAsStream("/clds/clds-parse-exception.json")); - } - -} diff --git a/src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java b/src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java deleted file mode 100644 index 311244f48..000000000 --- a/src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * Modifications copyright (c) 2018 Nokia - * ================================================================================ - * - */ - -package org.onap.clamp.clds.config.sdc; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.gson.JsonObject; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import org.junit.Test; -import org.onap.clamp.clds.exception.sdc.controller.SdcParametersException; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; - -/** - * This class tests the SDC Controller config. - */ -public class SdcSingleControllerConfigurationTest { - - /** - * This method loads the SDC controller configuration from a file located in the resource folder. - * - * @param fileName file for sdc controller configuration. - * @param sdcControllerName sdc controller name. - * @return instance of SdcSingleControllerConfiguration. - */ - public static SdcSingleControllerConfiguration loadControllerConfiguration(String fileName, - String sdcControllerName) { - - InputStreamReader streamReader = new InputStreamReader(ResourceFileUtils.getResourceAsStream(fileName), - StandardCharsets.UTF_8); - JsonObject jsonNode = JsonUtils.GSON.fromJson(streamReader, JsonObject.class); - - return new SdcSingleControllerConfiguration(jsonNode, sdcControllerName); - } - - @Test - public final void testTheInit() throws SdcParametersException, IOException { - SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-TLS.json", - "sdc-controller1"); - assertEquals("User", sdcConfig.getUser()); - assertEquals("ThePassword", sdcConfig.getPassword()); - assertEquals("consumerGroup", sdcConfig.getConsumerGroup()); - assertEquals("consumerId", sdcConfig.getConsumerID()); - assertEquals("environmentName", sdcConfig.getEnvironmentName()); - assertEquals("hostname:8080", sdcConfig.getAsdcAddress()); - assertEquals(10, sdcConfig.getPollingInterval()); - assertEquals(30, sdcConfig.getPollingTimeout()); - - assertThat(SdcSingleControllerConfiguration.SUPPORTED_ARTIFACT_TYPES_LIST) - .hasSameSizeAs(sdcConfig.getRelevantArtifactTypes()); - assertEquals("ThePassword", sdcConfig.getKeyStorePassword()); - assertTrue(sdcConfig.activateServerTLSAuth()); - assertThat(sdcConfig.getMsgBusAddress()).contains("localhost"); - } - - @Test(expected = SdcParametersException.class) - public final void testAllRequiredParameters() throws IOException { - SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-TLS.json", - "sdc-controller1"); - // No exception should be raised - sdcConfig.testAllRequiredParameters(); - sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-bad.json", "sdc-controller1"); - fail("Should have raised an exception"); - } - - @Test - public final void testAllRequiredParametersEmptyEncrypted() throws IOException { - SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration( - "clds/sdc-controller-config-empty-encrypted.json", "sdc-controller1"); - sdcConfig.testAllRequiredParameters(); - assertNull(sdcConfig.getKeyStorePassword()); - } - - @Test - public final void testConsumerGroupWithNull() throws IOException { - SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-NULL.json", - "sdc-controller1"); - assertTrue(sdcConfig.getConsumerGroup() == null); - } -} diff --git a/src/test/java/org/onap/clamp/clds/it/AuthorizationControllerItCase.java b/src/test/java/org/onap/clamp/clds/it/AuthorizationControllerItCase.java deleted file mode 100644 index 48338f17c..000000000 --- a/src/test/java/org/onap/clamp/clds/it/AuthorizationControllerItCase.java +++ /dev/null @@ -1,137 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * Modifications 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. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.it; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.Arrays; -import java.util.Collection; -import org.apache.camel.Exchange; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.onap.clamp.authorization.AuthorizationController; -import org.onap.clamp.authorization.SecureServicePermission; -import org.onap.clamp.clds.exception.NotAuthorizedException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * Test CldsDAO calls through CldsModel and CldsEvent. This really test the DB - * and stored procedures. - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class AuthorizationControllerItCase { - - @Autowired - private AuthorizationController auth; - - private static SecurityContext sc = SecurityContextHolder.getContext(); - - /** - * Setup the variable before the tests execution. - */ - @BeforeClass - public static void setupBefore() { - - sc.setAuthentication(new Authentication() { - @Override - public Collection getAuthorities() { - return Arrays.asList(new SimpleGrantedAuthority( - new SecureServicePermission("permission-type-cl", "dev", "read").getKey()), - new SimpleGrantedAuthority(new SecureServicePermission("permission-type-cl-manage", "dev", - "DEPLOY").getKey()), - new SimpleGrantedAuthority(new SecureServicePermission("permission-type-filter-vf", "dev", - "12345-55555-55555-5555").getKey())); - } - - @Override - public Object getCredentials() { - return null; - } - - @Override - public Object getDetails() { - return null; - } - - @Override - public Object getPrincipal() { - return "admin"; - } - - @Override - public boolean isAuthenticated() { - return true; - } - - @Override - public void setAuthenticated(boolean authenticatedFlag) throws IllegalArgumentException { - - } - - @Override - public String getName() { - return "admin"; - } - }); - - } - - @AfterClass - - public static void afterCleanup() { - sc.setAuthentication(null); - } - - @Test - public void testIsUserPermitted() { - assertEquals(AuthorizationController.getPrincipalName(sc), "admin"); - assertTrue(auth.isUserPermitted(new SecureServicePermission("permission-type-cl", "dev", "read"))); - assertTrue(auth.isUserPermitted(new SecureServicePermission("permission-type-cl-manage", "dev", "DEPLOY"))); - assertTrue(auth.isUserPermitted( - new SecureServicePermission("permission-type-filter-vf", "dev", "12345-55555-55555-5555"))); - assertFalse(auth.isUserPermitted(new SecureServicePermission("permission-type-cl", "test", "read"))); - } - - @Test(expected = NotAuthorizedException.class) - public void testIfAuthorizeThrowException() { - Exchange ex = Mockito.mock(Exchange.class); - auth.authorize(ex, "cl", "test", "read"); - } -} diff --git a/src/test/java/org/onap/clamp/clds/it/CldsHealthcheckServiceItCase.java b/src/test/java/org/onap/clamp/clds/it/CldsHealthcheckServiceItCase.java deleted file mode 100644 index 587b7c915..000000000 --- a/src/test/java/org/onap/clamp/clds/it/CldsHealthcheckServiceItCase.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - */ - -package org.onap.clamp.clds.it; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.model.CldsHealthCheck; -import org.onap.clamp.clds.service.CldsHealthcheckService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * Tests HealthCheck Service. - */ -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -public class CldsHealthcheckServiceItCase { - - @Autowired - private CldsHealthcheckService cldsHealthcheckService; - - @Test - public void testGetHealthCheck() { - CldsHealthCheck cldsHealthCheck = cldsHealthcheckService.gethealthcheck(); - assertNotNull(cldsHealthCheck); - assertEquals("UP", cldsHealthCheck.getHealthCheckStatus()); - assertEquals("CLDS-APP", cldsHealthCheck.getHealthCheckComponent()); - assertEquals("OK", cldsHealthCheck.getDescription()); - } -} diff --git a/src/test/java/org/onap/clamp/clds/it/HttpsItCase.java b/src/test/java/org/onap/clamp/clds/it/HttpsItCase.java deleted file mode 100644 index 90a240181..000000000 --- a/src/test/java/org/onap/clamp/clds/it/HttpsItCase.java +++ /dev/null @@ -1,159 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.it; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.File; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.nio.charset.Charset; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import org.apache.commons.io.FileUtils; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; - -/** - * Test HTTP and HTTPS settings + redirection of HTTP to HTTPS. - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) -@TestPropertySource(locations = "classpath:https/https-test.properties") -@DirtiesContext -public class HttpsItCase { - - @Value("${server.port}") - private String httpsPort; - @Value("${server.http-to-https-redirection.port}") - private String httpPort; - - /** - * Setup the variable before tests execution. - */ - @BeforeClass - public static void setUp() { - try { - // setup ssl context to ignore certificate errors - SSLContext ctx = SSLContext.getInstance("TLS"); - X509TrustManager tm = new X509TrustManager() { - - @Override - public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) - throws java.security.cert.CertificateException { - } - - @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) - throws java.security.cert.CertificateException { - } - - @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return null; - } - }; - ctx.init(null, new TrustManager[] { tm }, null); - SSLContext.setDefault(ctx); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - @Test - public void testDesignerIndex() throws Exception { - RestTemplate template = new RestTemplate(); - final MySimpleClientHttpRequestFactory factory = new MySimpleClientHttpRequestFactory(new HostnameVerifier() { - - @Override - public boolean verify(final String hostname, final SSLSession session) { - return true; - } - }); - template.setRequestFactory(factory); - ResponseEntity entity = template.getForEntity("http://localhost:" + this.httpPort + "/swagger.html", - String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.FOUND); - ResponseEntity httpsEntity = template - .getForEntity("https://localhost:" + this.httpsPort + "/swagger.html", String.class); - assertThat(httpsEntity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(httpsEntity.getBody()).contains("Clamp Rest API"); - } - - @Test - public void testSwaggerJson() throws Exception { - RestTemplate template = new RestTemplate(); - final MySimpleClientHttpRequestFactory factory = new MySimpleClientHttpRequestFactory(new HostnameVerifier() { - - @Override - public boolean verify(final String hostname, final SSLSession session) { - return true; - } - }); - template.setRequestFactory(factory); - ResponseEntity httpsEntity = template - .getForEntity("https://localhost:" + this.httpsPort + "/restservices/clds/api-doc", String.class); - assertThat(httpsEntity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(httpsEntity.getBody()).contains("swagger"); - FileUtils.writeStringToFile(new File("docs/swagger/swagger.json"), httpsEntity.getBody(), - Charset.defaultCharset()); - } - - /** - * Http Request Factory for ignoring SSL hostname errors. Not for production - * use! - */ - class MySimpleClientHttpRequestFactory extends SimpleClientHttpRequestFactory { - - private final HostnameVerifier verifier; - - public MySimpleClientHttpRequestFactory(final HostnameVerifier verifier) { - this.verifier = verifier; - } - - @Override - protected void prepareConnection(final HttpURLConnection connection, final String httpMethod) - throws IOException { - if (connection instanceof HttpsURLConnection) { - ((HttpsURLConnection) connection).setHostnameVerifier(this.verifier); - } - super.prepareConnection(connection, httpMethod); - } - } -} diff --git a/src/test/java/org/onap/clamp/clds/it/RobotItCase.java b/src/test/java/org/onap/clamp/clds/it/RobotItCase.java deleted file mode 100644 index 5eff96e44..000000000 --- a/src/test/java/org/onap/clamp/clds/it/RobotItCase.java +++ /dev/null @@ -1,116 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.it; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.BuildImageResultCallback; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.command.LogContainerCmd; -import com.github.dockerjava.api.model.AccessMode; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.BuildResponseItem; -import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.core.DockerClientBuilder; -import com.github.dockerjava.core.command.LogContainerResultCallback; -import com.github.dockerjava.netty.NettyDockerCmdExecFactory; -import java.io.File; -import java.util.Objects; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) -@TestPropertySource(locations = "classpath:robotframework/robotframework-test.properties") -@DirtiesContext -public class RobotItCase { - - @Value("${server.port}") - private String httpPort; - private static final int TIMEOUT_S = 150; - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(RobotItCase.class); - - @Test - public void robotTests() throws Exception { - File robotFolder = new File(getClass().getClassLoader().getResource("robotframework").getFile()); - Volume testsVolume = new Volume("/opt/robotframework/tests"); - DockerClient client = DockerClientBuilder - .getInstance() - .withDockerCmdExecFactory(new NettyDockerCmdExecFactory()) - .build(); - - - BuildImageResultCallback callback = new BuildImageResultCallback() { - @Override - public void onNext(BuildResponseItem item) { - System.out.println("XXX ITEM " + item); - super.onNext(item); - } - }; - - String imageId = client.buildImageCmd(robotFolder).exec(callback).awaitImageId(); - CreateContainerResponse createContainerResponse = client.createContainerCmd(imageId) - .withVolumes(testsVolume) - .withBinds( - new Bind(robotFolder.getAbsolutePath() + "/tests/", testsVolume, AccessMode.rw)) - .withEnv("CLAMP_PORT=" + httpPort) - .withStopTimeout(TIMEOUT_S) - .withNetworkMode("host") - .exec(); - String id = createContainerResponse.getId(); - client.startContainerCmd(id).exec(); - InspectContainerResponse exec; - - int tries = 0; - do { - Thread.sleep(1000); - exec = client.inspectContainerCmd(id).exec(); - tries++; - } while (exec.getState().getRunning() && tries < TIMEOUT_S); - Assert.assertEquals(exec.getState().getError(), 0L, - Objects.requireNonNull(exec.getState().getExitCodeLong()).longValue()); - LogContainerCmd logContainerCmd = client.logContainerCmd(id); - logContainerCmd.withStdOut(true).withStdErr(true); - try { - logContainerCmd.exec(new LogContainerResultCallback() { - @Override - public void onNext(Frame item) { - logger.info(item.toString()); - } - }).awaitCompletion(); - } catch (InterruptedException e) { - throw new Exception("Failed to retrieve logs of container " + id, e); - } - client.stopContainerCmd(id); - } -} diff --git a/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java b/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java deleted file mode 100644 index c4c0c345a..000000000 --- a/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java +++ /dev/null @@ -1,67 +0,0 @@ -/*- - * ============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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.it.config; - -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * Test corg.onap.clamp.ClampDesigner.model.refprop package using RefProp. - */ -@RunWith(SpringRunner.class) -@SpringBootTest -public class CldsReferencePropertiesItCase { - - @Autowired - private ClampProperties refProp; - - /** - * Test getting a value the properties in string. - */ - @Test - public void testGetStringValue() { - assertEquals("healthcheck", refProp.getStringValue("policy.api.userName")); - } - - /** - * Test getting prop value as a JSON Node / template. - * - * @throws IOException when JSON parsing fails - */ - @Test - public void testGetFileContent() throws IOException { - String users = ResourceFileUtils.getResourceAsString("clds/clds-users.json"); - assertEquals(users, refProp.getFileContent("files.cldsUsers")); - // Test composite key - assertEquals(users, refProp.getFileContent("files", "cldsUsers")); - } -} diff --git a/src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java b/src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java deleted file mode 100644 index cfdbe7753..000000000 --- a/src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java +++ /dev/null @@ -1,88 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.clamp.clds.it.config; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.gson.JsonSyntaxException; -import java.io.IOException; -import java.util.Map; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.config.sdc.SdcControllersConfiguration; -import org.onap.clamp.clds.config.sdc.SdcSingleControllerConfiguration; -import org.onap.clamp.clds.exception.sdc.controller.SdcParametersException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.util.ReflectionTestUtils; - -/** - * This class tests the SDC Controller config. - */ -@RunWith(SpringRunner.class) -@SpringBootTest -@ActiveProfiles({"clamp-default", "clamp-default-user", "clamp-sdc-controller"}) -public class SdcControllersConfigurationItCase { - - @Autowired - private SdcControllersConfiguration sdcControllersConfiguration; - - public final void loadFile(String fileName) throws IOException { - ReflectionTestUtils.setField(sdcControllersConfiguration, "sdcControllerFile", fileName); - sdcControllersConfiguration.loadConfiguration(); - } - - @Test - public void testGetAllDefinedControllers() throws IOException { - loadFile("classpath:/clds/sdc-controllers-config.json"); - Map mapResult = sdcControllersConfiguration - .getAllDefinedControllers(); - assertTrue(mapResult.size() == 2); - assertEquals("sdc-controller1", mapResult.get("sdc-controller1").getSdcControllerName()); - assertEquals("sdc-controller2", mapResult.get("sdc-controller2").getSdcControllerName()); - } - - @Test - public void testGetSdcSingleControllerConfiguration() throws IOException { - loadFile("classpath:/clds/sdc-controllers-config.json"); - assertEquals("sdc-controller1", sdcControllersConfiguration - .getSdcSingleControllerConfiguration("sdc-controller1").getSdcControllerName()); - assertEquals("sdc-controller2", sdcControllersConfiguration - .getSdcSingleControllerConfiguration("sdc-controller2").getSdcControllerName()); - } - - @Test(expected = JsonSyntaxException.class) - public void testBadJsonLoading() throws IOException { - loadFile("classpath:/clds/sdc-controllers-config-bad.json"); - fail("Should have raised an exception"); - } - - @Test(expected = SdcParametersException.class) - public void testMissingParamInJsonLoading() throws IOException { - loadFile("classpath:/clds/sdc-controllers-config-missing-param.json"); - sdcControllersConfiguration.getAllDefinedControllers(); - fail("Should have raised an exception"); - } -} diff --git a/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java b/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java deleted file mode 100644 index a3aa8b49b..000000000 --- a/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java +++ /dev/null @@ -1,152 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds.it.sdc.controller; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import org.assertj.core.api.Assertions; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.config.sdc.SdcSingleControllerConfigurationTest; -import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException; -import org.onap.clamp.clds.sdc.controller.SdcSingleController; -import org.onap.clamp.clds.sdc.controller.SdcSingleControllerStatus; -import org.onap.clamp.clds.sdc.controller.installer.CsarHandler; -import org.onap.clamp.loop.CsarInstaller; -import org.onap.sdc.api.notification.IArtifactInfo; -import org.onap.sdc.api.notification.INotificationData; -import org.onap.sdc.api.notification.IResourceInstance; -import org.slf4j.MDC; -import org.slf4j.spi.MDCAdapter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -@ActiveProfiles({"clamp-default", "clamp-default-user", "clamp-sdc-controller"}) -public class SdcSingleControllerItCase { - - private static final String CSAR_ARTIFACT_NAME = "testArtifact.csar"; - private static final String SERVICE_UUID = "serviceUUID"; - private static final String RESOURCE1_UUID = "resource1UUID"; - private static final String RESOURCE1_INSTANCE_NAME = "sim-1802 0"; - - @Autowired - private ClampProperties clampProp; - - private SdcSingleController sdcSingleController; - - private CsarInstaller csarInstaller = mock(CsarInstaller.class); - - private INotificationData buildFakeSdcNotification() { - // BUild what is needed for CSAR - IArtifactInfo serviceArtifact = mock(IArtifactInfo.class); - Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE); - Mockito.when(serviceArtifact.getArtifactName()).thenReturn(CSAR_ARTIFACT_NAME); - List servicesList = new ArrayList<>(); - servicesList.add(serviceArtifact); - INotificationData notifData = mock(INotificationData.class); - Mockito.when(notifData.getServiceArtifacts()).thenReturn(servicesList); - // Build what is needed for UUID - Mockito.when(notifData.getServiceInvariantUUID()).thenReturn(SERVICE_UUID); - // Build fake resource with one artifact BLUEPRINT - IResourceInstance resource1 = mock(IResourceInstance.class); - Mockito.when(resource1.getResourceType()).thenReturn("VF"); - Mockito.when(resource1.getResourceInvariantUUID()).thenReturn(RESOURCE1_UUID); - Mockito.when(resource1.getResourceInstanceName()).thenReturn(RESOURCE1_INSTANCE_NAME); - // Create a fake artifact for resource - IArtifactInfo blueprintArtifact = mock(IArtifactInfo.class); - Mockito.when(blueprintArtifact.getArtifactType()).thenReturn(CsarHandler.BLUEPRINT_TYPE); - List artifactsListForResource = new ArrayList<>(); - artifactsListForResource.add(blueprintArtifact); - Mockito.when(resource1.getArtifacts()).thenReturn(artifactsListForResource); - List resourcesList = new ArrayList<>(); - resourcesList.add(resource1); - Mockito.when(notifData.getResources()).thenReturn(resourcesList); - return notifData; - } - - /** - * Initialization method. - */ - @Before - public void init() { - sdcSingleController = new SdcSingleController(clampProp, csarInstaller, SdcSingleControllerConfigurationTest - .loadControllerConfiguration("clds/sdc-controller-config-TLS.json", "sdc-controller1"), null) { - }; - } - - @Test - public void testTreatNotification() { - // when - sdcSingleController.treatNotification(buildFakeSdcNotification()); - // then - Assertions.assertThat(sdcSingleController.getNbOfNotificationsOngoing()).isEqualTo(0); - } - - @Test - public void testCloseSdc() throws SdcControllerException { - // when - sdcSingleController.closeSdc(); - // then - assertThat(sdcSingleController.getControllerStatus()).isEqualTo(SdcSingleControllerStatus.STOPPED); - } - - @Test - public void testActivateCallback() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, - InstantiationException, ClassNotFoundException { - // given - - Class innerClass = Class - .forName("org.onap.clamp.clds.sdc.controller.SdcSingleController$SdcNotificationCallBack"); - Constructor constructor = innerClass.getDeclaredConstructor(SdcSingleController.class, - SdcSingleController.class); - constructor.setAccessible(true); - Object child = constructor.newInstance(sdcSingleController, sdcSingleController); - Method method = child.getClass().getDeclaredMethod("activateCallback", INotificationData.class); - method.setAccessible(true); - MDCAdapter mdcAdapter = MDC.getMDCAdapter(); - // when - method.invoke(child, buildFakeSdcNotification()); - // then - assertThat(mdcAdapter.get("ResponseCode")).isEqualTo("0"); - assertThat(mdcAdapter.get("StatusCode")).isEqualTo("COMPLETE"); - assertThat(mdcAdapter.get("ResponseDescription")) - .isEqualTo("SDC Notification received and processed successfully"); - assertThat(mdcAdapter.get("ClassName")).isEqualTo(child.getClass().getName()); - } -} diff --git a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java deleted file mode 100644 index bd0c94d52..000000000 --- a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java +++ /dev/null @@ -1,125 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model.dcae; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; - -import java.util.HashSet; -import java.util.Set; -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; -import org.apache.camel.builder.ExchangeBuilder; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class DcaeInventoryResponseCacheTestItCase { - - public static DcaeInventoryCache inventoryCache = new DcaeInventoryCache(); - - @Autowired - CamelContext camelContext; - - /** - * Initialize the responses. - */ - @BeforeClass - public static void createExample() { - DcaeInventoryResponse response1 = new DcaeInventoryResponse(); - response1.setAsdcServiceId("id1"); - response1.setAsdcResourceId("0"); - DcaeInventoryResponse response2 = new DcaeInventoryResponse(); - response2.setAsdcServiceId("id1"); - response2.setAsdcResourceId("1"); - DcaeInventoryResponse response3 = new DcaeInventoryResponse(); - response3.setAsdcServiceId("id1"); - response3.setAsdcResourceId("2"); - DcaeInventoryResponse response4 = new DcaeInventoryResponse(); - response4.setAsdcServiceId("id2"); - response4.setAsdcResourceId("0"); - DcaeInventoryResponse response5 = new DcaeInventoryResponse(); - response5.setAsdcServiceId("id2"); - response5.setAsdcResourceId("1"); - - inventoryCache.addDcaeInventoryResponse(response1); - inventoryCache.addDcaeInventoryResponse(response3); - inventoryCache.addDcaeInventoryResponse(response2); - inventoryCache.addDcaeInventoryResponse(response4); - inventoryCache.addDcaeInventoryResponse(response5); - } - - @Test - public void testGetAllLoopIds() { - assertThat(inventoryCache.getAllLoopIds().size()).isEqualTo(2); - } - - @Test - public void testGetAllBlueprintsPerLoopId() { - int value = 0; - for (DcaeInventoryResponse inventoryResponse : inventoryCache.getAllBlueprintsPerLoopId("id1")) { - assertThat(Integer.valueOf(inventoryResponse.getAsdcResourceId())).isEqualTo(value++); - } - - value = 0; - for (DcaeInventoryResponse inventoryResponse : inventoryCache.getAllBlueprintsPerLoopId("id2")) { - assertThat(Integer.valueOf(inventoryResponse.getAsdcResourceId())).isEqualTo(value++); - } - } - - @Test - public void testDcaeInventoryResponse() { - Exchange exchange = ExchangeBuilder.anExchange(camelContext).build(); - Exchange exchangeResponse = camelContext.createProducerTemplate() - .send("direct:get-all-dcae-blueprint-inventory", exchange); - assertThat(exchangeResponse.getIn().getHeader("CamelHttpResponseCode")).isEqualTo(200); - Set blueprint = inventoryCache.getAllBlueprintsPerLoopId("testAsdcServiceId"); - assertThat(blueprint.size()).isEqualTo(2); - - DcaeInventoryResponse response1 = new DcaeInventoryResponse(); - response1.setAsdcResourceId("0"); - response1.setTypeName("testTypeName"); - response1.setAsdcServiceId("testAsdcServiceId"); - response1.setBlueprintTemplate("testBlueprintTemplate"); - response1.setTypeId("testtypeId"); - DcaeInventoryResponse response2 = new DcaeInventoryResponse(); - response2.setAsdcResourceId("1"); - response2.setTypeName("testTypeName2"); - response2.setAsdcServiceId("testAsdcServiceId"); - response2.setBlueprintTemplate("testBlueprintTemplate2"); - response2.setTypeId("testtypeId2"); - - Set expectedBlueprint = new HashSet<>(); - expectedBlueprint.add(response1); - expectedBlueprint.add(response2); - - assertEquals(blueprint, expectedBlueprint); - } -} diff --git a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseTest.java b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseTest.java deleted file mode 100644 index c5217fdc9..000000000 --- a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.model.dcae; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.TreeSet; -import org.junit.Test; - -public class DcaeInventoryResponseTest { - - @Test - public void testComparator() { - DcaeInventoryResponse response1 = new DcaeInventoryResponse(); - response1.setAsdcServiceId("id1"); - response1.setAsdcResourceId("0"); - DcaeInventoryResponse response2 = new DcaeInventoryResponse(); - response2.setAsdcServiceId("id2"); - response2.setAsdcResourceId("1"); - DcaeInventoryResponse response3 = new DcaeInventoryResponse(); - response3.setAsdcServiceId("id3"); - response3.setAsdcResourceId("2"); - DcaeInventoryResponse response4 = new DcaeInventoryResponse(); - response4.setAsdcServiceId("id4"); - response4.setAsdcResourceId("3"); - - TreeSet responseSet = new TreeSet<>(); - responseSet.add(response4); - responseSet.add(response3); - responseSet.add(response1); - responseSet.add(response2); - - int value = 0; - for (DcaeInventoryResponse inventoryResponse : responseSet) { - assertThat(Integer.valueOf(inventoryResponse.getAsdcResourceId()) == value++).isTrue(); - } - } -} diff --git a/src/test/java/org/onap/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java b/src/test/java/org/onap/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java deleted file mode 100644 index 86b3497c6..000000000 --- a/src/test/java/org/onap/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 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.clamp.clds.model.jsontype; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonObject; -import org.hibernate.HibernateException; -import org.junit.Test; -import org.onap.clamp.dao.model.jsontype.JsonTypeDescriptor; - -public class JsonTypeDescriptorTest { - - private JsonTypeDescriptor descriptor = new JsonTypeDescriptor(); - - @Test - public void testFromString() { - JsonObject object = new JsonObject(); - object.addProperty("one", "oneValue"); - JsonObject child = new JsonObject(); - child.addProperty("two", "twoValue"); - object.add("child", child); - - JsonObject jsonResult = descriptor.fromString("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}"); - - assertThat(jsonResult).isEqualTo(object); - } - - @Test - public void testUnwrap() { - JsonObject res1 = descriptor.unwrap(null, null, null); - assertThat(res1).isNull(); - - JsonObject object = new JsonObject(); - object.addProperty("one", "oneValue"); - JsonObject child = new JsonObject(); - child.addProperty("two", "twoValue"); - object.add("child", child); - String res2 = descriptor.unwrap(object, String.class, null); - assertThat(res2.replace("\n", "").replace(" ", "")) - .isEqualTo("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}"); - - Object res3 = descriptor.unwrap(object, JsonObject.class, null); - String res3Str = ((String) res3).replace(" ", "").replace("\\n", "").replace("\\", "") - .replace("\"{", "{").replace("}\"", "}"); - assertThat(res3Str).isEqualTo("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}"); - } - - @Test(expected = HibernateException.class) - public void testUnwrapExpectationThrown() { - JsonObject object = new JsonObject(); - object.addProperty("one", "oneValue"); - - descriptor.unwrap(object, Integer.class, null); - } - - @Test - public void testWrap() { - JsonObject res1 = descriptor.wrap(null, null); - assertThat(res1).isNull(); - - JsonObject object = new JsonObject(); - object.addProperty("one", "oneValue"); - JsonObject child = new JsonObject(); - child.addProperty("two", "twoValue"); - object.add("child", child); - JsonObject res2 = descriptor.wrap("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}", null); - assertThat(res2).isEqualTo(object); - } - - @Test(expected = HibernateException.class) - public void testWrapExpectationThrown() { - descriptor.wrap(1, null); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java deleted file mode 100644 index a768526a0..000000000 --- a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java +++ /dev/null @@ -1,208 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds.sdc.controller.installer; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.json.JSONObject; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.onap.clamp.clds.exception.sdc.controller.BlueprintParserException; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.yaml.snakeyaml.Yaml; - -public class BlueprintParserTest { - private static final Gson GSON = new Gson(); - private static final String FIRST_APPP = "first_app"; - private static final String SECOND_APPP = "second_app"; - private static final String THIRD_APPP = "third_app"; - private static final String MODEL_TYPE1 = "type1"; - private static final String MODEL_TYPE_TCA = "onap.policies.monitoring.cdap.tca.hi.lo.app"; - private static final String VERSION = "1.0.0"; - - private static String microServiceTheWholeBlueprintValid; - private static String newMicroServiceBlueprint; - private static JsonObject jsonObjectBlueprintInvalid; - private static JsonObject jsonObjectBlueprintWithoutName; - private static JsonObject jsonObjectBlueprintWithoutProperties; - private static JsonObject jsonObjectBlueprintWithoutRelationships; - private static JsonObject jsonObjectBlueprintValidWithVersion; - - /** - * Method to load Blueprints before all test. - * - * @throws IOException In case of issues when opening the files - */ - @BeforeClass - public static void loadBlueprints() throws IOException { - microServiceTheWholeBlueprintValid = ResourceFileUtils - .getResourceAsString("clds/blueprint-with-microservice-chain.yaml"); - - newMicroServiceBlueprint = ResourceFileUtils.getResourceAsString("clds/new-microservice.yaml"); - - String microServiceBlueprintInvalid = ResourceFileUtils - .getResourceAsString("clds/single-microservice-fragment-invalid.yaml"); - jsonObjectBlueprintInvalid = yamlToJson(microServiceBlueprintInvalid); - String microServiceBlueprintWithoutName = ResourceFileUtils - .getResourceAsString("clds/single-microservice-fragment-without-name.yaml"); - jsonObjectBlueprintWithoutName = yamlToJson(microServiceBlueprintWithoutName); - String microServiceBlueprintWithoutProperties = ResourceFileUtils - .getResourceAsString("clds/single-microservice-fragment-without-properties.yaml"); - jsonObjectBlueprintWithoutProperties = yamlToJson(microServiceBlueprintWithoutProperties); - String microServiceBlueprintValidWithVersion = ResourceFileUtils - .getResourceAsString("clds/single-microservice-fragment-valid-with-version.yaml"); - jsonObjectBlueprintValidWithVersion = yamlToJson(microServiceBlueprintValidWithVersion); - - String microServiceBlueprintWithoutRelationships = ResourceFileUtils - .getResourceAsString("clds/single-microservice-fragment-without-relationships.yaml"); - jsonObjectBlueprintWithoutRelationships = yamlToJson(microServiceBlueprintWithoutRelationships); - - } - - @Test - public void getNameShouldReturnDefinedName() { - final JsonObject jsonObject = jsonObjectBlueprintInvalid; - String expectedName = jsonObject.get(jsonObject.keySet().iterator().next()).getAsJsonObject().get("properties") - .getAsJsonObject().get("name").getAsString(); - Entry entry = jsonObject.entrySet().iterator().next(); - String actualName = BlueprintParser.getName(entry); - - Assert.assertEquals(expectedName, actualName); - } - - @Test - public void getNameShouldReturnServiceNameWhenNoNameDefined() { - final JsonObject jsonObject = jsonObjectBlueprintWithoutName; - - String expectedName = jsonObject.keySet().iterator().next(); - Entry entry = jsonObject.entrySet().iterator().next(); - String actualName = BlueprintParser.getName(entry); - - Assert.assertEquals(expectedName, actualName); - } - - @Test - public void getNameShouldReturnServiceNameWhenNoPropertiesDefined() { - final JsonObject jsonObject = jsonObjectBlueprintWithoutProperties; - - String expectedName = jsonObject.keySet().iterator().next(); - Entry entry = jsonObject.entrySet().iterator().next(); - String actualName = BlueprintParser.getName(entry); - - Assert.assertEquals(expectedName, actualName); - } - - @Test - public void getInputShouldReturnInputWhenPresent() { - final JsonObject jsonObject = jsonObjectBlueprintInvalid; - - String expected = FIRST_APPP; - Entry entry = jsonObject.entrySet().iterator().next(); - String actual = BlueprintParser.getInput(entry); - - Assert.assertEquals(expected, actual); - } - - @Test - public void getInputShouldReturnEmptyStringWhenAbsent() { - final JsonObject jsonObject = jsonObjectBlueprintWithoutRelationships; - - String expected = ""; - Entry entry = jsonObject.entrySet().iterator().next(); - String actual = BlueprintParser.getInput(entry); - - Assert.assertEquals(expected, actual); - } - - @Test(expected = BlueprintParserException.class) - public void getNodeRepresentationFromIncompleteYaml() throws BlueprintParserException { - BlueprintParser.getNodeRepresentation(jsonObjectBlueprintInvalid.entrySet().iterator().next(), - jsonObjectBlueprintInvalid, null); - } - - @Test - public void getNodeRepresentationFromCompleteYamlWithModelVersion() throws BlueprintParserException { - final JsonObject jsonObject = jsonObjectBlueprintValidWithVersion; - - BlueprintMicroService expected = new BlueprintMicroService(SECOND_APPP, MODEL_TYPE1, "", "10.0.0"); - Entry entry = jsonObject.entrySet().iterator().next(); - BlueprintMicroService actual = BlueprintParser.getNodeRepresentation(entry, jsonObject, null); - - Assert.assertEquals(expected, actual); - } - - @Test - public void getMicroServicesFromBlueprintTest() throws BlueprintParserException { - BlueprintMicroService thirdApp = new BlueprintMicroService(THIRD_APPP, MODEL_TYPE_TCA, SECOND_APPP, VERSION); - BlueprintMicroService firstApp = new BlueprintMicroService(FIRST_APPP, MODEL_TYPE_TCA, "", VERSION); - BlueprintMicroService secondApp = new BlueprintMicroService(SECOND_APPP, MODEL_TYPE_TCA, FIRST_APPP, VERSION); - - Set expected = new HashSet<>(Arrays.asList(firstApp, secondApp, thirdApp)); - Set actual = BlueprintParser.getMicroServices(microServiceTheWholeBlueprintValid); - - Assert.assertEquals(expected, actual); - } - - @Test - public void fallBackToOneMicroServiceTcaTest() { - BlueprintMicroService tcaMs = new BlueprintMicroService(BlueprintParser.TCA, - "onap.policies.monitoring.cdap.tca.hi.lo.app", "", VERSION); - List expected = Collections.singletonList(tcaMs); - List actual = BlueprintParser.fallbackToOneMicroService(); - - Assert.assertEquals(expected, actual); - } - - @Test - public void newMicroServiceTest() throws BlueprintParserException { - List microServicesChain = new ChainGenerator() - .getChainOfMicroServices(BlueprintParser.getMicroServices(newMicroServiceBlueprint)); - if (microServicesChain.isEmpty()) { - microServicesChain = BlueprintParser.fallbackToOneMicroService(); - } - assertThat(microServicesChain.size()).isEqualTo(1); - assertThat(microServicesChain.get(0).getName()).isEqualTo("pmsh"); - } - - private static JsonObject yamlToJson(String yamlString) { - Yaml yaml = new Yaml(); - Map map = yaml.load(yamlString); - JSONObject jsonObject = new JSONObject(map); - return GSON.fromJson(jsonObject.toString(), JsonObject.class); - } -} diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java deleted file mode 100644 index a6b34f95d..000000000 --- a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller.installer; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.junit.Assert; -import org.junit.Test; - -public class ChainGeneratorTest { - private static final String FIRST_APPP = "first_app"; - private static final String SECOND_APPP = "second_app"; - private static final String THIRD_APPP = "third_app"; - private static final String FOURTH_APPP = "fourth_app"; - private static final String DEFAULT_VERSION = "1.0.0"; - - @Test - public void getChainOfMicroServicesTest() { - BlueprintMicroService ms1 = new BlueprintMicroService(FIRST_APPP, "", "", DEFAULT_VERSION); - BlueprintMicroService ms2 = new BlueprintMicroService(SECOND_APPP, "", FIRST_APPP, DEFAULT_VERSION); - BlueprintMicroService ms3 = new BlueprintMicroService(THIRD_APPP, "", SECOND_APPP, DEFAULT_VERSION); - BlueprintMicroService ms4 = new BlueprintMicroService(FOURTH_APPP, "", THIRD_APPP, DEFAULT_VERSION); - - List expectedList = Arrays.asList(ms1, ms2, ms3, ms4); - Set inputSet = new HashSet<>(expectedList); - - List actualList = new ChainGenerator().getChainOfMicroServices(inputSet); - Assert.assertEquals(expectedList, actualList); - } - - @Test - public void getChainOfMicroServicesTwiceNoInputTest() { - BlueprintMicroService ms1 = new BlueprintMicroService(FIRST_APPP, "", "", DEFAULT_VERSION); - BlueprintMicroService ms2 = new BlueprintMicroService(SECOND_APPP, "", "", DEFAULT_VERSION); - BlueprintMicroService ms3 = new BlueprintMicroService(THIRD_APPP, "", SECOND_APPP, DEFAULT_VERSION); - BlueprintMicroService ms4 = new BlueprintMicroService(FOURTH_APPP, "", FIRST_APPP, DEFAULT_VERSION); - - Set inputSet = new HashSet<>(Arrays.asList(ms1, ms2, ms3, ms4)); - List actualList = new ChainGenerator().getChainOfMicroServices(inputSet); - Assert.assertTrue(actualList.isEmpty()); - } - - @Test - public void getChainOfMicroServicesBranchingTest() { - BlueprintMicroService ms1 = new BlueprintMicroService(FIRST_APPP, "", "", DEFAULT_VERSION); - BlueprintMicroService ms2 = new BlueprintMicroService(SECOND_APPP, "", FIRST_APPP, DEFAULT_VERSION); - BlueprintMicroService ms3 = new BlueprintMicroService(THIRD_APPP, "", FIRST_APPP, DEFAULT_VERSION); - BlueprintMicroService ms4 = new BlueprintMicroService(FOURTH_APPP, "", FIRST_APPP, DEFAULT_VERSION); - - Set inputSet = new HashSet<>(Arrays.asList(ms1, ms2, ms3, ms4)); - List actualList = new ChainGenerator().getChainOfMicroServices(inputSet); - Assert.assertTrue(actualList.isEmpty()); - } -} diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java deleted file mode 100644 index f2a9de7a0..000000000 --- a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java +++ /dev/null @@ -1,199 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.sdc.controller.installer; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.mockito.Mockito; -import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException; -import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.sdc.api.notification.IArtifactInfo; -import org.onap.sdc.api.notification.INotificationData; -import org.onap.sdc.api.notification.IResourceInstance; -import org.onap.sdc.api.results.IDistributionClientDownloadResult; -import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; - -public class CsarHandlerTest { - - private static final String SDC_FOLDER = "/tmp/csar-handler-tests"; - private static final String CSAR_ARTIFACT_NAME = "testArtifact.csar"; - private static final String SERVICE_UUID = "serviceUUID"; - private static final String RESOURCE1_UUID = "resource1UUID"; - private static final String RESOURCE1_INSTANCE_NAME = "sim-1802 0"; - private static final String RESOURCE1_INSTANCE_NAME_IN_CSAR = "sim18020"; - private static final String BLUEPRINT1_NAME = "FOI.Simfoimap223S0112.event_proc_bp.yaml"; - private static final String BLUEPRINT2_NAME = "FOI.Simfoimap223S0112.event_proc_bp2.yaml"; - - @Test - public void testConstructor() throws CsarHandlerException { - IArtifactInfo serviceArtifact = Mockito.mock(IArtifactInfo.class); - Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE); - Mockito.when(serviceArtifact.getArtifactName()).thenReturn(CSAR_ARTIFACT_NAME); - List servicesList = new ArrayList<>(); - servicesList.add(serviceArtifact); - INotificationData notifData = Mockito.mock(INotificationData.class); - Mockito.when(notifData.getServiceArtifacts()).thenReturn(servicesList); - CsarHandler csar = new CsarHandler(notifData, "test-controller", SDC_FOLDER); - assertEquals(SDC_FOLDER + "/test-controller" + "/" + CSAR_ARTIFACT_NAME, csar.getFilePath()); - } - - @Test(expected = CsarHandlerException.class) - public void testFailingConstructor() throws CsarHandlerException { - INotificationData notifData = Mockito.mock(INotificationData.class); - Mockito.when(notifData.getServiceArtifacts()).thenReturn(new ArrayList<>()); - new CsarHandler(notifData, "test-controller", "/tmp/csar-handler-tests"); - fail("Exception should have been raised"); - } - - private INotificationData buildFakeSdcNotification() { - // BUild what is needed for CSAR - IArtifactInfo serviceArtifact = Mockito.mock(IArtifactInfo.class); - Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE); - Mockito.when(serviceArtifact.getArtifactName()).thenReturn(CSAR_ARTIFACT_NAME); - List servicesList = new ArrayList<>(); - servicesList.add(serviceArtifact); - INotificationData notifData = Mockito.mock(INotificationData.class); - Mockito.when(notifData.getServiceArtifacts()).thenReturn(servicesList); - // Build what is needed for UUID - Mockito.when(notifData.getServiceInvariantUUID()).thenReturn(SERVICE_UUID); - // Build fake resource with one artifact BLUEPRINT - IResourceInstance resource1 = Mockito.mock(IResourceInstance.class); - Mockito.when(resource1.getResourceType()).thenReturn("VF"); - Mockito.when(resource1.getResourceInvariantUUID()).thenReturn(RESOURCE1_UUID); - Mockito.when(resource1.getResourceInstanceName()).thenReturn(RESOURCE1_INSTANCE_NAME); - // Create a fake artifact for resource - IArtifactInfo blueprintArtifact = Mockito.mock(IArtifactInfo.class); - Mockito.when(blueprintArtifact.getArtifactType()).thenReturn(CsarHandler.BLUEPRINT_TYPE); - List artifactsListForResource = new ArrayList<>(); - artifactsListForResource.add(blueprintArtifact); - Mockito.when(resource1.getArtifacts()).thenReturn(artifactsListForResource); - List resourcesList = new ArrayList<>(); - resourcesList.add(resource1); - Mockito.when(notifData.getResources()).thenReturn(resourcesList); - return notifData; - } - - private IDistributionClientDownloadResult buildFakeSdcResut() throws IOException { - IDistributionClientDownloadResult resultArtifact = Mockito.mock(IDistributionClientDownloadResult.class); - Mockito.when(resultArtifact.getArtifactPayload()).thenReturn( - IOUtils.toByteArray(ResourceFileUtils.getResourceAsStream("example/sdc/service-Simsfoimap0112.csar"))); - return resultArtifact; - } - - private IDistributionClientDownloadResult buildFakeSdcResultWithoutPolicyModel() throws IOException { - IDistributionClientDownloadResult resultArtifact = Mockito.mock(IDistributionClientDownloadResult.class); - Mockito.when(resultArtifact.getArtifactPayload()).thenReturn( - IOUtils.toByteArray(ResourceFileUtils.getResourceAsStream("example/sdc/service-without-policy.csar"))); - return resultArtifact; - } - - @Test - public void testSave() - throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException { - CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); - // Test the save - csar.save(buildFakeSdcResut()); - assertTrue((new File(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME)).exists()); - assertEquals(CSAR_ARTIFACT_NAME, csar.getArtifactElement().getArtifactName()); - assertNotNull(csar.getSdcCsarHelper()); - // Test dcaeBlueprint - String blueprint = csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getDcaeBlueprint(); - assertNotNull(blueprint); - assertTrue(!blueprint.isEmpty()); - assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1")); - // Test additional properties from Sdc notif - assertEquals(BLUEPRINT1_NAME, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintArtifactName()); - assertEquals(RESOURCE1_UUID, - csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getResourceAttached().getResourceInvariantUUID()); - assertEquals(SERVICE_UUID, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintInvariantServiceUuid()); - - // Just check the second one is there as well - assertEquals(BLUEPRINT2_NAME, csar.getMapOfBlueprints().get(BLUEPRINT2_NAME).getBlueprintArtifactName()); - blueprint = csar.getMapOfBlueprints().get(BLUEPRINT2_NAME).getDcaeBlueprint(); - assertNotNull(blueprint); - assertTrue(!blueprint.isEmpty()); - assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1")); - // Do some cleanup - Path path = Paths.get(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME); - Files.deleteIfExists(path); - - } - - @Test - public void testLoadingOfPolicyModelFromCsar() - throws CsarHandlerException, IOException, SdcArtifactInstallerException, SdcToscaParserException { - CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); - csar.save(buildFakeSdcResut()); - String policyModelYaml = csar.getPolicyModelYaml().get(); - assertTrue(policyModelYaml.contains("tosca_simple_yaml_1_0_0")); - } - - @Test - public void testLoadingOfNonexistentPolicyModelFromCsar() - throws CsarHandlerException, IOException, SdcArtifactInstallerException, SdcToscaParserException { - CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); - csar.save(buildFakeSdcResultWithoutPolicyModel()); - assertFalse(csar.getPolicyModelYaml().isPresent()); - } - - @Test - public void testDoubleSave() - throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException { - CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); - // Test the save - csar.save(buildFakeSdcResut()); - assertTrue((new File(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME)).exists()); - assertEquals(CSAR_ARTIFACT_NAME, csar.getArtifactElement().getArtifactName()); - assertNotNull(csar.getSdcCsarHelper()); - // Test dcaeBlueprint - String blueprint = csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getDcaeBlueprint(); - assertNotNull(blueprint); - assertTrue(!blueprint.isEmpty()); - assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1")); - // Test additional properties from Sdc notif - assertEquals(BLUEPRINT1_NAME, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintArtifactName()); - assertEquals(RESOURCE1_UUID, - csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getResourceAttached().getResourceInvariantUUID()); - assertEquals(SERVICE_UUID, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintInvariantServiceUuid()); - Path path = Paths.get(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME); - // A double save should simply overwrite the existing - csar.save(buildFakeSdcResut()); - // Do some cleanup - Files.deleteIfExists(path); - } -} diff --git a/src/test/java/org/onap/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java b/src/test/java/org/onap/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java deleted file mode 100644 index 01dc8404c..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java +++ /dev/null @@ -1,88 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.tosca.Dictionary; -import org.onap.clamp.tosca.DictionaryElement; -import org.onap.clamp.tosca.DictionaryRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.transaction.annotation.Transactional; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) -public class DictionaryRepositoriesTestItCase { - @Autowired - private DictionaryRepository dictionaryRepository; - - @Test - @Transactional - public void crudTest() { - // Setup - Dictionary dictionaryTest1 = new Dictionary(); - dictionaryTest1.setName("testDictionary1"); - dictionaryTest1.setSecondLevelDictionary(1); - dictionaryTest1.setSubDictionaryType("testType"); - - DictionaryElement element1 = new DictionaryElement(); - element1.setName("element1"); - element1.setShortName("shortName1"); - element1.setType("type1"); - element1.setDescription("description1"); - - dictionaryTest1.addDictionaryElements(element1); - - Dictionary dictionaryTest2 = new Dictionary(); - dictionaryTest2.setName("testDictionary2"); - dictionaryTest2.setSecondLevelDictionary(1); - dictionaryTest2.setSubDictionaryType("testType"); - - DictionaryElement element2 = new DictionaryElement(); - element2.setName("element2"); - element2.setShortName("shortName2"); - element2.setSubDictionary("testDictionary1"); - element2.setType("type2"); - element2.setDescription("description2"); - - dictionaryTest2.addDictionaryElements(element2); - - dictionaryRepository.save(dictionaryTest1); - List res1 = dictionaryRepository.getAllDictionaryNames(); - assertThat(res1.size()).isGreaterThanOrEqualTo(1); - assertThat(res1).contains("testDictionary1"); - - dictionaryRepository.save(dictionaryTest2); - List res2 = dictionaryRepository.getAllDictionaryNames(); - assertThat(res2.size()).isGreaterThanOrEqualTo(2); - assertThat(res2).contains("testDictionary1"); - assertThat(res2).contains("testDictionary2"); - } -} diff --git a/src/test/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java b/src/test/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java deleted file mode 100644 index e73547652..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java +++ /dev/null @@ -1,201 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights - * reserved. - * Modifications Copyright (C) 2019 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.clds.tosca; - -import static org.junit.Assert.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import com.google.gson.JsonObject; -import java.io.IOException; -import javax.transaction.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.tosca.Dictionary; -import org.onap.clamp.tosca.DictionaryElement; -import org.onap.clamp.tosca.DictionaryService; -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.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) -public class ToscaYamlToJsonConvertorTestItCase { - - @Autowired - private DictionaryService dictionaryService; - - @Autowired - private ToscaYamlToJsonConvertor toscaYamlToJsonConvertor; - - /** - * This Test validates TOSCA yaml to JSON Schema conversion based on JSON Editor - * Schema. - * - * @throws IOException In case of issue when opening the tosca yaml file and - * converted json file - */ - @Test - public final void testParseToscaYaml() throws IOException { - String toscaModelYaml = ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"); - ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor(); - - String parsedJsonSchema = - convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.cdap.tca.hi.lo.app"); - assertNotNull(parsedJsonSchema); - JSONAssert.assertEquals( - ResourceFileUtils.getResourceAsString("tosca/policy-yaml-to-json.json"), - parsedJsonSchema, true); - } - - /** - * This Test validates TOSCA yaml with constraints to JSON Schema conversion - * based on JSON Editor Schema. - * - * @throws IOException In case of issue when opening the tosca yaml file and - * converted json file - */ - @Test - public final void testParseToscaYamlWithConstraints() throws IOException { - String toscaModelYaml = - ResourceFileUtils.getResourceAsString("tosca/tosca-with-constraints.yaml"); - ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor(); - - String parsedJsonSchema = - convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app"); - assertNotNull(parsedJsonSchema); - JSONAssert.assertEquals( - ResourceFileUtils.getResourceAsString("tosca/policy-yaml-to-json-with-constraints.json"), - parsedJsonSchema, true); - } - - /** - * This Test validates TOSCA yaml with different datatypes to JSON Schema - * conversion based on JSON Editor Schema. - * - * @throws IOException In case of issue when opening the tosca yaml file and - * converted json file - */ - @Test - public final void testParseToscaYamlWithTypes() throws IOException { - String toscaModelYaml = - ResourceFileUtils.getResourceAsString("tosca/tosca-with-datatypes.yaml"); - ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor(); - - String parsedJsonSchema = - convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app"); - assertNotNull(parsedJsonSchema); - JSONAssert.assertEquals( - ResourceFileUtils.getResourceAsString("tosca/policy-yaml-to-json-with-datatypes.json"), - parsedJsonSchema, true); - } - - /** - * This Test validates Tosca yaml with metadata tag that contains policy_model_type and acronym - * parameters which defines the Tosca Policy name and its short name. - * - * @throws IOException In case of issue when opening the tosca yaml file and - * converted json file - */ - @Test - @Transactional - public final void testMetadataClampPossibleValues() throws IOException { - setupDictionary(); - String toscaModelYaml = - ResourceFileUtils.getResourceAsString("tosca/tosca_metadata_clamp_possible_values.yaml"); - - JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(toscaModelYaml); - assertNotNull(jsonObject); - String policyModelType = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, - ToscaSchemaConstants.METADATA_POLICY_MODEL_TYPE); - String acronym = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, - ToscaSchemaConstants.METADATA_ACRONYM); - String parsedJsonSchema = - toscaYamlToJsonConvertor.parseToscaYaml(toscaModelYaml, policyModelType); - - assertNotNull(parsedJsonSchema); - assertEquals("onap.policies.monitoring.cdap.tca.hi.lo.app", policyModelType); - assertEquals("tca", acronym); - JSONAssert.assertEquals( - ResourceFileUtils - .getResourceAsString("tosca/tosca_metadata_clamp_possible_values_json_schema.json"), - parsedJsonSchema, true); - - } - - private void setupDictionary() { - - // Set up dictionary elements - Dictionary dictionaryTest = new Dictionary(); - dictionaryTest.setName("Context"); - dictionaryTest.setSecondLevelDictionary(0); - - DictionaryElement element = new DictionaryElement(); - element.setName("PROD"); - element.setShortName("PROD"); - element.setType("string"); - element.setDescription("Production"); - dictionaryTest.addDictionaryElements(element); - - dictionaryService.saveOrUpdateDictionary(dictionaryTest); - - Dictionary dictionaryTest1 = new Dictionary(); - dictionaryTest1.setName("EventDictionary"); - dictionaryTest1.setSecondLevelDictionary(0); - - DictionaryElement element1 = new DictionaryElement(); - element1.setName("alarmCondition"); - element1.setShortName("alarmCondition"); - element1.setType("string"); - element1.setDescription("Alarm Condition"); - dictionaryTest1.addDictionaryElements(element1); - - dictionaryTest1 = dictionaryService.saveOrUpdateDictionary(dictionaryTest1); - - DictionaryElement element3 = new DictionaryElement(); - element3.setName("timeEpoch"); - element3.setShortName("timeEpoch"); - element3.setType("datetime"); - element3.setDescription("Time Epoch"); - dictionaryTest1.addDictionaryElements(element3); - - dictionaryService.saveOrUpdateDictionary(dictionaryTest1); - - Dictionary dictionaryTest2 = new Dictionary(); - dictionaryTest2.setName("Operators"); - dictionaryTest2.setSecondLevelDictionary(0); - - DictionaryElement element2 = new DictionaryElement(); - element2.setName("equals"); - element2.setShortName("equals"); - element2.setType("string|datetime"); - element2.setDescription("equals"); - dictionaryTest2.addDictionaryElements(element2); - dictionaryService.saveOrUpdateDictionary(dictionaryTest2); - } - -} diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java deleted file mode 100644 index 8a81445b2..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import com.google.gson.JsonArray; -import java.io.IOException; -import java.util.ArrayList; -import junit.framework.TestCase; -import org.onap.clamp.clds.tosca.update.elements.ArrayField; -import org.onap.clamp.clds.tosca.update.elements.ToscaElement; -import org.onap.clamp.clds.tosca.update.elements.ToscaElementProperty; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateManager; -import org.onap.clamp.clds.util.ResourceFileUtils; - -public class ArrayFieldTest extends TestCase { - - /** - * Test the deploy method. - * - * @throws IOException in case of failure - */ - public void testDeploy() throws IOException { - JsonTemplateManager jsonTemplateManager = new JsonTemplateManager(ResourceFileUtils.getResourceAsString( - "tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"), ResourceFileUtils.getResourceAsString( - "clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Actor"); - ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("actor"); - ArrayField arrayParser = new ArrayField((ArrayList) toscaElementProperty.getItems().get("default")); - JsonArray toTest = arrayParser.deploy(); - String reference = "[1,\"String\",5.5,true]"; - assertEquals(reference, String.valueOf(toTest)); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java deleted file mode 100644 index f147f404d..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.ArrayList; -import junit.framework.TestCase; -import org.onap.clamp.clds.tosca.update.elements.ToscaElement; -import org.onap.clamp.clds.tosca.update.elements.ToscaElementProperty; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplate; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateManager; -import org.onap.clamp.clds.util.ResourceFileUtils; - -public class ConstraintTest extends TestCase { - - JsonTemplateManager jsonTemplateManager = new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/constraints.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - - ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Operation"); - - public ConstraintTest() throws IOException { - } - - /** - * Test get value array. - */ - public void testGetValuesArray() { - ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("timeout"); - JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("integer"); - JsonObject resultProcess = new JsonObject(); - toscaElementProperty.addConstraintsAsJson(resultProcess, - (ArrayList) toscaElementProperty.getItems().get("constraints"), - jsonTemplate); - String reference = "{\"enum\":[3,4,5.5,6,10]}"; - assertEquals(reference, String.valueOf(resultProcess)); - toscaElementProperty = toscaElement.getProperties().get("success"); - jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("string"); - resultProcess = new JsonObject(); - toscaElementProperty.addConstraintsAsJson(resultProcess, - (ArrayList) toscaElementProperty.getItems().get("constraints"), - jsonTemplate); - reference = "{\"enum\":[\"VALID\",\"TERMINATED\"]}"; - assertEquals(reference, String.valueOf(resultProcess)); - } - - /** - * Test get Specific length. - */ - public void testGetSpecificLength() { - //Test for string type, same process for array - ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("id"); - JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("string"); - JsonObject resultProcess = new JsonObject(); - toscaElementProperty.addConstraintsAsJson(resultProcess, - (ArrayList) toscaElementProperty.getItems().get("constraints"), - jsonTemplate); - int specificLength = 8; - int toTest = resultProcess.get("minLength").getAsInt(); - assertEquals(specificLength, toTest); - toTest = resultProcess.get("maxLength").getAsInt(); - assertEquals(specificLength, toTest); - } - - /** - * Test get limit value. - */ - public void testGetLimitValue() { - //Test for array type, same process for string - ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("description"); - JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("array"); - JsonObject resultProcess = new JsonObject(); - toscaElementProperty.addConstraintsAsJson(resultProcess, - (ArrayList) toscaElementProperty.getItems().get("constraints"), - jsonTemplate); - - int toTest = resultProcess.get("minItems").getAsInt(); - assertEquals(5, toTest); - toTest = resultProcess.get("maxItems").getAsInt(); - assertEquals(7, toTest); - } - -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateFieldTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateFieldTest.java deleted file mode 100644 index 7f0047e4f..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateFieldTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import junit.framework.TestCase; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateField; - -public class JsonTemplateFieldTest extends TestCase { - - JsonTemplateField field1 = new JsonTemplateField("type", "testType", true, true); - JsonTemplateField field2 = new JsonTemplateField("type"); - JsonTemplateField field3 = new JsonTemplateField("type", "testType1", true, true); - JsonTemplateField field4 = new JsonTemplateField("type", "testType", false, true); - JsonTemplateField field5 = new JsonTemplateField("type", "testType", true, false); - JsonTemplateField field6 = new JsonTemplateField("type", "testType", true, true); - - /** - * Test fieldsEqual method. - */ - public void testFieldsEqualsMethod() { - assertFalse(JsonTemplateField.fieldsEquals(field1, field3)); - assertFalse(JsonTemplateField.fieldsEquals(field1, field4)); - assertFalse(JsonTemplateField.fieldsEquals(field1, field5)); - assertTrue(JsonTemplateField.fieldsEquals(field1, field6)); - } - - /** - * Test equals method. - */ - public void testEqualsMethod() { - assertTrue(field1.equals(field2)); - assertTrue(field1.equals(field3)); - assertTrue(field1.equals(field4)); - assertTrue(field1.equals(field5)); - assertTrue(field1.equals(field6)); - } - - /** - * Test compareWithField method. - */ - public void testCompareWithFieldMethod() { - assertFalse(field1.compareWithField(field2)); - assertFalse(field1.compareWithField(field3)); - assertFalse(field1.compareWithField(field4)); - assertFalse(field1.compareWithField(field5)); - assertTrue(field1.equals(field6)); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateManagerTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateManagerTest.java deleted file mode 100644 index 504103559..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateManagerTest.java +++ /dev/null @@ -1,203 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import junit.framework.TestCase; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplate; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateField; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateManager; -import org.onap.clamp.clds.util.ResourceFileUtils; - -public class JsonTemplateManagerTest extends TestCase { - - /** - * Test the launch translation wit operational policies. - * - * @throws IOException In case of failure - * @throws UnknownComponentException In case of failure - */ - public void testLaunchTranslationTca() throws IOException, UnknownComponentException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" - + ".policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.file"), - ResourceFileUtils.getResourceAsString( - "clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - String componentName = "onap.policies.monitoring.cdap.tca.hi.lo.app"; - jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); - } - - /** - * Test the launch translation wit operational policies. - * - * @throws IOException In case of failure - * @throws UnknownComponentException In case of failure - */ - public void testLaunchTranslationFrequencyLimiter() throws IOException, UnknownComponentException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" - + ".policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.file"), - ResourceFileUtils.getResourceAsString( - "clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - String componentName = "onap.policies.controlloop.guard.common.FrequencyLimiter"; - jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); - } - - /** - * Test the launch translation wit operational policies. - * - * @throws IOException In case of failure - * @throws UnknownComponentException In case of failure - */ - public void testLaunchTranslationApex() throws IOException, UnknownComponentException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" - + ".policies.controlloop.operational.common.Apex/versions/1.0.0/.file"), - ResourceFileUtils.getResourceAsString( - "clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - String componentName = "onap.policies.controlloop.operational.common.Apex"; - jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); - } - - /** - * Test the launch translation wit operational policies. - * - * @throws IOException In case of failure - * @throws UnknownComponentException In case of failure - */ - public void testLaunchTranslationDrools() throws IOException, UnknownComponentException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" - + ".policies.controlloop.operational.common.Drools/versions/1.0.0/.file"), - ResourceFileUtils.getResourceAsString( - "clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - String componentName = "onap.policies.controlloop.operational.common.Drools"; - jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); - } - - - /** - * Test the launch translation. - * - * @throws IOException In case of failure - * @throws UnknownComponentException In case of failure - */ - public void testLaunchTranslation() throws IOException, UnknownComponentException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - String componentName = "onap.policies.controlloop.operational.common.Drools"; - jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); - } - - /** - * Test addTemplate. - * - * @throws IOException In case of failure - */ - public void testAddTemplate() throws IOException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - int count = jsonTemplateManager.getJsonSchemaTemplates().size(); - List - jsonTemplateFields = - new ArrayList<>(Arrays.asList(new JsonTemplateField("type"), new JsonTemplateField("description"), - new JsonTemplateField( - "required"), - new JsonTemplateField("metadata"), new JsonTemplateField("constraints"))); - jsonTemplateManager.addTemplate("test", jsonTemplateFields); - assertNotSame(count, jsonTemplateManager.getJsonSchemaTemplates().size()); - } - - /** - * test Remove template. - * - * @throws IOException In case of failure - */ - public void testRemoveTemplate() throws IOException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - int count = jsonTemplateManager.getJsonSchemaTemplates().size(); - jsonTemplateManager.removeTemplate("string"); - assertNotSame(count, jsonTemplateManager.getJsonSchemaTemplates().size()); - } - - /** - * Test update template. - * - * @throws IOException In case of failure - */ - public void testUpdateTemplate() throws IOException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - int count = jsonTemplateManager.getJsonSchemaTemplates().get("integer").getJsonTemplateFields().size(); - jsonTemplateManager.updateTemplate("integer", new JsonTemplateField("type"), false); - assertNotSame(count, - jsonTemplateManager.getJsonSchemaTemplates().get("integer").getJsonTemplateFields().size()); - } - - /** - * Test has template. - * - * @throws IOException In case of failure - */ - public void testHasTemplate() throws IOException { - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - boolean has = true; - List jsonTemplateFieldsString = - new ArrayList<>(Arrays.asList(new JsonTemplateField("type"), new JsonTemplateField("description"), - new JsonTemplateField("required"), - new JsonTemplateField("metadata"), new JsonTemplateField("constraints"))); - JsonTemplate jsonTemplateTest = new JsonTemplate("String", jsonTemplateFieldsString); - has = jsonTemplateManager.hasTemplate(jsonTemplateTest); - assertEquals(false, has); - } - -} diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateTest.java deleted file mode 100644 index dc736a48b..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/JsonTemplateTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import junit.framework.TestCase; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplate; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateField; - -public class JsonTemplateTest extends TestCase { - - JsonTemplate toTest = new JsonTemplate("toTest"); - List - jsonTemplateFields = new ArrayList<>( - Arrays.asList(new JsonTemplateField("type"), new JsonTemplateField("description"), - new JsonTemplateField( - "enum"))); - - /** - * Test check failed. - */ - public void testCheckFields() { - toTest.setJsonTemplateFields(jsonTemplateFields); - JsonTemplate reference = new JsonTemplate("toTest"); - reference.setJsonTemplateFields(jsonTemplateFields); - assertTrue(toTest.checkFields(reference)); - } - - /** - * Test other methods. - */ - public void testOtherFields() { - toTest.setJsonTemplateFields(jsonTemplateFields); - toTest.addField(new JsonTemplateField("moreField")); - toTest.setVisibility("moreField", true); - toTest.setStatic("moreField", true); - toTest.updateValueField("moreField", "testValue"); - - assertTrue(toTest.isVisible("moreField")); - assertTrue(toTest.getSpecificField("moreField").getValue().equals("testValue")); - assertTrue(toTest.fieldStaticStatus("moreField")); - assertTrue(toTest.toString() - .equals(" templateFields : [type null null null, description null null null, " - + "enum null null null, moreField testValue true true]")); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java b/src/test/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java deleted file mode 100644 index 4fae89f09..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java +++ /dev/null @@ -1,147 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import com.google.gson.JsonObject; -import java.io.IOException; -import javax.transaction.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.tosca.update.execution.ToscaMetadataExecutor; -import org.onap.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParserWithDictionarySupport; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateManager; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.tosca.Dictionary; -import org.onap.clamp.tosca.DictionaryElement; -import org.onap.clamp.tosca.DictionaryService; -import org.skyscreamer.jsonassert.JSONAssert; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) -@ActiveProfiles({"clamp-default", "clamp-default-user", "default-dictionary-elements"}) -public class ToscaConverterWithDictionarySupportItCase { - - @Autowired - private DictionaryService dictionaryService; - - @Autowired - private ToscaMetadataParserWithDictionarySupport toscaMetadataParserWithDictionarySupport; - - @Autowired - private ToscaMetadataExecutor toscaMetadataExecutor; - - /** - * This Test validates Tosca yaml with metadata tag that contains policy_model_type and acronym - * parameters which defines the Tosca Policy name and its short name. - * - * @throws IOException In case of issue when opening the tosca yaml file and - * converted json file - */ - @Test - @Transactional - public final void testMetadataClampPossibleValues() throws IOException, UnknownComponentException { - - // Set up dictionary elements - Dictionary dictionaryTest = new Dictionary(); - dictionaryTest.setName("Context"); - dictionaryTest.setSecondLevelDictionary(0); - - DictionaryElement element = new DictionaryElement(); - element.setName("PROD"); - element.setShortName("PROD"); - element.setType("string"); - element.setDescription("Production"); - dictionaryTest.addDictionaryElements(element); - - dictionaryService.saveOrUpdateDictionary(dictionaryTest); - - Dictionary dictionaryTest1 = new Dictionary(); - dictionaryTest1.setName("EventDictionary"); - dictionaryTest1.setSecondLevelDictionary(0); - - DictionaryElement element1 = new DictionaryElement(); - element1.setName("alarmCondition"); - element1.setShortName("alarmCondition"); - element1.setType("string"); - element1.setDescription("Alarm Condition"); - dictionaryTest1.addDictionaryElements(element1); - - dictionaryService.saveOrUpdateDictionary(dictionaryTest1); - - Dictionary dictionaryTest2 = new Dictionary(); - dictionaryTest2.setName("Operators"); - dictionaryTest2.setSecondLevelDictionary(0); - - DictionaryElement element2 = new DictionaryElement(); - element2.setName("equals"); - element2.setShortName("equals"); - element2.setType("string"); - element2.setDescription("equals"); - dictionaryTest2.addDictionaryElements(element2); - dictionaryService.saveOrUpdateDictionary(dictionaryTest2); - - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils - .getResourceAsString("tosca/new-converter/tosca_metadata_clamp_possible_values.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - - JsonObject jsonSchema = jsonTemplateManager.getJsonSchemaForPolicyType( - "onap.policies.monitoring.cdap.tca.hi.lo.app", toscaMetadataParserWithDictionarySupport, null); - - JSONAssert.assertEquals( - ResourceFileUtils - .getResourceAsString("tosca/new-converter/tca-with-metadata.json"), - JsonUtils.GSON.toJson(jsonSchema), true); - } - - @Test - @Transactional - public final void testMetadataClampPossibleValueWithExecutor() throws IOException, UnknownComponentException { - Service service = new Service(ResourceFileUtils.getResourceAsString("tosca/service-details.json"), - ResourceFileUtils.getResourceAsString("tosca/resource-details-cds.json")); - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" - + ".policies.controlloop.operational.common.Apex/versions/1.0.0/.file"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - - JsonObject jsonSchema = jsonTemplateManager.getJsonSchemaForPolicyType( - "onap.policies.controlloop.operational.common.Apex", toscaMetadataParserWithDictionarySupport, service); - - JSONAssert.assertEquals( - ResourceFileUtils - .getResourceAsString("tosca/new-converter/tosca_apex_with_metadata.json"), - JsonUtils.GSON.toJson(jsonSchema), true); - } -} diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementPropertyTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementPropertyTest.java deleted file mode 100644 index 52f8444ff..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementPropertyTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.ArrayList; -import junit.framework.TestCase; -import org.onap.clamp.clds.tosca.update.elements.ToscaElement; -import org.onap.clamp.clds.tosca.update.elements.ToscaElementProperty; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplate; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateManager; -import org.onap.clamp.clds.util.ResourceFileUtils; - -public class ToscaElementPropertyTest extends TestCase { - public ToscaElementPropertyTest() throws IOException { - } - - /** - * Test Parse array. - * - * @throws IOException In case of failure - */ - public void testParseArray() throws IOException { - JsonTemplateManager jsonTemplateManager = new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Actor"); - ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("actor"); - JsonArray toTest = - toscaElementProperty.parseArray((ArrayList) toscaElementProperty.getItems().get("default")); - assertNotNull(toTest); - } - - /** - * Test add constraint as json. - * - * @throws IOException In case of failure - */ - public void testAddConstraintsAsJson() throws IOException { - JsonTemplateManager jsonTemplateManager = new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - ToscaElement toscaElement = - jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.operation.Failure"); - ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("category"); - JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("string"); - JsonObject toTest = new JsonObject(); - toscaElementProperty - .addConstraintsAsJson(toTest, (ArrayList) toscaElementProperty.getItems().get("constraints"), - jsonTemplate); - String test = "{\"enum\":[\"error\",\"timeout\",\"retries\",\"guard\",\"exception\"]}"; - assertEquals(test, String.valueOf(toTest)); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementTest.java deleted file mode 100644 index ba8454bb2..000000000 --- a/src/test/java/org/onap/clamp/clds/tosca/update/ToscaElementTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.tosca.update; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import junit.framework.TestCase; -import org.onap.clamp.clds.tosca.update.elements.ToscaElement; -import org.onap.clamp.clds.tosca.update.templates.JsonTemplateManager; -import org.onap.clamp.clds.util.ResourceFileUtils; - -public class ToscaElementTest extends TestCase { - - /** - * Test propertiesName. - * - * @throws IOException In case of failure - */ - public void testPropertiesNames() throws IOException { - ArrayList reference = new ArrayList<>(Arrays.asList("actor", "operation", "target", "payload")); - JsonTemplateManager jsonTemplateManager = - new JsonTemplateManager( - ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), - ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); - ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Actor"); - assertEquals(reference, toscaElement.propertiesNames()); - } - -} diff --git a/src/test/java/org/onap/clamp/clds/util/CryptoUtilsTest.java b/src/test/java/org/onap/clamp/clds/util/CryptoUtilsTest.java deleted file mode 100644 index 42123aaf4..000000000 --- a/src/test/java/org/onap/clamp/clds/util/CryptoUtilsTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.clds.util; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.eq; - -import java.security.InvalidKeyException; -import javax.crypto.KeyGenerator; -import javax.crypto.SecretKey; -import org.apache.commons.codec.binary.Hex; -import org.apache.commons.lang3.ArrayUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ "javax.crypto.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*" }) -public class CryptoUtilsTest { - - private final String data = "This is a test string"; - - @Test - @PrepareForTest({ CryptoUtils.class }) - public final void testEncryption() throws Exception { - String encodedString = CryptoUtils.encrypt(data); - assertNotNull(encodedString); - assertEquals(data, CryptoUtils.decrypt(encodedString)); - } - - @Test - @PrepareForTest({ CryptoUtils.class }) - public final void testEncryptedStringIsDifferent() throws Exception { - String encodedString1 = CryptoUtils.encrypt(data); - String encodedString2 = CryptoUtils.encrypt(data); - byte[] encryptedMessage1 = Hex.decodeHex(encodedString1.toCharArray()); - byte[] encryptedMessage2 = Hex.decodeHex(encodedString2.toCharArray()); - assertNotNull(encryptedMessage1); - assertNotNull(encryptedMessage2); - assertNotEquals(encryptedMessage1, encryptedMessage2); - byte[] subData1 = ArrayUtils.subarray(encryptedMessage1, 16, encryptedMessage1.length); - byte[] subData2 = ArrayUtils.subarray(encryptedMessage2, 16, encryptedMessage2.length); - assertNotEquals(subData1, subData2); - } - - @Test - @PrepareForTest({ CryptoUtils.class }) - public final void testEncryptionBaseOnRandomKey() throws Exception { - SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); - final String encryptionKey = String.valueOf(Hex.encodeHex(secretKey.getEncoded())); - setAesEncryptionKeyEnv(encryptionKey); - - String encodedString = CryptoUtils.encrypt(data); - String decodedString = CryptoUtils.decrypt(encodedString); - assertEquals(data, decodedString); - } - - @Test(expected = InvalidKeyException.class) - @PrepareForTest({ CryptoUtils.class }) - public final void testEncryptionBadKey() throws Exception { - final String badEncryptionKey = "93210sd"; - setAesEncryptionKeyEnv(badEncryptionKey); - - CryptoUtils.encrypt(data); - } - - private static void setAesEncryptionKeyEnv(String value) { - PowerMockito.mockStatic(System.class); - PowerMockito.when(System.getenv(eq("AES_ENCRYPTION_KEY"))).thenReturn(value); - } -} diff --git a/src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java b/src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java deleted file mode 100644 index a986c159d..000000000 --- a/src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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============================================ - * Modifications copyright (c) 2019 Nokia - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import org.junit.Test; - -public class JsonUtilsTest { - - public static class TestClass extends TestObject { - - String test2; - TestObject2 object2; - - TestClass(String value1, String value2) { - super(value1); - test2 = value2; - } - - void setObject2(TestObject2 object2) { - this.object2 = object2; - } - } - - @Test - public void testGetObjectMapperInstance() { - assertNotNull(JsonUtils.GSON); - } - - /** - * This method test that the security hole in GSON is not enabled in the default - * ObjectMapper. - */ - @Test - public void testCreateBeanDeserializer() { - TestClass test = new TestClass("value1", "value2"); - test.setObject2(new TestObject2("test3")); - Object testObject = JsonUtils.GSON.fromJson("[\"org.onap.clamp.clds.util.JsonUtilsTest$TestClass\"" - + ",{\"test\":\"value1\",\"test2\":\"value2\",\"object2\":[\"org.onap.clamp.clds.util.TestObject2\"," - + "{\"test3\":\"test3\"}]}]", Object.class); - assertNotNull(testObject); - assertFalse(testObject instanceof TestObject); - } - - @Test(expected = IllegalArgumentException.class) - public void shouldThrowExceptionFileNotExists() throws IOException { - ResourceFileUtils.getResourceAsString("example/notExist.json"); - } -} diff --git a/src/test/java/org/onap/clamp/clds/util/LoggingUtilsTest.java b/src/test/java/org/onap/clamp/clds/util/LoggingUtilsTest.java deleted file mode 100644 index 7e823e163..000000000 --- a/src/test/java/org/onap/clamp/clds/util/LoggingUtilsTest.java +++ /dev/null @@ -1,138 +0,0 @@ -/*- -* ============LICENSE_START======================================================= -* ONAP CLAMP -* Copyright (C) 2019 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.clamp.clds.util; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.Map; -import javax.net.ssl.HttpsURLConnection; -import javax.servlet.http.HttpServletRequest; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.mockito.runners.MockitoJUnitRunner; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; -import org.slf4j.event.Level; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; - -/** - * Test Logging Utils. - */ -@RunWith(MockitoJUnitRunner.class) -public class LoggingUtilsTest { - - protected static final Logger logger = LoggerFactory.getLogger(LoggingUtilsTest.class); - - private static final String SERVICE_NAME = "LogginUtilsTest: Test Entering method"; - - private LoggingUtils util; - - @Before - public void setup() { - this.util = new LoggingUtils(logger); - } - - @Test - public void testEnteringLoggingUtils() { - // given - final String userName = "test"; - - UserDetails userDetails = Mockito.mock(UserDetails.class); - Mockito.when(userDetails.getUsername()).thenReturn(userName); - - Authentication localAuth = Mockito.mock(Authentication.class); - Mockito.when(localAuth.getPrincipal()).thenReturn(userDetails); - - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - Mockito.when(securityContext.getAuthentication()).thenReturn(localAuth); - SecurityContextHolder.setContext(securityContext); - - HttpServletRequest request = Mockito.mock(HttpServletRequest.class); - // when - util.entering(request, SERVICE_NAME); - - // then - String[] keys = {OnapLogConstants.Mdcs.PARTNER_NAME, OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, - OnapLogConstants.Mdcs.REQUEST_ID, OnapLogConstants.Mdcs.INVOCATION_ID, - OnapLogConstants.Mdcs.CLIENT_IP_ADDRESS, OnapLogConstants.Mdcs.SERVER_FQDN, - OnapLogConstants.Mdcs.INSTANCE_UUID, OnapLogConstants.Mdcs.SERVICE_NAME}; - Map mdc = MDC.getMDCAdapter().getCopyOfContextMap(); - - assertTrue(checkMapKeys(mdc, keys)); - assertEquals(userName, mdc.get(OnapLogConstants.Mdcs.PARTNER_NAME)); - } - - @Test - public void testExistingLoggingUtils() { - // given - MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, - ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT)); - - // when - util.exiting(HttpStatus.OK.value(), SERVICE_NAME, Level.INFO, - OnapLogConstants.ResponseStatus.COMPLETE); - - // then - Map mdc = MDC.getMDCAdapter().getCopyOfContextMap(); - assertNull(mdc); - } - - @Test - public void testInvokeTestUtils() { - // given - final String targetEntity = "LoggingUtilsTest"; - final String targetServiceName = "testInvokeTestUtils"; - HttpsURLConnection secureConnection = Mockito.mock(HttpsURLConnection.class); - - // when - secureConnection = util.invokeHttps(secureConnection, targetEntity, targetServiceName); - - // then - assertNotNull(secureConnection); - String[] keys = - {OnapLogConstants.Mdcs.TARGET_ENTITY, OnapLogConstants.Mdcs.TARGET_SERVICE_NAME, - OnapLogConstants.Mdcs.INVOCATIONID_OUT, OnapLogConstants.Mdcs.INVOKE_TIMESTAMP}; - Map mdc = MDC.getMDCAdapter().getCopyOfContextMap(); - - assertTrue(checkMapKeys(mdc, keys)); - assertEquals(targetEntity, mdc.get(OnapLogConstants.Mdcs.TARGET_ENTITY)); - assertEquals(targetServiceName, mdc.get(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME)); - } - - private boolean checkMapKeys(Map map, String[] keys) { - return Arrays.stream(keys).allMatch(key -> map.get(key) != null); - } -} diff --git a/src/test/java/org/onap/clamp/clds/util/TestObject.java b/src/test/java/org/onap/clamp/clds/util/TestObject.java deleted file mode 100644 index 418c80815..000000000 --- a/src/test/java/org/onap/clamp/clds/util/TestObject.java +++ /dev/null @@ -1,45 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -public class TestObject { - - private String test; - - public String getTest() { - return test; - } - - public void setTest(String test) { - this.test = test; - } - - // @JsonProperty("test"), @JsonCreator - public TestObject(String theString) { - this.setTest(theString); - } - - public TestObject() { - } -} diff --git a/src/test/java/org/onap/clamp/clds/util/TestObject2.java b/src/test/java/org/onap/clamp/clds/util/TestObject2.java deleted file mode 100644 index 4fd77c230..000000000 --- a/src/test/java/org/onap/clamp/clds/util/TestObject2.java +++ /dev/null @@ -1,44 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 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============================================ - * =================================================================== - * - */ - -package org.onap.clamp.clds.util; - -public class TestObject2 { - - private String test3; - - public String getTest3() { - return test3; - } - - public void setTest3(String test) { - this.test3 = test; - } - - public TestObject2(String theString) { - this.setTest3(theString); - } - - public TestObject2() { - } -} diff --git a/src/test/java/org/onap/clamp/flow/FlowLogOperationTest.java b/src/test/java/org/onap/clamp/flow/FlowLogOperationTest.java deleted file mode 100644 index 648c03307..000000000 --- a/src/test/java/org/onap/clamp/flow/FlowLogOperationTest.java +++ /dev/null @@ -1,100 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 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.clamp.flow; - -import static junit.framework.Assert.assertEquals; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; -import org.apache.camel.impl.DefaultExchange; -import org.junit.Test; -import org.mockito.Mockito; -import org.onap.clamp.clds.util.LoggingUtils; -import org.onap.clamp.clds.util.OnapLogConstants; -import org.onap.clamp.flow.log.FlowLogOperation; -import org.slf4j.MDC; -import org.slf4j.spi.MDCAdapter; -import org.springframework.test.util.ReflectionTestUtils; - -public class FlowLogOperationTest { - - private FlowLogOperation flowLogOperation = new FlowLogOperation(); - - @Test - public void testStratLog() { - // given - LoggingUtils loggingUtils = mock(LoggingUtils.class); - ReflectionTestUtils.setField(flowLogOperation, "util", loggingUtils); - - // when - Mockito.when(loggingUtils.getProperties(OnapLogConstants.Mdcs.REQUEST_ID)).thenReturn("MockRequestId"); - Mockito.when(loggingUtils.getProperties(OnapLogConstants.Mdcs.INVOCATION_ID)).thenReturn("MockInvocationId"); - Mockito.when(loggingUtils.getProperties(OnapLogConstants.Mdcs.PARTNER_NAME)).thenReturn("MockPartnerName"); - Exchange exchange = new DefaultExchange(mock(CamelContext.class)); - flowLogOperation.startLog(exchange, "serviceName"); - - // then - assertThat(exchange.getProperty(OnapLogConstants.Headers.REQUEST_ID)).isEqualTo("MockRequestId"); - assertThat(exchange.getProperty(OnapLogConstants.Headers.INVOCATION_ID)).isEqualTo("MockInvocationId"); - assertThat(exchange.getProperty(OnapLogConstants.Headers.PARTNER_NAME)).isEqualTo("MockPartnerName"); - } - - @Test - public void testInvokeLog() { - // given - final String mockEntity = "mockEntity"; - final String mockServiceName = "mockSerivceName"; - MDCAdapter mdcAdapter = MDC.getMDCAdapter(); - // when - flowLogOperation.invokeLog(mockEntity, mockServiceName); - // then - String entity = mdcAdapter.get(OnapLogConstants.Mdcs.TARGET_ENTITY); - String serviceName = mdcAdapter.get(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME); - assertEquals(entity, mockEntity); - assertEquals(serviceName, mockServiceName); - } - - @Test - public void testEndLog() { - // given - MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, "2019-05-19T00:00:00.007Z"); - MDCAdapter mdcAdapter = MDC.getMDCAdapter(); - /// when - flowLogOperation.endLog(); - // then - assertThat(mdcAdapter.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP)).isNull(); - } - - @Test - public void testErrorLog() { - // given - MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, "2019-05-19T00:00:00.007Z"); - MDCAdapter mdcAdapter = MDC.getMDCAdapter(); - // when - flowLogOperation.errorLog(); - // then - assertThat(mdcAdapter.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP)).isNull(); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java deleted file mode 100644 index a9f8f4f5f..000000000 --- a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java +++ /dev/null @@ -1,311 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications copyright (c) 2019 Nokia - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import javax.transaction.Transactional; -import org.apache.commons.lang3.RandomStringUtils; -import org.json.JSONException; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.exception.sdc.controller.BlueprintParserException; -import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException; -import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; -import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact; -import org.onap.clamp.clds.sdc.controller.installer.CsarHandler; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.cds.CdsDataInstaller; -import org.onap.clamp.loop.service.ServicesRepository; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.LoopTemplateLoopElementModel; -import org.onap.clamp.loop.template.LoopTemplatesRepository; -import org.onap.clamp.loop.template.PolicyModelId; -import org.onap.clamp.loop.template.PolicyModelsRepository; -import org.onap.sdc.api.notification.IArtifactInfo; -import org.onap.sdc.api.notification.INotificationData; -import org.onap.sdc.api.notification.IResourceInstance; -import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; -import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; -import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; -import org.onap.sdc.toscaparser.api.elements.Metadata; -import org.skyscreamer.jsonassert.JSONAssert; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.Commit; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -@ActiveProfiles({"clamp-default", "clamp-default-user", "clamp-sdc-controller"}) -public class CsarInstallerItCase { - - private static final String CSAR_ARTIFACT_NAME_CDS = "example/sdc/service_Vloadbalancerms_cds.csar"; - private static final String CSAR_ARTIFACT_NAME_NO_CDS = "example/sdc/service_Vloadbalancerms_no_cds.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 INVARIANT_RESOURCE2_UUID = "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad"; - private static final String RESOURCE_INSTANCE_NAME_RESOURCE1 = "ResourceInstanceName1"; - private static final String RESOURCE_INSTANCE_NAME_RESOURCE2 = "ResourceInstanceName2"; - - @Autowired - private LoopTemplatesRepository loopTemplatesRepo; - - @Autowired - ServicesRepository serviceRepository; - - @Autowired - PolicyModelsRepository policyModelsRepository; - - @Autowired - @Qualifier("csarInstaller") - private CsarInstaller csarInstaller; - - private BlueprintArtifact buildFakeBuildprintArtifact(String instanceName, String invariantResourceUuid, - String blueprintFilePath, String artifactName, - 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(ResourceFileUtils.getResourceAsString(blueprintFilePath)); - Mockito.when(blueprintArtifact.getBlueprintArtifactName()).thenReturn(artifactName); - Mockito.when(blueprintArtifact.getBlueprintInvariantServiceUuid()).thenReturn(invariantServiceUuid); - Mockito.when(blueprintArtifact.getResourceAttached()).thenReturn(resource); - return blueprintArtifact; - } - - private CsarHandler buildBadFakeCsarHandler(String generatedName, String csarFileName) throws IOException, - SdcToscaParserException { - - // Build a Bad csar because the blueprint contains a link to a microservice that does not exist in the emulator - // 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 listResources = new ArrayList<>(); - Mockito.when(notificationData.getResources()).thenReturn(listResources); - Map blueprintMap = new HashMap<>(); - Mockito.when(csarHandler.getMapOfBlueprints()).thenReturn(blueprintMap); - // Create fake blueprint artifact 1 on resource1 - BlueprintArtifact blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1, - INVARIANT_RESOURCE1_UUID, "example/sdc/blueprint-dcae/tca-guilin.yaml", "tca-guilin.yaml", - INVARIANT_SERVICE_UUID); - listResources.add(blueprintArtifact.getResourceAttached()); - blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); - - // Build fake csarhandler - Mockito.when(csarHandler.getSdcNotification()).thenReturn(notificationData); - // Build fake csar Helper - ISdcCsarHelper csarHelper = Mockito.mock(ISdcCsarHelper.class); - Metadata data = Mockito.mock(Metadata.class); - Mockito.when(data.getValue("name")).thenReturn(generatedName); - Mockito.when(notificationData.getServiceName()).thenReturn(generatedName); - Mockito.when(csarHelper.getServiceMetadata()).thenReturn(data); - - // Create helper based on real csar to test policy yaml and global properties - // set - SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); - String path = Thread.currentThread().getContextClassLoader().getResource(csarFileName).getFile(); - ISdcCsarHelper sdcHelper = factory.getSdcCsarHelper(path); - Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcHelper); - - // Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper); - Mockito.when(csarHandler.getPolicyModelYaml()) - .thenReturn(Optional.ofNullable(ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"))); - return csarHandler; - } - - private CsarHandler buildFakeCsarHandler(String generatedName, String csarFileName) throws IOException, - SdcToscaParserException { - // 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 listResources = new ArrayList<>(); - Mockito.when(notificationData.getResources()).thenReturn(listResources); - Map blueprintMap = new HashMap<>(); - Mockito.when(csarHandler.getMapOfBlueprints()).thenReturn(blueprintMap); - // Create fake blueprint artifact 1 on resource1 - BlueprintArtifact blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1, - INVARIANT_RESOURCE1_UUID, "example/sdc/blueprint-dcae/tca.yaml", "tca.yaml", INVARIANT_SERVICE_UUID); - listResources.add(blueprintArtifact.getResourceAttached()); - blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); - // Create fake blueprint artifact 2 on resource2 - blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE2, INVARIANT_RESOURCE2_UUID, - "example/sdc/blueprint-dcae/tca_2.yaml", "tca_2.yaml", INVARIANT_SERVICE_UUID); - listResources.add(blueprintArtifact.getResourceAttached()); - blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); - - // Create fake blueprint artifact 3 on resource 1 so that it's possible to - // test multiple CL deployment per Service/vnf - blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1, INVARIANT_RESOURCE1_UUID, - "example/sdc/blueprint-dcae/tca_3.yaml", "tca_3.yaml", INVARIANT_SERVICE_UUID); - blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); - - // Build fake csarhandler - Mockito.when(csarHandler.getSdcNotification()).thenReturn(notificationData); - // Build fake csar Helper - ISdcCsarHelper csarHelper = Mockito.mock(ISdcCsarHelper.class); - Metadata data = Mockito.mock(Metadata.class); - Mockito.when(data.getValue("name")).thenReturn(generatedName); - Mockito.when(notificationData.getServiceName()).thenReturn(generatedName); - Mockito.when(csarHelper.getServiceMetadata()).thenReturn(data); - - // Create helper based on real csar to test policy yaml and global properties - // set - SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); - String path = Thread.currentThread().getContextClassLoader().getResource(csarFileName).getFile(); - ISdcCsarHelper sdcHelper = factory.getSdcCsarHelper(path); - Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcHelper); - - // Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper); - Mockito.when(csarHandler.getPolicyModelYaml()) - .thenReturn(Optional.ofNullable(ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"))); - return csarHandler; - } - - @Test - @Transactional - public void testGetPolicyModelYaml() throws IOException, SdcToscaParserException, CsarHandlerException { - INotificationData notificationData = Mockito.mock(INotificationData.class); - IArtifactInfo serviceArtifacts = Mockito.mock(IArtifactInfo.class); - Mockito.when(serviceArtifacts.getArtifactType()).thenReturn("TOSCA_CSAR"); - List serviceArtifactsList = new ArrayList<>(); - serviceArtifactsList.add(serviceArtifacts); - Mockito.when(notificationData.getServiceArtifacts()).thenReturn(serviceArtifactsList); - - CsarHandler csarHandler = new CsarHandler(notificationData, "", ""); - csarHandler.setFilePath(Thread.currentThread().getContextClassLoader().getResource(CSAR_ARTIFACT_NAME_CDS) - .getFile()); - Assert.assertEquals(csarHandler.getPolicyModelYaml(), Optional - .ofNullable(ResourceFileUtils.getResourceAsString("example/sdc/expected-result/policy-data.yaml"))); - } - - @Test - @Transactional - public void testIsCsarAlreadyDeployedTca() throws SdcArtifactInstallerException, SdcToscaParserException, - CsarHandlerException, IOException, InterruptedException, BlueprintParserException { - String generatedName = RandomStringUtils.randomAlphanumeric(5); - CsarHandler csarHandler = buildFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_CDS); - assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isFalse(); - csarInstaller.installTheCsar(csarHandler); - assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isTrue(); - } - - @Test - @Transactional - public void testWithoutCdsTca() throws SdcArtifactInstallerException, SdcToscaParserException, - CsarHandlerException, IOException, InterruptedException, BlueprintParserException { - String generatedName = RandomStringUtils.randomAlphanumeric(5); - CsarHandler csarHandler = buildFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_NO_CDS); - - assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isFalse(); - csarInstaller.installTheCsar(csarHandler); - assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isTrue(); - } - - @Test(expected = SdcArtifactInstallerException.class) - @Transactional - public void testInstallTheBadCsarTca() - throws IOException, SdcToscaParserException, InterruptedException, BlueprintParserException, - SdcArtifactInstallerException { - // This test validates that the blueprint is well rejected because the blueprint contains a link - // to a policy that does not exist on the policy engine emulator. - String generatedName = RandomStringUtils.randomAlphanumeric(5); - csarInstaller.installTheCsar(buildBadFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_NO_CDS)); - } - - @Test - @Transactional - @Commit - public void testInstallTheCsarTca() throws SdcArtifactInstallerException, SdcToscaParserException, - CsarHandlerException, IOException, JSONException, InterruptedException, BlueprintParserException { - String generatedName = RandomStringUtils.randomAlphanumeric(5); - csarInstaller.installTheCsar(buildFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_CDS)); - - assertThat(serviceRepository.existsById("63cac700-ab9a-4115-a74f-7eac85e3fce0")).isTrue(); - // We should have CDS info - assertThat(serviceRepository.findById("63cac700-ab9a-4115-a74f-7eac85e3fce0").get().getResourceByType("VF") - .getAsJsonObject("vLoadBalancerMS 0").getAsJsonObject( - CdsDataInstaller.CONTROLLER_PROPERTIES)).isNotNull(); - assertThat(loopTemplatesRepo.existsById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", - RESOURCE_INSTANCE_NAME_RESOURCE1, "tca.yaml"))).isTrue(); - assertThat(loopTemplatesRepo.existsById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", - RESOURCE_INSTANCE_NAME_RESOURCE1, "tca_3.yaml"))).isTrue(); - assertThat(loopTemplatesRepo.existsById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", - RESOURCE_INSTANCE_NAME_RESOURCE2, "tca_2.yaml"))).isTrue(); - // Verify now that policy and json representation, global properties are well - // set - LoopTemplate loopTemplate = loopTemplatesRepo.findById(LoopTemplate.generateLoopTemplateName(generatedName, - "1.0", RESOURCE_INSTANCE_NAME_RESOURCE1, "tca.yaml")).get(); - assertThat(loopTemplate.getLoopElementModelsUsed()).hasSize(1); - assertThat(loopTemplate.getModelService().getServiceUuid()).isEqualTo("63cac700-ab9a-4115-a74f-7eac85e3fce0"); - JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/model-properties.json"), - JsonUtils.GSON_JPA_MODEL.toJson(loopTemplate.getModelService()), true); - JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/service-details.json"), - JsonUtils.GSON_JPA_MODEL.toJson(loopTemplate.getModelService().getServiceDetails()), true); - JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/resource-details.json"), - JsonUtils.GSON_JPA_MODEL.toJson(loopTemplate.getModelService().getResourceDetails()), true); - assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) - .getLoopElementModel().getName()).isNotEmpty(); - - loopTemplate = loopTemplatesRepo.findById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", - RESOURCE_INSTANCE_NAME_RESOURCE1, "tca_3.yaml")).get(); - assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) - .getLoopElementModel().getName()).isNotEmpty(); - assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) - .getLoopElementModel().getName()).isNotEmpty(); - assertThat(loopTemplate.getMaximumInstancesAllowed()).isEqualByComparingTo(Integer.valueOf(0)); - loopTemplate = loopTemplatesRepo.findById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", - RESOURCE_INSTANCE_NAME_RESOURCE2, "tca_2.yaml")).get(); - assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) - .getLoopElementModel().getName()).isNotEmpty(); - - assertThat(policyModelsRepository.findAll().size()).isGreaterThanOrEqualTo(1); - assertThat(policyModelsRepository - .existsById(new PolicyModelId("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0"))).isTrue(); - assertThat(policyModelsRepository - .getOne((new PolicyModelId("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0"))) - .getPolicyModelTosca()).isNotBlank(); - } -} diff --git a/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java b/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java deleted file mode 100644 index 022d10eb2..000000000 --- a/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java +++ /dev/null @@ -1,214 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.List; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.json.simple.parser.ParseException; -import org.junit.Test; -import org.mockito.Mockito; -import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse; -import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse; -import org.onap.clamp.loop.components.external.DcaeComponent; -import org.onap.clamp.loop.components.external.ExternalComponentState; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.policy.microservice.MicroServicePolicy; - -public class DcaeComponentTest { - - private Loop createTestLoop() { - Loop loopTest = new Loop("ControlLoopTest"); - loopTest.setGlobalPropertiesJson( - new Gson().fromJson( - "{\"dcaeDeployParameters\":{\"uniqueBlueprintParameters\": {\"policy_id\": \"name\"}}}", - JsonObject.class)); - loopTest.setLastComputedState(LoopState.DESIGN); - loopTest.setDcaeDeploymentId("123456789"); - loopTest.setDcaeDeploymentStatusUrl("http4://localhost:8085"); - - MicroServicePolicy microServicePolicy = new MicroServicePolicy("configPolicyTest", new PolicyModel("policy1", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0"), true, - new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), null, null, null); - microServicePolicy.setConfigurationsJson(new Gson().fromJson("{\"param1\":\"value1\"}", JsonObject.class)); - - loopTest.addMicroServicePolicy(microServicePolicy); - LoopTemplate loopTemplate = new LoopTemplate("test", "yaml", 1, null); - loopTemplate.setDcaeBlueprintId("UUID-blueprint"); - loopTest.setLoopTemplate(loopTemplate); - - return loopTest; - } - - /** - * Test the DcaeReponse roughly. - * - * @throws IOException In case of issues - */ - @Test - public void convertDcaeResponseTest() throws IOException { - String dcaeFakeResponse = "{'requestId':'testId','operationType':'install','status':'state'," - + "'error':'errorMessage', 'links':{'self':'selfUrl','uninstall':'uninstallUrl'}}"; - DcaeOperationStatusResponse responseObject = DcaeComponent.convertDcaeResponse(dcaeFakeResponse); - assertThat(responseObject.getRequestId()).isEqualTo("testId"); - assertThat(responseObject.getOperationType()).isEqualTo("install"); - assertThat(responseObject.getStatus()).isEqualTo("state"); - assertThat(responseObject.getError()).isEqualTo("errorMessage"); - assertThat(responseObject.getLinks()).isNotNull(); - assertThat(responseObject.getLinks().getSelf()).isEqualTo("selfUrl"); - assertThat(responseObject.getLinks().getUninstall()).isEqualTo("uninstallUrl"); - - assertThat(responseObject.getLinks().getStatus()).isNull(); - } - - @Test - public void testGetDeployPayload() throws IOException { - Loop loop = this.createTestLoop(); - String deploymentPayload = DcaeComponent.getDeployPayload(loop); - String expectedPayload = "{\"serviceTypeId\":\"UUID-blueprint\",\"inputs\":{\"policy_id\":\"name\"}}"; - assertThat(deploymentPayload).isEqualTo(expectedPayload); - } - - @Test - public void testGetUndeployPayload() throws IOException { - Loop loop = this.createTestLoop(); - String unDeploymentPayload = DcaeComponent.getUndeployPayload(loop); - String expectedPayload = "{\"serviceTypeId\":\"UUID-blueprint\"}"; - assertThat(unDeploymentPayload).isEqualTo(expectedPayload); - } - - /** - * Test the computeState method of the DcaeComponent roughly. - * - * @throws IOException In case of issues - */ - @Test - public void computeStateTest() throws IOException { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - Exchange exchange2 = Mockito.mock(Exchange.class); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getExchange()).thenReturn(exchange2); - Mockito.when(exchange2.getProperty("dcaeResponse")).thenReturn(null); - - DcaeComponent dcae = new DcaeComponent(); - - // initial state - ExternalComponentState state = dcae.computeState(exchange); - assertThat(state.getStateName()).isEqualTo("BLUEPRINT_DEPLOYED"); - - // OperationalType = install - DcaeOperationStatusResponse dcaeResponse = Mockito.mock(DcaeOperationStatusResponse.class); - Mockito.when(dcaeResponse.getOperationType()).thenReturn("install"); - - Mockito.when(dcaeResponse.getStatus()).thenReturn("succeeded"); - Mockito.when(exchange2.getProperty("dcaeResponse")).thenReturn(dcaeResponse); - ExternalComponentState state2 = dcae.computeState(exchange); - assertThat(state2.getStateName()).isEqualTo("MICROSERVICE_INSTALLED_SUCCESSFULLY"); - Mockito.when(dcaeResponse.getStatus()).thenReturn("processing"); - ExternalComponentState state3 = dcae.computeState(exchange); - assertThat(state3.getStateName()).isEqualTo("PROCESSING_MICROSERVICE_INSTALLATION"); - - Mockito.when(dcaeResponse.getStatus()).thenReturn("failed"); - ExternalComponentState state4 = dcae.computeState(exchange); - assertThat(state4.getStateName()).isEqualTo("MICROSERVICE_INSTALLATION_FAILED"); - - // OperationalType = uninstall - Mockito.when(dcaeResponse.getOperationType()).thenReturn("uninstall"); - - Mockito.when(dcaeResponse.getStatus()).thenReturn("succeeded"); - Mockito.when(exchange2.getProperty("dcaeResponse")).thenReturn(dcaeResponse); - ExternalComponentState state5 = dcae.computeState(exchange); - assertThat(state5.getStateName()).isEqualTo("MICROSERVICE_UNINSTALLED_SUCCESSFULLY"); - - Mockito.when(dcaeResponse.getStatus()).thenReturn("processing"); - ExternalComponentState state6 = dcae.computeState(exchange); - assertThat(state6.getStateName()).isEqualTo("PROCESSING_MICROSERVICE_UNINSTALLATION"); - - Mockito.when(dcaeResponse.getStatus()).thenReturn("failed"); - ExternalComponentState state7 = dcae.computeState(exchange); - assertThat(state7.getStateName()).isEqualTo("MICROSERVICE_UNINSTALLATION_FAILED"); - - // error cases - Mockito.when(dcaeResponse.getOperationType()).thenReturn("whatever"); - ExternalComponentState state8 = dcae.computeState(exchange); - assertThat(state8.getStateName()).isEqualTo("IN_ERROR"); - - Mockito.when(dcaeResponse.getOperationType()).thenReturn("install"); - Mockito.when(dcaeResponse.getStatus()).thenReturn("anythingelse"); - ExternalComponentState state9 = dcae.computeState(exchange); - assertThat(state9.getStateName()).isEqualTo("IN_ERROR"); - } - - /** - * Test the Converter to DcaeInventoryResponse method. - * - * @throws IOException In case of failure - * @throws ParseException In case of failure - */ - @Test - public void convertToDcaeInventoryResponseTest() throws IOException, ParseException { - String dcaeFakeResponse = "{\n" + " \"links\": {\n" + " \"previousLink\": {\n" - + " \"title\": \"string\",\n" + " \"rel\": \"string\",\n" + " \"uri\": \"string\",\n" - + " \"uriBuilder\": {},\n" + " \"rels\": [\n" + " \"string\"\n" + " ],\n" - + " \"params\": {\n" + " \"additionalProp1\": \"string\",\n" - + " \"additionalProp2\": \"string\",\n" + " \"additionalProp3\": \"string\"\n" - + " },\n" + " \"type\": \"string\"\n" + " },\n" + " \"nextLink\": {\n" - + " \"title\": \"string\",\n" + " \"rel\": \"string\",\n" + " \"uri\": \"string\",\n" - + " \"uriBuilder\": {},\n" + " \"rels\": [\n" + " \"string\"\n" + " ],\n" - + " \"params\": {\n" + " \"additionalProp1\": \"string\",\n" - + " \"additionalProp2\": \"string\",\n" + " \"additionalProp3\": \"string\"\n" - + " },\n" + " \"type\": \"string\"\n" + " }\n" + " },\n" + " \"totalCount\": 0,\n" - + " \"items\": [\n" + " {\n" + " \"owner\": \"testOwner\",\n" - + " \"application\": \"testApplication\",\n" + " \"component\": \"testComponent\",\n" - + " \"typeName\": \"testTypeName\",\n" + " \"typeVersion\": 0,\n" - + " \"blueprintTemplate\": \"testBlueprintTemplate\",\n" + " \"serviceIds\": [\n" - + " \"serviceId1\", \"serviceId2\"\n" + " ],\n" + " \"vnfTypes\": [\n" - + " \"vnfType1\", \"vnfType2\"\n" + " ],\n" + " \"serviceLocations\": [\n" - + " \"serviceLocation1\", \"serviceLocation2\"\n" + " ],\n" - + " \"asdcServiceId\": \"testAsdcServiceId\",\n" - + " \"asdcResourceId\": \"testAsdcResourceId\",\n" - + " \"asdcServiceURL\": \"testAsdcServiceURL\",\n" + " \"typeId\": \"testTypeId\",\n" - + " \"selfLink\": {\n" + " \"title\": \"selfLinkTitle\",\n" - + " \"rel\": \"selfLinkRel\",\n" + " \"uri\": \"selfLinkUri\",\n" - + " \"uriBuilder\": {},\n" + " \"rels\": [\n" + " \"string\"\n" + " ],\n" - + " \"params\": {\n" + " \"additionalProp1\": \"string\",\n" - + " \"additionalProp2\": \"string\",\n" + " \"additionalProp3\": \"string\"\n" - + " },\n" + " \"type\": \"string\"\n" + " },\n" - + " \"created\": \"2020-01-22T09:38:15.436Z\",\n" - + " \"deactivated\": \"2020-01-22T09:38:15.437Z\"\n" + " }\n" + " ]\n" + "}"; - List responseObject = DcaeComponent.convertToDcaeInventoryResponse(dcaeFakeResponse); - assertThat(responseObject.get(0).getAsdcResourceId()).isEqualTo("testAsdcResourceId"); - assertThat(responseObject.get(0).getAsdcServiceId()).isEqualTo("testAsdcServiceId"); - assertThat(responseObject.get(0).getTypeName()).isEqualTo("testTypeName"); - assertThat(responseObject.get(0).getTypeId()).isEqualTo("testTypeId"); - assertThat(responseObject.get(0).getBlueprintTemplate()).isEqualTo("testBlueprintTemplate"); - } -} diff --git a/src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java b/src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java deleted file mode 100644 index 169db9db1..000000000 --- a/src/test/java/org/onap/clamp/loop/DeployFlowTestItCase.java +++ /dev/null @@ -1,321 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; -import java.io.IOException; -import java.util.Set; -import javax.transaction.Transactional; -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; -import org.apache.camel.builder.ExchangeBuilder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelsService; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class DeployFlowTestItCase { - private Gson gson = new Gson(); - - @Autowired - CamelContext camelContext; - - @Autowired - PolicyModelsService policyModelsService; - - @Autowired - LoopService loopService; - - @Autowired - LoopsRepository loopsRepository; - - /** - * This method tests a deployment a single blueprint. - * - * @throws JsonSyntaxException In case of issues - * @throws IOException In case of issues - */ - @Test - @Transactional - public void deployWithSingleBlueprintTest() throws JsonSyntaxException, IOException { - Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", - "{\"dcaeDeployParameters\":{\"uniqueBlueprintParameters\": {\"policy_id\": \"name\"}}}", - "UUID-blueprint"); - LoopTemplate template = new LoopTemplate(); - template.setName("templateName"); - template.setBlueprint("yamlcontent"); - loopTest.setLoopTemplate(template); - MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", - "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", - "{\"param1\":\"value1\"}", true); - loopTest.addMicroServicePolicy(microServicePolicy); - loopService.saveOrUpdateLoop(loopTest); - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) - .build(); - - camelContext.createProducerTemplate().send("direct:deploy-loop", myCamelExchange); - - Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); - assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNotNull(); - assertThat(loopAfterTest.getDcaeDeploymentId()).isNotNull(); - } - - /** - * This method tests the deployment of multiple separated blueprints. - * - * @throws JsonSyntaxException In case of issues - * @throws IOException In case of issues - */ - @Test - @Transactional - public void deployWithMultipleBlueprintTest() throws JsonSyntaxException, IOException { - Loop loopTest2 = createLoop("ControlLoopTest2", "yamlcontent", "{\"dcaeDeployParameters\": {" - + "\"microService1\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName1_tca\"}," - + "\"microService2\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName2_tca\"}" - + "}}", "UUID-blueprint"); - LoopTemplate template = new LoopTemplate(); - template.setName("templateName"); - loopTest2.setLoopTemplate(template); - MicroServicePolicy microServicePolicy1 = getMicroServicePolicy("microService1", "", "{\"configtype\":\"json\"}", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true); - MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("microService2", "", "{\"configtype\":\"json\"}", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true); - loopTest2.addMicroServicePolicy(microServicePolicy1); - loopTest2.addMicroServicePolicy(microServicePolicy2); - loopsRepository.saveAndFlush(loopTest2); - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest2) - .build(); - - camelContext.createProducerTemplate().send("direct:deploy-loop", myCamelExchange); - - Loop loopAfterTest = loopService.getLoop("ControlLoopTest2"); - Set policyList = loopAfterTest.getMicroServicePolicies(); - for (MicroServicePolicy policy : policyList) { - assertThat(policy.getDcaeDeploymentStatusUrl()).isNotNull(); - assertThat(policy.getDcaeDeploymentId()).isNotNull(); - } - assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNull(); - assertThat(loopAfterTest.getDcaeDeploymentId()).isNull(); - } - - /** - * This method tests the undeployment of a single blueprint. - * - * @throws JsonSyntaxException In case of issues - * @throws IOException In case of issues - */ - @Test - @Transactional - public void undeployWithSingleBlueprintTest() throws JsonSyntaxException, IOException { - Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", - "UUID-blueprint"); - LoopTemplate template = new LoopTemplate(); - template.setName("templateName"); - template.setBlueprint("yamlcontent"); - loopTest.setLoopTemplate(template); - loopTest.setDcaeDeploymentId("testDeploymentId"); - loopTest.setDcaeDeploymentStatusUrl("testUrl"); - MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", - "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", - "{\"param1\":\"value1\"}", true); - loopTest.addMicroServicePolicy(microServicePolicy); - loopService.saveOrUpdateLoop(loopTest); - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) - .build(); - - camelContext.createProducerTemplate().send("direct:undeploy-loop", myCamelExchange); - - Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); - assertThat(loopAfterTest.getDcaeDeploymentStatusUrl().contains("/uninstall")).isTrue(); - assertThat(loopAfterTest.getDcaeDeploymentId()).isNull(); - } - - /** - * This method tests the undeployment of multiple separated blueprints. - * - * @throws JsonSyntaxException In case of issues - * @throws IOException In case of issues - */ - @Test - @Transactional - public void undeployWithMultipleBlueprintTest() throws JsonSyntaxException, IOException { - Loop loopTest2 = createLoop("ControlLoopTest2", "yamlcontent", "{\"dcaeDeployParameters\": {" - + "\"microService1\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName1_tca\"}," - + "\"microService2\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName2_tca\"}" - + "}}", "UUID-blueprint"); - LoopTemplate template = new LoopTemplate(); - template.setName("templateName"); - loopTest2.setLoopTemplate(template); - MicroServicePolicy microServicePolicy1 = getMicroServicePolicy("microService1", "", "{\"configtype\":\"json\"}", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true, - "testDeploymentId1", "testDeploymentStatusUrl1"); - MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("microService2", "", "{\"configtype\":\"json\"}", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true, - "testDeploymentId2", "testDeploymentStatusUrl2"); - loopTest2.addMicroServicePolicy(microServicePolicy1); - loopTest2.addMicroServicePolicy(microServicePolicy2); - loopsRepository.saveAndFlush(loopTest2); - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest2) - .build(); - - camelContext.createProducerTemplate().send("direct:undeploy-loop", myCamelExchange); - - Loop loopAfterTest = loopService.getLoop("ControlLoopTest2"); - Set policyList = loopAfterTest.getMicroServicePolicies(); - for (MicroServicePolicy policy : policyList) { - assertThat(policy.getDcaeDeploymentStatusUrl().contains("/uninstall")).isTrue(); - assertThat(policy.getDcaeDeploymentId()).isNull(); - - } - assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNull(); - assertThat(loopAfterTest.getDcaeDeploymentId()).isNull(); - } - - /** - * This method tests the DCAE get status for a single blueprint. - * - * @throws JsonSyntaxException In case of issues - * @throws IOException In case of issues - */ - @Test - @Transactional - public void getStatusWithSingleBlueprintTest() throws JsonSyntaxException, IOException { - Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", - "UUID-blueprint"); - LoopTemplate template = new LoopTemplate(); - template.setName("templateName"); - template.setBlueprint("yamlcontent"); - loopTest.setLoopTemplate(template); - MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", - "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", - "{\"param1\":\"value1\"}", true); - loopTest.addMicroServicePolicy(microServicePolicy); - loopService.saveOrUpdateLoop(loopTest); - assertThat(loopTest.getComponents().size()).isEqualTo(2); - assertThat(loopTest.getComponent("DCAE")).isNotNull(); - assertThat(loopTest.getComponent("POLICY")).isNotNull(); - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) - .build(); - - camelContext.createProducerTemplate().send("direct:update-dcae-status-for-loop", myCamelExchange); - - assertThat(loopTest.getComponent("DCAE").getState().getStateName()).isEqualTo("BLUEPRINT_DEPLOYED"); - - Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); - assertThat(loopAfterTest.getComponents().size()).isEqualTo(2); - assertThat(loopAfterTest.getComponent("DCAE")).isNotNull(); - assertThat(loopAfterTest.getComponent("POLICY")).isNotNull(); - } - - /** - * This method tests the dcae get status for multiple blueprints. - * - * @throws JsonSyntaxException In case of issues - * @throws IOException In case of issues - */ - @Test - @Transactional - public void getStatusWithMultipleBlueprintTest() throws JsonSyntaxException, IOException { - Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", - "UUID-blueprint"); - LoopTemplate template = new LoopTemplate(); - template.setName("templateName"); - loopTest.setLoopTemplate(template); - MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", - "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", - "{\"param1\":\"value1\"}", true); - MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("configPolicyTest2", "", - "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", - "{\"param1\":\"value1\"}", true); - loopTest.addMicroServicePolicy(microServicePolicy); - loopTest.addMicroServicePolicy(microServicePolicy2); - loopService.saveOrUpdateLoop(loopTest); - assertThat(loopTest.getComponents().size()).isEqualTo(3); - assertThat(loopTest.getComponent("DCAE")).isNull(); - assertThat(loopTest.getComponent("DCAE_configPolicyTest")).isNotNull(); - assertThat(loopTest.getComponent("DCAE_configPolicyTest2")).isNotNull(); - assertThat(loopTest.getComponent("POLICY")).isNotNull(); - Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) - .build(); - - camelContext.createProducerTemplate().send("direct:update-dcae-status-for-loop", myCamelExchange); - - assertThat(loopTest.getComponent("DCAE_configPolicyTest").getState().getStateName()) - .isEqualTo("BLUEPRINT_DEPLOYED"); - assertThat(loopTest.getComponent("DCAE_configPolicyTest2").getState().getStateName()) - .isEqualTo("BLUEPRINT_DEPLOYED"); - - Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); - assertThat(loopAfterTest.getComponents().size()).isEqualTo(3); - assertThat(loopAfterTest.getComponent("DCAE")).isNull(); - assertThat(loopAfterTest.getComponent("POLICY")).isNotNull(); - assertThat(loopTest.getComponent("DCAE_configPolicyTest")).isNotNull(); - assertThat(loopTest.getComponent("DCAE_configPolicyTest2")).isNotNull(); - } - - private Loop createLoop(String name, String blueprint, String globalPropertiesJson, - String dcaeBlueprintId) throws JsonSyntaxException, IOException { - Loop loop = new Loop(name); - loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, JsonObject.class)); - loop.setLastComputedState(LoopState.DESIGN); - return loop; - } - - private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, - String policyTosca, String jsonProperties, boolean shared) { - - PolicyModel policyModel = new PolicyModel(modelType, policyTosca, "1.0.0"); - policyModelsService.saveOrUpdatePolicyModel(policyModel); - MicroServicePolicy microService = new MicroServicePolicy(name, policyModel, - shared, - gson.fromJson(jsonRepresentation, JsonObject.class), null, null, null); - - microService.setConfigurationsJson(new Gson().fromJson(jsonProperties, JsonObject.class)); - return microService; - } - - private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, - String policyTosca, String jsonProperties, boolean shared, - String deploymengId, - String deploymentStatusUrl) { - MicroServicePolicy microService = getMicroServicePolicy(name, modelType, jsonRepresentation, policyTosca, - jsonProperties, shared); - - microService.setDcaeDeploymentId(deploymengId); - microService.setDcaeDeploymentStatusUrl(deploymentStatusUrl); - return microService; - } -} diff --git a/src/test/java/org/onap/clamp/loop/ExternalComponentStateTest.java b/src/test/java/org/onap/clamp/loop/ExternalComponentStateTest.java deleted file mode 100644 index 34fcc077f..000000000 --- a/src/test/java/org/onap/clamp/loop/ExternalComponentStateTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.onap.clamp.loop.components.external.ExternalComponentState; - -public class ExternalComponentStateTest { - private ExternalComponentState state = new ExternalComponentState("NOT_SENT", - "The policies defined have NOT yet been created on the policy engine", 90); - - @Test - public void generalTest() { - assertThat(state.toString()).isEqualTo("NOT_SENT"); - state.setLevel(70); - assertThat(state.getLevel()).isEqualTo(70); - } - - @Test - public void equalsTest() { - assertThat(state.equals(null)).isEqualTo(false); - - ExternalComponentState state2 = new ExternalComponentState("NOT_SENT", - "The policies defined have NOT yet been created on the policy engine", 90); - assertThat(state.equals(state2)).isEqualTo(true); - - assertThat(state.equals(12)).isEqualTo(false); - - state2.setLevel(70); - assertThat(state.equals(state2)).isEqualTo(true); - - ExternalComponentState state3 = new ExternalComponentState("SENT", - "The policies defined have NOT yet been created on the policy engine", 90); - assertThat(state.equals(state3)).isEqualTo(false); - - ExternalComponentState state4 = new ExternalComponentState(null, - "The policies defined have NOT yet been created on the policy engine", 90); - ExternalComponentState state5 = new ExternalComponentState(null, - "The policies defined have NOT yet been", 50); - assertThat(state4.equals(state3)).isEqualTo(false); - assertThat(state4.equals(state5)).isEqualTo(true); - } - - @Test - public void compareToTest() { - ExternalComponentState state2 = new ExternalComponentState("NOT_SENT", - "The policies defined have NOT yet been created on the policy engine", 90); - assertThat(state.compareTo(state2)).isEqualTo(0); - - ExternalComponentState state3 = new ExternalComponentState("SENT", - "The policies defined have NOT yet been created on the policy engine", 50); - assertThat(state.compareTo(state3)).isEqualTo(1); - - ExternalComponentState state4 = new ExternalComponentState(null, - "The policies defined have NOT yet been created on the policy engine", 100); - assertThat(state.compareTo(state4)).isEqualTo(-1); - - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/loop/LoopControllerTestItCase.java b/src/test/java/org/onap/clamp/loop/LoopControllerTestItCase.java deleted file mode 100644 index f170bc6df..000000000 --- a/src/test/java/org/onap/clamp/loop/LoopControllerTestItCase.java +++ /dev/null @@ -1,174 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * Modifications Copyright (C) 2019 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import java.io.IOException; -import java.util.Set; -import javax.transaction.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelsService; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.microservice.MicroServicePolicyService; -import org.onap.clamp.policy.operational.OperationalPolicy; -import org.onap.clamp.policy.operational.OperationalPolicyService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class LoopControllerTestItCase { - - private static final String EXAMPLE_LOOP_NAME = "ClosedLoopTest"; - private static final String EXAMPLE_JSON = "{\"testName\":\"testValue\"}"; - - @Autowired - LoopService loopService; - - @Autowired - LoopsRepository loopsRepository; - - @Autowired - MicroServicePolicyService microServicePolicyService; - - @Autowired - OperationalPolicyService operationalPolicyService; - - @Autowired - PolicyModelsService policyModelsService; - - @Autowired - LoopController loopController; - - private void saveTestLoopToDb() { - Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, "blueprint", "representation"); - testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); - LoopTemplate template = new LoopTemplate(); - template.setName("testTemplate"); - testLoop.setLoopTemplate(template); - Service modelService = new Service("{\"name\":\"serviceName\",\"UUID\":\"uuid\"}", "{}"); - testLoop.setModelService(modelService); - loopService.saveOrUpdateLoop(testLoop); - } - - private Loop createTestLoop(String loopName, String loopBlueprint, String loopSvg) { - return new Loop(loopName); - } - - @Test - @Transactional - public void testUpdateOperationalPolicies() { - saveTestLoopToDb(); - String policy = "[{\"name\":\"OPERATIONAL_CLholmes31_v1_0_vFW_PG_T10_k8s-holmes-rules\"," - + "\"configurationsJson\":{" - + "\"operational_policy\":{\"controlLoop\":{\"trigger_policy\":\"unique-policy-id-1-modifyConfig\"," - + "\"timeout\":\"3600\",\"abatement\":\"false\"," - + "\"controlLoopName\":\"LOOP_CLholmes31_v1_0_vFW_PG_T10_k8s-holmes-rules\"}," - + "\"policies\":[{\"id\":\"unique-policy-id-1-modifyConfig\",\"recipe\":\"ModifyConfig\"," - + "\"retry\":\"2\",\"timeout\":\"1200\",\"actor\":\"APPC\",\"payload\":\"{\\\"active-streams\\\":5}\"," - + "\"success\":\"\",\"failure\":\"\",\"failure_timeout\":\"\",\"failure_retries\":\"\"," - + "\"failure_exception\":\"\",\"failure_guard\":\"\",\"target\":{\"type\":\"VNF\"," - + "\"resourceID\":\"vFW_PG_T1\"}}]}}}]"; - JsonParser parser = new JsonParser(); - JsonElement ele = parser.parse(policy); - JsonArray arr = ele.getAsJsonArray(); - Loop loop = loopController.updateOperationalPolicies(EXAMPLE_LOOP_NAME, arr); - assertThat(loop.getOperationalPolicies()).hasSize(1); - Set opSet = loop.getOperationalPolicies(); - OperationalPolicy op = opSet.iterator().next(); - assertThat(op.getName()).isEqualTo("OPERATIONAL_CLholmes31_v1_0_vFW_PG_T10_k8s-holmes-rules"); - } - - @Test - @Transactional - public void testUpdateGlobalProperties() { - saveTestLoopToDb(); - String policy = "{\"dcaeDeployParameters\":{\"aaiEnrichmentHost\":\"aai.onap.svc.cluster.local\"," - + "\"aaiEnrichmentPort\":\"8443\",\"enableAAIEnrichment\":\"false\",\"dmaap_host\":\"message-router" - + ".onap\",\"dmaap_port\":\"3904\",\"enableRedisCaching\":\"false\",\"redisHosts\":\"dcae-redis.onap" - + ".svc.cluster.local:6379\",\"tag_version\":\"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments" - + ".tca-cdap-container:1.1.1\",\"consul_host\":\"consul-server.onap\",\"consul_port\":\"8500\"," - + "\"cbs_host\":\"config-binding-service\",\"cbs_port\":\"10000\",\"external_port\":\"32012\"," - + "\"policy_model_id\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\"," - + "\"policy_id\":\"tca_k8s_CLTCA_v1_0_vFW_PG_T10_k8s-tca-clamp-policy-05162019\"}}"; - JsonParser parser = new JsonParser(); - JsonElement ele = parser.parse(policy); - JsonObject obj = ele.getAsJsonObject(); - loopController.updateGlobalPropertiesJson(EXAMPLE_LOOP_NAME, obj); - Loop loop = loopController.getLoop(EXAMPLE_LOOP_NAME); - JsonObject globalPropertiesJson = loop.getGlobalPropertiesJson(); - JsonObject prop = globalPropertiesJson.getAsJsonObject("dcaeDeployParameters"); - assertThat(prop.get("aaiEnrichmentHost").getAsString()).isEqualTo("aai.onap.svc.cluster.local"); - } - - @Test - @Transactional - public void testUpdateMicroservicePolicy() { - saveTestLoopToDb(); - PolicyModel policyModel = new PolicyModel("testPolicyModel", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0"); - policyModelsService.saveOrUpdatePolicyModel(policyModel); - MicroServicePolicy policy = new MicroServicePolicy("policyName", policyModel, false, - JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - loopController.updateMicroservicePolicy(EXAMPLE_LOOP_NAME, policy); - assertThat(microServicePolicyService.isExisting("policyName")).isTrue(); - } - - @Test - @Transactional - public void testAddAndRemoveOperationalPolicies() throws IOException { - saveTestLoopToDb(); - PolicyModel policyModel = new PolicyModel("testPolicyModel", - null, "1.0.0"); - policyModelsService.saveOrUpdatePolicyModel(policyModel); - - loopController.addOperationalPolicy(EXAMPLE_LOOP_NAME, "testPolicyModel", "1.0.0"); - - Loop newLoop = loopController.getLoop(EXAMPLE_LOOP_NAME); - Set opPolicyList = newLoop.getOperationalPolicies(); - assertThat(opPolicyList.size()).isEqualTo(1); - for (OperationalPolicy policy : opPolicyList) { - assertThat(policy.getName().contains("OPERATIONAL_serviceName")).isTrue(); - assertThat(policy.getPolicyModel().getPolicyModelType()).isEqualTo("testPolicyModel"); - assertThat(policy.getPolicyModel().getVersion()).isEqualTo("1.0.0"); - } - - loopController.removeOperationalPolicy(EXAMPLE_LOOP_NAME, "testPolicyModel", "1.0.0"); - Loop newLoop2 = loopController.getLoop(EXAMPLE_LOOP_NAME); - assertThat(newLoop2.getOperationalPolicies().size()).isEqualTo(0); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/loop/LoopLogServiceTestItCase.java b/src/test/java/org/onap/clamp/loop/LoopLogServiceTestItCase.java deleted file mode 100644 index ddab7b659..000000000 --- a/src/test/java/org/onap/clamp/loop/LoopLogServiceTestItCase.java +++ /dev/null @@ -1,95 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Huawei Technologies Co., Ltd. - * ================================================================================ - * 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.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonObject; -import java.util.Set; -import javax.transaction.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.log.LogType; -import org.onap.clamp.loop.log.LoopLog; -import org.onap.clamp.loop.log.LoopLogService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class LoopLogServiceTestItCase { - - private static final String EXAMPLE_LOOP_NAME = "ClosedLoopTest"; - private static final String EXAMPLE_JSON = "{\"testName\":\"testValue\"}"; - private static final String CLAMP_COMPONENT = "CLAMP"; - private static final String SAMPLE_LOG_MESSAGE = "Sample log"; - private static final String BLUEPRINT = "blueprint"; - - @Autowired - LoopService loopService; - - @Autowired - LoopsRepository loopsRepository; - - @Autowired - LoopLogService loopLogService; - - private void saveTestLoopToDb() { - Loop testLoop = new Loop(EXAMPLE_LOOP_NAME); - testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); - loopService.saveOrUpdateLoop(testLoop); - } - - @Test - @Transactional - public void testAddLog() { - saveTestLoopToDb(); - Loop loop = loopService.getLoop(EXAMPLE_LOOP_NAME); - loopLogService.addLog(SAMPLE_LOG_MESSAGE, "INFO", loop); - Set loopLogs = loop.getLoopLogs(); - assertThat(loopLogs).hasSize(1); - LoopLog loopLog = loopLogs.iterator().next(); - assertThat(loopLog.getMessage()).isEqualTo(SAMPLE_LOG_MESSAGE); - } - - @Test - @Transactional - public void testLoopLog() { - LoopLog log = new LoopLog(); - Long id = Long.valueOf(100); - log.setId(id); - log.setLogComponent(CLAMP_COMPONENT); - log.setLogType(LogType.INFO); - log.setMessage(SAMPLE_LOG_MESSAGE); - Loop testLoop = new Loop(EXAMPLE_LOOP_NAME); - log.setLoop(testLoop); - assertThat(log.getMessage()).isEqualTo(SAMPLE_LOG_MESSAGE); - assertThat(log.getLogType()).isEqualTo(LogType.INFO); - assertThat(log.getLogComponent()).isEqualTo(CLAMP_COMPONENT); - assertThat(log.getId()).isEqualTo(id); - assertThat(log.getLoop()).isEqualTo(testLoop); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java b/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java deleted file mode 100644 index 9815575cc..000000000 --- a/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java +++ /dev/null @@ -1,253 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import java.time.Instant; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.loop.log.LogType; -import org.onap.clamp.loop.log.LoopLog; -import org.onap.clamp.loop.log.LoopLogRepository; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.service.ServicesRepository; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.LoopElementModelsRepository; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.LoopTemplatesRepository; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelId; -import org.onap.clamp.loop.template.PolicyModelsRepository; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.microservice.MicroServicePolicyService; -import org.onap.clamp.policy.operational.OperationalPolicy; -import org.onap.clamp.policy.operational.OperationalPolicyService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.transaction.annotation.Transactional; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) -public class LoopRepositoriesItCase { - - private Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); - - @Autowired - private LoopsRepository loopRepository; - - @Autowired - private MicroServicePolicyService microServicePolicyService; - - @Autowired - private OperationalPolicyService operationalPolicyService; - - @Autowired - private LoopLogRepository loopLogRepository; - - @Autowired - private LoopTemplatesRepository loopTemplateRepository; - - @Autowired - private LoopElementModelsRepository microServiceModelsRepository; - - @Autowired - private PolicyModelsRepository policyModelsRepository; - - @Autowired - private ServicesRepository servicesRepository; - - private Service getService(String serviceDetails, String resourceDetails) { - return new Service(serviceDetails, resourceDetails); - } - - private OperationalPolicy getOperationalPolicy(String configJson, String name, PolicyModel policyModel) { - return new OperationalPolicy(name, null, new Gson().fromJson(configJson, JsonObject.class), policyModel, - null, null, null); - } - - private LoopElementModel getLoopElementModel(String yaml, String name, String policyType, String createdBy, - PolicyModel policyModel) { - LoopElementModel model = new LoopElementModel(name, policyType, yaml); - model.addPolicyModel(policyModel); - return model; - } - - private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, - String policyAcronym) { - return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); - } - - private LoopTemplate getLoopTemplates(String name, String blueprint, String createdBy, - Integer maxInstancesAllowed) { - LoopTemplate template = new LoopTemplate(name, blueprint, maxInstancesAllowed, null); - template.addLoopElementModel(getLoopElementModel("yaml", "microService1", "org.onap.policy.drools", createdBy, - getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools"))); - template.addLoopElementModel(getLoopElementModel("yaml", "oppolicy1", "org.onap.policy.drools.legacy", - createdBy, getPolicyModel("org.onap.policy.drools.legacy", "yaml", "1.0.0", "DroolsLegacy"))); - loopTemplateRepository.save(template); - return template; - } - - private Loop getLoop(String name, String blueprint, String globalPropertiesJson, - String dcaeId, String dcaeUrl, String dcaeBlueprintId) { - Loop loop = new Loop(); - loop.setName(name); - loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, JsonObject.class)); - loop.setLastComputedState(LoopState.DESIGN); - loop.setDcaeDeploymentId(dcaeId); - loop.setDcaeDeploymentStatusUrl(dcaeUrl); - loop.setLoopTemplate(getLoopTemplates("templateName", "yaml", "toto", 1)); - return loop; - } - - private MicroServicePolicy getMicroServicePolicy(String name, String jsonRepresentation, String jsonProperties, - boolean shared, PolicyModel policyModel) { - MicroServicePolicy microService = new MicroServicePolicy(name, policyModel, shared, - gson.fromJson(jsonRepresentation, JsonObject.class), null, null, null); - microService.setConfigurationsJson(new Gson().fromJson(jsonProperties, JsonObject.class)); - return microService; - } - - private LoopLog getLoopLog(LogType type, String message, Loop loop) { - return new LoopLog(message, type, "CLAMP", loop); - } - - /** - * This method does a crud test and save a loop template and a loop object in db. - */ - @Test - @Transactional - public void crudTest() { - // Setup - Loop loopTest = getLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", - "123456789", "https://dcaetest.org", "UUID-blueprint"); - OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest", - getPolicyModel("org.onap.policy.drools.legacy", "yaml", "1.0.0", "DroolsLegacy")); - loopTest.addOperationalPolicy(opPolicy); - MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "{\"configtype\":\"json\"}", - "{\"param1\":\"value1\"}", true, getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools")); - loopTest.addMicroServicePolicy(microServicePolicy); - LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest); - loopTest.addLog(loopLog); - Service service = getService( - "{\"name\": \"vLoadBalancerMS\", \"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fce0\"}", "{\"CP\": {}}"); - loopTest.setModelService(service); - - // Attempt to save into the database the entire loop - Loop loopInDb = loopRepository.save(loopTest); - assertThat(loopInDb).isNotNull(); - assertThat(loopRepository.findById(loopInDb.getName()).get()).isNotNull(); - assertThat(loopInDb.getCreatedDate()).isNotNull(); - assertThat(loopInDb.getUpdatedDate()).isNotNull(); - assertThat(loopInDb.getUpdatedDate()).isEqualTo(loopInDb.getCreatedDate()); - assertThat(loopInDb.getName()).isEqualTo("ControlLoopTest"); - // Autogen id so now set the ID in the previous model so that we can compare the - // objects - loopLog.setId(((LoopLog) loopInDb.getLoopLogs().toArray()[0]).getId()); - - assertThat(loopInDb).isEqualToIgnoringGivenFields(loopTest, "components", "createdDate", "updatedDate", - "createdBy", "updatedBy"); - assertThat(loopRepository.existsById(loopTest.getName())).isEqualTo(true); - assertThat(operationalPolicyService.isExisting(opPolicy.getName())).isEqualTo(true); - assertThat(microServicePolicyService.isExisting(microServicePolicy.getName())).isEqualTo(true); - assertThat(loopLogRepository.existsById(loopLog.getId())).isEqualTo(true); - assertThat(loopTemplateRepository.existsById(loopInDb.getLoopTemplate().getName())).isEqualTo(true); - assertThat(loopTemplateRepository.existsById(loopInDb.getLoopTemplate().getName())).isEqualTo(true); - assertThat(servicesRepository.existsById(loopInDb.getModelService().getServiceUuid())).isEqualTo(true); - assertThat(microServiceModelsRepository.existsById( - loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getName())) - .isEqualTo(true); - assertThat(policyModelsRepository.existsById(new PolicyModelId( - loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() - .first().getPolicyModelType(), - loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() - .first().getVersion()))).isEqualTo(true); - - // Now attempt to read from database - Loop loopInDbRetrieved = loopRepository.findById(loopTest.getName()).get(); - assertThat(loopInDbRetrieved).isEqualToIgnoringGivenFields(loopTest, "components", "createdDate", "updatedDate", - "createdBy", "updatedBy"); - assertThat(loopInDbRetrieved).isEqualToComparingOnlyGivenFields(loopInDb, "createdDate", "updatedDate", - "createdBy", "updatedBy"); - assertThat((LoopLog) loopInDbRetrieved.getLoopLogs().toArray()[0]).isEqualToComparingFieldByField(loopLog); - assertThat((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]) - .isEqualToIgnoringGivenFields(opPolicy, "createdDate", "updatedDate", "createdBy", "updatedBy"); - assertThat(((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getCreatedDate()) - .isNotNull(); - assertThat(((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getUpdatedDate()) - .isNotNull(); - assertThat(((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getCreatedBy()) - .isNotNull(); - assertThat(((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getUpdatedBy()) - .isNotNull(); - - assertThat((MicroServicePolicy) loopInDbRetrieved.getMicroServicePolicies().toArray()[0]) - .isEqualToIgnoringGivenFields(microServicePolicy, "createdDate", "updatedDate", "createdBy", - "updatedBy"); - - // Attempt an update - ((LoopLog) loopInDbRetrieved.getLoopLogs().toArray()[0]).setLogInstant(Instant.now()); - loopInDbRetrieved.setLastComputedState(LoopState.RUNNING); - Loop loopInDbRetrievedUpdated = loopRepository.saveAndFlush(loopInDbRetrieved); - // Loop loopInDbRetrievedUpdated = - // loopRepository.findById(loopTest.getName()).get(); - assertThat((LoopLog) loopInDbRetrievedUpdated.getLoopLogs().toArray()[0]) - .isEqualToComparingFieldByField(loopInDbRetrieved.getLoopLogs().toArray()[0]); - // UpdatedDate should have been changed - assertThat(loopInDbRetrievedUpdated.getUpdatedDate()).isNotEqualTo(loopInDbRetrievedUpdated.getCreatedDate()); - // createdDate should have NOT been changed - assertThat(loopInDbRetrievedUpdated.getCreatedDate()).isEqualTo(loopInDb.getCreatedDate()); - // other audit are the same - assertThat(loopInDbRetrievedUpdated.getCreatedBy()).isEqualTo("Not found"); - assertThat(loopInDbRetrievedUpdated.getUpdatedBy()).isEqualTo("Not found"); - - // Attempt to delete the object and check it has well been cascaded - - loopRepository.delete(loopInDbRetrieved); - assertThat(loopRepository.existsById(loopTest.getName())).isEqualTo(false); - assertThat(operationalPolicyService.isExisting(opPolicy.getName())).isEqualTo(false); - assertThat(microServicePolicyService.isExisting(microServicePolicy.getName())).isEqualTo(true); - assertThat(loopLogRepository.existsById(loopLog.getId())).isEqualTo(false); - assertThat(loopTemplateRepository.existsById(loopInDb.getLoopTemplate().getName())).isEqualTo(true); - assertThat(servicesRepository.existsById(loopInDb.getModelService().getServiceUuid())).isEqualTo(true); - assertThat(microServiceModelsRepository.existsById( - loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getName())) - .isEqualTo(true); - - assertThat(policyModelsRepository.existsById(new PolicyModelId( - loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() - .first().getPolicyModelType(), - loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() - .first().getVersion()))).isEqualTo(true); - - } -} diff --git a/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java b/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java deleted file mode 100644 index 15cf59f38..000000000 --- a/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java +++ /dev/null @@ -1,380 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonObject; -import java.util.Set; -import java.util.stream.Collectors; -import javax.transaction.Transactional; -import org.assertj.core.util.Lists; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.log.LogType; -import org.onap.clamp.loop.log.LoopLog; -import org.onap.clamp.loop.log.LoopLogService; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelsService; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.microservice.MicroServicePolicyService; -import org.onap.clamp.policy.operational.OperationalPolicy; -import org.onap.clamp.policy.operational.OperationalPolicyService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class LoopServiceTestItCase { - - private static final String EXAMPLE_LOOP_NAME = "ClosedLoopTest"; - private static final String EXAMPLE_JSON = "{\"testName\":\"testValue\"}"; - - @Autowired - LoopService loopService; - - @Autowired - LoopsRepository loopsRepository; - - @Autowired - MicroServicePolicyService microServicePolicyService; - - @Autowired - OperationalPolicyService operationalPolicyService; - - @Autowired - LoopLogService loopLogService; - - @Autowired - PolicyModelsService policyModelsService; - - @Test - @Transactional - public void shouldCreateEmptyLoop() { - // given - String loopBlueprint = "blueprint"; - Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, loopBlueprint); - testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); - testLoop.setLastComputedState(LoopState.DESIGN); - - // when - Loop actualLoop = loopService.saveOrUpdateLoop(testLoop); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop).isEqualTo(loopsRepository.findById(actualLoop.getName()).get()); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - assertThat(actualLoop.getGlobalPropertiesJson().getAsJsonPrimitive("testName").getAsString()) - .isEqualTo("testValue"); - } - - @Test - @Transactional - public void shouldAddOperationalPolicyToLoop() { - // given - saveTestLoopToDb(); - OperationalPolicy operationalPolicy = new OperationalPolicy("policyName", null, - JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); - - // when - Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, - Lists.newArrayList(operationalPolicy)); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - Set savedPolicies = actualLoop.getOperationalPolicies(); - assertThat(savedPolicies).hasSize(1); - assertThat(savedPolicies) - .usingElementComparatorIgnoringFields("loop", "createdBy", "createdDate", "updatedBy", "updatedDate") - .contains(operationalPolicy); - OperationalPolicy savedPolicy = savedPolicies.iterator().next(); - assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME); - - } - - @Test - @Transactional - public void shouldAddMicroservicePolicyToLoop() { - // given - saveTestLoopToDb(); - PolicyModel policyModel = new PolicyModel("org.policies.policyModel1", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "policyModel1"); - policyModelsService.saveOrUpdatePolicyModel(policyModel); - MicroServicePolicy microServicePolicy = new MicroServicePolicy("policyName", policyModel, - false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - - // when - Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, - Lists.newArrayList(microServicePolicy)); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - Set savedPolicies = actualLoop.getMicroServicePolicies(); - assertThat(savedPolicies).hasSize(1); - assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops", "createdDate", "updatedDate", - "createdBy", "updatedBy").containsExactly(microServicePolicy); - assertThat(savedPolicies).extracting("usedByLoops").hasSize(1); - - } - - @Test - @Transactional - //@Commit - public void shouldCreateNewMicroservicePolicyAndUpdateJsonRepresentationOfOldOne() { - // given - saveTestLoopToDb(); - PolicyModel policyModel1 = new PolicyModel("org.policies.firstPolicyName", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "firstPolicyName"); - policyModelsService.saveOrUpdatePolicyModel(policyModel1); - PolicyModel policyModel2 = new PolicyModel("org.policies.secondPolicyName", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "secondPolicyName"); - policyModelsService.saveOrUpdatePolicyModel(policyModel2); - MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", policyModel1, false, - JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - - loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy)); - MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("secondPolicyName", policyModel2, false, - JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - - // when - firstMicroServicePolicy - .setConfigurationsJson(JsonUtils.GSON.fromJson("{\"name1\":\"value1\"}", JsonObject.class)); - Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, - Lists.newArrayList(firstMicroServicePolicy, secondMicroServicePolicy)); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - Set savedPolicies = actualLoop.getMicroServicePolicies(); - assertThat(savedPolicies).hasSize(2); - assertThat(savedPolicies).contains(firstMicroServicePolicy); - assertThat(savedPolicies).contains(secondMicroServicePolicy); - assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops", "createdDate", "updatedDate", - "createdBy", "updatedBy").containsExactlyInAnyOrder(firstMicroServicePolicy, secondMicroServicePolicy); - } - - private void saveTestLoopToDb() { - Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, "blueprint"); - testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); - LoopTemplate template = new LoopTemplate(); - template.setName("testTemplate"); - testLoop.setLoopTemplate(template); - loopService.saveOrUpdateLoop(testLoop); - } - - @Test - @Transactional - public void shouldRemoveOldMicroservicePolicyIfNotInUpdatedList() { - // given - saveTestLoopToDb(); - PolicyModel policyModel1 = new PolicyModel("org.policies.firstPolicyName", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "firstPolicyName"); - policyModelsService.saveOrUpdatePolicyModel(policyModel1); - PolicyModel policyModel2 = new PolicyModel("org.policies.secondPolicyName", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "secondPolicyName"); - policyModelsService.saveOrUpdatePolicyModel(policyModel2); - MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", policyModel1, - false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy)); - - MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("secondPolicyName", policyModel2, - false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - - // when - Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, - Lists.newArrayList(secondMicroServicePolicy)); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - Set savedPolicies = actualLoop.getMicroServicePolicies(); - assertThat(savedPolicies).hasSize(1); - assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops", "createdDate", "updatedDate", - "createdBy", "updatedBy").containsExactly(secondMicroServicePolicy); - - } - - @Test - @Transactional - public void shouldCreateNewOperationalPolicyAndUpdateJsonRepresentationOfOldOne() { - // given - saveTestLoopToDb(); - - JsonObject newJsonConfiguration = JsonUtils.GSON.fromJson("{}", JsonObject.class); - - OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null, - JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); - loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy)); - - OperationalPolicy secondOperationalPolicy = new OperationalPolicy("secondPolicyName", null, - newJsonConfiguration, null, null, null, null); - - // when - firstOperationalPolicy.setConfigurationsJson(newJsonConfiguration); - Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, - Lists.newArrayList(firstOperationalPolicy, secondOperationalPolicy)); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - Set savedPolicies = actualLoop.getOperationalPolicies(); - assertThat(savedPolicies).hasSize(2); - assertThat(savedPolicies) - .usingElementComparatorIgnoringFields("loop", "createdDate", "updatedDate", "createdBy", "updatedBy") - .containsExactlyInAnyOrder(firstOperationalPolicy, secondOperationalPolicy); - Set policiesLoops = Lists.newArrayList(savedPolicies).stream().map(OperationalPolicy::getLoop) - .map(Loop::getName).collect(Collectors.toSet()); - assertThat(policiesLoops).containsExactly(EXAMPLE_LOOP_NAME); - } - - @Test - @Transactional - public void shouldRemoveOldOperationalPolicyIfNotInUpdatedList() { - // given - saveTestLoopToDb(); - - OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null, - JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); - loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy)); - - OperationalPolicy secondOperationalPolicy = new OperationalPolicy("policyName", null, - JsonUtils.GSON.fromJson("{}", JsonObject.class), null, null, "pdpGroup1", "pdpSubgroup1"); - - // when - Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, - Lists.newArrayList(secondOperationalPolicy)); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - Set savedPolicies = actualLoop.getOperationalPolicies(); - assertThat(savedPolicies).hasSize(1); - assertThat(savedPolicies) - .usingElementComparatorIgnoringFields("loop", "createdDate", "updatedDate", "createdBy", "updatedBy") - .containsExactly(secondOperationalPolicy); - OperationalPolicy savedPolicy = savedPolicies.iterator().next(); - assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME); - - } - - @Test - @Transactional - public void shouldCreateModelPropertiesAndUpdateJsonRepresentationOfOldOne() { - // given - saveTestLoopToDb(); - String expectedJson = "{\"test\":\"test\"}"; - JsonObject baseGlobalProperites = JsonUtils.GSON.fromJson("{}", JsonObject.class); - JsonObject updatedGlobalProperites = JsonUtils.GSON.fromJson(expectedJson, JsonObject.class); - loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, baseGlobalProperites); - - // when - Loop actualLoop = loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, updatedGlobalProperites); - - // then - assertThat(actualLoop).isNotNull(); - assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); - JsonObject returnedGlobalProperties = actualLoop.getGlobalPropertiesJson(); - assertThat(returnedGlobalProperties.getAsJsonObject()).isEqualTo(updatedGlobalProperites); - } - - @Test - @Transactional - public void deleteAttempt() { - saveTestLoopToDb(); - // Add log - Loop loop = loopsRepository.findById(EXAMPLE_LOOP_NAME).orElse(null); - loop.addLog(new LoopLog("test", LogType.INFO, "CLAMP", loop)); - LoopTemplate template = new LoopTemplate(); - template.setName("testTemplate"); - loop.setLoopTemplate(template); - loop = loopService.saveOrUpdateLoop(loop); - // Add op policy - OperationalPolicy operationalPolicy = new OperationalPolicy("opPolicy", null, - JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); - loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(operationalPolicy)); - - PolicyModel policyModel = new PolicyModel("org.policies.microPolicy", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "microPolicy"); - policyModelsService.saveOrUpdatePolicyModel(policyModel); - // Add Micro service policy - MicroServicePolicy microServicePolicy = new MicroServicePolicy("microPolicy", policyModel, - false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(microServicePolicy)); - - // Verify it's there - assertThat(loopsRepository.findById(EXAMPLE_LOOP_NAME).orElse(null)).isNotNull(); - loopService.deleteLoop(EXAMPLE_LOOP_NAME); - // Verify it's well deleted and has been cascaded, except for Microservice - assertThat(loopsRepository.findById(EXAMPLE_LOOP_NAME).orElse(null)).isNull(); - assertThat(microServicePolicyService.isExisting("microPolicy")).isTrue(); - assertThat(operationalPolicyService.isExisting("opPolicy")).isFalse(); - assertThat(loopLogService.isExisting(((LoopLog) loop.getLoopLogs().toArray()[0]).getId())).isFalse(); - } - - @Test - @Transactional - public void testUpdateLoopState() { - saveTestLoopToDb(); - Loop loop = loopService.getLoop(EXAMPLE_LOOP_NAME); - loopService.updateLoopState(loop, "SUBMITTED"); - Loop updatedLoop = loopService.getLoop(EXAMPLE_LOOP_NAME); - assertThat(updatedLoop.getLastComputedState()).isEqualTo(LoopState.SUBMITTED); - } - - @Test - @Transactional - public void testUpdateDcaeDeploymentFields() { - saveTestLoopToDb(); - Loop loop = loopService.getLoop(EXAMPLE_LOOP_NAME); - loopService.updateDcaeDeploymentFields(loop, "CLAMP_c5ce429a-f570-48c5-a7ea-53bed8f86f85", - "https4://deployment-handler.onap:8443"); - loop = loopService.getLoop(EXAMPLE_LOOP_NAME); - assertThat(loop.getDcaeDeploymentId()).isEqualTo("CLAMP_c5ce429a-f570-48c5-a7ea-53bed8f86f85"); - assertThat(loop.getDcaeDeploymentStatusUrl()).isEqualTo("https4://deployment-handler.onap:8443"); - } - - @Test - @Transactional - public void testUpdateMicroservicePolicy() { - saveTestLoopToDb(); - assertThat(microServicePolicyService.isExisting("policyName")).isFalse(); - PolicyModel policyModel = new PolicyModel("org.policies.policyName", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "policyName"); - policyModelsService.saveOrUpdatePolicyModel(policyModel); - MicroServicePolicy microServicePolicy = new MicroServicePolicy("policyName", policyModel, - false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); - loopService.updateMicroservicePolicy(EXAMPLE_LOOP_NAME, microServicePolicy); - assertThat(microServicePolicyService.isExisting("policyName")).isTrue(); - } - - private Loop createTestLoop(String loopName, String loopBlueprint) { - return new Loop(loopName); - } -} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/loop/LoopTemplateLoopElementModelTest.java b/src/test/java/org/onap/clamp/loop/LoopTemplateLoopElementModelTest.java deleted file mode 100644 index 70ff9b118..000000000 --- a/src/test/java/org/onap/clamp/loop/LoopTemplateLoopElementModelTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.LoopTemplateLoopElementModel; -import org.onap.clamp.loop.template.PolicyModel; - - -public class LoopTemplateLoopElementModelTest { - - private LoopElementModel loopElementModel = getLoopElementModel("yaml", "microService1", - getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools", "type1")); - private LoopTemplate loopTemplate = getLoopTemplate("templateName", "yaml", 1); - - private LoopElementModel getLoopElementModel(String yaml, String name, PolicyModel policyModel) { - LoopElementModel model = new LoopElementModel(); - model.setBlueprint(yaml); - model.setName(name); - model.addPolicyModel(policyModel); - model.setLoopElementType("OPERATIONAL_POLICY"); - return model; - } - - private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, String policyAcronym, - String policyVariant) { - return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); - } - - private LoopTemplate getLoopTemplate(String name, String blueprint, Integer maxInstancesAllowed) { - LoopTemplate template = new LoopTemplate(name, blueprint, maxInstancesAllowed, null); - template.addLoopElementModel(loopElementModel); - return template; - } - - /** - * This tests compareTo method. - */ - @Test - public void compareToTest() { - LoopTemplateLoopElementModel model1 = new LoopTemplateLoopElementModel(); - LoopTemplateLoopElementModel model2 = new LoopTemplateLoopElementModel(); - assertThat(model1.compareTo(model2)).isEqualTo(1); - - model1.setFlowOrder(2); - assertThat(model1.compareTo(model2)).isEqualTo(-1); - - model2.setFlowOrder(3); - assertThat(model1.compareTo(model2)).isEqualTo(1); - } - - /** - * This tests equals method. - */ - @Test - public void equalsTest() { - LoopTemplateLoopElementModel model1 = new LoopTemplateLoopElementModel(); - LoopTemplateLoopElementModel model2 = new LoopTemplateLoopElementModel(); - - assertThat(model1.equals(model2)).isTrue(); - - model1.setLoopTemplate(loopTemplate); - assertThat(model1.equals(model2)).isFalse(); - model2.setLoopTemplate(loopTemplate); - assertThat(model1.equals(model2)).isTrue(); - - model1.setLoopElementModel(loopElementModel); - assertThat(model1.equals(model2)).isFalse(); - model2.setLoopElementModel(loopElementModel); - assertThat(model1.equals(model2)).isTrue(); - - model1.setFlowOrder(1); - assertThat(model1.equals(model2)).isTrue(); - model2.setFlowOrder(2); - assertThat(model1.equals(model2)).isTrue(); - } - -} diff --git a/src/test/java/org/onap/clamp/loop/LoopTemplatesServiceItCase.java b/src/test/java/org/onap/clamp/loop/LoopTemplatesServiceItCase.java deleted file mode 100644 index b8b1144f6..000000000 --- a/src/test/java/org/onap/clamp/loop/LoopTemplatesServiceItCase.java +++ /dev/null @@ -1,146 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; -import java.util.SortedSet; -import javax.transaction.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.LoopTemplateLoopElementModel; -import org.onap.clamp.loop.template.LoopTemplatesService; -import org.onap.clamp.loop.template.LoopType; -import org.onap.clamp.loop.template.PolicyModel; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class LoopTemplatesServiceItCase { - - @Autowired - LoopTemplatesService loopTemplatesService; - - private static final String POLICY_MODEL_TYPE_1 = "org.onap.test"; - private static final String VERSION = "1.0.0"; - - private LoopElementModel getLoopElementModel(String yaml, String name, String loopElementType, - String createdBy, PolicyModel policyModel) { - LoopElementModel model = new LoopElementModel(name, loopElementType, yaml); - model.setBlueprint(""); - model.setDcaeBlueprintId(""); - model.addPolicyModel(policyModel); - return model; - } - - private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, - String policyAcronym, String createdBy) { - return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); - } - - private LoopTemplate getLoopTemplate(String name, String blueprint, String createdBy, Integer maxInstancesAllowed) { - LoopTemplate template = - new LoopTemplate(name, blueprint, maxInstancesAllowed, null); - template.addLoopElementModel(getLoopElementModel("yaml", "microService1", "MicroService", - createdBy, getPolicyModel(POLICY_MODEL_TYPE_1, "yaml", VERSION, "MS1", createdBy))); - template.setAllowedLoopType(LoopType.OPEN); - return template; - } - - @Test - @Transactional - public void shouldSaveOrUpdateLoopTemplate() { - LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); - LoopTemplate actualLoopTemplate = - loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); - - assertNotNull(actualLoopTemplate); - assertThat(loopTemplate.getName()).isEqualTo("TemplateName"); - assertThat(loopTemplate.getAllowedLoopType()).isEqualTo(LoopType.OPEN); - } - - @Test - @Transactional - public void shouldReturnAllLoopTemplates() { - LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); - loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); - List loopTemplateList = loopTemplatesService.getAllLoopTemplates(); - - assertNotNull(loopTemplateList); - } - - @Test - @Transactional - public void shouldReturnLoopTemplateNames() { - LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); - loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); - List loopTemplateNames = loopTemplatesService.getLoopTemplateNames(); - - assertNotNull(loopTemplateNames); - assertEquals("TemplateName", loopTemplateNames.get(0)); - } - - @Test - @Transactional - public void shouldReturnLoopTemplate() { - LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); - loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); - LoopTemplate actualLoopTemplate = loopTemplatesService.getLoopTemplate("TemplateName"); - - assertNotNull(actualLoopTemplate); - assertThat(loopTemplate).isEqualTo(actualLoopTemplate); - assertThat(loopTemplate.getName()).isEqualTo(actualLoopTemplate.getName()); - assertThat(loopTemplate.getMaximumInstancesAllowed()) - .isEqualTo(actualLoopTemplate.getMaximumInstancesAllowed()); - SortedSet loopElementModelsUsed = - loopTemplate.getLoopElementModelsUsed(); - LoopTemplateLoopElementModel loopTemplateLoopElementModel = loopElementModelsUsed.first(); - assertThat(loopTemplateLoopElementModel.getLoopElementModel().getName()) - .isEqualTo("microService1"); - assertThat(loopTemplateLoopElementModel.getLoopTemplate().getName()) - .isEqualTo("TemplateName"); - assertNull(actualLoopTemplate.getBlueprint()); - assertNull(actualLoopTemplate.getModelService()); - } - - @Test - @Transactional - public void shouldDeleteLoopTemplate() { - LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); - loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); - loopTemplatesService.deleteLoopTemplate("TemplateName"); - LoopTemplate actualLoopTemplate = loopTemplatesService.getLoopTemplate("TemplateName"); - assertNull(actualLoopTemplate); - } - -} diff --git a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java deleted file mode 100644 index 99c8f1ff9..000000000 --- a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java +++ /dev/null @@ -1,173 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertNotNull; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; -import java.io.IOException; -import java.util.Random; -import org.junit.Test; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.log.LogType; -import org.onap.clamp.loop.log.LoopLog; -import org.onap.clamp.loop.service.Service; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.operational.OperationalPolicy; - -public class LoopToJsonTest { - - private Gson gson = new Gson(); - - private OperationalPolicy getOperationalPolicy(String configJson, String name) { - return new OperationalPolicy(name, null, gson.fromJson(configJson, JsonObject.class), - getPolicyModel("org.onap.policy.drools.legacy", "yaml", "1.0.0", "Drools", "type1"), null, null, null); - } - - private Loop getLoop(String name, String blueprint, String globalPropertiesJson, - String dcaeId, String dcaeUrl, String dcaeBlueprintId) - throws JsonSyntaxException, IOException { - Loop loop = new Loop(name); - loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, JsonObject.class)); - loop.setLastComputedState(LoopState.DESIGN); - loop.setDcaeDeploymentId(dcaeId); - loop.setDcaeDeploymentStatusUrl(dcaeUrl); - return loop; - } - - private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, - String policyTosca, String jsonProperties, boolean shared) { - MicroServicePolicy microService = new MicroServicePolicy(name, new PolicyModel(modelType, policyTosca, "1.0.0"), - shared, - gson.fromJson(jsonRepresentation, JsonObject.class), null, null, null); - microService.setConfigurationsJson(new Gson().fromJson(jsonProperties, JsonObject.class)); - return microService; - } - - private LoopElementModel getLoopElementModel(String yaml, String name, PolicyModel policyModel) { - LoopElementModel model = new LoopElementModel(); - model.setBlueprint(yaml); - model.setName(name); - model.addPolicyModel(policyModel); - model.setLoopElementType("OPERATIONAL_POLICY"); - return model; - } - - private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, String policyAcronym, - String policyVariant) { - return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); - } - - private LoopTemplate getLoopTemplate(String name, String blueprint, Integer maxInstancesAllowed) { - LoopTemplate template = new LoopTemplate(name, blueprint, maxInstancesAllowed, null); - template.addLoopElementModel(getLoopElementModel("yaml", "microService1", - getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools", "type1"))); - return template; - } - - private LoopLog getLoopLog(LogType type, String message, Loop loop) { - LoopLog log = new LoopLog(message, type, "CLAMP", loop); - log.setId(Long.valueOf(new Random().nextInt())); - return log; - } - - /** - * This tests a GSON encode/decode. - * - * @throws IOException In case of failure - */ - @Test - public void loopGsonTest() throws IOException { - Loop loopTest = getLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", - "123456789", "https://dcaetest.org", "UUID-blueprint"); - OperationalPolicy opPolicy = this.getOperationalPolicy( - ResourceFileUtils.getResourceAsString("tosca/operational-policy-properties.json"), "GuardOpPolicyTest"); - loopTest.addOperationalPolicy(opPolicy); - MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", - "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", - "{\"param1\":\"value1\"}", true); - loopTest.addMicroServicePolicy(microServicePolicy); - LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest); - loopTest.addLog(loopLog); - LoopTemplate loopTemplate = getLoopTemplate("templateName", "yaml", 1); - loopTest.setLoopTemplate(loopTemplate); - - String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest); - assertThat(jsonSerialized).isNotNull().isNotEmpty(); - System.out.println(jsonSerialized); - Loop loopTestDeserialized = JsonUtils.GSON_JPA_MODEL.fromJson(jsonSerialized, Loop.class); - assertNotNull(loopTestDeserialized); - assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest, "svgRepresentation", "blueprint", - "components"); - assertThat(loopTestDeserialized.getComponent("DCAE").getState()) - .isEqualToComparingFieldByField(loopTest.getComponent("DCAE").getState()); - assertThat(loopTestDeserialized.getComponent("POLICY").getState()).isEqualToComparingOnlyGivenFields( - loopTest.getComponent("POLICY").getState(), "stateName", "description"); - // blueprint not exposed so wont be deserialized - - assertThat(loopTestDeserialized.getOperationalPolicies()).containsExactly(opPolicy); - assertThat(loopTestDeserialized.getMicroServicePolicies()).containsExactly(microServicePolicy); - assertThat(loopTestDeserialized.getLoopLogs()).containsExactly(loopLog); - assertThat((LoopLog) loopTestDeserialized.getLoopLogs().toArray()[0]).isEqualToIgnoringGivenFields(loopLog, - "loop"); - - // Verify the loop template - assertThat(loopTestDeserialized.getLoopTemplate()).isEqualTo(loopTemplate); - } - - /** - * This tests the service object GSON encode/decode. - * - * @throws IOException In case of issues - */ - @Test - public void loopServiceTest() throws IOException { - Loop loopTest2 = getLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", - "123456789", "https://dcaetest.org", "UUID-blueprint"); - - JsonObject jsonModel = new GsonBuilder().create() - .fromJson(ResourceFileUtils.getResourceAsString("tosca/model-properties.json"), JsonObject.class); - Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(), - jsonModel.get("resourceDetails").getAsJsonObject(), "1.0"); - loopTest2.setModelService(service); - String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest2); - assertThat(jsonSerialized).isNotNull().isNotEmpty(); - System.out.println(jsonSerialized); - - Loop loopTestDeserialized = JsonUtils.GSON_JPA_MODEL.fromJson(jsonSerialized, Loop.class); - assertNotNull(loopTestDeserialized); - assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest2, "modelService", "svgRepresentation", - "blueprint", "components"); - } -} diff --git a/src/test/java/org/onap/clamp/loop/PolicyComponentTest.java b/src/test/java/org/onap/clamp/loop/PolicyComponentTest.java deleted file mode 100644 index 8afdd0583..000000000 --- a/src/test/java/org/onap/clamp/loop/PolicyComponentTest.java +++ /dev/null @@ -1,297 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import java.io.IOException; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.junit.Test; -import org.mockito.Mockito; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.components.external.ExternalComponentState; -import org.onap.clamp.loop.components.external.PolicyComponent; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.operational.OperationalPolicy; - -public class PolicyComponentTest { - - /** - * Test the computeState method. - * oldState newState expectedFinalState - * NOT_SENT SENT_AND_DEPLOYED NOT_SENT - * NOT_SENT SENT NOT_SENT - * NOT_SENT NOT_SENT NOT_SENT - * NOT_SENT IN_ERROR IN_ERROR - */ - @Test - public void computeStateTestOriginalStateUnknown() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - Exchange exchange2 = Mockito.mock(Exchange.class); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getExchange()).thenReturn(exchange2); - // policy found + deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - PolicyComponent policy = new PolicyComponent(); - - ExternalComponentState state = policy.computeState(exchange); - assertThat(state.getStateName()).isEqualTo("SENT_AND_DEPLOYED"); - // policy found + not deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state2 = policy.computeState(exchange); - assertThat(state2.getStateName()).isEqualTo("SENT"); - // policy not found + not deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state4 = policy.computeState(exchange); - assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); - // policy not found + deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state3 = policy.computeState(exchange); - assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); - } - - /** - * Test the computeState method. - * oldState newState expectedFinalState - * NOT_SENT SENT_AND_DEPLOYED NOT_SENT - * NOT_SENT SENT NOT_SENT - * NOT_SENT NOT_SENT NOT_SENT - * NOT_SENT IN_ERROR IN_ERROR - */ - @Test - public void computeStateTestOriginalStateNotSent() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - Exchange exchange2 = Mockito.mock(Exchange.class); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getExchange()).thenReturn(exchange2); - // policy found + deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - PolicyComponent policy = new PolicyComponent(); - ExternalComponentState notSent = new ExternalComponentState("NOT_SENT", - "The policies defined have NOT yet been created on the policy engine", 90); - policy.setState(notSent); - ExternalComponentState state = policy.computeState(exchange); - assertThat(state.getStateName()).isEqualTo("NOT_SENT"); - // policy found + not deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state2 = policy.computeState(exchange); - assertThat(state2.getStateName()).isEqualTo("NOT_SENT"); - // policy not found + not deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state4 = policy.computeState(exchange); - assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); - // policy not found + deployed - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state3 = policy.computeState(exchange); - assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); - } - - - /** - * Test the computeState method. - * oldState newState expectedFinalState - * SENT SENT SENT - * SENT SENT_AND_DEPLOYED SENT - * SENT IN_ERROR IN_ERROR - * SENT NOT_SENT NOT_SENT - */ - @Test - public void computeStateTestOriginalStateSent() throws IOException { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - Exchange exchange2 = Mockito.mock(Exchange.class); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getExchange()).thenReturn(exchange2); - PolicyComponent policy = new PolicyComponent(); - ExternalComponentState sent = new ExternalComponentState("SENT", - "The policies defined have been created but NOT deployed on the policy engine", 50); - policy.setState(sent); - // new policy state SENT - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state = policy.computeState(exchange); - assertThat(state.getStateName()).isEqualTo("SENT"); - // new policy state SENT_AND_DEPLOYED - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state2 = policy.computeState(exchange); - assertThat(state2.getStateName()).isEqualTo("SENT"); - // new policy state IN_ERROR - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state3 = policy.computeState(exchange); - assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); - // new policy state NOT_SENT - policy.setState(sent); - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state4 = policy.computeState(exchange); - assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); - } - - /** - * Test the computeState method. - * oldState newState expectedFinalState - * SENT_AND_DEPLOYED SENT_AND_DEPLOYED SENT_AND_DEPLOYED - * SENT_AND_DEPLOYED SENT SENT - * SENT_AND_DEPLOYED IN_ERROR IN_ERROR - * SENT_AND_DEPLOYED NOT_SENT NOT_SENT - */ - @Test - public void computeStateTestOriginalStateSentAndDeployed() throws IOException { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - Exchange exchange2 = Mockito.mock(Exchange.class); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getExchange()).thenReturn(exchange2); - PolicyComponent policy = new PolicyComponent(); - ExternalComponentState sendDeployed = new ExternalComponentState("SENT_AND_DEPLOYED", - "The policies defined have been created and deployed on the policy engine", 10); - policy.setState(sendDeployed); - // new policy state SENT_AND_DEPLOYED - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state = policy.computeState(exchange); - assertThat(state.getStateName()).isEqualTo("SENT_AND_DEPLOYED"); - // new policy state SENT - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state2 = policy.computeState(exchange); - assertThat(state2.getStateName()).isEqualTo("SENT"); - // new policy state IN_ERROR - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state3 = policy.computeState(exchange); - assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); - // new policy state NOT_SENT - policy.setState(sendDeployed); - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state4 = policy.computeState(exchange); - assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); - } - - - /** - * Test the computeState method. - * oldState newState expectedFinalState - * IN_ERROR SENT_AND_DEPLOYED IN_ERROR - * IN_ERROR SENT IN_ERROR - * IN_ERROR IN_ERROR IN_ERROR - * IN_ERROR NOT_SENT IN_ERROR - */ - @Test - public void computeStateTestOriginalStateInError() throws IOException { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - Exchange exchange2 = Mockito.mock(Exchange.class); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getExchange()).thenReturn(exchange2); - PolicyComponent policy = new PolicyComponent(); - ExternalComponentState inError = new ExternalComponentState("IN_ERROR", - "There was an error during the sending to policy, the policy engine may be corrupted or inconsistent", - 100); - policy.setState(inError); - // new policy state SENT_AND_DEPLOYED - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state = policy.computeState(exchange); - assertThat(state.getStateName()).isEqualTo("IN_ERROR"); - // new policy state SENT - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state2 = policy.computeState(exchange); - assertThat(state2.getStateName()).isEqualTo("IN_ERROR"); - // new policy state IN_ERROR - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); - ExternalComponentState state3 = policy.computeState(exchange); - assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); - // new policy state NOT_SENT - Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); - Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); - ExternalComponentState state4 = policy.computeState(exchange); - - assertThat(state4.getStateName()).isEqualTo("IN_ERROR"); - } - - /** - * Test the create policies payload PdpGroup test. - */ - @Test - public void createPoliciesPayloadPdpGroupTest() throws IOException { - Loop loopTest = new Loop("ControlLoopTest"); - PolicyModel policyModel1 = new PolicyModel("onap.policies.monitoring.test", null, "1.0.0"); - - MicroServicePolicy microServicePolicy = new MicroServicePolicy("configPolicyTest", policyModel1, true, - new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), null, "pdpGroup1", "pdpSubgroup1"); - loopTest.addMicroServicePolicy(microServicePolicy); - - MicroServicePolicy microServicePolicy2 = new MicroServicePolicy("configPolicyTest2", policyModel1, true, - new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), null, "pdpGroup2", "pdpSubgroup1"); - loopTest.addMicroServicePolicy(microServicePolicy2); - - PolicyModel policyModel2 = new PolicyModel("onap.policies.monitoring.test2", null, - "1.0.0"); - OperationalPolicy opPolicy = - new OperationalPolicy("opPolicy", new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), - new Gson().fromJson("{\"jsonschema\":\"schema\"}", JsonObject.class), policyModel2, null, - "pdpGroup2", - "pdpSubgroup2"); - - loopTest.addOperationalPolicy(opPolicy); - OperationalPolicy opLegacyPolicy = - new OperationalPolicy("opLegacyPolicy", new Gson().fromJson( - "{\"guard_policies\":[{\"policy-id\":\"guard1\"}]}", JsonObject.class), - new Gson().fromJson("{\"jsonschema\":\"schema\"}", JsonObject.class), policyModel2, null, - "pdpGroup2", - "pdpSubgroup2"); - - loopTest.addOperationalPolicy(opLegacyPolicy); - - LoopTemplate loopTemplate = new LoopTemplate("test", "yaml", 1, null); - loopTemplate.setDcaeBlueprintId("UUID-blueprint"); - loopTest.setLoopTemplate(loopTemplate); - - String payload = PolicyComponent.createPoliciesPayloadPdpGroup(loopTest, "POST"); - String expectedRes = ResourceFileUtils.getResourceAsString("tosca/pdp-group-policy-payload.json"); - - assertThat(payload).isEqualTo(expectedRes); - } -} diff --git a/src/test/java/org/onap/clamp/loop/PolicyModelServiceItCase.java b/src/test/java/org/onap/clamp/loop/PolicyModelServiceItCase.java deleted file mode 100644 index 6f6cad815..000000000 --- a/src/test/java/org/onap/clamp/loop/PolicyModelServiceItCase.java +++ /dev/null @@ -1,311 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.stream.Collectors; -import javax.transaction.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelId; -import org.onap.clamp.loop.template.PolicyModelsRepository; -import org.onap.clamp.loop.template.PolicyModelsService; -import org.onap.clamp.policy.pdpgroup.PdpGroup; -import org.onap.clamp.policy.pdpgroup.PdpSubgroup; -import org.onap.clamp.policy.pdpgroup.PolicyModelKey; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class PolicyModelServiceItCase { - - @Autowired - PolicyModelsService policyModelsService; - - @Autowired - PolicyModelsRepository policyModelsRepository; - - private static final String POLICY_MODEL_TYPE_1 = "org.onap.testos"; - private static final String POLICY_MODEL_TYPE_1_VERSION_1 = "1.0.0"; - - private static final String POLICY_MODEL_TYPE_2 = "org.onap.testos2"; - private static final String POLICY_MODEL_TYPE_3 = "org.onap.testos3"; - private static final String POLICY_MODEL_TYPE_2_VERSION_1 = "1.0.0"; - private static final String POLICY_MODEL_TYPE_3_VERSION_1 = "1.0.0"; - private static final String POLICY_MODEL_TYPE_2_VERSION_2 = "2.0.0"; - - private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, - String policyAcronym, String policyVariant, String createdBy) { - PolicyModel policyModel = new PolicyModel(); - policyModel.setCreatedBy(createdBy); - policyModel.setPolicyAcronym(policyAcronym); - policyModel.setPolicyModelTosca(policyModelTosca); - policyModel.setPolicyModelType(policyType); - policyModel.setUpdatedBy(createdBy); - policyModel.setVersion(version); - return policyModel; - } - - /** - * This test the create policy Model. - */ - @Test - @Transactional - public void shouldCreatePolicyModel() { - // given - PolicyModel policyModel = getPolicyModel(POLICY_MODEL_TYPE_1, "yaml", - POLICY_MODEL_TYPE_1_VERSION_1, "TEST", "VARIANT", "user"); - - // when - PolicyModel actualPolicyModel = policyModelsService.saveOrUpdatePolicyModel(policyModel); - - // then - assertThat(actualPolicyModel).isNotNull(); - assertThat(actualPolicyModel).isEqualTo(policyModelsRepository - .findById(new PolicyModelId(actualPolicyModel.getPolicyModelType(), - actualPolicyModel.getVersion())) - .get()); - assertThat(actualPolicyModel.getPolicyModelType()) - .isEqualTo(policyModel.getPolicyModelType()); - assertThat(actualPolicyModel.getCreatedBy()).isEqualTo("Not found"); - assertThat(actualPolicyModel.getCreatedDate()).isNotNull(); - assertThat(actualPolicyModel.getPolicyAcronym()).isEqualTo(policyModel.getPolicyAcronym()); - assertThat(actualPolicyModel.getPolicyModelTosca()) - .isEqualTo(policyModel.getPolicyModelTosca()); - assertThat(actualPolicyModel.getUpdatedBy()).isEqualTo("Not found"); - assertThat(actualPolicyModel.getUpdatedDate()).isNotNull(); - assertThat(actualPolicyModel.getVersion()).isEqualTo(policyModel.getVersion()); - - assertThat( - policyModelsService.getPolicyModel(POLICY_MODEL_TYPE_1, POLICY_MODEL_TYPE_1_VERSION_1)) - .isEqualToIgnoringGivenFields(policyModel, "createdDate", "updatedDate", - "createdBy", "updatedBy"); - } - - /** - * This tests a create Policy Model from Tosca. - * - * @throws IOException In case of failure - */ - @Test - @Transactional - public void shouldCreatePolicyModelFromTosca() throws IOException { - String toscaModelYaml = - ResourceFileUtils.getResourceAsString("tosca/tosca_with_metadata.yaml"); - PolicyModel policyModel = policyModelsService.createNewPolicyModelFromTosca(toscaModelYaml); - - assertThat(policyModelsService.getAllPolicyModels()).contains(policyModel); - - assertThat(policyModelsService.getPolicyModelTosca(policyModel.getPolicyModelType(), - policyModel.getVersion())).contains(toscaModelYaml); - } - - /** - * This tests a update Policy Model. - * - * @throws IOException In case of failure - */ - @Test - @Transactional - public void shouldUpdatePolicyModel() throws IOException { - String toscaModelYaml = - ResourceFileUtils.getResourceAsString("tosca/tosca_with_metadata.yaml"); - PolicyModel policyModel = policyModelsService.createNewPolicyModelFromTosca(toscaModelYaml); - String newToscaModelYaml = - ResourceFileUtils.getResourceAsString("tosca/tosca_metadata_clamp_possible_values.yaml"); - - PolicyModel updatedPolicyModel = policyModelsService.updatePolicyModelTosca( - policyModel.getPolicyModelType(), policyModel.getVersion(), newToscaModelYaml); - - assertThat(updatedPolicyModel.getPolicyModelTosca()).isEqualTo(newToscaModelYaml); - - } - - /** - * This tests a getAllPolicyModelTypes get. - */ - @Test - @Transactional - public void shouldReturnAllPolicyModelTypes() { - // given - PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel1); - PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel2); - List policyModelTypesList = policyModelsService.getAllPolicyModelTypes(); - - assertThat(policyModelTypesList).contains(policyModel1.getPolicyModelType(), - policyModel2.getPolicyModelType()); - } - - /** - * This tests a getAllPolicyModels get. - */ - @Test - @Transactional - public void shouldReturnAllPolicyModels() { - PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel1); - PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel2); - - assertThat(policyModelsService.getAllPolicyModels()).contains(policyModel1, policyModel2); - } - - /** - * This tests a getAllPolicyModelsByType get. - */ - @Test - @Transactional - public void shouldReturnAllModelsByType() { - PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel1); - PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel2); - - assertThat(policyModelsService.getAllPolicyModelsByType(POLICY_MODEL_TYPE_2)) - .contains(policyModel1, policyModel2); - } - - /** - * This tests the sorting of policyModel. - */ - @Test - @Transactional - public void shouldReturnSortedSet() { - PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel1); - PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel2); - PolicyModel policyModel3 = getPolicyModel(POLICY_MODEL_TYPE_3, "yaml", - POLICY_MODEL_TYPE_3_VERSION_1, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel3); - - SortedSet sortedSet = new TreeSet<>(); - policyModelsService.getAllPolicyModels().forEach(sortedSet::add); - List listToCheck = - sortedSet - .stream().filter(policy -> policy.equals(policyModel3) - || policy.equals(policyModel2) || policy.equals(policyModel1)) - .collect(Collectors.toList()); - assertThat(listToCheck.get(0)).isEqualByComparingTo(policyModel2); - assertThat(listToCheck.get(1)).isEqualByComparingTo(policyModel1); - assertThat(listToCheck.get(2)).isEqualByComparingTo(policyModel3); - } - - /** - * This tests the pdpgroup GSON encode/decode and saving. - */ - @Test - @Transactional - public void shouldAddPdpGroupInfo() { - PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_1, "yaml", - POLICY_MODEL_TYPE_1_VERSION_1, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel1); - PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", - POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel2); - PolicyModel policyModel3 = getPolicyModel(POLICY_MODEL_TYPE_3, "yaml", - POLICY_MODEL_TYPE_3_VERSION_1, "TEST", "VARIANT", "user"); - policyModelsService.saveOrUpdatePolicyModel(policyModel3); - - PolicyModelKey type1 = new PolicyModelKey("org.onap.testos", "1.0.0"); - PolicyModelKey type2 = new PolicyModelKey("org.onap.testos2", "2.0.0"); - - PdpSubgroup pdpSubgroup1 = new PdpSubgroup(); - pdpSubgroup1.setPdpType("subGroup1"); - List pdpTypeList = new LinkedList(); - pdpTypeList.add(type1); - pdpTypeList.add(type2); - pdpSubgroup1.setSupportedPolicyTypes(pdpTypeList); - - PolicyModelKey type3 = new PolicyModelKey("org.onap.testos3", "2.0.0"); - PdpSubgroup pdpSubgroup2 = new PdpSubgroup(); - pdpSubgroup2.setPdpType("subGroup2"); - List pdpTypeList2 = new LinkedList(); - pdpTypeList2.add(type2); - pdpTypeList2.add(type3); - pdpSubgroup2.setSupportedPolicyTypes(pdpTypeList2); - - List pdpSubgroupList = new LinkedList(); - pdpSubgroupList.add(pdpSubgroup1); - - PdpGroup pdpGroup1 = new PdpGroup(); - pdpGroup1.setName("pdpGroup1"); - pdpGroup1.setPdpGroupState("ACTIVE"); - pdpGroup1.setPdpSubgroups(pdpSubgroupList); - - List pdpSubgroupList2 = new LinkedList(); - pdpSubgroupList2.add(pdpSubgroup1); - pdpSubgroupList2.add(pdpSubgroup2); - PdpGroup pdpGroup2 = new PdpGroup(); - pdpGroup2.setName("pdpGroup2"); - pdpGroup2.setPdpGroupState("ACTIVE"); - pdpGroup2.setPdpSubgroups(pdpSubgroupList2); - - List pdpGroupList = new LinkedList(); - pdpGroupList.add(pdpGroup1); - pdpGroupList.add(pdpGroup2); - policyModelsService.updatePdpGroupInfo(pdpGroupList); - - JsonObject res1 = - policyModelsService.getPolicyModel("org.onap.testos", "1.0.0").getPolicyPdpGroup(); - String expectedRes1 = - "{\"supportedPdpGroups\":[{\"pdpGroup1\":[\"subGroup1\"]},{\"pdpGroup2\":[\"subGroup1\"]}]}"; - JsonObject expectedJson1 = JsonUtils.GSON.fromJson(expectedRes1, JsonObject.class); - assertThat(res1).isEqualTo(expectedJson1); - - JsonObject res2 = - policyModelsService.getPolicyModel("org.onap.testos2", "2.0.0").getPolicyPdpGroup(); - String expectedRes2 = - "{\"supportedPdpGroups\":[{\"pdpGroup1\":[\"subGroup1\"]},{\"pdpGroup2\":[\"subGroup1\",\"subGroup2\"]}]}"; - JsonObject expectedJson2 = JsonUtils.GSON.fromJson(expectedRes2, JsonObject.class); - assertThat(res2).isEqualTo(expectedJson2); - - JsonObject res3 = - policyModelsService.getPolicyModel("org.onap.testos3", "1.0.0").getPolicyPdpGroup(); - assertThat(res3).isNull(); - } -} diff --git a/src/test/java/org/onap/clamp/loop/ServiceTest.java b/src/test/java/org/onap/clamp/loop/ServiceTest.java deleted file mode 100644 index 7507d42e9..000000000 --- a/src/test/java/org/onap/clamp/loop/ServiceTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.loop; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonObject; -import org.junit.Test; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.service.Service; - -public class ServiceTest { - - @Test - public void equalMethodTest() { - String serviceStr1 = "{\"name\": \"vLoadBalancerMS\", \"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fce0\"}"; - String serviceStr2 = "{\"name\": \"vLoadBalancerMS2\", \"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fce0\"}"; - String serviceStr3 = "{\"name\": \"vLoadBalancerMS\",\"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fc11\"}"; - String resourceStr = "{\"CP\": {}}"; - - Service service1 = new Service(JsonUtils.GSON.fromJson(serviceStr1, JsonObject.class), - JsonUtils.GSON.fromJson(resourceStr, JsonObject.class), "1.0"); - - Service service2 = new Service(JsonUtils.GSON.fromJson(serviceStr2, JsonObject.class), null, "1.0"); - - Service service3 = new Service(JsonUtils.GSON.fromJson(serviceStr3, JsonObject.class), - JsonUtils.GSON.fromJson(resourceStr, JsonObject.class), "1.0"); - - assertThat(service1.equals(service2)).isEqualTo(true); - assertThat(service1.equals(service3)).isEqualTo(false); - } - -} diff --git a/src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java b/src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java deleted file mode 100644 index 8a5b5876f..000000000 --- a/src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java +++ /dev/null @@ -1,125 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications copyright (c) 2019 Nokia - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.clamp.loop.deploy; - -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.LinkedHashSet; -import org.junit.Assert; -import org.junit.Test; -import org.mockito.Mockito; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.Loop; -import org.onap.clamp.loop.template.LoopElementModel; -import org.onap.clamp.loop.template.LoopTemplate; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; - -public class BlueprintInputParametersTest { - - /** - * getDeploymentParametersinJsonMultiBlueprintsTest. - * - * @throws IOException in case of failure - * @throws SdcToscaParserException in case of failure - */ - @Test - public void getDeploymentParametersinJsonMultiBlueprintsTest() throws IOException, SdcToscaParserException { - - - MicroServicePolicy umService1 = Mockito.mock(MicroServicePolicy.class); - Mockito.when(umService1.getName()).thenReturn("testName1"); - - LoopElementModel loopElement = Mockito.mock(LoopElementModel.class); - String blueprint1 = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca.yaml"); - Mockito.when(loopElement.getBlueprint()).thenReturn(blueprint1); - Mockito.when(umService1.getLoopElementModel()).thenReturn(loopElement); - - MicroServicePolicy umService2 = Mockito.mock(MicroServicePolicy.class); - Mockito.when(umService2.getName()).thenReturn("testName2"); - - LoopElementModel loopElement2 = Mockito.mock(LoopElementModel.class); - String blueprint2 = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca_2.yaml"); - Mockito.when(loopElement2.getBlueprint()).thenReturn(blueprint2); - Mockito.when(umService2.getLoopElementModel()).thenReturn(loopElement2); - - MicroServicePolicy umService3 = Mockito.mock(MicroServicePolicy.class); - Mockito.when(umService3.getName()).thenReturn("testName3"); - - LoopElementModel loopElement3 = Mockito.mock(LoopElementModel.class); - String blueprint3 = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca_3.yaml"); - Mockito.when(loopElement3.getBlueprint()).thenReturn(blueprint3); - Mockito.when(umService3.getLoopElementModel()).thenReturn(loopElement3); - - LinkedHashSet umServiceSet = new LinkedHashSet<>(); - umServiceSet.add(umService1); - umServiceSet.add(umService2); - umServiceSet.add(umService3); - Loop loop = Mockito.mock(Loop.class); - Mockito.when(loop.getMicroServicePolicies()).thenReturn(umServiceSet); - - LoopTemplate template = Mockito.mock(LoopTemplate.class); - Mockito.when(template.getUniqueBlueprint()).thenReturn(false); - Mockito.when(loop.getLoopTemplate()).thenReturn(template); - - JsonObject paramJson = DcaeDeployParameters.getDcaeDeploymentParametersInJson(loop); - - Assert.assertEquals(JsonUtils.GSON_JPA_MODEL.toJson(paramJson), - ResourceFileUtils.getResourceAsString( - "example/sdc/expected-result/deployment-parameters-multi-blueprints.json")); - } - - /** - * getDeploymentParametersInJsonSingleBlueprintTest. - * - * @throws IOException In case of failure - * @throws SdcToscaParserException In case of failure - */ - @Test - public void getDeploymentParametersInJsonSingleBlueprintTest() throws IOException, SdcToscaParserException { - Loop loop = Mockito.mock(Loop.class); - - MicroServicePolicy umService1 = Mockito.mock(MicroServicePolicy.class); - Mockito.when(umService1.getName()).thenReturn("testName1"); - LinkedHashSet umServiceSet = new LinkedHashSet(); - umServiceSet.add(umService1); - Mockito.when(loop.getMicroServicePolicies()).thenReturn(umServiceSet); - - LoopTemplate template = Mockito.mock(LoopTemplate.class); - Mockito.when(template.getUniqueBlueprint()).thenReturn(true); - String blueprint = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca.yaml"); - Mockito.when(template.getBlueprint()).thenReturn(blueprint); - Mockito.when(loop.getLoopTemplate()).thenReturn(template); - - JsonObject paramJson = DcaeDeployParameters.getDcaeDeploymentParametersInJson(loop); - - Assert.assertEquals(JsonUtils.GSON_JPA_MODEL.toJson(paramJson), - ResourceFileUtils.getResourceAsString( - "example/sdc/expected-result/deployment-parameters-single-blueprint.json")); - } -} diff --git a/src/test/java/org/onap/clamp/policy/downloader/PolicyEngineControllerTestItCase.java b/src/test/java/org/onap/clamp/policy/downloader/PolicyEngineControllerTestItCase.java deleted file mode 100644 index 47afb91c4..000000000 --- a/src/test/java/org/onap/clamp/policy/downloader/PolicyEngineControllerTestItCase.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.onap.clamp.policy.downloader; -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 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============================================ - * =================================================================== - * - */ - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; -import java.io.IOException; -import java.time.Instant; -import java.util.List; -import javax.transaction.Transactional; -import org.json.simple.parser.ParseException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.loop.template.PolicyModel; -import org.onap.clamp.loop.template.PolicyModelId; -import org.onap.clamp.loop.template.PolicyModelsRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -@ActiveProfiles({"clamp-default", "clamp-policy-controller"}) -public class PolicyEngineControllerTestItCase { - - @Autowired - PolicyEngineController policyController; - - @Autowired - PolicyModelsRepository policyModelsRepository; - - /** - * This method tests a fake synchronization with the emulator. - * - * @throws JsonSyntaxException In case of issues - * @throws IOException In case of issues - * @throws InterruptedException In case of issues - */ - @Test - @Transactional - public void synchronizeAllPoliciesTest() throws JsonSyntaxException, IOException, InterruptedException { - policyController.synchronizeAllPolicies(); - Instant firstExecution = policyController.getLastInstantExecuted(); - assertThat(firstExecution).isNotNull(); - List policyModelsList = policyModelsRepository.findAll(); - assertThat(policyModelsList.size()).isGreaterThanOrEqualTo(5); - assertThat(policyModelsList).contains(new PolicyModel("onap.policies.controlloop.operational.common.Drools", - null, "1.0.0")); - assertThat(policyModelsList).contains(new PolicyModel("onap.policies.controlloop.operational.common.Apex", - null, "1.0.0")); - assertThat(policyModelsList) - .contains(new PolicyModel("onap.policies.controlloop.guard.common.FrequencyLimiter", null, "1.0.0")); - assertThat(policyModelsList) - .contains(new PolicyModel("onap.policies.controlloop.guard.common.Blacklist", null, "1.0.0")); - assertThat(policyModelsList) - .contains(new PolicyModel("onap.policies.controlloop.guard.common.MinMax", null, "2.0.0")); - - // Re-do it to check that there is no issue with duplicate key - policyController.synchronizeAllPolicies(); - Instant secondExecution = policyController.getLastInstantExecuted(); - assertThat(secondExecution).isNotNull(); - - assertThat(firstExecution).isBefore(secondExecution); - } - - @Test - @Transactional - public void downloadPdpGroupsTest() throws JsonSyntaxException, IOException, InterruptedException, ParseException { - PolicyModel policyModel1 = new PolicyModel("onap.policies.monitoring.test", null, "1.0.0"); - policyModelsRepository.saveAndFlush(policyModel1); - PolicyModel policyModel2 = new PolicyModel("onap.policies.controlloop.Operational", null, "1.0.0"); - policyModelsRepository.saveAndFlush(policyModel2); - - policyController.downloadPdpGroups(); - - List policyModelsList = policyModelsRepository.findAll(); - assertThat(policyModelsList.size()).isGreaterThanOrEqualTo(2); - - PolicyModel policy1 = policyModelsRepository - .getOne(new PolicyModelId("onap.policies.monitoring.test", "1.0.0")); - PolicyModel policy2 = policyModelsRepository - .getOne(new PolicyModelId("onap.policies.controlloop.Operational", "1.0.0")); - - String expectedRes1 = "{\"supportedPdpGroups\":[{\"monitoring\":[\"xacml\"]}]}"; - JsonObject expectedJson1 = JsonUtils.GSON.fromJson(expectedRes1, JsonObject.class); - assertThat(policy1.getPolicyPdpGroup()).isEqualTo(expectedJson1); - String expectedRes2 = "{\"supportedPdpGroups\":[{\"controlloop\":[\"apex\",\"drools\"]}]}"; - JsonObject expectedJson2 = JsonUtils.GSON.fromJson(expectedRes2, JsonObject.class); - assertThat(policy2.getPolicyPdpGroup()).isEqualTo(expectedJson2); - - } -} diff --git a/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java b/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java deleted file mode 100644 index c43e62403..000000000 --- a/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.microservice; - -import com.google.gson.JsonObject; -import java.io.IOException; -import org.junit.Test; -import org.onap.clamp.clds.util.JsonUtils; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.template.PolicyModel; -import org.skyscreamer.jsonassert.JSONAssert; - -public class MicroServicePayloadTest { - - @Test - public void testPayloadConstruction() throws IOException { - MicroServicePolicy policy = new MicroServicePolicy("testPolicy", new PolicyModel( - "onap.policies.monitoring.cdap.tca.hi.lo.app", - ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"), "1.0.0"), false, null, null, null, - null); - policy.setConfigurationsJson(JsonUtils.GSON.fromJson( - ResourceFileUtils.getResourceAsString("tosca/micro-service-policy-properties.json"), JsonObject.class)); - JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/micro-service-policy-payload.json"), - policy.createPolicyPayload(), false); - } -} diff --git a/src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java b/src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java deleted file mode 100644 index 322548bb4..000000000 --- a/src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.operational; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import java.io.IOException; -import org.junit.Test; -import org.onap.clamp.clds.util.ResourceFileUtils; -import org.onap.clamp.loop.service.Service; -import org.skyscreamer.jsonassert.JSONAssert; - -public class OperationalPolicyRepresentationBuilderTest { - - @Test - public void testOperationalPolicyPayloadConstruction() throws IOException { - JsonObject jsonModel = new GsonBuilder().create().fromJson(ResourceFileUtils - .getResourceAsString("tosca/model-properties-operational-policy.json"), JsonObject.class); - Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(), - jsonModel.get("resourceDetails").getAsJsonObject(), "1.0"); - - JsonObject jsonSchema = OperationalPolicyRepresentationBuilder.generateOperationalPolicySchema(service); - - assertThat(jsonSchema).isNotNull(); - - JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/operational-policy-json-schema.json"), - new GsonBuilder().create().toJson(jsonSchema), false); - } - - @Test - public void testOperationalPolicyPayloadConstructionForCds() throws IOException { - JsonObject jsonModel = new GsonBuilder().create() - .fromJson(ResourceFileUtils.getResourceAsString("tosca/model-properties-cds.json"), JsonObject.class); - Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(), - jsonModel.get("resourceDetails").getAsJsonObject(), - "1.0"); - - JsonObject jsonSchema = OperationalPolicyRepresentationBuilder.generateOperationalPolicySchema(service); - assertThat(jsonSchema).isNotNull(); - JSONAssert.assertEquals( - ResourceFileUtils.getResourceAsString("tosca/operational-policy-cds-payload-with-list.json"), - new GsonBuilder().create().toJson(jsonSchema), false); - } -} diff --git a/src/test/java/org/onap/clamp/policy/pdpgroup/PdpGroupTest.java b/src/test/java/org/onap/clamp/policy/pdpgroup/PdpGroupTest.java deleted file mode 100644 index 46980d19f..000000000 --- a/src/test/java/org/onap/clamp/policy/pdpgroup/PdpGroupTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.pdpgroup; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; -import org.junit.Test; - -public class PdpGroupTest { - - - @Test - public void testGetSupportedSubgroups() throws IOException { - PdpGroup pdpGroup1 = new PdpGroup(); - pdpGroup1.setName("pdpGroup1"); - pdpGroup1.setPdpGroupState("INACTIVE"); - assertThat(pdpGroup1.getSupportedSubgroups("test", "1.0.0")).isNull(); - - PdpGroup pdpGroup2 = new PdpGroup(); - pdpGroup2.setName("pdpGroup2"); - pdpGroup2.setPdpGroupState("ACTIVE"); - - PolicyModelKey type1 = new PolicyModelKey("type1", "1.0.0"); - PolicyModelKey type2 = new PolicyModelKey("type2", "2.0.0"); - - PdpSubgroup pdpSubgroup1 = new PdpSubgroup(); - pdpSubgroup1.setPdpType("subGroup1"); - List pdpTypeList = new LinkedList(); - pdpTypeList.add(type1); - pdpTypeList.add(type2); - pdpSubgroup1.setSupportedPolicyTypes(pdpTypeList); - - PolicyModelKey type3 = new PolicyModelKey("type3", "1.0.0"); - PdpSubgroup pdpSubgroup2 = new PdpSubgroup(); - pdpSubgroup2.setPdpType("subGroup2"); - List pdpTypeList2 = new LinkedList(); - pdpTypeList2.add(type2); - pdpTypeList2.add(type3); - pdpSubgroup2.setSupportedPolicyTypes(pdpTypeList2); - - List pdpSubgroupList = new LinkedList(); - pdpSubgroupList.add(pdpSubgroup1); - pdpSubgroupList.add(pdpSubgroup2); - pdpGroup2.setPdpSubgroups(pdpSubgroupList); - - JsonObject res1 = pdpGroup2.getSupportedSubgroups("type2", "2.0.0"); - assertThat(res1.get("pdpGroup2")).isNotNull(); - JsonArray resSubList = res1.getAsJsonArray("pdpGroup2"); - assertThat(resSubList.size()).isEqualTo(2); - assertThat(resSubList.toString().contains("subGroup1")).isTrue(); - assertThat(resSubList.toString().contains("subGroup2")).isTrue(); - - JsonObject res2 = pdpGroup2.getSupportedSubgroups("type1", "1.0.0"); - assertThat(res2.get("pdpGroup2")).isNotNull(); - JsonArray resSubList2 = res2.getAsJsonArray("pdpGroup2"); - assertThat(resSubList2.size()).isEqualTo(1); - - assertThat(pdpGroup2.getSupportedSubgroups("type3", "1.0.1")).isNull(); - } -} diff --git a/src/test/java/org/onap/clamp/policy/pdpgroup/PolicyModelKeyTest.java b/src/test/java/org/onap/clamp/policy/pdpgroup/PolicyModelKeyTest.java deleted file mode 100644 index 3befcf2d3..000000000 --- a/src/test/java/org/onap/clamp/policy/pdpgroup/PolicyModelKeyTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.policy.pdpgroup; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.IOException; -import org.junit.Test; - -public class PolicyModelKeyTest { - - @Test - public void testEqualsMethod() throws IOException { - PolicyModelKey key1 = new PolicyModelKey("name1", "1.0.0"); - PolicyModelKey key2 = new PolicyModelKey(null, "1.0.0"); - PolicyModelKey key3 = new PolicyModelKey("name1", null); - - assertThat(key1.equals(null)).isFalse(); - assertThat(key1.equals("key2")).isFalse(); - - assertThat(key2.equals(key1)).isFalse(); - assertThat(key3.equals(key1)).isFalse(); - - PolicyModelKey key4 = new PolicyModelKey("name2", "1.0.0"); - PolicyModelKey key5 = new PolicyModelKey("name1", "2.0.0"); - assertThat(key1.equals(key4)).isFalse(); - assertThat(key1.equals(key5)).isFalse(); - - PolicyModelKey key6 = new PolicyModelKey("name(.*)", "1.0.0"); - PolicyModelKey key7 = new PolicyModelKey("name1", "1.0.0"); - assertThat(key1.equals(key6)).isTrue(); - assertThat(key1.equals(key7)).isTrue(); - } -} diff --git a/src/test/java/org/onap/clamp/tosca/DictionaryServiceItCase.java b/src/test/java/org/onap/clamp/tosca/DictionaryServiceItCase.java deleted file mode 100644 index 55d347ceb..000000000 --- a/src/test/java/org/onap/clamp/tosca/DictionaryServiceItCase.java +++ /dev/null @@ -1,247 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.tosca; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.List; -import javax.persistence.EntityNotFoundException; -import javax.transaction.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.clamp.clds.Application; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class DictionaryServiceItCase { - - @Autowired - private DictionaryService dictionaryService; - - @Autowired - private DictionaryElementsRepository dictionaryElementsRepository; - - private DictionaryElement getDictionaryElement(String shortName, String name, - String description, String type, String subDictionaryName) { - - return new DictionaryElement(name, shortName, description, type, subDictionaryName); - - } - - private Dictionary getSimpleDictionaryExample() { - - Dictionary dictionary = new Dictionary("Dictionary1", 0, null); - - dictionary.addDictionaryElements(getDictionaryElement("DE1", "DictionaryElement1", - "DictionaryElement1", "string", null)); - - dictionary.addDictionaryElements(getDictionaryElement("DE2", "DictionaryElement2", - "DictionaryElement2", "number", null)); - - return dictionary; - } - - private Dictionary getSecondaryDictionaryExample() { - - Dictionary dictionary = new Dictionary("SecondaryDict", 1, "string"); - - dictionary.addDictionaryElements(getDictionaryElement("SDE1", "SecondaryDictElement1", - "SecondaryDictElement1", "string", null)); - - dictionary.addDictionaryElements(getDictionaryElement("SDE2", "SecondaryDictElement2", - "SecondaryDictElement2", "string", null)); - - return dictionary; - } - - /** - * Test to validate that Dictionary is created. - */ - @Test - @Transactional - public void shouldCreateDictionary() { - Dictionary dictionary = getSimpleDictionaryExample(); - Dictionary actualDictionary = dictionaryService.saveOrUpdateDictionary(dictionary); - assertNotNull(actualDictionary); - assertThat(actualDictionary).isEqualTo(dictionary); - assertThat(actualDictionary.getName()).isEqualTo(dictionary.getName()); - - assertThat(actualDictionary.getDictionaryElements()).contains( - dictionaryElementsRepository.findById("DE1").get(), - dictionaryElementsRepository.findById("DE2").get()); - } - - /** - * Test to validate a DictionaryElement is created for a Dictionary. - */ - @Test - @Transactional - public void shouldCreateorUpdateDictionaryElement() { - Dictionary dictionary = getSimpleDictionaryExample(); - Dictionary actualDictionary = dictionaryService.saveOrUpdateDictionary(dictionary); - DictionaryElement dictionaryElement = - getDictionaryElement("DictionaryElement3", "DE3", "DictionaryElement3", "date", null); - actualDictionary.addDictionaryElements(dictionaryElement); - Dictionary updatedDictionary = dictionaryService - .saveOrUpdateDictionaryElement(actualDictionary.getName(), actualDictionary); - assertNotNull(updatedDictionary); - assertTrue(updatedDictionary.getDictionaryElements().contains(dictionaryElement)); - assertThat(updatedDictionary.getName()).isEqualTo(actualDictionary.getName()); - // update the dictionary element. - dictionaryElement.setDescription("DictionaryElement3 New Description"); - Dictionary dictionary3 = new Dictionary("Dictionary1", 0, null); - dictionary3.addDictionaryElements(dictionaryElement); - Dictionary updatedDictionary2 = - dictionaryService.saveOrUpdateDictionaryElement(dictionary3.getName(), dictionary3); - - assertNotNull(updatedDictionary2); - assertTrue(updatedDictionary2.getDictionaryElements().contains(dictionaryElement)); - updatedDictionary2.getDictionaryElements().forEach(element -> { - if (element.equals(dictionaryElement)) { - assertTrue(element.getDescription().equals(dictionaryElement.getDescription())); - } - }); - - } - - /** - * Test to validate that All Dictionaries are retrieved. - */ - @Test - @Transactional - public void shouldReturnAllDictionaries() { - Dictionary dictionary = getSimpleDictionaryExample(); - Dictionary secondaryDictionary = getSecondaryDictionaryExample(); - dictionaryService.saveOrUpdateDictionary(dictionary); - dictionaryService.saveOrUpdateDictionary(secondaryDictionary); - - List list = dictionaryService.getAllDictionaries(); - assertNotNull(list); - assertThat(list).contains(dictionary, secondaryDictionary); - } - - /** - * Test to validate one Dictionary is returned. - */ - @Test - @Transactional - public void shouldReturnOneDictionary() { - Dictionary dictionary = getSimpleDictionaryExample(); - dictionaryService.saveOrUpdateDictionary(dictionary); - - Dictionary returnedDictionary = dictionaryService.getDictionary("Dictionary1"); - assertNotNull(returnedDictionary); - assertThat(returnedDictionary).isEqualTo(dictionary); - assertThat(returnedDictionary.getDictionaryElements()) - .isEqualTo(dictionary.getDictionaryElements()); - } - - /** - * Test to validate one Dictionary is returned. - */ - @Test - @Transactional - public void shouldReturnEntityNotFoundException() { - try { - dictionaryService.getDictionary("Test"); - } catch (Exception e) { - assertThat(e).isInstanceOf(EntityNotFoundException.class); - assertTrue(e.getMessage().equals("Couldn't find Dictionary named: Test")); - } - } - - /** - * Test to validate Dictionary is deleted. - */ - @Test - @Transactional - public void shouldDeleteDictionaryByObject() { - Dictionary dictionary = getSimpleDictionaryExample(); - Dictionary returnedDictionary = dictionaryService.saveOrUpdateDictionary(dictionary); - - dictionaryService.deleteDictionary(returnedDictionary); - try { - dictionaryService.getDictionary("Dictionary1"); - } catch (EntityNotFoundException e) { - assertTrue(e.getMessage().equals("Couldn't find Dictionary named: Dictionary1")); - } - } - - /** - * Test to validate Dictionary is deleted by Name. - */ - @Test - @Transactional - public void shouldDeleteDictionaryByName() { - Dictionary dictionary = getSimpleDictionaryExample(); - dictionaryService.saveOrUpdateDictionary(dictionary); - dictionaryService.deleteDictionary(dictionary.getName()); - try { - dictionaryService.getDictionary("Dictionary1"); - } catch (EntityNotFoundException e) { - assertTrue(e.getMessage().equals("Couldn't find Dictionary named: Dictionary1")); - } - } - - /** - * Test to validate DictionaryElements is deleted by Name. - */ - @Test - @Transactional - public void shouldDeleteDictionaryElementsByName() { - Dictionary dictionary = getSimpleDictionaryExample(); - dictionaryService.saveOrUpdateDictionary(dictionary); - DictionaryElement dictionaryElement = - dictionaryElementsRepository.findById("DE1").orElse(null); - assertNotNull(dictionaryElement); - dictionaryService.deleteDictionaryElement("Dictionary1", "DE1"); - dictionary = dictionaryService.getDictionary("Dictionary1"); - DictionaryElement deletedDictionaryElement = - dictionaryElementsRepository.findById("DE1").orElse(null); - assertThat(deletedDictionaryElement).isNotIn(dictionary.getDictionaryElements()); - } - - /** - * Test to validate all secondary level dictionary names are returned. - */ - @Test - @Transactional - public void shouldReturnAllSecondaryLevelDictionaryNames() { - Dictionary dictionary = getSecondaryDictionaryExample(); - dictionaryService.saveOrUpdateDictionary(dictionary); - - Dictionary dictionary2 = new Dictionary("SecondaryDict2", 1, "string"); - dictionaryService.saveOrUpdateDictionary(dictionary2); - List secondaryDictionaryNames = - dictionaryService.getAllSecondaryLevelDictionaryNames(); - - assertNotNull(secondaryDictionaryNames); - assertThat(secondaryDictionaryNames).contains(dictionary.getName(), dictionary2.getName()); - } -} diff --git a/src/test/java/org/onap/clamp/util/PassDecoderTest.java b/src/test/java/org/onap/clamp/util/PassDecoderTest.java deleted file mode 100644 index e5de8b0a8..000000000 --- a/src/test/java/org/onap/clamp/util/PassDecoderTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.util; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -import org.junit.Test; - -public class PassDecoderTest { - - private final String encrypted = "enc:WWCxchk4WGBNSvuzLq3MLjMs5ObRybJtts5AI0XD1Vc"; - - @Test - public final void testDecryptionNoKeyfile() throws Exception { - String decodedPass = PassDecoder.decode(encrypted, null); - assertEquals(decodedPass, encrypted); - } - - @Test - public final void testDecryptionNoPassword() throws Exception { - String decodedPass = PassDecoder.decode(null, "classpath:clds/aaf/org.onap.clamp.keyfile"); - assertNull(decodedPass); - } - - @Test - public final void testDecryption() throws Exception { - String decodedPass = PassDecoder.decode(encrypted, "classpath:clds/aaf/org.onap.clamp.keyfile"); - assertEquals(decodedPass, "China in the Spring"); - } -} diff --git a/src/test/java/org/onap/clamp/util/SemanticVersioningTest.java b/src/test/java/org/onap/clamp/util/SemanticVersioningTest.java deleted file mode 100644 index 88f2bbe1b..000000000 --- a/src/test/java/org/onap/clamp/util/SemanticVersioningTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END============================================ - * =================================================================== - * - */ - -package org.onap.clamp.util; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; - -public class SemanticVersioningTest { - - /** - * compare test. - */ - @Test - public void compareTest() { - assertThat(SemanticVersioning.compare("1.0.0", "2.0.0")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("1.5.0", "2.0.0")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("1.5.0", "2.1.0")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("1.5.3", "2.0.0")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("2.5.3", "2.6.0")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("2.5", "2.5.1")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("2.5.0", "2.5.1")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("2.5.0.0", "2.5.1")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("2.5.1.0", "2.5.1")).isEqualTo(1); - - assertThat(SemanticVersioning.compare("2.0.0", "1.0.0")).isEqualTo(1); - assertThat(SemanticVersioning.compare("2.0.0", "1.5.0")).isEqualTo(1); - assertThat(SemanticVersioning.compare("2.1.0", "1.5.0")).isEqualTo(1); - assertThat(SemanticVersioning.compare("2.0.0", "1.5.3")).isEqualTo(1); - assertThat(SemanticVersioning.compare("2.6.0", "2.5.3")).isEqualTo(1); - assertThat(SemanticVersioning.compare("2.5.1", "2.5")).isEqualTo(1); - assertThat(SemanticVersioning.compare("2.5.1", "2.5.0")).isEqualTo(1); - assertThat(SemanticVersioning.compare("2.5.1", "2.5.0.0")).isEqualTo(1); - assertThat(SemanticVersioning.compare("1", "1.2.3.0")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("1.2", "1")).isEqualTo(1); - } - - /** - * Compare test. - */ - @Test - public void compareEqualsTest() { - assertThat(SemanticVersioning.compare("1.0.0", "1.0.0")).isEqualTo(0); - assertThat(SemanticVersioning.compare("1.0.0.0", "1.0.0")).isEqualTo(1); - assertThat(SemanticVersioning.compare("1.2.3", "1.2.3")).isEqualTo(0); - assertThat(SemanticVersioning.compare("1.2.3", "1.2.3.0")).isEqualTo(-1); - - } - - /** - * Compare with null. - */ - @Test - public void compareNullTest() { - assertThat(SemanticVersioning.compare(null, null)).isEqualTo(0); - assertThat(SemanticVersioning.compare(null, "1.0")).isEqualTo(-1); - assertThat(SemanticVersioning.compare("1.0", null)).isEqualTo(1); - } - - /** - * Increment major version test. - */ - @Test - public void incrementVersionTest() { - assertThat(SemanticVersioning.incrementMajorVersion("1.0")).isEqualTo("2.0.0"); - assertThat(SemanticVersioning.incrementMajorVersion("1.0.0")).isEqualTo("2.0.0"); - assertThat(SemanticVersioning.incrementMajorVersion("1")).isEqualTo("2.0.0"); - assertThat(SemanticVersioning.incrementMajorVersion("1.2.3")).isEqualTo("2.0.0"); - } -} diff --git a/src/test/java/org/onap/policy/clamp/clds/client/CdsServicesTest.java b/src/test/java/org/onap/policy/clamp/clds/client/CdsServicesTest.java new file mode 100644 index 000000000..6e5300e23 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/client/CdsServicesTest.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.clds.client; + +import com.google.gson.JsonObject; +import java.io.IOException; +import org.junit.Test; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.skyscreamer.jsonassert.JSONAssert; + +public class CdsServicesTest { + + @Test + public void testParseCdsListTypeProperties() throws IOException { + String cdsResponse = ResourceFileUtils + .getResourceAsString("example/cds-response/vFW-CDS-resource-assignment-workflow.json"); + CdsServices services = new CdsServices(); + JsonObject output = services.parseCdsResponse(cdsResponse); + JSONAssert.assertEquals(ResourceFileUtils + .getResourceAsString("example/cds-response/vFW-CDS-resource-assignment-wf-expected-result.json"), + JsonUtils.GSON.toJson(output), true); + } + + @Test + public void testParseCdsResponse() throws IOException { + String cdsResponse = ResourceFileUtils + .getResourceAsString("example/cds-response/vFW-CDS-modify-config-workflow.json"); + CdsServices services = new CdsServices(); + JsonObject output = services.parseCdsResponse(cdsResponse); + JSONAssert.assertEquals(ResourceFileUtils + .getResourceAsString("example/cds-response/vFW-CDS-modify-config-wf-expected-result.json"), + JsonUtils.GSON.toJson(output), true); + } + +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoderTest.java b/src/test/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoderTest.java new file mode 100644 index 000000000..605ab99ae --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/config/CldsUserJsonDecoderTest.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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============================================ + * Modifications copyright (c) 2018 Nokia + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.config; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.onap.policy.clamp.authorization.CldsUser; +import org.onap.policy.clamp.clds.exception.CldsUsersException; + +public class CldsUserJsonDecoderTest { + + private String user1 = "admin1"; + private String user2 = "admin2"; + private String password = "5f4dcc3b5aa765d61d8327deb882cf99"; + private String[] normalPermissionsArray = { "permission-type-cl|dev|read", "permission-type-cl|dev|update", + "permission-type-cl-manage|dev|*", "permission-type-filter-vf|dev|*", "permission-type-template|dev|read", + "permission-type-template|dev|update" }; + private String[] incompletePermissionsArray = { "permission-type-cl|dev|*", "permission-type-cl|dev|*", + "permission-type-cl-manage|dev|*", "permission-type-filter-vf|dev|*", "permission-type-template|dev|read", + "permission-type-template|dev|update" }; + + @Test + public void testDecodingDoubleUsers() { + + // when + CldsUser[] usersArray = CldsUserJsonDecoder + .decodeJson(CldsUserJsonDecoderTest.class.getResourceAsStream("/clds/clds-users-two-users.json")); + + // then + assertThat(usersArray).hasSize(2); + assertThat(usersArray[0]).extracting(CldsUser::getUser, CldsUser::getPassword, CldsUser::getPermissionsString) + .containsExactly(user1, password, normalPermissionsArray); + + assertThat(usersArray[1]).extracting(CldsUser::getUser, CldsUser::getPassword, CldsUser::getPermissionsString) + .containsExactly(user2, password, normalPermissionsArray); + + } + + @Test + public void testDecodingNoPermission() { + // when + CldsUser[] usersArray = CldsUserJsonDecoder + .decodeJson(this.getClass().getResourceAsStream("/clds/clds-users-no-permission.json")); + + // then + assertThat(usersArray).hasSize(1); + CldsUser user = usersArray[0]; + assertThat(user.getUser()).isEqualTo(user1); + assertThat(user.getPassword()).isEqualTo(null); + assertThat(user.getPermissionsString()).isEmpty(); + } + + @Test + public void testDecodingIncompletePermissions() { + + // when + CldsUser[] usersArray = CldsUserJsonDecoder + .decodeJson(this.getClass().getResourceAsStream("/clds/clds-users-incomplete-permissions.json")); + + // then + assertThat(usersArray).hasSize(1); + CldsUser user = usersArray[0]; + assertThat(user.getUser()).isEqualTo(user1); + assertThat(user.getPassword()).isEqualTo(password); + assertThat(user.getPermissionsString()).isEqualTo(incompletePermissionsArray); + } + + @Test(expected = CldsUsersException.class) + public void shouldThrowCldsUsersException() { + // when + CldsUserJsonDecoder.decodeJson(this.getClass().getResourceAsStream("/clds/clds-parse-exception.json")); + } + +} diff --git a/src/test/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java b/src/test/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java new file mode 100644 index 000000000..89178b778 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * Modifications copyright (c) 2018 Nokia + * ================================================================================ + * + */ + +package org.onap.policy.clamp.clds.config.sdc; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import org.junit.Test; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcParametersException; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; + +/** + * This class tests the SDC Controller config. + */ +public class SdcSingleControllerConfigurationTest { + + /** + * This method loads the SDC controller configuration from a file located in the resource folder. + * + * @param fileName file for sdc controller configuration. + * @param sdcControllerName sdc controller name. + * @return instance of SdcSingleControllerConfiguration. + */ + public static SdcSingleControllerConfiguration loadControllerConfiguration(String fileName, + String sdcControllerName) { + + InputStreamReader streamReader = new InputStreamReader(ResourceFileUtils.getResourceAsStream(fileName), + StandardCharsets.UTF_8); + JsonObject jsonNode = JsonUtils.GSON.fromJson(streamReader, JsonObject.class); + + return new SdcSingleControllerConfiguration(jsonNode, sdcControllerName); + } + + @Test + public final void testTheInit() throws SdcParametersException, IOException { + SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-TLS.json", + "sdc-controller1"); + assertEquals("User", sdcConfig.getUser()); + assertEquals("ThePassword", sdcConfig.getPassword()); + assertEquals("consumerGroup", sdcConfig.getConsumerGroup()); + assertEquals("consumerId", sdcConfig.getConsumerID()); + assertEquals("environmentName", sdcConfig.getEnvironmentName()); + assertEquals("hostname:8080", sdcConfig.getAsdcAddress()); + assertEquals(10, sdcConfig.getPollingInterval()); + assertEquals(30, sdcConfig.getPollingTimeout()); + + assertThat(SdcSingleControllerConfiguration.SUPPORTED_ARTIFACT_TYPES_LIST) + .hasSameSizeAs(sdcConfig.getRelevantArtifactTypes()); + assertEquals("ThePassword", sdcConfig.getKeyStorePassword()); + assertTrue(sdcConfig.activateServerTLSAuth()); + assertThat(sdcConfig.getMsgBusAddress()).contains("localhost"); + } + + @Test(expected = SdcParametersException.class) + public final void testAllRequiredParameters() throws IOException { + SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-TLS.json", + "sdc-controller1"); + // No exception should be raised + sdcConfig.testAllRequiredParameters(); + sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-bad.json", "sdc-controller1"); + fail("Should have raised an exception"); + } + + @Test + public final void testAllRequiredParametersEmptyEncrypted() throws IOException { + SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration( + "clds/sdc-controller-config-empty-encrypted.json", "sdc-controller1"); + sdcConfig.testAllRequiredParameters(); + assertNull(sdcConfig.getKeyStorePassword()); + } + + @Test + public final void testConsumerGroupWithNull() throws IOException { + SdcSingleControllerConfiguration sdcConfig = loadControllerConfiguration("clds/sdc-controller-config-NULL.json", + "sdc-controller1"); + assertTrue(sdcConfig.getConsumerGroup() == null); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/it/AuthorizationControllerItCase.java b/src/test/java/org/onap/policy/clamp/clds/it/AuthorizationControllerItCase.java new file mode 100644 index 000000000..557a2e96c --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/it/AuthorizationControllerItCase.java @@ -0,0 +1,137 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * Modifications 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. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.it; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.Collection; +import org.apache.camel.Exchange; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.onap.policy.clamp.authorization.AuthorizationController; +import org.onap.policy.clamp.authorization.SecureServicePermission; +import org.onap.policy.clamp.clds.exception.NotAuthorizedException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Test CldsDAO calls through CldsModel and CldsEvent. This really test the DB + * and stored procedures. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class AuthorizationControllerItCase { + + @Autowired + private AuthorizationController auth; + + private static SecurityContext sc = SecurityContextHolder.getContext(); + + /** + * Setup the variable before the tests execution. + */ + @BeforeClass + public static void setupBefore() { + + sc.setAuthentication(new Authentication() { + @Override + public Collection getAuthorities() { + return Arrays.asList(new SimpleGrantedAuthority( + new SecureServicePermission("permission-type-cl", "dev", "read").getKey()), + new SimpleGrantedAuthority(new SecureServicePermission("permission-type-cl-manage", "dev", + "DEPLOY").getKey()), + new SimpleGrantedAuthority(new SecureServicePermission("permission-type-filter-vf", "dev", + "12345-55555-55555-5555").getKey())); + } + + @Override + public Object getCredentials() { + return null; + } + + @Override + public Object getDetails() { + return null; + } + + @Override + public Object getPrincipal() { + return "admin"; + } + + @Override + public boolean isAuthenticated() { + return true; + } + + @Override + public void setAuthenticated(boolean authenticatedFlag) throws IllegalArgumentException { + + } + + @Override + public String getName() { + return "admin"; + } + }); + + } + + @AfterClass + + public static void afterCleanup() { + sc.setAuthentication(null); + } + + @Test + public void testIsUserPermitted() { + assertEquals(AuthorizationController.getPrincipalName(sc), "admin"); + assertTrue(auth.isUserPermitted(new SecureServicePermission("permission-type-cl", "dev", "read"))); + assertTrue(auth.isUserPermitted(new SecureServicePermission("permission-type-cl-manage", "dev", "DEPLOY"))); + assertTrue(auth.isUserPermitted( + new SecureServicePermission("permission-type-filter-vf", "dev", "12345-55555-55555-5555"))); + assertFalse(auth.isUserPermitted(new SecureServicePermission("permission-type-cl", "test", "read"))); + } + + @Test(expected = NotAuthorizedException.class) + public void testIfAuthorizeThrowException() { + Exchange ex = Mockito.mock(Exchange.class); + auth.authorize(ex, "cl", "test", "read"); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/it/CldsHealthcheckServiceItCase.java b/src/test/java/org/onap/policy/clamp/clds/it/CldsHealthcheckServiceItCase.java new file mode 100644 index 000000000..52da63952 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/it/CldsHealthcheckServiceItCase.java @@ -0,0 +1,55 @@ +/*- + * ============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============================================ + * =================================================================== + */ + +package org.onap.policy.clamp.clds.it; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.model.CldsHealthCheck; +import org.onap.policy.clamp.clds.service.CldsHealthcheckService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Tests HealthCheck Service. + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +public class CldsHealthcheckServiceItCase { + + @Autowired + private CldsHealthcheckService cldsHealthcheckService; + + @Test + public void testGetHealthCheck() { + CldsHealthCheck cldsHealthCheck = cldsHealthcheckService.gethealthcheck(); + assertNotNull(cldsHealthCheck); + assertEquals("UP", cldsHealthCheck.getHealthCheckStatus()); + assertEquals("CLDS-APP", cldsHealthCheck.getHealthCheckComponent()); + assertEquals("OK", cldsHealthCheck.getDescription()); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/it/HttpsItCase.java b/src/test/java/org/onap/policy/clamp/clds/it/HttpsItCase.java new file mode 100644 index 000000000..9dd2130c6 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/it/HttpsItCase.java @@ -0,0 +1,159 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.it; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.nio.charset.Charset; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.apache.commons.io.FileUtils; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +/** + * Test HTTP and HTTPS settings + redirection of HTTP to HTTPS. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +@TestPropertySource(locations = "classpath:https/https-test.properties") +@DirtiesContext +public class HttpsItCase { + + @Value("${server.port}") + private String httpsPort; + @Value("${server.http-to-https-redirection.port}") + private String httpPort; + + /** + * Setup the variable before tests execution. + */ + @BeforeClass + public static void setUp() { + try { + // setup ssl context to ignore certificate errors + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) + throws java.security.cert.CertificateException { + } + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) + throws java.security.cert.CertificateException { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLContext.setDefault(ctx); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Test + public void testDesignerIndex() throws Exception { + RestTemplate template = new RestTemplate(); + final MySimpleClientHttpRequestFactory factory = new MySimpleClientHttpRequestFactory(new HostnameVerifier() { + + @Override + public boolean verify(final String hostname, final SSLSession session) { + return true; + } + }); + template.setRequestFactory(factory); + ResponseEntity entity = template.getForEntity("http://localhost:" + this.httpPort + "/swagger.html", + String.class); + assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.FOUND); + ResponseEntity httpsEntity = template + .getForEntity("https://localhost:" + this.httpsPort + "/swagger.html", String.class); + assertThat(httpsEntity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(httpsEntity.getBody()).contains("Clamp Rest API"); + } + + @Test + public void testSwaggerJson() throws Exception { + RestTemplate template = new RestTemplate(); + final MySimpleClientHttpRequestFactory factory = new MySimpleClientHttpRequestFactory(new HostnameVerifier() { + + @Override + public boolean verify(final String hostname, final SSLSession session) { + return true; + } + }); + template.setRequestFactory(factory); + ResponseEntity httpsEntity = template + .getForEntity("https://localhost:" + this.httpsPort + "/restservices/clds/api-doc", String.class); + assertThat(httpsEntity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(httpsEntity.getBody()).contains("swagger"); + FileUtils.writeStringToFile(new File("docs/swagger/swagger.json"), httpsEntity.getBody(), + Charset.defaultCharset()); + } + + /** + * Http Request Factory for ignoring SSL hostname errors. Not for production + * use! + */ + class MySimpleClientHttpRequestFactory extends SimpleClientHttpRequestFactory { + + private final HostnameVerifier verifier; + + public MySimpleClientHttpRequestFactory(final HostnameVerifier verifier) { + this.verifier = verifier; + } + + @Override + protected void prepareConnection(final HttpURLConnection connection, final String httpMethod) + throws IOException { + if (connection instanceof HttpsURLConnection) { + ((HttpsURLConnection) connection).setHostnameVerifier(this.verifier); + } + super.prepareConnection(connection, httpMethod); + } + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/it/RobotItCase.java b/src/test/java/org/onap/policy/clamp/clds/it/RobotItCase.java new file mode 100644 index 000000000..8c06929e1 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/it/RobotItCase.java @@ -0,0 +1,116 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.it; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.BuildImageResultCallback; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.model.AccessMode; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.core.DockerClientBuilder; +import com.github.dockerjava.core.command.LogContainerResultCallback; +import com.github.dockerjava.netty.NettyDockerCmdExecFactory; +import java.io.File; +import java.util.Objects; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +@TestPropertySource(locations = "classpath:robotframework/robotframework-test.properties") +@DirtiesContext +public class RobotItCase { + + @Value("${server.port}") + private String httpPort; + private static final int TIMEOUT_S = 150; + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(RobotItCase.class); + + @Test + public void robotTests() throws Exception { + File robotFolder = new File(getClass().getClassLoader().getResource("robotframework").getFile()); + Volume testsVolume = new Volume("/opt/robotframework/tests"); + DockerClient client = DockerClientBuilder + .getInstance() + .withDockerCmdExecFactory(new NettyDockerCmdExecFactory()) + .build(); + + + BuildImageResultCallback callback = new BuildImageResultCallback() { + @Override + public void onNext(BuildResponseItem item) { + System.out.println("XXX ITEM " + item); + super.onNext(item); + } + }; + + String imageId = client.buildImageCmd(robotFolder).exec(callback).awaitImageId(); + CreateContainerResponse createContainerResponse = client.createContainerCmd(imageId) + .withVolumes(testsVolume) + .withBinds( + new Bind(robotFolder.getAbsolutePath() + "/tests/", testsVolume, AccessMode.rw)) + .withEnv("CLAMP_PORT=" + httpPort) + .withStopTimeout(TIMEOUT_S) + .withNetworkMode("host") + .exec(); + String id = createContainerResponse.getId(); + client.startContainerCmd(id).exec(); + InspectContainerResponse exec; + + int tries = 0; + do { + Thread.sleep(1000); + exec = client.inspectContainerCmd(id).exec(); + tries++; + } while (exec.getState().getRunning() && tries < TIMEOUT_S); + Assert.assertEquals(exec.getState().getError(), 0L, + Objects.requireNonNull(exec.getState().getExitCodeLong()).longValue()); + LogContainerCmd logContainerCmd = client.logContainerCmd(id); + logContainerCmd.withStdOut(true).withStdErr(true); + try { + logContainerCmd.exec(new LogContainerResultCallback() { + @Override + public void onNext(Frame item) { + logger.info(item.toString()); + } + }).awaitCompletion(); + } catch (InterruptedException e) { + throw new Exception("Failed to retrieve logs of container " + id, e); + } + client.stopContainerCmd(id); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/it/config/CldsReferencePropertiesItCase.java b/src/test/java/org/onap/policy/clamp/clds/it/config/CldsReferencePropertiesItCase.java new file mode 100644 index 000000000..c8b9932cc --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/it/config/CldsReferencePropertiesItCase.java @@ -0,0 +1,64 @@ +/*- + * ============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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.it.config; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CldsReferencePropertiesItCase { + + @Autowired + private ClampProperties refProp; + + /** + * Test getting a value the properties in string. + */ + @Test + public void testGetStringValue() { + assertEquals("healthcheck", refProp.getStringValue("policy.api.userName")); + } + + /** + * Test getting prop value as a JSON Node / template. + * + * @throws IOException when JSON parsing fails + */ + @Test + public void testGetFileContent() throws IOException { + String users = ResourceFileUtils.getResourceAsString("clds/clds-users.json"); + assertEquals(users, refProp.getFileContent("files.cldsUsers")); + // Test composite key + assertEquals(users, refProp.getFileContent("files", "cldsUsers")); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/it/config/SdcControllersConfigurationItCase.java b/src/test/java/org/onap/policy/clamp/clds/it/config/SdcControllersConfigurationItCase.java new file mode 100644 index 000000000..516fc7a09 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/it/config/SdcControllersConfigurationItCase.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.clds.it.config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.gson.JsonSyntaxException; +import java.io.IOException; +import java.util.Map; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.config.sdc.SdcControllersConfiguration; +import org.onap.policy.clamp.clds.config.sdc.SdcSingleControllerConfiguration; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcParametersException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; + +/** + * This class tests the SDC Controller config. + */ +@RunWith(SpringRunner.class) +@SpringBootTest +@ActiveProfiles({"clamp-default", "clamp-default-user", "clamp-sdc-controller"}) +public class SdcControllersConfigurationItCase { + + @Autowired + private SdcControllersConfiguration sdcControllersConfiguration; + + public final void loadFile(String fileName) throws IOException { + ReflectionTestUtils.setField(sdcControllersConfiguration, "sdcControllerFile", fileName); + sdcControllersConfiguration.loadConfiguration(); + } + + @Test + public void testGetAllDefinedControllers() throws IOException { + loadFile("classpath:/clds/sdc-controllers-config.json"); + Map mapResult = sdcControllersConfiguration + .getAllDefinedControllers(); + assertTrue(mapResult.size() == 2); + assertEquals("sdc-controller1", mapResult.get("sdc-controller1").getSdcControllerName()); + assertEquals("sdc-controller2", mapResult.get("sdc-controller2").getSdcControllerName()); + } + + @Test + public void testGetSdcSingleControllerConfiguration() throws IOException { + loadFile("classpath:/clds/sdc-controllers-config.json"); + assertEquals("sdc-controller1", sdcControllersConfiguration + .getSdcSingleControllerConfiguration("sdc-controller1").getSdcControllerName()); + assertEquals("sdc-controller2", sdcControllersConfiguration + .getSdcSingleControllerConfiguration("sdc-controller2").getSdcControllerName()); + } + + @Test(expected = JsonSyntaxException.class) + public void testBadJsonLoading() throws IOException { + loadFile("classpath:/clds/sdc-controllers-config-bad.json"); + fail("Should have raised an exception"); + } + + @Test(expected = SdcParametersException.class) + public void testMissingParamInJsonLoading() throws IOException { + loadFile("classpath:/clds/sdc-controllers-config-missing-param.json"); + sdcControllersConfiguration.getAllDefinedControllers(); + fail("Should have raised an exception"); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java b/src/test/java/org/onap/policy/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java new file mode 100644 index 000000000..787118902 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java @@ -0,0 +1,152 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds.it.sdc.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.onap.policy.clamp.clds.config.ClampProperties; +import org.onap.policy.clamp.clds.config.sdc.SdcSingleControllerConfigurationTest; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcControllerException; +import org.onap.policy.clamp.clds.sdc.controller.SdcSingleController; +import org.onap.policy.clamp.clds.sdc.controller.SdcSingleControllerStatus; +import org.onap.policy.clamp.clds.sdc.controller.installer.CsarHandler; +import org.onap.policy.clamp.loop.CsarInstaller; +import org.onap.sdc.api.notification.IArtifactInfo; +import org.onap.sdc.api.notification.INotificationData; +import org.onap.sdc.api.notification.IResourceInstance; +import org.slf4j.MDC; +import org.slf4j.spi.MDCAdapter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +@ActiveProfiles({"clamp-default", "clamp-default-user", "clamp-sdc-controller"}) +public class SdcSingleControllerItCase { + + private static final String CSAR_ARTIFACT_NAME = "testArtifact.csar"; + private static final String SERVICE_UUID = "serviceUUID"; + private static final String RESOURCE1_UUID = "resource1UUID"; + private static final String RESOURCE1_INSTANCE_NAME = "sim-1802 0"; + + @Autowired + private ClampProperties clampProp; + + private SdcSingleController sdcSingleController; + + private CsarInstaller csarInstaller = mock(CsarInstaller.class); + + private INotificationData buildFakeSdcNotification() { + // BUild what is needed for CSAR + IArtifactInfo serviceArtifact = mock(IArtifactInfo.class); + Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE); + Mockito.when(serviceArtifact.getArtifactName()).thenReturn(CSAR_ARTIFACT_NAME); + List servicesList = new ArrayList<>(); + servicesList.add(serviceArtifact); + INotificationData notifData = mock(INotificationData.class); + Mockito.when(notifData.getServiceArtifacts()).thenReturn(servicesList); + // Build what is needed for UUID + Mockito.when(notifData.getServiceInvariantUUID()).thenReturn(SERVICE_UUID); + // Build fake resource with one artifact BLUEPRINT + IResourceInstance resource1 = mock(IResourceInstance.class); + Mockito.when(resource1.getResourceType()).thenReturn("VF"); + Mockito.when(resource1.getResourceInvariantUUID()).thenReturn(RESOURCE1_UUID); + Mockito.when(resource1.getResourceInstanceName()).thenReturn(RESOURCE1_INSTANCE_NAME); + // Create a fake artifact for resource + IArtifactInfo blueprintArtifact = mock(IArtifactInfo.class); + Mockito.when(blueprintArtifact.getArtifactType()).thenReturn(CsarHandler.BLUEPRINT_TYPE); + List artifactsListForResource = new ArrayList<>(); + artifactsListForResource.add(blueprintArtifact); + Mockito.when(resource1.getArtifacts()).thenReturn(artifactsListForResource); + List resourcesList = new ArrayList<>(); + resourcesList.add(resource1); + Mockito.when(notifData.getResources()).thenReturn(resourcesList); + return notifData; + } + + /** + * Initialization method. + */ + @Before + public void init() { + sdcSingleController = new SdcSingleController(clampProp, csarInstaller, SdcSingleControllerConfigurationTest + .loadControllerConfiguration("clds/sdc-controller-config-TLS.json", "sdc-controller1"), null) { + }; + } + + @Test + public void testTreatNotification() { + // when + sdcSingleController.treatNotification(buildFakeSdcNotification()); + // then + Assertions.assertThat(sdcSingleController.getNbOfNotificationsOngoing()).isEqualTo(0); + } + + @Test + public void testCloseSdc() throws SdcControllerException { + // when + sdcSingleController.closeSdc(); + // then + assertThat(sdcSingleController.getControllerStatus()).isEqualTo(SdcSingleControllerStatus.STOPPED); + } + + @Test + public void testActivateCallback() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, + InstantiationException, ClassNotFoundException { + // given + + Class innerClass = Class + .forName("org.onap.policy.clamp.clds.sdc.controller.SdcSingleController$SdcNotificationCallBack"); + Constructor constructor = innerClass.getDeclaredConstructor(SdcSingleController.class, + SdcSingleController.class); + constructor.setAccessible(true); + Object child = constructor.newInstance(sdcSingleController, sdcSingleController); + Method method = child.getClass().getDeclaredMethod("activateCallback", INotificationData.class); + method.setAccessible(true); + MDCAdapter mdcAdapter = MDC.getMDCAdapter(); + // when + method.invoke(child, buildFakeSdcNotification()); + // then + assertThat(mdcAdapter.get("ResponseCode")).isEqualTo("0"); + assertThat(mdcAdapter.get("StatusCode")).isEqualTo("COMPLETE"); + assertThat(mdcAdapter.get("ResponseDescription")) + .isEqualTo("SDC Notification received and processed successfully"); + assertThat(mdcAdapter.get("ClassName")).isEqualTo(child.getClass().getName()); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java b/src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java new file mode 100644 index 000000000..0e7fe6c7e --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java @@ -0,0 +1,125 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model.dcae; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; + +import java.util.HashSet; +import java.util.Set; +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.builder.ExchangeBuilder; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class DcaeInventoryResponseCacheTestItCase { + + public static DcaeInventoryCache inventoryCache = new DcaeInventoryCache(); + + @Autowired + CamelContext camelContext; + + /** + * Initialize the responses. + */ + @BeforeClass + public static void createExample() { + DcaeInventoryResponse response1 = new DcaeInventoryResponse(); + response1.setAsdcServiceId("id1"); + response1.setAsdcResourceId("0"); + DcaeInventoryResponse response2 = new DcaeInventoryResponse(); + response2.setAsdcServiceId("id1"); + response2.setAsdcResourceId("1"); + DcaeInventoryResponse response3 = new DcaeInventoryResponse(); + response3.setAsdcServiceId("id1"); + response3.setAsdcResourceId("2"); + DcaeInventoryResponse response4 = new DcaeInventoryResponse(); + response4.setAsdcServiceId("id2"); + response4.setAsdcResourceId("0"); + DcaeInventoryResponse response5 = new DcaeInventoryResponse(); + response5.setAsdcServiceId("id2"); + response5.setAsdcResourceId("1"); + + inventoryCache.addDcaeInventoryResponse(response1); + inventoryCache.addDcaeInventoryResponse(response3); + inventoryCache.addDcaeInventoryResponse(response2); + inventoryCache.addDcaeInventoryResponse(response4); + inventoryCache.addDcaeInventoryResponse(response5); + } + + @Test + public void testGetAllLoopIds() { + assertThat(inventoryCache.getAllLoopIds().size()).isEqualTo(2); + } + + @Test + public void testGetAllBlueprintsPerLoopId() { + int value = 0; + for (DcaeInventoryResponse inventoryResponse : inventoryCache.getAllBlueprintsPerLoopId("id1")) { + assertThat(Integer.valueOf(inventoryResponse.getAsdcResourceId())).isEqualTo(value++); + } + + value = 0; + for (DcaeInventoryResponse inventoryResponse : inventoryCache.getAllBlueprintsPerLoopId("id2")) { + assertThat(Integer.valueOf(inventoryResponse.getAsdcResourceId())).isEqualTo(value++); + } + } + + @Test + public void testDcaeInventoryResponse() { + Exchange exchange = ExchangeBuilder.anExchange(camelContext).build(); + Exchange exchangeResponse = camelContext.createProducerTemplate() + .send("direct:get-all-dcae-blueprint-inventory", exchange); + assertThat(exchangeResponse.getIn().getHeader("CamelHttpResponseCode")).isEqualTo(200); + Set blueprint = inventoryCache.getAllBlueprintsPerLoopId("testAsdcServiceId"); + assertThat(blueprint.size()).isEqualTo(2); + + DcaeInventoryResponse response1 = new DcaeInventoryResponse(); + response1.setAsdcResourceId("0"); + response1.setTypeName("testTypeName"); + response1.setAsdcServiceId("testAsdcServiceId"); + response1.setBlueprintTemplate("testBlueprintTemplate"); + response1.setTypeId("testtypeId"); + DcaeInventoryResponse response2 = new DcaeInventoryResponse(); + response2.setAsdcResourceId("1"); + response2.setTypeName("testTypeName2"); + response2.setAsdcServiceId("testAsdcServiceId"); + response2.setBlueprintTemplate("testBlueprintTemplate2"); + response2.setTypeId("testtypeId2"); + + Set expectedBlueprint = new HashSet<>(); + expectedBlueprint.add(response1); + expectedBlueprint.add(response2); + + assertEquals(blueprint, expectedBlueprint); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseTest.java b/src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseTest.java new file mode 100644 index 000000000..a246e0efa --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/model/dcae/DcaeInventoryResponseTest.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.model.dcae; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.TreeSet; +import org.junit.Test; + +public class DcaeInventoryResponseTest { + + @Test + public void testComparator() { + DcaeInventoryResponse response1 = new DcaeInventoryResponse(); + response1.setAsdcServiceId("id1"); + response1.setAsdcResourceId("0"); + DcaeInventoryResponse response2 = new DcaeInventoryResponse(); + response2.setAsdcServiceId("id2"); + response2.setAsdcResourceId("1"); + DcaeInventoryResponse response3 = new DcaeInventoryResponse(); + response3.setAsdcServiceId("id3"); + response3.setAsdcResourceId("2"); + DcaeInventoryResponse response4 = new DcaeInventoryResponse(); + response4.setAsdcServiceId("id4"); + response4.setAsdcResourceId("3"); + + TreeSet responseSet = new TreeSet<>(); + responseSet.add(response4); + responseSet.add(response3); + responseSet.add(response1); + responseSet.add(response2); + + int value = 0; + for (DcaeInventoryResponse inventoryResponse : responseSet) { + assertThat(Integer.valueOf(inventoryResponse.getAsdcResourceId()) == value++).isTrue(); + } + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java b/src/test/java/org/onap/policy/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java new file mode 100644 index 000000000..7999709c2 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/model/jsontype/JsonTypeDescriptorTest.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 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.policy.clamp.clds.model.jsontype; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonObject; +import org.hibernate.HibernateException; +import org.junit.Test; +import org.onap.policy.clamp.dao.model.jsontype.JsonTypeDescriptor; + +public class JsonTypeDescriptorTest { + + private JsonTypeDescriptor descriptor = new JsonTypeDescriptor(); + + @Test + public void testFromString() { + JsonObject object = new JsonObject(); + object.addProperty("one", "oneValue"); + JsonObject child = new JsonObject(); + child.addProperty("two", "twoValue"); + object.add("child", child); + + JsonObject jsonResult = descriptor.fromString("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}"); + + assertThat(jsonResult).isEqualTo(object); + } + + @Test + public void testUnwrap() { + JsonObject res1 = descriptor.unwrap(null, null, null); + assertThat(res1).isNull(); + + JsonObject object = new JsonObject(); + object.addProperty("one", "oneValue"); + JsonObject child = new JsonObject(); + child.addProperty("two", "twoValue"); + object.add("child", child); + String res2 = descriptor.unwrap(object, String.class, null); + assertThat(res2.replace("\n", "").replace(" ", "")) + .isEqualTo("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}"); + + Object res3 = descriptor.unwrap(object, JsonObject.class, null); + String res3Str = ((String) res3).replace(" ", "").replace("\\n", "").replace("\\", "") + .replace("\"{", "{").replace("}\"", "}"); + assertThat(res3Str).isEqualTo("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}"); + } + + @Test(expected = HibernateException.class) + public void testUnwrapExpectationThrown() { + JsonObject object = new JsonObject(); + object.addProperty("one", "oneValue"); + + descriptor.unwrap(object, Integer.class, null); + } + + @Test + public void testWrap() { + JsonObject res1 = descriptor.wrap(null, null); + assertThat(res1).isNull(); + + JsonObject object = new JsonObject(); + object.addProperty("one", "oneValue"); + JsonObject child = new JsonObject(); + child.addProperty("two", "twoValue"); + object.add("child", child); + JsonObject res2 = descriptor.wrap("{\"one\":\"oneValue\",\"child\":{\"two\":\"twoValue\"}}", null); + assertThat(res2).isEqualTo(object); + } + + @Test(expected = HibernateException.class) + public void testWrapExpectationThrown() { + descriptor.wrap(1, null); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParserTest.java b/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParserTest.java new file mode 100644 index 000000000..085b3d187 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/BlueprintParserTest.java @@ -0,0 +1,208 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds.sdc.controller.installer; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.json.JSONObject; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.policy.clamp.clds.exception.sdc.controller.BlueprintParserException; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.yaml.snakeyaml.Yaml; + +public class BlueprintParserTest { + private static final Gson GSON = new Gson(); + private static final String FIRST_APPP = "first_app"; + private static final String SECOND_APPP = "second_app"; + private static final String THIRD_APPP = "third_app"; + private static final String MODEL_TYPE1 = "type1"; + private static final String MODEL_TYPE_TCA = "onap.policies.monitoring.cdap.tca.hi.lo.app"; + private static final String VERSION = "1.0.0"; + + private static String microServiceTheWholeBlueprintValid; + private static String newMicroServiceBlueprint; + private static JsonObject jsonObjectBlueprintInvalid; + private static JsonObject jsonObjectBlueprintWithoutName; + private static JsonObject jsonObjectBlueprintWithoutProperties; + private static JsonObject jsonObjectBlueprintWithoutRelationships; + private static JsonObject jsonObjectBlueprintValidWithVersion; + + /** + * Method to load Blueprints before all test. + * + * @throws IOException In case of issues when opening the files + */ + @BeforeClass + public static void loadBlueprints() throws IOException { + microServiceTheWholeBlueprintValid = ResourceFileUtils + .getResourceAsString("clds/blueprint-with-microservice-chain.yaml"); + + newMicroServiceBlueprint = ResourceFileUtils.getResourceAsString("clds/new-microservice.yaml"); + + String microServiceBlueprintInvalid = ResourceFileUtils + .getResourceAsString("clds/single-microservice-fragment-invalid.yaml"); + jsonObjectBlueprintInvalid = yamlToJson(microServiceBlueprintInvalid); + String microServiceBlueprintWithoutName = ResourceFileUtils + .getResourceAsString("clds/single-microservice-fragment-without-name.yaml"); + jsonObjectBlueprintWithoutName = yamlToJson(microServiceBlueprintWithoutName); + String microServiceBlueprintWithoutProperties = ResourceFileUtils + .getResourceAsString("clds/single-microservice-fragment-without-properties.yaml"); + jsonObjectBlueprintWithoutProperties = yamlToJson(microServiceBlueprintWithoutProperties); + String microServiceBlueprintValidWithVersion = ResourceFileUtils + .getResourceAsString("clds/single-microservice-fragment-valid-with-version.yaml"); + jsonObjectBlueprintValidWithVersion = yamlToJson(microServiceBlueprintValidWithVersion); + + String microServiceBlueprintWithoutRelationships = ResourceFileUtils + .getResourceAsString("clds/single-microservice-fragment-without-relationships.yaml"); + jsonObjectBlueprintWithoutRelationships = yamlToJson(microServiceBlueprintWithoutRelationships); + + } + + @Test + public void getNameShouldReturnDefinedName() { + final JsonObject jsonObject = jsonObjectBlueprintInvalid; + String expectedName = jsonObject.get(jsonObject.keySet().iterator().next()).getAsJsonObject().get("properties") + .getAsJsonObject().get("name").getAsString(); + Entry entry = jsonObject.entrySet().iterator().next(); + String actualName = BlueprintParser.getName(entry); + + Assert.assertEquals(expectedName, actualName); + } + + @Test + public void getNameShouldReturnServiceNameWhenNoNameDefined() { + final JsonObject jsonObject = jsonObjectBlueprintWithoutName; + + String expectedName = jsonObject.keySet().iterator().next(); + Entry entry = jsonObject.entrySet().iterator().next(); + String actualName = BlueprintParser.getName(entry); + + Assert.assertEquals(expectedName, actualName); + } + + @Test + public void getNameShouldReturnServiceNameWhenNoPropertiesDefined() { + final JsonObject jsonObject = jsonObjectBlueprintWithoutProperties; + + String expectedName = jsonObject.keySet().iterator().next(); + Entry entry = jsonObject.entrySet().iterator().next(); + String actualName = BlueprintParser.getName(entry); + + Assert.assertEquals(expectedName, actualName); + } + + @Test + public void getInputShouldReturnInputWhenPresent() { + final JsonObject jsonObject = jsonObjectBlueprintInvalid; + + String expected = FIRST_APPP; + Entry entry = jsonObject.entrySet().iterator().next(); + String actual = BlueprintParser.getInput(entry); + + Assert.assertEquals(expected, actual); + } + + @Test + public void getInputShouldReturnEmptyStringWhenAbsent() { + final JsonObject jsonObject = jsonObjectBlueprintWithoutRelationships; + + String expected = ""; + Entry entry = jsonObject.entrySet().iterator().next(); + String actual = BlueprintParser.getInput(entry); + + Assert.assertEquals(expected, actual); + } + + @Test(expected = BlueprintParserException.class) + public void getNodeRepresentationFromIncompleteYaml() throws BlueprintParserException { + BlueprintParser.getNodeRepresentation(jsonObjectBlueprintInvalid.entrySet().iterator().next(), + jsonObjectBlueprintInvalid, null); + } + + @Test + public void getNodeRepresentationFromCompleteYamlWithModelVersion() throws BlueprintParserException { + final JsonObject jsonObject = jsonObjectBlueprintValidWithVersion; + + BlueprintMicroService expected = new BlueprintMicroService(SECOND_APPP, MODEL_TYPE1, "", "10.0.0"); + Entry entry = jsonObject.entrySet().iterator().next(); + BlueprintMicroService actual = BlueprintParser.getNodeRepresentation(entry, jsonObject, null); + + Assert.assertEquals(expected, actual); + } + + @Test + public void getMicroServicesFromBlueprintTest() throws BlueprintParserException { + BlueprintMicroService thirdApp = new BlueprintMicroService(THIRD_APPP, MODEL_TYPE_TCA, SECOND_APPP, VERSION); + BlueprintMicroService firstApp = new BlueprintMicroService(FIRST_APPP, MODEL_TYPE_TCA, "", VERSION); + BlueprintMicroService secondApp = new BlueprintMicroService(SECOND_APPP, MODEL_TYPE_TCA, FIRST_APPP, VERSION); + + Set expected = new HashSet<>(Arrays.asList(firstApp, secondApp, thirdApp)); + Set actual = BlueprintParser.getMicroServices(microServiceTheWholeBlueprintValid); + + Assert.assertEquals(expected, actual); + } + + @Test + public void fallBackToOneMicroServiceTcaTest() { + BlueprintMicroService tcaMs = new BlueprintMicroService(BlueprintParser.TCA, + "onap.policies.monitoring.cdap.tca.hi.lo.app", "", VERSION); + List expected = Collections.singletonList(tcaMs); + List actual = BlueprintParser.fallbackToOneMicroService(); + + Assert.assertEquals(expected, actual); + } + + @Test + public void newMicroServiceTest() throws BlueprintParserException { + List microServicesChain = new ChainGenerator() + .getChainOfMicroServices(BlueprintParser.getMicroServices(newMicroServiceBlueprint)); + if (microServicesChain.isEmpty()) { + microServicesChain = BlueprintParser.fallbackToOneMicroService(); + } + assertThat(microServicesChain.size()).isEqualTo(1); + assertThat(microServicesChain.get(0).getName()).isEqualTo("pmsh"); + } + + private static JsonObject yamlToJson(String yamlString) { + Yaml yaml = new Yaml(); + Map map = yaml.load(yamlString); + JSONObject jsonObject = new JSONObject(map); + return GSON.fromJson(jsonObject.toString(), JsonObject.class); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java b/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java new file mode 100644 index 000000000..d7a3b3823 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/ChainGeneratorTest.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller.installer; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.junit.Assert; +import org.junit.Test; + +public class ChainGeneratorTest { + private static final String FIRST_APPP = "first_app"; + private static final String SECOND_APPP = "second_app"; + private static final String THIRD_APPP = "third_app"; + private static final String FOURTH_APPP = "fourth_app"; + private static final String DEFAULT_VERSION = "1.0.0"; + + @Test + public void getChainOfMicroServicesTest() { + BlueprintMicroService ms1 = new BlueprintMicroService(FIRST_APPP, "", "", DEFAULT_VERSION); + BlueprintMicroService ms2 = new BlueprintMicroService(SECOND_APPP, "", FIRST_APPP, DEFAULT_VERSION); + BlueprintMicroService ms3 = new BlueprintMicroService(THIRD_APPP, "", SECOND_APPP, DEFAULT_VERSION); + BlueprintMicroService ms4 = new BlueprintMicroService(FOURTH_APPP, "", THIRD_APPP, DEFAULT_VERSION); + + List expectedList = Arrays.asList(ms1, ms2, ms3, ms4); + Set inputSet = new HashSet<>(expectedList); + + List actualList = new ChainGenerator().getChainOfMicroServices(inputSet); + Assert.assertEquals(expectedList, actualList); + } + + @Test + public void getChainOfMicroServicesTwiceNoInputTest() { + BlueprintMicroService ms1 = new BlueprintMicroService(FIRST_APPP, "", "", DEFAULT_VERSION); + BlueprintMicroService ms2 = new BlueprintMicroService(SECOND_APPP, "", "", DEFAULT_VERSION); + BlueprintMicroService ms3 = new BlueprintMicroService(THIRD_APPP, "", SECOND_APPP, DEFAULT_VERSION); + BlueprintMicroService ms4 = new BlueprintMicroService(FOURTH_APPP, "", FIRST_APPP, DEFAULT_VERSION); + + Set inputSet = new HashSet<>(Arrays.asList(ms1, ms2, ms3, ms4)); + List actualList = new ChainGenerator().getChainOfMicroServices(inputSet); + Assert.assertTrue(actualList.isEmpty()); + } + + @Test + public void getChainOfMicroServicesBranchingTest() { + BlueprintMicroService ms1 = new BlueprintMicroService(FIRST_APPP, "", "", DEFAULT_VERSION); + BlueprintMicroService ms2 = new BlueprintMicroService(SECOND_APPP, "", FIRST_APPP, DEFAULT_VERSION); + BlueprintMicroService ms3 = new BlueprintMicroService(THIRD_APPP, "", FIRST_APPP, DEFAULT_VERSION); + BlueprintMicroService ms4 = new BlueprintMicroService(FOURTH_APPP, "", FIRST_APPP, DEFAULT_VERSION); + + Set inputSet = new HashSet<>(Arrays.asList(ms1, ms2, ms3, ms4)); + List actualList = new ChainGenerator().getChainOfMicroServices(inputSet); + Assert.assertTrue(actualList.isEmpty()); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandlerTest.java b/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandlerTest.java new file mode 100644 index 000000000..08e425abf --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/sdc/controller/installer/CsarHandlerTest.java @@ -0,0 +1,199 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.sdc.controller.installer; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.policy.clamp.clds.exception.sdc.controller.CsarHandlerException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.sdc.api.notification.IArtifactInfo; +import org.onap.sdc.api.notification.INotificationData; +import org.onap.sdc.api.notification.IResourceInstance; +import org.onap.sdc.api.results.IDistributionClientDownloadResult; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; + +public class CsarHandlerTest { + + private static final String SDC_FOLDER = "/tmp/csar-handler-tests"; + private static final String CSAR_ARTIFACT_NAME = "testArtifact.csar"; + private static final String SERVICE_UUID = "serviceUUID"; + private static final String RESOURCE1_UUID = "resource1UUID"; + private static final String RESOURCE1_INSTANCE_NAME = "sim-1802 0"; + private static final String RESOURCE1_INSTANCE_NAME_IN_CSAR = "sim18020"; + private static final String BLUEPRINT1_NAME = "FOI.Simfoimap223S0112.event_proc_bp.yaml"; + private static final String BLUEPRINT2_NAME = "FOI.Simfoimap223S0112.event_proc_bp2.yaml"; + + @Test + public void testConstructor() throws CsarHandlerException { + IArtifactInfo serviceArtifact = Mockito.mock(IArtifactInfo.class); + Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE); + Mockito.when(serviceArtifact.getArtifactName()).thenReturn(CSAR_ARTIFACT_NAME); + List servicesList = new ArrayList<>(); + servicesList.add(serviceArtifact); + INotificationData notifData = Mockito.mock(INotificationData.class); + Mockito.when(notifData.getServiceArtifacts()).thenReturn(servicesList); + CsarHandler csar = new CsarHandler(notifData, "test-controller", SDC_FOLDER); + assertEquals(SDC_FOLDER + "/test-controller" + "/" + CSAR_ARTIFACT_NAME, csar.getFilePath()); + } + + @Test(expected = CsarHandlerException.class) + public void testFailingConstructor() throws CsarHandlerException { + INotificationData notifData = Mockito.mock(INotificationData.class); + Mockito.when(notifData.getServiceArtifacts()).thenReturn(new ArrayList<>()); + new CsarHandler(notifData, "test-controller", "/tmp/csar-handler-tests"); + fail("Exception should have been raised"); + } + + private INotificationData buildFakeSdcNotification() { + // BUild what is needed for CSAR + IArtifactInfo serviceArtifact = Mockito.mock(IArtifactInfo.class); + Mockito.when(serviceArtifact.getArtifactType()).thenReturn(CsarHandler.CSAR_TYPE); + Mockito.when(serviceArtifact.getArtifactName()).thenReturn(CSAR_ARTIFACT_NAME); + List servicesList = new ArrayList<>(); + servicesList.add(serviceArtifact); + INotificationData notifData = Mockito.mock(INotificationData.class); + Mockito.when(notifData.getServiceArtifacts()).thenReturn(servicesList); + // Build what is needed for UUID + Mockito.when(notifData.getServiceInvariantUUID()).thenReturn(SERVICE_UUID); + // Build fake resource with one artifact BLUEPRINT + IResourceInstance resource1 = Mockito.mock(IResourceInstance.class); + Mockito.when(resource1.getResourceType()).thenReturn("VF"); + Mockito.when(resource1.getResourceInvariantUUID()).thenReturn(RESOURCE1_UUID); + Mockito.when(resource1.getResourceInstanceName()).thenReturn(RESOURCE1_INSTANCE_NAME); + // Create a fake artifact for resource + IArtifactInfo blueprintArtifact = Mockito.mock(IArtifactInfo.class); + Mockito.when(blueprintArtifact.getArtifactType()).thenReturn(CsarHandler.BLUEPRINT_TYPE); + List artifactsListForResource = new ArrayList<>(); + artifactsListForResource.add(blueprintArtifact); + Mockito.when(resource1.getArtifacts()).thenReturn(artifactsListForResource); + List resourcesList = new ArrayList<>(); + resourcesList.add(resource1); + Mockito.when(notifData.getResources()).thenReturn(resourcesList); + return notifData; + } + + private IDistributionClientDownloadResult buildFakeSdcResut() throws IOException { + IDistributionClientDownloadResult resultArtifact = Mockito.mock(IDistributionClientDownloadResult.class); + Mockito.when(resultArtifact.getArtifactPayload()).thenReturn( + IOUtils.toByteArray(ResourceFileUtils.getResourceAsStream("example/sdc/service-Simsfoimap0112.csar"))); + return resultArtifact; + } + + private IDistributionClientDownloadResult buildFakeSdcResultWithoutPolicyModel() throws IOException { + IDistributionClientDownloadResult resultArtifact = Mockito.mock(IDistributionClientDownloadResult.class); + Mockito.when(resultArtifact.getArtifactPayload()).thenReturn( + IOUtils.toByteArray(ResourceFileUtils.getResourceAsStream("example/sdc/service-without-policy.csar"))); + return resultArtifact; + } + + @Test + public void testSave() + throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException { + CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); + // Test the save + csar.save(buildFakeSdcResut()); + assertTrue((new File(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME)).exists()); + assertEquals(CSAR_ARTIFACT_NAME, csar.getArtifactElement().getArtifactName()); + assertNotNull(csar.getSdcCsarHelper()); + // Test dcaeBlueprint + String blueprint = csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getDcaeBlueprint(); + assertNotNull(blueprint); + assertTrue(!blueprint.isEmpty()); + assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1")); + // Test additional properties from Sdc notif + assertEquals(BLUEPRINT1_NAME, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintArtifactName()); + assertEquals(RESOURCE1_UUID, + csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getResourceAttached().getResourceInvariantUUID()); + assertEquals(SERVICE_UUID, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintInvariantServiceUuid()); + + // Just check the second one is there as well + assertEquals(BLUEPRINT2_NAME, csar.getMapOfBlueprints().get(BLUEPRINT2_NAME).getBlueprintArtifactName()); + blueprint = csar.getMapOfBlueprints().get(BLUEPRINT2_NAME).getDcaeBlueprint(); + assertNotNull(blueprint); + assertTrue(!blueprint.isEmpty()); + assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1")); + // Do some cleanup + Path path = Paths.get(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME); + Files.deleteIfExists(path); + + } + + @Test + public void testLoadingOfPolicyModelFromCsar() + throws CsarHandlerException, IOException, SdcArtifactInstallerException, SdcToscaParserException { + CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); + csar.save(buildFakeSdcResut()); + String policyModelYaml = csar.getPolicyModelYaml().get(); + assertTrue(policyModelYaml.contains("tosca_simple_yaml_1_0_0")); + } + + @Test + public void testLoadingOfNonexistentPolicyModelFromCsar() + throws CsarHandlerException, IOException, SdcArtifactInstallerException, SdcToscaParserException { + CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); + csar.save(buildFakeSdcResultWithoutPolicyModel()); + assertFalse(csar.getPolicyModelYaml().isPresent()); + } + + @Test + public void testDoubleSave() + throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException { + CsarHandler csar = new CsarHandler(buildFakeSdcNotification(), "test-controller", "/tmp/csar-handler-tests"); + // Test the save + csar.save(buildFakeSdcResut()); + assertTrue((new File(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME)).exists()); + assertEquals(CSAR_ARTIFACT_NAME, csar.getArtifactElement().getArtifactName()); + assertNotNull(csar.getSdcCsarHelper()); + // Test dcaeBlueprint + String blueprint = csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getDcaeBlueprint(); + assertNotNull(blueprint); + assertTrue(!blueprint.isEmpty()); + assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1")); + // Test additional properties from Sdc notif + assertEquals(BLUEPRINT1_NAME, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintArtifactName()); + assertEquals(RESOURCE1_UUID, + csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getResourceAttached().getResourceInvariantUUID()); + assertEquals(SERVICE_UUID, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintInvariantServiceUuid()); + Path path = Paths.get(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME); + // A double save should simply overwrite the existing + csar.save(buildFakeSdcResut()); + // Do some cleanup + Files.deleteIfExists(path); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java b/src/test/java/org/onap/policy/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java new file mode 100644 index 000000000..f70e74cd6 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/DictionaryRepositoriesTestItCase.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.tosca.Dictionary; +import org.onap.policy.clamp.tosca.DictionaryElement; +import org.onap.policy.clamp.tosca.DictionaryRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = Application.class) +public class DictionaryRepositoriesTestItCase { + @Autowired + private DictionaryRepository dictionaryRepository; + + @Test + @Transactional + public void crudTest() { + // Setup + Dictionary dictionaryTest1 = new Dictionary(); + dictionaryTest1.setName("testDictionary1"); + dictionaryTest1.setSecondLevelDictionary(1); + dictionaryTest1.setSubDictionaryType("testType"); + + DictionaryElement element1 = new DictionaryElement(); + element1.setName("element1"); + element1.setShortName("shortName1"); + element1.setType("type1"); + element1.setDescription("description1"); + + dictionaryTest1.addDictionaryElements(element1); + + Dictionary dictionaryTest2 = new Dictionary(); + dictionaryTest2.setName("testDictionary2"); + dictionaryTest2.setSecondLevelDictionary(1); + dictionaryTest2.setSubDictionaryType("testType"); + + DictionaryElement element2 = new DictionaryElement(); + element2.setName("element2"); + element2.setShortName("shortName2"); + element2.setSubDictionary("testDictionary1"); + element2.setType("type2"); + element2.setDescription("description2"); + + dictionaryTest2.addDictionaryElements(element2); + + dictionaryRepository.save(dictionaryTest1); + List res1 = dictionaryRepository.getAllDictionaryNames(); + assertThat(res1.size()).isGreaterThanOrEqualTo(1); + assertThat(res1).contains("testDictionary1"); + + dictionaryRepository.save(dictionaryTest2); + List res2 = dictionaryRepository.getAllDictionaryNames(); + assertThat(res2.size()).isGreaterThanOrEqualTo(2); + assertThat(res2).contains("testDictionary1"); + assertThat(res2).contains("testDictionary2"); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java b/src/test/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java new file mode 100644 index 000000000..6ff82b6d7 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java @@ -0,0 +1,201 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights + * reserved. + * Modifications Copyright (C) 2019 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.clds.tosca; + +import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonObject; +import java.io.IOException; +import javax.transaction.Transactional; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.tosca.Dictionary; +import org.onap.policy.clamp.tosca.DictionaryElement; +import org.onap.policy.clamp.tosca.DictionaryService; +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.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = Application.class) +public class ToscaYamlToJsonConvertorTestItCase { + + @Autowired + private DictionaryService dictionaryService; + + @Autowired + private ToscaYamlToJsonConvertor toscaYamlToJsonConvertor; + + /** + * This Test validates TOSCA yaml to JSON Schema conversion based on JSON Editor + * Schema. + * + * @throws IOException In case of issue when opening the tosca yaml file and + * converted json file + */ + @Test + public final void testParseToscaYaml() throws IOException { + String toscaModelYaml = ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"); + ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor(); + + String parsedJsonSchema = + convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.cdap.tca.hi.lo.app"); + assertNotNull(parsedJsonSchema); + JSONAssert.assertEquals( + ResourceFileUtils.getResourceAsString("tosca/policy-yaml-to-json.json"), + parsedJsonSchema, true); + } + + /** + * This Test validates TOSCA yaml with constraints to JSON Schema conversion + * based on JSON Editor Schema. + * + * @throws IOException In case of issue when opening the tosca yaml file and + * converted json file + */ + @Test + public final void testParseToscaYamlWithConstraints() throws IOException { + String toscaModelYaml = + ResourceFileUtils.getResourceAsString("tosca/tosca-with-constraints.yaml"); + ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor(); + + String parsedJsonSchema = + convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app"); + assertNotNull(parsedJsonSchema); + JSONAssert.assertEquals( + ResourceFileUtils.getResourceAsString("tosca/policy-yaml-to-json-with-constraints.json"), + parsedJsonSchema, true); + } + + /** + * This Test validates TOSCA yaml with different datatypes to JSON Schema + * conversion based on JSON Editor Schema. + * + * @throws IOException In case of issue when opening the tosca yaml file and + * converted json file + */ + @Test + public final void testParseToscaYamlWithTypes() throws IOException { + String toscaModelYaml = + ResourceFileUtils.getResourceAsString("tosca/tosca-with-datatypes.yaml"); + ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor(); + + String parsedJsonSchema = + convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app"); + assertNotNull(parsedJsonSchema); + JSONAssert.assertEquals( + ResourceFileUtils.getResourceAsString("tosca/policy-yaml-to-json-with-datatypes.json"), + parsedJsonSchema, true); + } + + /** + * This Test validates Tosca yaml with metadata tag that contains policy_model_type and acronym + * parameters which defines the Tosca Policy name and its short name. + * + * @throws IOException In case of issue when opening the tosca yaml file and + * converted json file + */ + @Test + @Transactional + public final void testMetadataClampPossibleValues() throws IOException { + setupDictionary(); + String toscaModelYaml = + ResourceFileUtils.getResourceAsString("tosca/tosca_metadata_clamp_possible_values.yaml"); + + JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(toscaModelYaml); + assertNotNull(jsonObject); + String policyModelType = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, + ToscaSchemaConstants.METADATA_POLICY_MODEL_TYPE); + String acronym = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject, + ToscaSchemaConstants.METADATA_ACRONYM); + String parsedJsonSchema = + toscaYamlToJsonConvertor.parseToscaYaml(toscaModelYaml, policyModelType); + + assertNotNull(parsedJsonSchema); + assertEquals("onap.policies.monitoring.cdap.tca.hi.lo.app", policyModelType); + assertEquals("tca", acronym); + JSONAssert.assertEquals( + ResourceFileUtils + .getResourceAsString("tosca/tosca_metadata_clamp_possible_values_json_schema.json"), + parsedJsonSchema, true); + + } + + private void setupDictionary() { + + // Set up dictionary elements + Dictionary dictionaryTest = new Dictionary(); + dictionaryTest.setName("Context"); + dictionaryTest.setSecondLevelDictionary(0); + + DictionaryElement element = new DictionaryElement(); + element.setName("PROD"); + element.setShortName("PROD"); + element.setType("string"); + element.setDescription("Production"); + dictionaryTest.addDictionaryElements(element); + + dictionaryService.saveOrUpdateDictionary(dictionaryTest); + + Dictionary dictionaryTest1 = new Dictionary(); + dictionaryTest1.setName("EventDictionary"); + dictionaryTest1.setSecondLevelDictionary(0); + + DictionaryElement element1 = new DictionaryElement(); + element1.setName("alarmCondition"); + element1.setShortName("alarmCondition"); + element1.setType("string"); + element1.setDescription("Alarm Condition"); + dictionaryTest1.addDictionaryElements(element1); + + dictionaryTest1 = dictionaryService.saveOrUpdateDictionary(dictionaryTest1); + + DictionaryElement element3 = new DictionaryElement(); + element3.setName("timeEpoch"); + element3.setShortName("timeEpoch"); + element3.setType("datetime"); + element3.setDescription("Time Epoch"); + dictionaryTest1.addDictionaryElements(element3); + + dictionaryService.saveOrUpdateDictionary(dictionaryTest1); + + Dictionary dictionaryTest2 = new Dictionary(); + dictionaryTest2.setName("Operators"); + dictionaryTest2.setSecondLevelDictionary(0); + + DictionaryElement element2 = new DictionaryElement(); + element2.setName("equals"); + element2.setShortName("equals"); + element2.setType("string|datetime"); + element2.setDescription("equals"); + dictionaryTest2.addDictionaryElements(element2); + dictionaryService.saveOrUpdateDictionary(dictionaryTest2); + } + +} diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/ArrayFieldTest.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ArrayFieldTest.java new file mode 100644 index 000000000..6f6f5c104 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ArrayFieldTest.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import java.io.IOException; +import java.util.ArrayList; +import junit.framework.TestCase; +import org.onap.policy.clamp.clds.tosca.update.elements.ArrayField; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElement; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElementProperty; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateManager; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; + +public class ArrayFieldTest extends TestCase { + + /** + * Test the deploy method. + * + * @throws IOException in case of failure + */ + public void testDeploy() throws IOException { + JsonTemplateManager jsonTemplateManager = new JsonTemplateManager(ResourceFileUtils.getResourceAsString( + "tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"), ResourceFileUtils.getResourceAsString( + "clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Actor"); + ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("actor"); + ArrayField arrayParser = new ArrayField((ArrayList) toscaElementProperty.getItems().get("default")); + JsonArray toTest = arrayParser.deploy(); + String reference = "[1,\"String\",5.5,true]"; + assertEquals(reference, String.valueOf(toTest)); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/ConstraintTest.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ConstraintTest.java new file mode 100644 index 000000000..493ee992c --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ConstraintTest.java @@ -0,0 +1,106 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.ArrayList; +import junit.framework.TestCase; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElement; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElementProperty; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplate; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateManager; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; + +public class ConstraintTest extends TestCase { + + JsonTemplateManager jsonTemplateManager = new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/constraints.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + + ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Operation"); + + public ConstraintTest() throws IOException { + } + + /** + * Test get value array. + */ + public void testGetValuesArray() { + ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("timeout"); + JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("integer"); + JsonObject resultProcess = new JsonObject(); + toscaElementProperty.addConstraintsAsJson(resultProcess, + (ArrayList) toscaElementProperty.getItems().get("constraints"), + jsonTemplate); + String reference = "{\"enum\":[3,4,5.5,6,10]}"; + assertEquals(reference, String.valueOf(resultProcess)); + toscaElementProperty = toscaElement.getProperties().get("success"); + jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("string"); + resultProcess = new JsonObject(); + toscaElementProperty.addConstraintsAsJson(resultProcess, + (ArrayList) toscaElementProperty.getItems().get("constraints"), + jsonTemplate); + reference = "{\"enum\":[\"VALID\",\"TERMINATED\"]}"; + assertEquals(reference, String.valueOf(resultProcess)); + } + + /** + * Test get Specific length. + */ + public void testGetSpecificLength() { + //Test for string type, same process for array + ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("id"); + JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("string"); + JsonObject resultProcess = new JsonObject(); + toscaElementProperty.addConstraintsAsJson(resultProcess, + (ArrayList) toscaElementProperty.getItems().get("constraints"), + jsonTemplate); + int specificLength = 8; + int toTest = resultProcess.get("minLength").getAsInt(); + assertEquals(specificLength, toTest); + toTest = resultProcess.get("maxLength").getAsInt(); + assertEquals(specificLength, toTest); + } + + /** + * Test get limit value. + */ + public void testGetLimitValue() { + //Test for array type, same process for string + ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("description"); + JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("array"); + JsonObject resultProcess = new JsonObject(); + toscaElementProperty.addConstraintsAsJson(resultProcess, + (ArrayList) toscaElementProperty.getItems().get("constraints"), + jsonTemplate); + + int toTest = resultProcess.get("minItems").getAsInt(); + assertEquals(5, toTest); + toTest = resultProcess.get("maxItems").getAsInt(); + assertEquals(7, toTest); + } + +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateFieldTest.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateFieldTest.java new file mode 100644 index 000000000..3eaa0ce51 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateFieldTest.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import junit.framework.TestCase; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateField; + +public class JsonTemplateFieldTest extends TestCase { + + JsonTemplateField field1 = new JsonTemplateField("type", "testType", true, true); + JsonTemplateField field2 = new JsonTemplateField("type"); + JsonTemplateField field3 = new JsonTemplateField("type", "testType1", true, true); + JsonTemplateField field4 = new JsonTemplateField("type", "testType", false, true); + JsonTemplateField field5 = new JsonTemplateField("type", "testType", true, false); + JsonTemplateField field6 = new JsonTemplateField("type", "testType", true, true); + + /** + * Test fieldsEqual method. + */ + public void testFieldsEqualsMethod() { + assertFalse(JsonTemplateField.fieldsEquals(field1, field3)); + assertFalse(JsonTemplateField.fieldsEquals(field1, field4)); + assertFalse(JsonTemplateField.fieldsEquals(field1, field5)); + assertTrue(JsonTemplateField.fieldsEquals(field1, field6)); + } + + /** + * Test equals method. + */ + public void testEqualsMethod() { + assertTrue(field1.equals(field2)); + assertTrue(field1.equals(field3)); + assertTrue(field1.equals(field4)); + assertTrue(field1.equals(field5)); + assertTrue(field1.equals(field6)); + } + + /** + * Test compareWithField method. + */ + public void testCompareWithFieldMethod() { + assertFalse(field1.compareWithField(field2)); + assertFalse(field1.compareWithField(field3)); + assertFalse(field1.compareWithField(field4)); + assertFalse(field1.compareWithField(field5)); + assertTrue(field1.equals(field6)); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateManagerTest.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateManagerTest.java new file mode 100644 index 000000000..2c8744f33 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateManagerTest.java @@ -0,0 +1,203 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import junit.framework.TestCase; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplate; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateField; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateManager; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; + +public class JsonTemplateManagerTest extends TestCase { + + /** + * Test the launch translation wit operational policies. + * + * @throws IOException In case of failure + * @throws UnknownComponentException In case of failure + */ + public void testLaunchTranslationTca() throws IOException, UnknownComponentException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" + + ".policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.file"), + ResourceFileUtils.getResourceAsString( + "clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + String componentName = "onap.policies.monitoring.cdap.tca.hi.lo.app"; + jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); + } + + /** + * Test the launch translation wit operational policies. + * + * @throws IOException In case of failure + * @throws UnknownComponentException In case of failure + */ + public void testLaunchTranslationFrequencyLimiter() throws IOException, UnknownComponentException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" + + ".policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.file"), + ResourceFileUtils.getResourceAsString( + "clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + String componentName = "onap.policies.controlloop.guard.common.FrequencyLimiter"; + jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); + } + + /** + * Test the launch translation wit operational policies. + * + * @throws IOException In case of failure + * @throws UnknownComponentException In case of failure + */ + public void testLaunchTranslationApex() throws IOException, UnknownComponentException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" + + ".policies.controlloop.operational.common.Apex/versions/1.0.0/.file"), + ResourceFileUtils.getResourceAsString( + "clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + String componentName = "onap.policies.controlloop.operational.common.Apex"; + jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); + } + + /** + * Test the launch translation wit operational policies. + * + * @throws IOException In case of failure + * @throws UnknownComponentException In case of failure + */ + public void testLaunchTranslationDrools() throws IOException, UnknownComponentException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" + + ".policies.controlloop.operational.common.Drools/versions/1.0.0/.file"), + ResourceFileUtils.getResourceAsString( + "clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + String componentName = "onap.policies.controlloop.operational.common.Drools"; + jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); + } + + + /** + * Test the launch translation. + * + * @throws IOException In case of failure + * @throws UnknownComponentException In case of failure + */ + public void testLaunchTranslation() throws IOException, UnknownComponentException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + String componentName = "onap.policies.controlloop.operational.common.Drools"; + jsonTemplateManager.getJsonSchemaForPolicyType(componentName, null, null); + } + + /** + * Test addTemplate. + * + * @throws IOException In case of failure + */ + public void testAddTemplate() throws IOException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + int count = jsonTemplateManager.getJsonSchemaTemplates().size(); + List + jsonTemplateFields = + new ArrayList<>(Arrays.asList(new JsonTemplateField("type"), new JsonTemplateField("description"), + new JsonTemplateField( + "required"), + new JsonTemplateField("metadata"), new JsonTemplateField("constraints"))); + jsonTemplateManager.addTemplate("test", jsonTemplateFields); + assertNotSame(count, jsonTemplateManager.getJsonSchemaTemplates().size()); + } + + /** + * test Remove template. + * + * @throws IOException In case of failure + */ + public void testRemoveTemplate() throws IOException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + int count = jsonTemplateManager.getJsonSchemaTemplates().size(); + jsonTemplateManager.removeTemplate("string"); + assertNotSame(count, jsonTemplateManager.getJsonSchemaTemplates().size()); + } + + /** + * Test update template. + * + * @throws IOException In case of failure + */ + public void testUpdateTemplate() throws IOException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + int count = jsonTemplateManager.getJsonSchemaTemplates().get("integer").getJsonTemplateFields().size(); + jsonTemplateManager.updateTemplate("integer", new JsonTemplateField("type"), false); + assertNotSame(count, + jsonTemplateManager.getJsonSchemaTemplates().get("integer").getJsonTemplateFields().size()); + } + + /** + * Test has template. + * + * @throws IOException In case of failure + */ + public void testHasTemplate() throws IOException { + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + boolean has = true; + List jsonTemplateFieldsString = + new ArrayList<>(Arrays.asList(new JsonTemplateField("type"), new JsonTemplateField("description"), + new JsonTemplateField("required"), + new JsonTemplateField("metadata"), new JsonTemplateField("constraints"))); + JsonTemplate jsonTemplateTest = new JsonTemplate("String", jsonTemplateFieldsString); + has = jsonTemplateManager.hasTemplate(jsonTemplateTest); + assertEquals(false, has); + } + +} diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateTest.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateTest.java new file mode 100644 index 000000000..dc27d8aaa --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/JsonTemplateTest.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import junit.framework.TestCase; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplate; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateField; + +public class JsonTemplateTest extends TestCase { + + JsonTemplate toTest = new JsonTemplate("toTest"); + List + jsonTemplateFields = new ArrayList<>( + Arrays.asList(new JsonTemplateField("type"), new JsonTemplateField("description"), + new JsonTemplateField( + "enum"))); + + /** + * Test check failed. + */ + public void testCheckFields() { + toTest.setJsonTemplateFields(jsonTemplateFields); + JsonTemplate reference = new JsonTemplate("toTest"); + reference.setJsonTemplateFields(jsonTemplateFields); + assertTrue(toTest.checkFields(reference)); + } + + /** + * Test other methods. + */ + public void testOtherFields() { + toTest.setJsonTemplateFields(jsonTemplateFields); + toTest.addField(new JsonTemplateField("moreField")); + toTest.setVisibility("moreField", true); + toTest.setStatic("moreField", true); + toTest.updateValueField("moreField", "testValue"); + + assertTrue(toTest.isVisible("moreField")); + assertTrue(toTest.getSpecificField("moreField").getValue().equals("testValue")); + assertTrue(toTest.fieldStaticStatus("moreField")); + assertTrue(toTest.toString() + .equals(" templateFields : [type null null null, description null null null, " + + "enum null null null, moreField testValue true true]")); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java new file mode 100644 index 000000000..658419d4c --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaConverterWithDictionarySupportItCase.java @@ -0,0 +1,147 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import com.google.gson.JsonObject; +import java.io.IOException; +import javax.transaction.Transactional; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.tosca.update.execution.ToscaMetadataExecutor; +import org.onap.policy.clamp.clds.tosca.update.parser.metadata.ToscaMetadataParserWithDictionarySupport; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateManager; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.tosca.Dictionary; +import org.onap.policy.clamp.tosca.DictionaryElement; +import org.onap.policy.clamp.tosca.DictionaryService; +import org.skyscreamer.jsonassert.JSONAssert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = Application.class) +@ActiveProfiles({"clamp-default", "clamp-default-user", "default-dictionary-elements"}) +public class ToscaConverterWithDictionarySupportItCase { + + @Autowired + private DictionaryService dictionaryService; + + @Autowired + private ToscaMetadataParserWithDictionarySupport toscaMetadataParserWithDictionarySupport; + + @Autowired + private ToscaMetadataExecutor toscaMetadataExecutor; + + /** + * This Test validates Tosca yaml with metadata tag that contains policy_model_type and acronym + * parameters which defines the Tosca Policy name and its short name. + * + * @throws IOException In case of issue when opening the tosca yaml file and + * converted json file + */ + @Test + @Transactional + public final void testMetadataClampPossibleValues() throws IOException, UnknownComponentException { + + // Set up dictionary elements + Dictionary dictionaryTest = new Dictionary(); + dictionaryTest.setName("Context"); + dictionaryTest.setSecondLevelDictionary(0); + + DictionaryElement element = new DictionaryElement(); + element.setName("PROD"); + element.setShortName("PROD"); + element.setType("string"); + element.setDescription("Production"); + dictionaryTest.addDictionaryElements(element); + + dictionaryService.saveOrUpdateDictionary(dictionaryTest); + + Dictionary dictionaryTest1 = new Dictionary(); + dictionaryTest1.setName("EventDictionary"); + dictionaryTest1.setSecondLevelDictionary(0); + + DictionaryElement element1 = new DictionaryElement(); + element1.setName("alarmCondition"); + element1.setShortName("alarmCondition"); + element1.setType("string"); + element1.setDescription("Alarm Condition"); + dictionaryTest1.addDictionaryElements(element1); + + dictionaryService.saveOrUpdateDictionary(dictionaryTest1); + + Dictionary dictionaryTest2 = new Dictionary(); + dictionaryTest2.setName("Operators"); + dictionaryTest2.setSecondLevelDictionary(0); + + DictionaryElement element2 = new DictionaryElement(); + element2.setName("equals"); + element2.setShortName("equals"); + element2.setType("string"); + element2.setDescription("equals"); + dictionaryTest2.addDictionaryElements(element2); + dictionaryService.saveOrUpdateDictionary(dictionaryTest2); + + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils + .getResourceAsString("tosca/new-converter/tosca_metadata_clamp_possible_values.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + + JsonObject jsonSchema = jsonTemplateManager.getJsonSchemaForPolicyType( + "onap.policies.monitoring.cdap.tca.hi.lo.app", toscaMetadataParserWithDictionarySupport, null); + + JSONAssert.assertEquals( + ResourceFileUtils + .getResourceAsString("tosca/new-converter/tca-with-metadata.json"), + JsonUtils.GSON.toJson(jsonSchema), true); + } + + @Test + @Transactional + public final void testMetadataClampPossibleValueWithExecutor() throws IOException, UnknownComponentException { + Service service = new Service(ResourceFileUtils.getResourceAsString("tosca/service-details.json"), + ResourceFileUtils.getResourceAsString("tosca/resource-details-cds.json")); + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("http-cache/example/policy/api/v1/policytypes/onap" + + ".policies.controlloop.operational.common.Apex/versions/1.0.0/.file"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + + JsonObject jsonSchema = jsonTemplateManager.getJsonSchemaForPolicyType( + "onap.policies.controlloop.operational.common.Apex", toscaMetadataParserWithDictionarySupport, service); + + JSONAssert.assertEquals( + ResourceFileUtils + .getResourceAsString("tosca/new-converter/tosca_apex_with_metadata.json"), + JsonUtils.GSON.toJson(jsonSchema), true); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementPropertyTest.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementPropertyTest.java new file mode 100644 index 000000000..5652fa9cd --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementPropertyTest.java @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.ArrayList; +import junit.framework.TestCase; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElement; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElementProperty; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplate; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateManager; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; + +public class ToscaElementPropertyTest extends TestCase { + public ToscaElementPropertyTest() throws IOException { + } + + /** + * Test Parse array. + * + * @throws IOException In case of failure + */ + public void testParseArray() throws IOException { + JsonTemplateManager jsonTemplateManager = new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Actor"); + ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("actor"); + JsonArray toTest = + toscaElementProperty.parseArray((ArrayList) toscaElementProperty.getItems().get("default")); + assertNotNull(toTest); + } + + /** + * Test add constraint as json. + * + * @throws IOException In case of failure + */ + public void testAddConstraintsAsJson() throws IOException { + JsonTemplateManager jsonTemplateManager = new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + ToscaElement toscaElement = + jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.operation.Failure"); + ToscaElementProperty toscaElementProperty = toscaElement.getProperties().get("category"); + JsonTemplate jsonTemplate = jsonTemplateManager.getJsonSchemaTemplates().get("string"); + JsonObject toTest = new JsonObject(); + toscaElementProperty + .addConstraintsAsJson(toTest, (ArrayList) toscaElementProperty.getItems().get("constraints"), + jsonTemplate); + String test = "{\"enum\":[\"error\",\"timeout\",\"retries\",\"guard\",\"exception\"]}"; + assertEquals(test, String.valueOf(toTest)); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementTest.java b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementTest.java new file mode 100644 index 000000000..7b17adeec --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/tosca/update/ToscaElementTest.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.tosca.update; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import junit.framework.TestCase; +import org.onap.policy.clamp.clds.tosca.update.elements.ToscaElement; +import org.onap.policy.clamp.clds.tosca.update.templates.JsonTemplateManager; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; + +public class ToscaElementTest extends TestCase { + + /** + * Test propertiesName. + * + * @throws IOException In case of failure + */ + public void testPropertiesNames() throws IOException { + ArrayList reference = new ArrayList<>(Arrays.asList("actor", "operation", "target", "payload")); + JsonTemplateManager jsonTemplateManager = + new JsonTemplateManager( + ResourceFileUtils.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/default-tosca-types.yaml"), + ResourceFileUtils.getResourceAsString("clds/tosca-converter/templates.json")); + ToscaElement toscaElement = jsonTemplateManager.getToscaElements().get("onap.datatype.controlloop.Actor"); + assertEquals(reference, toscaElement.propertiesNames()); + } + +} diff --git a/src/test/java/org/onap/policy/clamp/clds/util/CryptoUtilsTest.java b/src/test/java/org/onap/policy/clamp/clds/util/CryptoUtilsTest.java new file mode 100644 index 000000000..6239fef80 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/util/CryptoUtilsTest.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.clds.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.eq; + +import java.security.InvalidKeyException; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.lang3.ArrayUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({ "javax.crypto.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*" }) +public class CryptoUtilsTest { + + private final String data = "This is a test string"; + + @Test + @PrepareForTest({ CryptoUtils.class }) + public final void testEncryption() throws Exception { + String encodedString = CryptoUtils.encrypt(data); + assertNotNull(encodedString); + assertEquals(data, CryptoUtils.decrypt(encodedString)); + } + + @Test + @PrepareForTest({ CryptoUtils.class }) + public final void testEncryptedStringIsDifferent() throws Exception { + String encodedString1 = CryptoUtils.encrypt(data); + String encodedString2 = CryptoUtils.encrypt(data); + byte[] encryptedMessage1 = Hex.decodeHex(encodedString1.toCharArray()); + byte[] encryptedMessage2 = Hex.decodeHex(encodedString2.toCharArray()); + assertNotNull(encryptedMessage1); + assertNotNull(encryptedMessage2); + assertNotEquals(encryptedMessage1, encryptedMessage2); + byte[] subData1 = ArrayUtils.subarray(encryptedMessage1, 16, encryptedMessage1.length); + byte[] subData2 = ArrayUtils.subarray(encryptedMessage2, 16, encryptedMessage2.length); + assertNotEquals(subData1, subData2); + } + + @Test + @PrepareForTest({ CryptoUtils.class }) + public final void testEncryptionBaseOnRandomKey() throws Exception { + SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); + final String encryptionKey = String.valueOf(Hex.encodeHex(secretKey.getEncoded())); + setAesEncryptionKeyEnv(encryptionKey); + + String encodedString = CryptoUtils.encrypt(data); + String decodedString = CryptoUtils.decrypt(encodedString); + assertEquals(data, decodedString); + } + + @Test(expected = InvalidKeyException.class) + @PrepareForTest({ CryptoUtils.class }) + public final void testEncryptionBadKey() throws Exception { + final String badEncryptionKey = "93210sd"; + setAesEncryptionKeyEnv(badEncryptionKey); + + CryptoUtils.encrypt(data); + } + + private static void setAesEncryptionKeyEnv(String value) { + PowerMockito.mockStatic(System.class); + PowerMockito.when(System.getenv(eq("AES_ENCRYPTION_KEY"))).thenReturn(value); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/util/JsonUtilsTest.java b/src/test/java/org/onap/policy/clamp/clds/util/JsonUtilsTest.java new file mode 100644 index 000000000..b2c6d282a --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/util/JsonUtilsTest.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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============================================ + * Modifications copyright (c) 2019 Nokia + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import org.junit.Test; + +public class JsonUtilsTest { + + public static class TestClass extends TestObject { + + String test2; + TestObject2 object2; + + TestClass(String value1, String value2) { + super(value1); + test2 = value2; + } + + void setObject2(TestObject2 object2) { + this.object2 = object2; + } + } + + @Test + public void testGetObjectMapperInstance() { + assertNotNull(JsonUtils.GSON); + } + + /** + * This method test that the security hole in GSON is not enabled in the default + * ObjectMapper. + */ + @Test + public void testCreateBeanDeserializer() { + TestClass test = new TestClass("value1", "value2"); + test.setObject2(new TestObject2("test3")); + Object testObject = JsonUtils.GSON.fromJson("[\"org.onap.policy.clamp.clds.util.JsonUtilsTest$TestClass\"" + + ",{\"test\":\"value1\",\"test2\":\"value2\"," + + "\"object2\":[\"org.onap.policy.clamp.clds.util.TestObject2\"," + + "{\"test3\":\"test3\"}]}]", Object.class); + assertNotNull(testObject); + assertFalse(testObject instanceof TestObject); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionFileNotExists() throws IOException { + ResourceFileUtils.getResourceAsString("example/notExist.json"); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/util/LoggingUtilsTest.java b/src/test/java/org/onap/policy/clamp/clds/util/LoggingUtilsTest.java new file mode 100644 index 000000000..ab6a41bca --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/util/LoggingUtilsTest.java @@ -0,0 +1,138 @@ +/*- +* ============LICENSE_START======================================================= +* ONAP CLAMP +* Copyright (C) 2019 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.policy.clamp.clds.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Map; +import javax.net.ssl.HttpsURLConnection; +import javax.servlet.http.HttpServletRequest; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.slf4j.event.Level; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * Test Logging Utils. + */ +@RunWith(MockitoJUnitRunner.class) +public class LoggingUtilsTest { + + protected static final Logger logger = LoggerFactory.getLogger(LoggingUtilsTest.class); + + private static final String SERVICE_NAME = "LogginUtilsTest: Test Entering method"; + + private LoggingUtils util; + + @Before + public void setup() { + this.util = new LoggingUtils(logger); + } + + @Test + public void testEnteringLoggingUtils() { + // given + final String userName = "test"; + + UserDetails userDetails = Mockito.mock(UserDetails.class); + Mockito.when(userDetails.getUsername()).thenReturn(userName); + + Authentication localAuth = Mockito.mock(Authentication.class); + Mockito.when(localAuth.getPrincipal()).thenReturn(userDetails); + + SecurityContext securityContext = Mockito.mock(SecurityContext.class); + Mockito.when(securityContext.getAuthentication()).thenReturn(localAuth); + SecurityContextHolder.setContext(securityContext); + + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + // when + util.entering(request, SERVICE_NAME); + + // then + String[] keys = {OnapLogConstants.Mdcs.PARTNER_NAME, OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, + OnapLogConstants.Mdcs.REQUEST_ID, OnapLogConstants.Mdcs.INVOCATION_ID, + OnapLogConstants.Mdcs.CLIENT_IP_ADDRESS, OnapLogConstants.Mdcs.SERVER_FQDN, + OnapLogConstants.Mdcs.INSTANCE_UUID, OnapLogConstants.Mdcs.SERVICE_NAME}; + Map mdc = MDC.getMDCAdapter().getCopyOfContextMap(); + + assertTrue(checkMapKeys(mdc, keys)); + assertEquals(userName, mdc.get(OnapLogConstants.Mdcs.PARTNER_NAME)); + } + + @Test + public void testExistingLoggingUtils() { + // given + MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, + ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT)); + + // when + util.exiting(HttpStatus.OK.value(), SERVICE_NAME, Level.INFO, + OnapLogConstants.ResponseStatus.COMPLETE); + + // then + Map mdc = MDC.getMDCAdapter().getCopyOfContextMap(); + assertNull(mdc); + } + + @Test + public void testInvokeTestUtils() { + // given + final String targetEntity = "LoggingUtilsTest"; + final String targetServiceName = "testInvokeTestUtils"; + HttpsURLConnection secureConnection = Mockito.mock(HttpsURLConnection.class); + + // when + secureConnection = util.invokeHttps(secureConnection, targetEntity, targetServiceName); + + // then + assertNotNull(secureConnection); + String[] keys = + {OnapLogConstants.Mdcs.TARGET_ENTITY, OnapLogConstants.Mdcs.TARGET_SERVICE_NAME, + OnapLogConstants.Mdcs.INVOCATIONID_OUT, OnapLogConstants.Mdcs.INVOKE_TIMESTAMP}; + Map mdc = MDC.getMDCAdapter().getCopyOfContextMap(); + + assertTrue(checkMapKeys(mdc, keys)); + assertEquals(targetEntity, mdc.get(OnapLogConstants.Mdcs.TARGET_ENTITY)); + assertEquals(targetServiceName, mdc.get(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME)); + } + + private boolean checkMapKeys(Map map, String[] keys) { + return Arrays.stream(keys).allMatch(key -> map.get(key) != null); + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/util/TestObject.java b/src/test/java/org/onap/policy/clamp/clds/util/TestObject.java new file mode 100644 index 000000000..02cabd270 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/util/TestObject.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +public class TestObject { + + private String test; + + public String getTest() { + return test; + } + + public void setTest(String test) { + this.test = test; + } + + // @JsonProperty("test"), @JsonCreator + public TestObject(String theString) { + this.setTest(theString); + } + + public TestObject() { + } +} diff --git a/src/test/java/org/onap/policy/clamp/clds/util/TestObject2.java b/src/test/java/org/onap/policy/clamp/clds/util/TestObject2.java new file mode 100644 index 000000000..d5abf41d0 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/clds/util/TestObject2.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 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============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.clds.util; + +public class TestObject2 { + + private String test3; + + public String getTest3() { + return test3; + } + + public void setTest3(String test) { + this.test3 = test; + } + + public TestObject2(String theString) { + this.setTest3(theString); + } + + public TestObject2() { + } +} diff --git a/src/test/java/org/onap/policy/clamp/flow/FlowLogOperationTest.java b/src/test/java/org/onap/policy/clamp/flow/FlowLogOperationTest.java new file mode 100644 index 000000000..51c4c078a --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/flow/FlowLogOperationTest.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 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.policy.clamp.flow; + +import static junit.framework.Assert.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.impl.DefaultExchange; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.policy.clamp.clds.util.LoggingUtils; +import org.onap.policy.clamp.clds.util.OnapLogConstants; +import org.onap.policy.clamp.flow.log.FlowLogOperation; +import org.slf4j.MDC; +import org.slf4j.spi.MDCAdapter; +import org.springframework.test.util.ReflectionTestUtils; + +public class FlowLogOperationTest { + + private FlowLogOperation flowLogOperation = new FlowLogOperation(); + + @Test + public void testStratLog() { + // given + LoggingUtils loggingUtils = mock(LoggingUtils.class); + ReflectionTestUtils.setField(flowLogOperation, "util", loggingUtils); + + // when + Mockito.when(loggingUtils.getProperties(OnapLogConstants.Mdcs.REQUEST_ID)).thenReturn("MockRequestId"); + Mockito.when(loggingUtils.getProperties(OnapLogConstants.Mdcs.INVOCATION_ID)).thenReturn("MockInvocationId"); + Mockito.when(loggingUtils.getProperties(OnapLogConstants.Mdcs.PARTNER_NAME)).thenReturn("MockPartnerName"); + Exchange exchange = new DefaultExchange(mock(CamelContext.class)); + flowLogOperation.startLog(exchange, "serviceName"); + + // then + assertThat(exchange.getProperty(OnapLogConstants.Headers.REQUEST_ID)).isEqualTo("MockRequestId"); + assertThat(exchange.getProperty(OnapLogConstants.Headers.INVOCATION_ID)).isEqualTo("MockInvocationId"); + assertThat(exchange.getProperty(OnapLogConstants.Headers.PARTNER_NAME)).isEqualTo("MockPartnerName"); + } + + @Test + public void testInvokeLog() { + // given + final String mockEntity = "mockEntity"; + final String mockServiceName = "mockSerivceName"; + MDCAdapter mdcAdapter = MDC.getMDCAdapter(); + // when + flowLogOperation.invokeLog(mockEntity, mockServiceName); + // then + String entity = mdcAdapter.get(OnapLogConstants.Mdcs.TARGET_ENTITY); + String serviceName = mdcAdapter.get(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME); + assertEquals(entity, mockEntity); + assertEquals(serviceName, mockServiceName); + } + + @Test + public void testEndLog() { + // given + MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, "2019-05-19T00:00:00.007Z"); + MDCAdapter mdcAdapter = MDC.getMDCAdapter(); + /// when + flowLogOperation.endLog(); + // then + assertThat(mdcAdapter.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP)).isNull(); + } + + @Test + public void testErrorLog() { + // given + MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, "2019-05-19T00:00:00.007Z"); + MDCAdapter mdcAdapter = MDC.getMDCAdapter(); + // when + flowLogOperation.errorLog(); + // then + assertThat(mdcAdapter.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP)).isNull(); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/loop/CsarInstallerItCase.java b/src/test/java/org/onap/policy/clamp/loop/CsarInstallerItCase.java new file mode 100644 index 000000000..8ef0df5e4 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/CsarInstallerItCase.java @@ -0,0 +1,313 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications copyright (c) 2019 Nokia + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.transaction.Transactional; +import org.apache.commons.lang3.RandomStringUtils; +import org.assertj.core.api.Assertions; +import org.json.JSONException; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.exception.sdc.controller.BlueprintParserException; +import org.onap.policy.clamp.clds.exception.sdc.controller.CsarHandlerException; +import org.onap.policy.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException; +import org.onap.policy.clamp.clds.sdc.controller.installer.BlueprintArtifact; +import org.onap.policy.clamp.clds.sdc.controller.installer.CsarHandler; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.cds.CdsDataInstaller; +import org.onap.policy.clamp.loop.service.ServicesRepository; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.LoopTemplateLoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplatesRepository; +import org.onap.policy.clamp.loop.template.PolicyModelId; +import org.onap.policy.clamp.loop.template.PolicyModelsRepository; +import org.onap.sdc.api.notification.IArtifactInfo; +import org.onap.sdc.api.notification.INotificationData; +import org.onap.sdc.api.notification.IResourceInstance; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; +import org.onap.sdc.toscaparser.api.elements.Metadata; +import org.skyscreamer.jsonassert.JSONAssert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Commit; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +@ActiveProfiles({"clamp-default", "clamp-default-user", "clamp-sdc-controller"}) +public class CsarInstallerItCase { + + private static final String CSAR_ARTIFACT_NAME_CDS = "example/sdc/service_Vloadbalancerms_cds.csar"; + private static final String CSAR_ARTIFACT_NAME_NO_CDS = "example/sdc/service_Vloadbalancerms_no_cds.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 INVARIANT_RESOURCE2_UUID = "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad"; + private static final String RESOURCE_INSTANCE_NAME_RESOURCE1 = "ResourceInstanceName1"; + private static final String RESOURCE_INSTANCE_NAME_RESOURCE2 = "ResourceInstanceName2"; + + @Autowired + private LoopTemplatesRepository loopTemplatesRepo; + + @Autowired + ServicesRepository serviceRepository; + + @Autowired + PolicyModelsRepository policyModelsRepository; + + @Autowired + @Qualifier("csarInstaller") + private CsarInstaller csarInstaller; + + private BlueprintArtifact buildFakeBuildprintArtifact(String instanceName, String invariantResourceUuid, + String blueprintFilePath, String artifactName, + 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(ResourceFileUtils.getResourceAsString(blueprintFilePath)); + Mockito.when(blueprintArtifact.getBlueprintArtifactName()).thenReturn(artifactName); + Mockito.when(blueprintArtifact.getBlueprintInvariantServiceUuid()).thenReturn(invariantServiceUuid); + Mockito.when(blueprintArtifact.getResourceAttached()).thenReturn(resource); + return blueprintArtifact; + } + + private CsarHandler buildBadFakeCsarHandler(String generatedName, String csarFileName) throws IOException, + SdcToscaParserException { + + // Build a Bad csar because the blueprint contains a link to a microservice that does not exist in the emulator + // 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 listResources = new ArrayList<>(); + Mockito.when(notificationData.getResources()).thenReturn(listResources); + Map blueprintMap = new HashMap<>(); + Mockito.when(csarHandler.getMapOfBlueprints()).thenReturn(blueprintMap); + // Create fake blueprint artifact 1 on resource1 + BlueprintArtifact blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1, + INVARIANT_RESOURCE1_UUID, "example/sdc/blueprint-dcae/tca-guilin.yaml", "tca-guilin.yaml", + INVARIANT_SERVICE_UUID); + listResources.add(blueprintArtifact.getResourceAttached()); + blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); + + // Build fake csarhandler + Mockito.when(csarHandler.getSdcNotification()).thenReturn(notificationData); + // Build fake csar Helper + ISdcCsarHelper csarHelper = Mockito.mock(ISdcCsarHelper.class); + Metadata data = Mockito.mock(Metadata.class); + Mockito.when(data.getValue("name")).thenReturn(generatedName); + Mockito.when(notificationData.getServiceName()).thenReturn(generatedName); + Mockito.when(csarHelper.getServiceMetadata()).thenReturn(data); + + // Create helper based on real csar to test policy yaml and global properties + // set + SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); + String path = Thread.currentThread().getContextClassLoader().getResource(csarFileName).getFile(); + ISdcCsarHelper sdcHelper = factory.getSdcCsarHelper(path); + Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcHelper); + + // Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper); + Mockito.when(csarHandler.getPolicyModelYaml()) + .thenReturn(Optional.ofNullable(ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"))); + return csarHandler; + } + + private CsarHandler buildFakeCsarHandler(String generatedName, String csarFileName) throws IOException, + SdcToscaParserException { + // 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 listResources = new ArrayList<>(); + Mockito.when(notificationData.getResources()).thenReturn(listResources); + Map blueprintMap = new HashMap<>(); + Mockito.when(csarHandler.getMapOfBlueprints()).thenReturn(blueprintMap); + // Create fake blueprint artifact 1 on resource1 + BlueprintArtifact blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1, + INVARIANT_RESOURCE1_UUID, "example/sdc/blueprint-dcae/tca.yaml", "tca.yaml", INVARIANT_SERVICE_UUID); + listResources.add(blueprintArtifact.getResourceAttached()); + blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); + // Create fake blueprint artifact 2 on resource2 + blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE2, INVARIANT_RESOURCE2_UUID, + "example/sdc/blueprint-dcae/tca_2.yaml", "tca_2.yaml", INVARIANT_SERVICE_UUID); + listResources.add(blueprintArtifact.getResourceAttached()); + blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); + + // Create fake blueprint artifact 3 on resource 1 so that it's possible to + // test multiple CL deployment per Service/vnf + blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1, INVARIANT_RESOURCE1_UUID, + "example/sdc/blueprint-dcae/tca_3.yaml", "tca_3.yaml", INVARIANT_SERVICE_UUID); + blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact); + + // Build fake csarhandler + Mockito.when(csarHandler.getSdcNotification()).thenReturn(notificationData); + // Build fake csar Helper + ISdcCsarHelper csarHelper = Mockito.mock(ISdcCsarHelper.class); + Metadata data = Mockito.mock(Metadata.class); + Mockito.when(data.getValue("name")).thenReturn(generatedName); + Mockito.when(notificationData.getServiceName()).thenReturn(generatedName); + Mockito.when(csarHelper.getServiceMetadata()).thenReturn(data); + + // Create helper based on real csar to test policy yaml and global properties + // set + SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); + String path = Thread.currentThread().getContextClassLoader().getResource(csarFileName).getFile(); + ISdcCsarHelper sdcHelper = factory.getSdcCsarHelper(path); + Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcHelper); + + // Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper); + Mockito.when(csarHandler.getPolicyModelYaml()) + .thenReturn(Optional.ofNullable(ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"))); + return csarHandler; + } + + @Test + @Transactional + public void testGetPolicyModelYaml() throws IOException, SdcToscaParserException, CsarHandlerException { + INotificationData notificationData = Mockito.mock(INotificationData.class); + IArtifactInfo serviceArtifacts = Mockito.mock(IArtifactInfo.class); + Mockito.when(serviceArtifacts.getArtifactType()).thenReturn("TOSCA_CSAR"); + List serviceArtifactsList = new ArrayList<>(); + serviceArtifactsList.add(serviceArtifacts); + Mockito.when(notificationData.getServiceArtifacts()).thenReturn(serviceArtifactsList); + + CsarHandler csarHandler = new CsarHandler(notificationData, "", ""); + csarHandler.setFilePath(Thread.currentThread().getContextClassLoader().getResource(CSAR_ARTIFACT_NAME_CDS) + .getFile()); + Assert.assertEquals(csarHandler.getPolicyModelYaml(), Optional + .ofNullable(ResourceFileUtils.getResourceAsString("example/sdc/expected-result/policy-data.yaml"))); + } + + @Test + @Transactional + public void testIsCsarAlreadyDeployedTca() throws SdcArtifactInstallerException, SdcToscaParserException, + CsarHandlerException, IOException, InterruptedException, BlueprintParserException { + String generatedName = RandomStringUtils.randomAlphanumeric(5); + CsarHandler csarHandler = buildFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_CDS); + assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isFalse(); + csarInstaller.installTheCsar(csarHandler); + assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isTrue(); + } + + @Test + @Transactional + public void testWithoutCdsTca() throws SdcArtifactInstallerException, SdcToscaParserException, + CsarHandlerException, IOException, InterruptedException, BlueprintParserException { + String generatedName = RandomStringUtils.randomAlphanumeric(5); + CsarHandler csarHandler = buildFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_NO_CDS); + + assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isFalse(); + csarInstaller.installTheCsar(csarHandler); + assertThat(csarInstaller.isCsarAlreadyDeployed(csarHandler)).isTrue(); + } + + @Test(expected = SdcArtifactInstallerException.class) + @Transactional + public void testInstallTheBadCsarTca() + throws IOException, SdcToscaParserException, InterruptedException, BlueprintParserException, + SdcArtifactInstallerException { + // This test validates that the blueprint is well rejected because the blueprint contains a link + // to a policy that does not exist on the policy engine emulator. + String generatedName = RandomStringUtils.randomAlphanumeric(5); + csarInstaller.installTheCsar(buildBadFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_NO_CDS)); + } + + @Test + @Transactional + @Commit + public void testInstallTheCsarTca() throws SdcArtifactInstallerException, SdcToscaParserException, + CsarHandlerException, IOException, JSONException, InterruptedException, BlueprintParserException { + String generatedName = RandomStringUtils.randomAlphanumeric(5); + csarInstaller.installTheCsar(buildFakeCsarHandler(generatedName, CSAR_ARTIFACT_NAME_CDS)); + + assertThat(serviceRepository.existsById("63cac700-ab9a-4115-a74f-7eac85e3fce0")).isTrue(); + // We should have CDS info + assertThat(serviceRepository.findById("63cac700-ab9a-4115-a74f-7eac85e3fce0").get().getResourceByType("VF") + .getAsJsonObject("vLoadBalancerMS 0").getAsJsonObject( + CdsDataInstaller.CONTROLLER_PROPERTIES)).isNotNull(); + assertThat(loopTemplatesRepo.existsById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", + RESOURCE_INSTANCE_NAME_RESOURCE1, "tca.yaml"))).isTrue(); + assertThat(loopTemplatesRepo.existsById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", + RESOURCE_INSTANCE_NAME_RESOURCE1, "tca_3.yaml"))).isTrue(); + assertThat(loopTemplatesRepo.existsById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", + RESOURCE_INSTANCE_NAME_RESOURCE2, "tca_2.yaml"))).isTrue(); + // Verify now that policy and json representation, global properties are well + // set + LoopTemplate loopTemplate = loopTemplatesRepo.findById(LoopTemplate.generateLoopTemplateName(generatedName, + "1.0", RESOURCE_INSTANCE_NAME_RESOURCE1, "tca.yaml")).get(); + assertThat(loopTemplate.getLoopElementModelsUsed()).hasSize(1); + Assertions.assertThat(loopTemplate.getModelService().getServiceUuid()) + .isEqualTo("63cac700-ab9a-4115-a74f-7eac85e3fce0"); + JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/model-properties.json"), + JsonUtils.GSON_JPA_MODEL.toJson(loopTemplate.getModelService()), true); + JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/service-details.json"), + JsonUtils.GSON_JPA_MODEL.toJson(loopTemplate.getModelService().getServiceDetails()), true); + JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/resource-details.json"), + JsonUtils.GSON_JPA_MODEL.toJson(loopTemplate.getModelService().getResourceDetails()), true); + Assertions.assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) + .getLoopElementModel().getName()).isNotEmpty(); + + loopTemplate = loopTemplatesRepo.findById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", + RESOURCE_INSTANCE_NAME_RESOURCE1, "tca_3.yaml")).get(); + assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) + .getLoopElementModel().getName()).isNotEmpty(); + assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) + .getLoopElementModel().getName()).isNotEmpty(); + assertThat(loopTemplate.getMaximumInstancesAllowed()).isEqualByComparingTo(Integer.valueOf(0)); + loopTemplate = loopTemplatesRepo.findById(LoopTemplate.generateLoopTemplateName(generatedName, "1.0", + RESOURCE_INSTANCE_NAME_RESOURCE2, "tca_2.yaml")).get(); + assertThat(((LoopTemplateLoopElementModel) (loopTemplate.getLoopElementModelsUsed().toArray()[0])) + .getLoopElementModel().getName()).isNotEmpty(); + + assertThat(policyModelsRepository.findAll().size()).isGreaterThanOrEqualTo(1); + assertThat(policyModelsRepository + .existsById(new PolicyModelId("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0"))).isTrue(); + assertThat(policyModelsRepository + .getOne((new PolicyModelId("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0"))) + .getPolicyModelTosca()).isNotBlank(); + } +} diff --git a/src/test/java/org/onap/policy/clamp/loop/DcaeComponentTest.java b/src/test/java/org/onap/policy/clamp/loop/DcaeComponentTest.java new file mode 100644 index 000000000..c94937031 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/DcaeComponentTest.java @@ -0,0 +1,214 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.List; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.json.simple.parser.ParseException; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.policy.clamp.clds.model.dcae.DcaeInventoryResponse; +import org.onap.policy.clamp.clds.model.dcae.DcaeOperationStatusResponse; +import org.onap.policy.clamp.loop.components.external.DcaeComponent; +import org.onap.policy.clamp.loop.components.external.ExternalComponentState; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; + +public class DcaeComponentTest { + + private Loop createTestLoop() { + Loop loopTest = new Loop("ControlLoopTest"); + loopTest.setGlobalPropertiesJson( + new Gson().fromJson( + "{\"dcaeDeployParameters\":{\"uniqueBlueprintParameters\": {\"policy_id\": \"name\"}}}", + JsonObject.class)); + loopTest.setLastComputedState(LoopState.DESIGN); + loopTest.setDcaeDeploymentId("123456789"); + loopTest.setDcaeDeploymentStatusUrl("http4://localhost:8085"); + + MicroServicePolicy microServicePolicy = new MicroServicePolicy("configPolicyTest", new PolicyModel("policy1", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0"), true, + new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), null, null, null); + microServicePolicy.setConfigurationsJson(new Gson().fromJson("{\"param1\":\"value1\"}", JsonObject.class)); + + loopTest.addMicroServicePolicy(microServicePolicy); + LoopTemplate loopTemplate = new LoopTemplate("test", "yaml", 1, null); + loopTemplate.setDcaeBlueprintId("UUID-blueprint"); + loopTest.setLoopTemplate(loopTemplate); + + return loopTest; + } + + /** + * Test the DcaeReponse roughly. + * + * @throws IOException In case of issues + */ + @Test + public void convertDcaeResponseTest() throws IOException { + String dcaeFakeResponse = "{'requestId':'testId','operationType':'install','status':'state'," + + "'error':'errorMessage', 'links':{'self':'selfUrl','uninstall':'uninstallUrl'}}"; + DcaeOperationStatusResponse responseObject = DcaeComponent.convertDcaeResponse(dcaeFakeResponse); + assertThat(responseObject.getRequestId()).isEqualTo("testId"); + assertThat(responseObject.getOperationType()).isEqualTo("install"); + assertThat(responseObject.getStatus()).isEqualTo("state"); + assertThat(responseObject.getError()).isEqualTo("errorMessage"); + assertThat(responseObject.getLinks()).isNotNull(); + assertThat(responseObject.getLinks().getSelf()).isEqualTo("selfUrl"); + assertThat(responseObject.getLinks().getUninstall()).isEqualTo("uninstallUrl"); + + assertThat(responseObject.getLinks().getStatus()).isNull(); + } + + @Test + public void testGetDeployPayload() throws IOException { + Loop loop = this.createTestLoop(); + String deploymentPayload = DcaeComponent.getDeployPayload(loop); + String expectedPayload = "{\"serviceTypeId\":\"UUID-blueprint\",\"inputs\":{\"policy_id\":\"name\"}}"; + assertThat(deploymentPayload).isEqualTo(expectedPayload); + } + + @Test + public void testGetUndeployPayload() throws IOException { + Loop loop = this.createTestLoop(); + String unDeploymentPayload = DcaeComponent.getUndeployPayload(loop); + String expectedPayload = "{\"serviceTypeId\":\"UUID-blueprint\"}"; + assertThat(unDeploymentPayload).isEqualTo(expectedPayload); + } + + /** + * Test the computeState method of the DcaeComponent roughly. + * + * @throws IOException In case of issues + */ + @Test + public void computeStateTest() throws IOException { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + Exchange exchange2 = Mockito.mock(Exchange.class); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getExchange()).thenReturn(exchange2); + Mockito.when(exchange2.getProperty("dcaeResponse")).thenReturn(null); + + DcaeComponent dcae = new DcaeComponent(); + + // initial state + ExternalComponentState state = dcae.computeState(exchange); + assertThat(state.getStateName()).isEqualTo("BLUEPRINT_DEPLOYED"); + + // OperationalType = install + DcaeOperationStatusResponse dcaeResponse = Mockito.mock(DcaeOperationStatusResponse.class); + Mockito.when(dcaeResponse.getOperationType()).thenReturn("install"); + + Mockito.when(dcaeResponse.getStatus()).thenReturn("succeeded"); + Mockito.when(exchange2.getProperty("dcaeResponse")).thenReturn(dcaeResponse); + ExternalComponentState state2 = dcae.computeState(exchange); + assertThat(state2.getStateName()).isEqualTo("MICROSERVICE_INSTALLED_SUCCESSFULLY"); + Mockito.when(dcaeResponse.getStatus()).thenReturn("processing"); + ExternalComponentState state3 = dcae.computeState(exchange); + assertThat(state3.getStateName()).isEqualTo("PROCESSING_MICROSERVICE_INSTALLATION"); + + Mockito.when(dcaeResponse.getStatus()).thenReturn("failed"); + ExternalComponentState state4 = dcae.computeState(exchange); + assertThat(state4.getStateName()).isEqualTo("MICROSERVICE_INSTALLATION_FAILED"); + + // OperationalType = uninstall + Mockito.when(dcaeResponse.getOperationType()).thenReturn("uninstall"); + + Mockito.when(dcaeResponse.getStatus()).thenReturn("succeeded"); + Mockito.when(exchange2.getProperty("dcaeResponse")).thenReturn(dcaeResponse); + ExternalComponentState state5 = dcae.computeState(exchange); + assertThat(state5.getStateName()).isEqualTo("MICROSERVICE_UNINSTALLED_SUCCESSFULLY"); + + Mockito.when(dcaeResponse.getStatus()).thenReturn("processing"); + ExternalComponentState state6 = dcae.computeState(exchange); + assertThat(state6.getStateName()).isEqualTo("PROCESSING_MICROSERVICE_UNINSTALLATION"); + + Mockito.when(dcaeResponse.getStatus()).thenReturn("failed"); + ExternalComponentState state7 = dcae.computeState(exchange); + assertThat(state7.getStateName()).isEqualTo("MICROSERVICE_UNINSTALLATION_FAILED"); + + // error cases + Mockito.when(dcaeResponse.getOperationType()).thenReturn("whatever"); + ExternalComponentState state8 = dcae.computeState(exchange); + assertThat(state8.getStateName()).isEqualTo("IN_ERROR"); + + Mockito.when(dcaeResponse.getOperationType()).thenReturn("install"); + Mockito.when(dcaeResponse.getStatus()).thenReturn("anythingelse"); + ExternalComponentState state9 = dcae.computeState(exchange); + assertThat(state9.getStateName()).isEqualTo("IN_ERROR"); + } + + /** + * Test the Converter to DcaeInventoryResponse method. + * + * @throws IOException In case of failure + * @throws ParseException In case of failure + */ + @Test + public void convertToDcaeInventoryResponseTest() throws IOException, ParseException { + String dcaeFakeResponse = "{\n" + " \"links\": {\n" + " \"previousLink\": {\n" + + " \"title\": \"string\",\n" + " \"rel\": \"string\",\n" + " \"uri\": \"string\",\n" + + " \"uriBuilder\": {},\n" + " \"rels\": [\n" + " \"string\"\n" + " ],\n" + + " \"params\": {\n" + " \"additionalProp1\": \"string\",\n" + + " \"additionalProp2\": \"string\",\n" + " \"additionalProp3\": \"string\"\n" + + " },\n" + " \"type\": \"string\"\n" + " },\n" + " \"nextLink\": {\n" + + " \"title\": \"string\",\n" + " \"rel\": \"string\",\n" + " \"uri\": \"string\",\n" + + " \"uriBuilder\": {},\n" + " \"rels\": [\n" + " \"string\"\n" + " ],\n" + + " \"params\": {\n" + " \"additionalProp1\": \"string\",\n" + + " \"additionalProp2\": \"string\",\n" + " \"additionalProp3\": \"string\"\n" + + " },\n" + " \"type\": \"string\"\n" + " }\n" + " },\n" + " \"totalCount\": 0,\n" + + " \"items\": [\n" + " {\n" + " \"owner\": \"testOwner\",\n" + + " \"application\": \"testApplication\",\n" + " \"component\": \"testComponent\",\n" + + " \"typeName\": \"testTypeName\",\n" + " \"typeVersion\": 0,\n" + + " \"blueprintTemplate\": \"testBlueprintTemplate\",\n" + " \"serviceIds\": [\n" + + " \"serviceId1\", \"serviceId2\"\n" + " ],\n" + " \"vnfTypes\": [\n" + + " \"vnfType1\", \"vnfType2\"\n" + " ],\n" + " \"serviceLocations\": [\n" + + " \"serviceLocation1\", \"serviceLocation2\"\n" + " ],\n" + + " \"asdcServiceId\": \"testAsdcServiceId\",\n" + + " \"asdcResourceId\": \"testAsdcResourceId\",\n" + + " \"asdcServiceURL\": \"testAsdcServiceURL\",\n" + " \"typeId\": \"testTypeId\",\n" + + " \"selfLink\": {\n" + " \"title\": \"selfLinkTitle\",\n" + + " \"rel\": \"selfLinkRel\",\n" + " \"uri\": \"selfLinkUri\",\n" + + " \"uriBuilder\": {},\n" + " \"rels\": [\n" + " \"string\"\n" + " ],\n" + + " \"params\": {\n" + " \"additionalProp1\": \"string\",\n" + + " \"additionalProp2\": \"string\",\n" + " \"additionalProp3\": \"string\"\n" + + " },\n" + " \"type\": \"string\"\n" + " },\n" + + " \"created\": \"2020-01-22T09:38:15.436Z\",\n" + + " \"deactivated\": \"2020-01-22T09:38:15.437Z\"\n" + " }\n" + " ]\n" + "}"; + List responseObject = DcaeComponent.convertToDcaeInventoryResponse(dcaeFakeResponse); + assertThat(responseObject.get(0).getAsdcResourceId()).isEqualTo("testAsdcResourceId"); + assertThat(responseObject.get(0).getAsdcServiceId()).isEqualTo("testAsdcServiceId"); + assertThat(responseObject.get(0).getTypeName()).isEqualTo("testTypeName"); + assertThat(responseObject.get(0).getTypeId()).isEqualTo("testTypeId"); + assertThat(responseObject.get(0).getBlueprintTemplate()).isEqualTo("testBlueprintTemplate"); + } +} diff --git a/src/test/java/org/onap/policy/clamp/loop/DeployFlowTestItCase.java b/src/test/java/org/onap/policy/clamp/loop/DeployFlowTestItCase.java new file mode 100644 index 000000000..4d02b10dc --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/DeployFlowTestItCase.java @@ -0,0 +1,321 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import java.io.IOException; +import java.util.Set; +import javax.transaction.Transactional; +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.builder.ExchangeBuilder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelsService; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class DeployFlowTestItCase { + private Gson gson = new Gson(); + + @Autowired + CamelContext camelContext; + + @Autowired + PolicyModelsService policyModelsService; + + @Autowired + LoopService loopService; + + @Autowired + LoopsRepository loopsRepository; + + /** + * This method tests a deployment a single blueprint. + * + * @throws JsonSyntaxException In case of issues + * @throws IOException In case of issues + */ + @Test + @Transactional + public void deployWithSingleBlueprintTest() throws JsonSyntaxException, IOException { + Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", + "{\"dcaeDeployParameters\":{\"uniqueBlueprintParameters\": {\"policy_id\": \"name\"}}}", + "UUID-blueprint"); + LoopTemplate template = new LoopTemplate(); + template.setName("templateName"); + template.setBlueprint("yamlcontent"); + loopTest.setLoopTemplate(template); + MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", + "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", + "{\"param1\":\"value1\"}", true); + loopTest.addMicroServicePolicy(microServicePolicy); + loopService.saveOrUpdateLoop(loopTest); + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) + .build(); + + camelContext.createProducerTemplate().send("direct:deploy-loop", myCamelExchange); + + Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); + assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNotNull(); + assertThat(loopAfterTest.getDcaeDeploymentId()).isNotNull(); + } + + /** + * This method tests the deployment of multiple separated blueprints. + * + * @throws JsonSyntaxException In case of issues + * @throws IOException In case of issues + */ + @Test + @Transactional + public void deployWithMultipleBlueprintTest() throws JsonSyntaxException, IOException { + Loop loopTest2 = createLoop("ControlLoopTest2", "yamlcontent", "{\"dcaeDeployParameters\": {" + + "\"microService1\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName1_tca\"}," + + "\"microService2\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName2_tca\"}" + + "}}", "UUID-blueprint"); + LoopTemplate template = new LoopTemplate(); + template.setName("templateName"); + loopTest2.setLoopTemplate(template); + MicroServicePolicy microServicePolicy1 = getMicroServicePolicy("microService1", "", "{\"configtype\":\"json\"}", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true); + MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("microService2", "", "{\"configtype\":\"json\"}", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true); + loopTest2.addMicroServicePolicy(microServicePolicy1); + loopTest2.addMicroServicePolicy(microServicePolicy2); + loopsRepository.saveAndFlush(loopTest2); + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest2) + .build(); + + camelContext.createProducerTemplate().send("direct:deploy-loop", myCamelExchange); + + Loop loopAfterTest = loopService.getLoop("ControlLoopTest2"); + Set policyList = loopAfterTest.getMicroServicePolicies(); + for (MicroServicePolicy policy : policyList) { + assertThat(policy.getDcaeDeploymentStatusUrl()).isNotNull(); + assertThat(policy.getDcaeDeploymentId()).isNotNull(); + } + assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNull(); + assertThat(loopAfterTest.getDcaeDeploymentId()).isNull(); + } + + /** + * This method tests the undeployment of a single blueprint. + * + * @throws JsonSyntaxException In case of issues + * @throws IOException In case of issues + */ + @Test + @Transactional + public void undeployWithSingleBlueprintTest() throws JsonSyntaxException, IOException { + Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", + "UUID-blueprint"); + LoopTemplate template = new LoopTemplate(); + template.setName("templateName"); + template.setBlueprint("yamlcontent"); + loopTest.setLoopTemplate(template); + loopTest.setDcaeDeploymentId("testDeploymentId"); + loopTest.setDcaeDeploymentStatusUrl("testUrl"); + MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", + "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", + "{\"param1\":\"value1\"}", true); + loopTest.addMicroServicePolicy(microServicePolicy); + loopService.saveOrUpdateLoop(loopTest); + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) + .build(); + + camelContext.createProducerTemplate().send("direct:undeploy-loop", myCamelExchange); + + Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); + assertThat(loopAfterTest.getDcaeDeploymentStatusUrl().contains("/uninstall")).isTrue(); + assertThat(loopAfterTest.getDcaeDeploymentId()).isNull(); + } + + /** + * This method tests the undeployment of multiple separated blueprints. + * + * @throws JsonSyntaxException In case of issues + * @throws IOException In case of issues + */ + @Test + @Transactional + public void undeployWithMultipleBlueprintTest() throws JsonSyntaxException, IOException { + Loop loopTest2 = createLoop("ControlLoopTest2", "yamlcontent", "{\"dcaeDeployParameters\": {" + + "\"microService1\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName1_tca\"}," + + "\"microService2\": {\"location_id\": \"\", \"policy_id\": \"TCA_ResourceInstanceName2_tca\"}" + + "}}", "UUID-blueprint"); + LoopTemplate template = new LoopTemplate(); + template.setName("templateName"); + loopTest2.setLoopTemplate(template); + MicroServicePolicy microServicePolicy1 = getMicroServicePolicy("microService1", "", "{\"configtype\":\"json\"}", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true, + "testDeploymentId1", "testDeploymentStatusUrl1"); + MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("microService2", "", "{\"configtype\":\"json\"}", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "{\"param1\":\"value1\"}", true, + "testDeploymentId2", "testDeploymentStatusUrl2"); + loopTest2.addMicroServicePolicy(microServicePolicy1); + loopTest2.addMicroServicePolicy(microServicePolicy2); + loopsRepository.saveAndFlush(loopTest2); + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest2) + .build(); + + camelContext.createProducerTemplate().send("direct:undeploy-loop", myCamelExchange); + + Loop loopAfterTest = loopService.getLoop("ControlLoopTest2"); + Set policyList = loopAfterTest.getMicroServicePolicies(); + for (MicroServicePolicy policy : policyList) { + assertThat(policy.getDcaeDeploymentStatusUrl().contains("/uninstall")).isTrue(); + assertThat(policy.getDcaeDeploymentId()).isNull(); + + } + assertThat(loopAfterTest.getDcaeDeploymentStatusUrl()).isNull(); + assertThat(loopAfterTest.getDcaeDeploymentId()).isNull(); + } + + /** + * This method tests the DCAE get status for a single blueprint. + * + * @throws JsonSyntaxException In case of issues + * @throws IOException In case of issues + */ + @Test + @Transactional + public void getStatusWithSingleBlueprintTest() throws JsonSyntaxException, IOException { + Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", + "UUID-blueprint"); + LoopTemplate template = new LoopTemplate(); + template.setName("templateName"); + template.setBlueprint("yamlcontent"); + loopTest.setLoopTemplate(template); + MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", + "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", + "{\"param1\":\"value1\"}", true); + loopTest.addMicroServicePolicy(microServicePolicy); + loopService.saveOrUpdateLoop(loopTest); + assertThat(loopTest.getComponents().size()).isEqualTo(2); + assertThat(loopTest.getComponent("DCAE")).isNotNull(); + assertThat(loopTest.getComponent("POLICY")).isNotNull(); + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) + .build(); + + camelContext.createProducerTemplate().send("direct:update-dcae-status-for-loop", myCamelExchange); + + assertThat(loopTest.getComponent("DCAE").getState().getStateName()).isEqualTo("BLUEPRINT_DEPLOYED"); + + Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); + assertThat(loopAfterTest.getComponents().size()).isEqualTo(2); + assertThat(loopAfterTest.getComponent("DCAE")).isNotNull(); + assertThat(loopAfterTest.getComponent("POLICY")).isNotNull(); + } + + /** + * This method tests the dcae get status for multiple blueprints. + * + * @throws JsonSyntaxException In case of issues + * @throws IOException In case of issues + */ + @Test + @Transactional + public void getStatusWithMultipleBlueprintTest() throws JsonSyntaxException, IOException { + Loop loopTest = createLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", + "UUID-blueprint"); + LoopTemplate template = new LoopTemplate(); + template.setName("templateName"); + loopTest.setLoopTemplate(template); + MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", + "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", + "{\"param1\":\"value1\"}", true); + MicroServicePolicy microServicePolicy2 = getMicroServicePolicy("configPolicyTest2", "", + "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", + "{\"param1\":\"value1\"}", true); + loopTest.addMicroServicePolicy(microServicePolicy); + loopTest.addMicroServicePolicy(microServicePolicy2); + loopService.saveOrUpdateLoop(loopTest); + assertThat(loopTest.getComponents().size()).isEqualTo(3); + assertThat(loopTest.getComponent("DCAE")).isNull(); + assertThat(loopTest.getComponent("DCAE_configPolicyTest")).isNotNull(); + assertThat(loopTest.getComponent("DCAE_configPolicyTest2")).isNotNull(); + assertThat(loopTest.getComponent("POLICY")).isNotNull(); + Exchange myCamelExchange = ExchangeBuilder.anExchange(camelContext).withProperty("loopObject", loopTest) + .build(); + + camelContext.createProducerTemplate().send("direct:update-dcae-status-for-loop", myCamelExchange); + + assertThat(loopTest.getComponent("DCAE_configPolicyTest").getState().getStateName()) + .isEqualTo("BLUEPRINT_DEPLOYED"); + assertThat(loopTest.getComponent("DCAE_configPolicyTest2").getState().getStateName()) + .isEqualTo("BLUEPRINT_DEPLOYED"); + + Loop loopAfterTest = loopService.getLoop("ControlLoopTest"); + assertThat(loopAfterTest.getComponents().size()).isEqualTo(3); + assertThat(loopAfterTest.getComponent("DCAE")).isNull(); + assertThat(loopAfterTest.getComponent("POLICY")).isNotNull(); + assertThat(loopTest.getComponent("DCAE_configPolicyTest")).isNotNull(); + assertThat(loopTest.getComponent("DCAE_configPolicyTest2")).isNotNull(); + } + + private Loop createLoop(String name, String blueprint, String globalPropertiesJson, + String dcaeBlueprintId) throws JsonSyntaxException, IOException { + Loop loop = new Loop(name); + loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, JsonObject.class)); + loop.setLastComputedState(LoopState.DESIGN); + return loop; + } + + private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, + String policyTosca, String jsonProperties, boolean shared) { + + PolicyModel policyModel = new PolicyModel(modelType, policyTosca, "1.0.0"); + policyModelsService.saveOrUpdatePolicyModel(policyModel); + MicroServicePolicy microService = new MicroServicePolicy(name, policyModel, + shared, + gson.fromJson(jsonRepresentation, JsonObject.class), null, null, null); + + microService.setConfigurationsJson(new Gson().fromJson(jsonProperties, JsonObject.class)); + return microService; + } + + private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, + String policyTosca, String jsonProperties, boolean shared, + String deploymengId, + String deploymentStatusUrl) { + MicroServicePolicy microService = getMicroServicePolicy(name, modelType, jsonRepresentation, policyTosca, + jsonProperties, shared); + + microService.setDcaeDeploymentId(deploymengId); + microService.setDcaeDeploymentStatusUrl(deploymentStatusUrl); + return microService; + } +} diff --git a/src/test/java/org/onap/policy/clamp/loop/ExternalComponentStateTest.java b/src/test/java/org/onap/policy/clamp/loop/ExternalComponentStateTest.java new file mode 100644 index 000000000..a73b2784b --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/ExternalComponentStateTest.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.onap.policy.clamp.loop.components.external.ExternalComponentState; + +public class ExternalComponentStateTest { + private ExternalComponentState state = new ExternalComponentState("NOT_SENT", + "The policies defined have NOT yet been created on the policy engine", 90); + + @Test + public void generalTest() { + assertThat(state.toString()).isEqualTo("NOT_SENT"); + state.setLevel(70); + assertThat(state.getLevel()).isEqualTo(70); + } + + @Test + public void equalsTest() { + assertThat(state.equals(null)).isEqualTo(false); + + ExternalComponentState state2 = new ExternalComponentState("NOT_SENT", + "The policies defined have NOT yet been created on the policy engine", 90); + assertThat(state.equals(state2)).isEqualTo(true); + + assertThat(state.equals(12)).isEqualTo(false); + + state2.setLevel(70); + assertThat(state.equals(state2)).isEqualTo(true); + + ExternalComponentState state3 = new ExternalComponentState("SENT", + "The policies defined have NOT yet been created on the policy engine", 90); + assertThat(state.equals(state3)).isEqualTo(false); + + ExternalComponentState state4 = new ExternalComponentState(null, + "The policies defined have NOT yet been created on the policy engine", 90); + ExternalComponentState state5 = new ExternalComponentState(null, + "The policies defined have NOT yet been", 50); + assertThat(state4.equals(state3)).isEqualTo(false); + assertThat(state4.equals(state5)).isEqualTo(true); + } + + @Test + public void compareToTest() { + ExternalComponentState state2 = new ExternalComponentState("NOT_SENT", + "The policies defined have NOT yet been created on the policy engine", 90); + assertThat(state.compareTo(state2)).isEqualTo(0); + + ExternalComponentState state3 = new ExternalComponentState("SENT", + "The policies defined have NOT yet been created on the policy engine", 50); + assertThat(state.compareTo(state3)).isEqualTo(1); + + ExternalComponentState state4 = new ExternalComponentState(null, + "The policies defined have NOT yet been created on the policy engine", 100); + assertThat(state.compareTo(state4)).isEqualTo(-1); + + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/loop/LoopControllerTestItCase.java b/src/test/java/org/onap/policy/clamp/loop/LoopControllerTestItCase.java new file mode 100644 index 000000000..6728d292c --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/LoopControllerTestItCase.java @@ -0,0 +1,175 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * Modifications Copyright (C) 2019 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.io.IOException; +import java.util.Set; +import javax.transaction.Transactional; +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelsService; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicyService; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class LoopControllerTestItCase { + + private static final String EXAMPLE_LOOP_NAME = "ClosedLoopTest"; + private static final String EXAMPLE_JSON = "{\"testName\":\"testValue\"}"; + + @Autowired + LoopService loopService; + + @Autowired + LoopsRepository loopsRepository; + + @Autowired + MicroServicePolicyService microServicePolicyService; + + @Autowired + OperationalPolicyService operationalPolicyService; + + @Autowired + PolicyModelsService policyModelsService; + + @Autowired + LoopController loopController; + + private void saveTestLoopToDb() { + Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, "blueprint", "representation"); + testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); + LoopTemplate template = new LoopTemplate(); + template.setName("testTemplate"); + testLoop.setLoopTemplate(template); + Service modelService = new Service("{\"name\":\"serviceName\",\"UUID\":\"uuid\"}", "{}"); + testLoop.setModelService(modelService); + loopService.saveOrUpdateLoop(testLoop); + } + + private Loop createTestLoop(String loopName, String loopBlueprint, String loopSvg) { + return new Loop(loopName); + } + + @Test + @Transactional + public void testUpdateOperationalPolicies() { + saveTestLoopToDb(); + String policy = "[{\"name\":\"OPERATIONAL_CLholmes31_v1_0_vFW_PG_T10_k8s-holmes-rules\"," + + "\"configurationsJson\":{" + + "\"operational_policy\":{\"controlLoop\":{\"trigger_policy\":\"unique-policy-id-1-modifyConfig\"," + + "\"timeout\":\"3600\",\"abatement\":\"false\"," + + "\"controlLoopName\":\"LOOP_CLholmes31_v1_0_vFW_PG_T10_k8s-holmes-rules\"}," + + "\"policies\":[{\"id\":\"unique-policy-id-1-modifyConfig\",\"recipe\":\"ModifyConfig\"," + + "\"retry\":\"2\",\"timeout\":\"1200\",\"actor\":\"APPC\",\"payload\":\"{\\\"active-streams\\\":5}\"," + + "\"success\":\"\",\"failure\":\"\",\"failure_timeout\":\"\",\"failure_retries\":\"\"," + + "\"failure_exception\":\"\",\"failure_guard\":\"\",\"target\":{\"type\":\"VNF\"," + + "\"resourceID\":\"vFW_PG_T1\"}}]}}}]"; + JsonParser parser = new JsonParser(); + JsonElement ele = parser.parse(policy); + JsonArray arr = ele.getAsJsonArray(); + Loop loop = loopController.updateOperationalPolicies(EXAMPLE_LOOP_NAME, arr); + assertThat(loop.getOperationalPolicies()).hasSize(1); + Set opSet = loop.getOperationalPolicies(); + OperationalPolicy op = opSet.iterator().next(); + assertThat(op.getName()).isEqualTo("OPERATIONAL_CLholmes31_v1_0_vFW_PG_T10_k8s-holmes-rules"); + } + + @Test + @Transactional + public void testUpdateGlobalProperties() { + saveTestLoopToDb(); + String policy = "{\"dcaeDeployParameters\":{\"aaiEnrichmentHost\":\"aai.onap.svc.cluster.local\"," + + "\"aaiEnrichmentPort\":\"8443\",\"enableAAIEnrichment\":\"false\",\"dmaap_host\":\"message-router" + + ".onap\",\"dmaap_port\":\"3904\",\"enableRedisCaching\":\"false\",\"redisHosts\":\"dcae-redis.onap" + + ".svc.cluster.local:6379\",\"tag_version\":\"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments" + + ".tca-cdap-container:1.1.1\",\"consul_host\":\"consul-server.onap\",\"consul_port\":\"8500\"," + + "\"cbs_host\":\"config-binding-service\",\"cbs_port\":\"10000\",\"external_port\":\"32012\"," + + "\"policy_model_id\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\"," + + "\"policy_id\":\"tca_k8s_CLTCA_v1_0_vFW_PG_T10_k8s-tca-clamp-policy-05162019\"}}"; + JsonParser parser = new JsonParser(); + JsonElement ele = parser.parse(policy); + JsonObject obj = ele.getAsJsonObject(); + loopController.updateGlobalPropertiesJson(EXAMPLE_LOOP_NAME, obj); + Loop loop = loopController.getLoop(EXAMPLE_LOOP_NAME); + JsonObject globalPropertiesJson = loop.getGlobalPropertiesJson(); + JsonObject prop = globalPropertiesJson.getAsJsonObject("dcaeDeployParameters"); + assertThat(prop.get("aaiEnrichmentHost").getAsString()).isEqualTo("aai.onap.svc.cluster.local"); + } + + @Test + @Transactional + public void testUpdateMicroservicePolicy() { + saveTestLoopToDb(); + PolicyModel policyModel = new PolicyModel("testPolicyModel", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0"); + policyModelsService.saveOrUpdatePolicyModel(policyModel); + MicroServicePolicy policy = new MicroServicePolicy("policyName", policyModel, false, + JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + loopController.updateMicroservicePolicy(EXAMPLE_LOOP_NAME, policy); + assertThat(microServicePolicyService.isExisting("policyName")).isTrue(); + } + + @Test + @Transactional + public void testAddAndRemoveOperationalPolicies() throws IOException { + saveTestLoopToDb(); + PolicyModel policyModel = new PolicyModel("testPolicyModel", + null, "1.0.0"); + policyModelsService.saveOrUpdatePolicyModel(policyModel); + + loopController.addOperationalPolicy(EXAMPLE_LOOP_NAME, "testPolicyModel", "1.0.0"); + + Loop newLoop = loopController.getLoop(EXAMPLE_LOOP_NAME); + Set opPolicyList = newLoop.getOperationalPolicies(); + assertThat(opPolicyList.size()).isEqualTo(1); + for (OperationalPolicy policy : opPolicyList) { + assertThat(policy.getName().contains("OPERATIONAL_serviceName")).isTrue(); + Assertions.assertThat(policy.getPolicyModel().getPolicyModelType()).isEqualTo("testPolicyModel"); + Assertions.assertThat(policy.getPolicyModel().getVersion()).isEqualTo("1.0.0"); + } + + loopController.removeOperationalPolicy(EXAMPLE_LOOP_NAME, "testPolicyModel", "1.0.0"); + Loop newLoop2 = loopController.getLoop(EXAMPLE_LOOP_NAME); + assertThat(newLoop2.getOperationalPolicies().size()).isEqualTo(0); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/loop/LoopLogServiceTestItCase.java b/src/test/java/org/onap/policy/clamp/loop/LoopLogServiceTestItCase.java new file mode 100644 index 000000000..7b0ab8614 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/LoopLogServiceTestItCase.java @@ -0,0 +1,96 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Huawei Technologies Co., Ltd. + * ================================================================================ + * 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.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonObject; +import java.util.Set; +import javax.transaction.Transactional; +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.log.LogType; +import org.onap.policy.clamp.loop.log.LoopLog; +import org.onap.policy.clamp.loop.log.LoopLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class LoopLogServiceTestItCase { + + private static final String EXAMPLE_LOOP_NAME = "ClosedLoopTest"; + private static final String EXAMPLE_JSON = "{\"testName\":\"testValue\"}"; + private static final String CLAMP_COMPONENT = "CLAMP"; + private static final String SAMPLE_LOG_MESSAGE = "Sample log"; + private static final String BLUEPRINT = "blueprint"; + + @Autowired + LoopService loopService; + + @Autowired + LoopsRepository loopsRepository; + + @Autowired + LoopLogService loopLogService; + + private void saveTestLoopToDb() { + Loop testLoop = new Loop(EXAMPLE_LOOP_NAME); + testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); + loopService.saveOrUpdateLoop(testLoop); + } + + @Test + @Transactional + public void testAddLog() { + saveTestLoopToDb(); + Loop loop = loopService.getLoop(EXAMPLE_LOOP_NAME); + loopLogService.addLog(SAMPLE_LOG_MESSAGE, "INFO", loop); + Set loopLogs = loop.getLoopLogs(); + assertThat(loopLogs).hasSize(1); + LoopLog loopLog = loopLogs.iterator().next(); + assertThat(loopLog.getMessage()).isEqualTo(SAMPLE_LOG_MESSAGE); + } + + @Test + @Transactional + public void testLoopLog() { + LoopLog log = new LoopLog(); + Long id = Long.valueOf(100); + log.setId(id); + log.setLogComponent(CLAMP_COMPONENT); + log.setLogType(LogType.INFO); + log.setMessage(SAMPLE_LOG_MESSAGE); + Loop testLoop = new Loop(EXAMPLE_LOOP_NAME); + log.setLoop(testLoop); + assertThat(log.getMessage()).isEqualTo(SAMPLE_LOG_MESSAGE); + assertThat(log.getLogType()).isEqualTo(LogType.INFO); + assertThat(log.getLogComponent()).isEqualTo(CLAMP_COMPONENT); + assertThat(log.getId()).isEqualTo(id); + Assertions.assertThat(log.getLoop()).isEqualTo(testLoop); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/loop/LoopRepositoriesItCase.java b/src/test/java/org/onap/policy/clamp/loop/LoopRepositoriesItCase.java new file mode 100644 index 000000000..e18dd2475 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/LoopRepositoriesItCase.java @@ -0,0 +1,258 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import java.time.Instant; +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.loop.log.LogType; +import org.onap.policy.clamp.loop.log.LoopLog; +import org.onap.policy.clamp.loop.log.LoopLogRepository; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.service.ServicesRepository; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.LoopElementModelsRepository; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.LoopTemplatesRepository; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelId; +import org.onap.policy.clamp.loop.template.PolicyModelsRepository; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicyService; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = Application.class) +public class LoopRepositoriesItCase { + + private Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); + + @Autowired + private LoopsRepository loopRepository; + + @Autowired + private MicroServicePolicyService microServicePolicyService; + + @Autowired + private OperationalPolicyService operationalPolicyService; + + @Autowired + private LoopLogRepository loopLogRepository; + + @Autowired + private LoopTemplatesRepository loopTemplateRepository; + + @Autowired + private LoopElementModelsRepository microServiceModelsRepository; + + @Autowired + private PolicyModelsRepository policyModelsRepository; + + @Autowired + private ServicesRepository servicesRepository; + + private Service getService(String serviceDetails, String resourceDetails) { + return new Service(serviceDetails, resourceDetails); + } + + private OperationalPolicy getOperationalPolicy(String configJson, String name, PolicyModel policyModel) { + return new OperationalPolicy(name, null, new Gson().fromJson(configJson, JsonObject.class), policyModel, + null, null, null); + } + + private LoopElementModel getLoopElementModel(String yaml, String name, String policyType, String createdBy, + PolicyModel policyModel) { + LoopElementModel model = new LoopElementModel(name, policyType, yaml); + model.addPolicyModel(policyModel); + return model; + } + + private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, + String policyAcronym) { + return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); + } + + private LoopTemplate getLoopTemplates(String name, String blueprint, String createdBy, + Integer maxInstancesAllowed) { + LoopTemplate template = new LoopTemplate(name, blueprint, maxInstancesAllowed, null); + template.addLoopElementModel(getLoopElementModel("yaml", "microService1", "org.onap.policy.drools", createdBy, + getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools"))); + template.addLoopElementModel(getLoopElementModel("yaml", "oppolicy1", "org.onap.policy.drools.legacy", + createdBy, getPolicyModel("org.onap.policy.drools.legacy", "yaml", "1.0.0", "DroolsLegacy"))); + loopTemplateRepository.save(template); + return template; + } + + private Loop getLoop(String name, String blueprint, String globalPropertiesJson, + String dcaeId, String dcaeUrl, String dcaeBlueprintId) { + Loop loop = new Loop(); + loop.setName(name); + loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, JsonObject.class)); + loop.setLastComputedState(LoopState.DESIGN); + loop.setDcaeDeploymentId(dcaeId); + loop.setDcaeDeploymentStatusUrl(dcaeUrl); + loop.setLoopTemplate(getLoopTemplates("templateName", "yaml", "toto", 1)); + return loop; + } + + private MicroServicePolicy getMicroServicePolicy(String name, String jsonRepresentation, String jsonProperties, + boolean shared, PolicyModel policyModel) { + MicroServicePolicy microService = new MicroServicePolicy(name, policyModel, shared, + gson.fromJson(jsonRepresentation, JsonObject.class), null, null, null); + microService.setConfigurationsJson(new Gson().fromJson(jsonProperties, JsonObject.class)); + return microService; + } + + private LoopLog getLoopLog(LogType type, String message, Loop loop) { + return new LoopLog(message, type, "CLAMP", loop); + } + + /** + * This method does a crud test and save a loop template and a loop object in db. + */ + @Test + @Transactional + public void crudTest() { + // Setup + Loop loopTest = getLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", + "123456789", "https://dcaetest.org", "UUID-blueprint"); + OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest", + getPolicyModel("org.onap.policy.drools.legacy", "yaml", "1.0.0", "DroolsLegacy")); + loopTest.addOperationalPolicy(opPolicy); + MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "{\"configtype\":\"json\"}", + "{\"param1\":\"value1\"}", true, getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools")); + loopTest.addMicroServicePolicy(microServicePolicy); + LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest); + loopTest.addLog(loopLog); + Service service = getService( + "{\"name\": \"vLoadBalancerMS\", \"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fce0\"}", "{\"CP\": {}}"); + loopTest.setModelService(service); + + // Attempt to save into the database the entire loop + Loop loopInDb = loopRepository.save(loopTest); + assertThat(loopInDb).isNotNull(); + assertThat(loopRepository.findById(loopInDb.getName()).get()).isNotNull(); + assertThat(loopInDb.getCreatedDate()).isNotNull(); + assertThat(loopInDb.getUpdatedDate()).isNotNull(); + assertThat(loopInDb.getUpdatedDate()).isEqualTo(loopInDb.getCreatedDate()); + assertThat(loopInDb.getName()).isEqualTo("ControlLoopTest"); + // Autogen id so now set the ID in the previous model so that we can compare the + // objects + loopLog.setId(((LoopLog) loopInDb.getLoopLogs().toArray()[0]).getId()); + + assertThat(loopInDb).isEqualToIgnoringGivenFields(loopTest, "components", "createdDate", "updatedDate", + "createdBy", "updatedBy"); + assertThat(loopRepository.existsById(loopTest.getName())).isEqualTo(true); + assertThat(operationalPolicyService.isExisting(opPolicy.getName())).isEqualTo(true); + assertThat(microServicePolicyService.isExisting(microServicePolicy.getName())).isEqualTo(true); + assertThat(loopLogRepository.existsById(loopLog.getId())).isEqualTo(true); + assertThat(loopTemplateRepository.existsById(loopInDb.getLoopTemplate().getName())).isEqualTo(true); + assertThat(loopTemplateRepository.existsById(loopInDb.getLoopTemplate().getName())).isEqualTo(true); + assertThat(servicesRepository.existsById(loopInDb.getModelService().getServiceUuid())).isEqualTo(true); + assertThat(microServiceModelsRepository.existsById( + loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getName())) + .isEqualTo(true); + assertThat(policyModelsRepository.existsById(new PolicyModelId( + loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() + .first().getPolicyModelType(), + loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() + .first().getVersion()))).isEqualTo(true); + + // Now attempt to read from database + Loop loopInDbRetrieved = loopRepository.findById(loopTest.getName()).get(); + assertThat(loopInDbRetrieved).isEqualToIgnoringGivenFields(loopTest, "components", "createdDate", "updatedDate", + "createdBy", "updatedBy"); + assertThat(loopInDbRetrieved).isEqualToComparingOnlyGivenFields(loopInDb, "createdDate", "updatedDate", + "createdBy", "updatedBy"); + assertThat((LoopLog) loopInDbRetrieved.getLoopLogs().toArray()[0]).isEqualToComparingFieldByField(loopLog); + assertThat((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]) + .isEqualToIgnoringGivenFields(opPolicy, "createdDate", "updatedDate", "createdBy", "updatedBy"); + Assertions.assertThat( + ((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getCreatedDate()) + .isNotNull(); + Assertions.assertThat( + ((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getUpdatedDate()) + .isNotNull(); + Assertions.assertThat( + ((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getCreatedBy()) + .isNotNull(); + Assertions.assertThat( + ((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]).getUpdatedBy()) + .isNotNull(); + + assertThat((MicroServicePolicy) loopInDbRetrieved.getMicroServicePolicies().toArray()[0]) + .isEqualToIgnoringGivenFields(microServicePolicy, "createdDate", "updatedDate", "createdBy", + "updatedBy"); + + // Attempt an update + ((LoopLog) loopInDbRetrieved.getLoopLogs().toArray()[0]).setLogInstant(Instant.now()); + loopInDbRetrieved.setLastComputedState(LoopState.RUNNING); + Loop loopInDbRetrievedUpdated = loopRepository.saveAndFlush(loopInDbRetrieved); + // Loop loopInDbRetrievedUpdated = + // loopRepository.findById(loopTest.getName()).get(); + assertThat((LoopLog) loopInDbRetrievedUpdated.getLoopLogs().toArray()[0]) + .isEqualToComparingFieldByField(loopInDbRetrieved.getLoopLogs().toArray()[0]); + // UpdatedDate should have been changed + assertThat(loopInDbRetrievedUpdated.getUpdatedDate()).isNotEqualTo(loopInDbRetrievedUpdated.getCreatedDate()); + // createdDate should have NOT been changed + assertThat(loopInDbRetrievedUpdated.getCreatedDate()).isEqualTo(loopInDb.getCreatedDate()); + // other audit are the same + assertThat(loopInDbRetrievedUpdated.getCreatedBy()).isEqualTo("Not found"); + assertThat(loopInDbRetrievedUpdated.getUpdatedBy()).isEqualTo("Not found"); + + // Attempt to delete the object and check it has well been cascaded + + loopRepository.delete(loopInDbRetrieved); + assertThat(loopRepository.existsById(loopTest.getName())).isEqualTo(false); + assertThat(operationalPolicyService.isExisting(opPolicy.getName())).isEqualTo(false); + assertThat(microServicePolicyService.isExisting(microServicePolicy.getName())).isEqualTo(true); + assertThat(loopLogRepository.existsById(loopLog.getId())).isEqualTo(false); + assertThat(loopTemplateRepository.existsById(loopInDb.getLoopTemplate().getName())).isEqualTo(true); + assertThat(servicesRepository.existsById(loopInDb.getModelService().getServiceUuid())).isEqualTo(true); + assertThat(microServiceModelsRepository.existsById( + loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getName())) + .isEqualTo(true); + + assertThat(policyModelsRepository.existsById(new PolicyModelId( + loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() + .first().getPolicyModelType(), + loopInDb.getLoopTemplate().getLoopElementModelsUsed().first().getLoopElementModel().getPolicyModels() + .first().getVersion()))).isEqualTo(true); + + } +} diff --git a/src/test/java/org/onap/policy/clamp/loop/LoopServiceTestItCase.java b/src/test/java/org/onap/policy/clamp/loop/LoopServiceTestItCase.java new file mode 100644 index 000000000..010c4978a --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/LoopServiceTestItCase.java @@ -0,0 +1,381 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Nokia Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonObject; +import java.util.Set; +import java.util.stream.Collectors; +import javax.transaction.Transactional; +import org.assertj.core.api.Assertions; +import org.assertj.core.util.Lists; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.log.LogType; +import org.onap.policy.clamp.loop.log.LoopLog; +import org.onap.policy.clamp.loop.log.LoopLogService; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelsService; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicyService; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class LoopServiceTestItCase { + + private static final String EXAMPLE_LOOP_NAME = "ClosedLoopTest"; + private static final String EXAMPLE_JSON = "{\"testName\":\"testValue\"}"; + + @Autowired + LoopService loopService; + + @Autowired + LoopsRepository loopsRepository; + + @Autowired + MicroServicePolicyService microServicePolicyService; + + @Autowired + OperationalPolicyService operationalPolicyService; + + @Autowired + LoopLogService loopLogService; + + @Autowired + PolicyModelsService policyModelsService; + + @Test + @Transactional + public void shouldCreateEmptyLoop() { + // given + String loopBlueprint = "blueprint"; + Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, loopBlueprint); + testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); + testLoop.setLastComputedState(LoopState.DESIGN); + + // when + Loop actualLoop = loopService.saveOrUpdateLoop(testLoop); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop).isEqualTo(loopsRepository.findById(actualLoop.getName()).get()); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + assertThat(actualLoop.getGlobalPropertiesJson().getAsJsonPrimitive("testName").getAsString()) + .isEqualTo("testValue"); + } + + @Test + @Transactional + public void shouldAddOperationalPolicyToLoop() { + // given + saveTestLoopToDb(); + OperationalPolicy operationalPolicy = new OperationalPolicy("policyName", null, + JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); + + // when + Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, + Lists.newArrayList(operationalPolicy)); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + Set savedPolicies = actualLoop.getOperationalPolicies(); + assertThat(savedPolicies).hasSize(1); + assertThat(savedPolicies) + .usingElementComparatorIgnoringFields("loop", "createdBy", "createdDate", "updatedBy", "updatedDate") + .contains(operationalPolicy); + OperationalPolicy savedPolicy = savedPolicies.iterator().next(); + Assertions.assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME); + + } + + @Test + @Transactional + public void shouldAddMicroservicePolicyToLoop() { + // given + saveTestLoopToDb(); + PolicyModel policyModel = new PolicyModel("org.policies.policyModel1", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "policyModel1"); + policyModelsService.saveOrUpdatePolicyModel(policyModel); + MicroServicePolicy microServicePolicy = new MicroServicePolicy("policyName", policyModel, + false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + + // when + Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, + Lists.newArrayList(microServicePolicy)); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + Set savedPolicies = actualLoop.getMicroServicePolicies(); + assertThat(savedPolicies).hasSize(1); + assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops", "createdDate", "updatedDate", + "createdBy", "updatedBy").containsExactly(microServicePolicy); + assertThat(savedPolicies).extracting("usedByLoops").hasSize(1); + + } + + @Test + @Transactional + //@Commit + public void shouldCreateNewMicroservicePolicyAndUpdateJsonRepresentationOfOldOne() { + // given + saveTestLoopToDb(); + PolicyModel policyModel1 = new PolicyModel("org.policies.firstPolicyName", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "firstPolicyName"); + policyModelsService.saveOrUpdatePolicyModel(policyModel1); + PolicyModel policyModel2 = new PolicyModel("org.policies.secondPolicyName", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "secondPolicyName"); + policyModelsService.saveOrUpdatePolicyModel(policyModel2); + MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", policyModel1, false, + JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + + loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy)); + MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("secondPolicyName", policyModel2, false, + JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + + // when + firstMicroServicePolicy + .setConfigurationsJson(JsonUtils.GSON.fromJson("{\"name1\":\"value1\"}", JsonObject.class)); + Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, + Lists.newArrayList(firstMicroServicePolicy, secondMicroServicePolicy)); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + Set savedPolicies = actualLoop.getMicroServicePolicies(); + assertThat(savedPolicies).hasSize(2); + assertThat(savedPolicies).contains(firstMicroServicePolicy); + assertThat(savedPolicies).contains(secondMicroServicePolicy); + assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops", "createdDate", "updatedDate", + "createdBy", "updatedBy").containsExactlyInAnyOrder(firstMicroServicePolicy, secondMicroServicePolicy); + } + + private void saveTestLoopToDb() { + Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, "blueprint"); + testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class)); + LoopTemplate template = new LoopTemplate(); + template.setName("testTemplate"); + testLoop.setLoopTemplate(template); + loopService.saveOrUpdateLoop(testLoop); + } + + @Test + @Transactional + public void shouldRemoveOldMicroservicePolicyIfNotInUpdatedList() { + // given + saveTestLoopToDb(); + PolicyModel policyModel1 = new PolicyModel("org.policies.firstPolicyName", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "firstPolicyName"); + policyModelsService.saveOrUpdatePolicyModel(policyModel1); + PolicyModel policyModel2 = new PolicyModel("org.policies.secondPolicyName", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "secondPolicyName"); + policyModelsService.saveOrUpdatePolicyModel(policyModel2); + MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", policyModel1, + false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy)); + + MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("secondPolicyName", policyModel2, + false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + + // when + Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, + Lists.newArrayList(secondMicroServicePolicy)); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + Set savedPolicies = actualLoop.getMicroServicePolicies(); + assertThat(savedPolicies).hasSize(1); + assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops", "createdDate", "updatedDate", + "createdBy", "updatedBy").containsExactly(secondMicroServicePolicy); + + } + + @Test + @Transactional + public void shouldCreateNewOperationalPolicyAndUpdateJsonRepresentationOfOldOne() { + // given + saveTestLoopToDb(); + + JsonObject newJsonConfiguration = JsonUtils.GSON.fromJson("{}", JsonObject.class); + + OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null, + JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); + loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy)); + + OperationalPolicy secondOperationalPolicy = new OperationalPolicy("secondPolicyName", null, + newJsonConfiguration, null, null, null, null); + + // when + firstOperationalPolicy.setConfigurationsJson(newJsonConfiguration); + Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, + Lists.newArrayList(firstOperationalPolicy, secondOperationalPolicy)); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + Set savedPolicies = actualLoop.getOperationalPolicies(); + assertThat(savedPolicies).hasSize(2); + assertThat(savedPolicies) + .usingElementComparatorIgnoringFields("loop", "createdDate", "updatedDate", "createdBy", "updatedBy") + .containsExactlyInAnyOrder(firstOperationalPolicy, secondOperationalPolicy); + Set policiesLoops = Lists.newArrayList(savedPolicies).stream().map(OperationalPolicy::getLoop) + .map(Loop::getName).collect(Collectors.toSet()); + assertThat(policiesLoops).containsExactly(EXAMPLE_LOOP_NAME); + } + + @Test + @Transactional + public void shouldRemoveOldOperationalPolicyIfNotInUpdatedList() { + // given + saveTestLoopToDb(); + + OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null, + JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); + loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy)); + + OperationalPolicy secondOperationalPolicy = new OperationalPolicy("policyName", null, + JsonUtils.GSON.fromJson("{}", JsonObject.class), null, null, "pdpGroup1", "pdpSubgroup1"); + + // when + Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, + Lists.newArrayList(secondOperationalPolicy)); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + Set savedPolicies = actualLoop.getOperationalPolicies(); + assertThat(savedPolicies).hasSize(1); + assertThat(savedPolicies) + .usingElementComparatorIgnoringFields("loop", "createdDate", "updatedDate", "createdBy", "updatedBy") + .containsExactly(secondOperationalPolicy); + OperationalPolicy savedPolicy = savedPolicies.iterator().next(); + Assertions.assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME); + + } + + @Test + @Transactional + public void shouldCreateModelPropertiesAndUpdateJsonRepresentationOfOldOne() { + // given + saveTestLoopToDb(); + String expectedJson = "{\"test\":\"test\"}"; + JsonObject baseGlobalProperites = JsonUtils.GSON.fromJson("{}", JsonObject.class); + JsonObject updatedGlobalProperites = JsonUtils.GSON.fromJson(expectedJson, JsonObject.class); + loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, baseGlobalProperites); + + // when + Loop actualLoop = loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, updatedGlobalProperites); + + // then + assertThat(actualLoop).isNotNull(); + assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME); + JsonObject returnedGlobalProperties = actualLoop.getGlobalPropertiesJson(); + assertThat(returnedGlobalProperties.getAsJsonObject()).isEqualTo(updatedGlobalProperites); + } + + @Test + @Transactional + public void deleteAttempt() { + saveTestLoopToDb(); + // Add log + Loop loop = loopsRepository.findById(EXAMPLE_LOOP_NAME).orElse(null); + loop.addLog(new LoopLog("test", LogType.INFO, "CLAMP", loop)); + LoopTemplate template = new LoopTemplate(); + template.setName("testTemplate"); + loop.setLoopTemplate(template); + loop = loopService.saveOrUpdateLoop(loop); + // Add op policy + OperationalPolicy operationalPolicy = new OperationalPolicy("opPolicy", null, + JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null, null); + loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(operationalPolicy)); + + PolicyModel policyModel = new PolicyModel("org.policies.microPolicy", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "microPolicy"); + policyModelsService.saveOrUpdatePolicyModel(policyModel); + // Add Micro service policy + MicroServicePolicy microServicePolicy = new MicroServicePolicy("microPolicy", policyModel, + false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(microServicePolicy)); + + // Verify it's there + assertThat(loopsRepository.findById(EXAMPLE_LOOP_NAME).orElse(null)).isNotNull(); + loopService.deleteLoop(EXAMPLE_LOOP_NAME); + // Verify it's well deleted and has been cascaded, except for Microservice + assertThat(loopsRepository.findById(EXAMPLE_LOOP_NAME).orElse(null)).isNull(); + assertThat(microServicePolicyService.isExisting("microPolicy")).isTrue(); + assertThat(operationalPolicyService.isExisting("opPolicy")).isFalse(); + assertThat(loopLogService.isExisting(((LoopLog) loop.getLoopLogs().toArray()[0]).getId())).isFalse(); + } + + @Test + @Transactional + public void testUpdateLoopState() { + saveTestLoopToDb(); + Loop loop = loopService.getLoop(EXAMPLE_LOOP_NAME); + loopService.updateLoopState(loop, "SUBMITTED"); + Loop updatedLoop = loopService.getLoop(EXAMPLE_LOOP_NAME); + assertThat(updatedLoop.getLastComputedState()).isEqualTo(LoopState.SUBMITTED); + } + + @Test + @Transactional + public void testUpdateDcaeDeploymentFields() { + saveTestLoopToDb(); + Loop loop = loopService.getLoop(EXAMPLE_LOOP_NAME); + loopService.updateDcaeDeploymentFields(loop, "CLAMP_c5ce429a-f570-48c5-a7ea-53bed8f86f85", + "https4://deployment-handler.onap:8443"); + loop = loopService.getLoop(EXAMPLE_LOOP_NAME); + assertThat(loop.getDcaeDeploymentId()).isEqualTo("CLAMP_c5ce429a-f570-48c5-a7ea-53bed8f86f85"); + assertThat(loop.getDcaeDeploymentStatusUrl()).isEqualTo("https4://deployment-handler.onap:8443"); + } + + @Test + @Transactional + public void testUpdateMicroservicePolicy() { + saveTestLoopToDb(); + assertThat(microServicePolicyService.isExisting("policyName")).isFalse(); + PolicyModel policyModel = new PolicyModel("org.policies.policyName", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", "1.0.0", "policyName"); + policyModelsService.saveOrUpdatePolicyModel(policyModel); + MicroServicePolicy microServicePolicy = new MicroServicePolicy("policyName", policyModel, + false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, null, null); + loopService.updateMicroservicePolicy(EXAMPLE_LOOP_NAME, microServicePolicy); + assertThat(microServicePolicyService.isExisting("policyName")).isTrue(); + } + + private Loop createTestLoop(String loopName, String loopBlueprint) { + return new Loop(loopName); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/policy/clamp/loop/LoopTemplateLoopElementModelTest.java b/src/test/java/org/onap/policy/clamp/loop/LoopTemplateLoopElementModelTest.java new file mode 100644 index 000000000..9dcd71ef1 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/LoopTemplateLoopElementModelTest.java @@ -0,0 +1,105 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.LoopTemplateLoopElementModel; +import org.onap.policy.clamp.loop.template.PolicyModel; + + +public class LoopTemplateLoopElementModelTest { + + private LoopElementModel loopElementModel = getLoopElementModel("yaml", "microService1", + getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools", "type1")); + private LoopTemplate loopTemplate = getLoopTemplate("templateName", "yaml", 1); + + private LoopElementModel getLoopElementModel(String yaml, String name, PolicyModel policyModel) { + LoopElementModel model = new LoopElementModel(); + model.setBlueprint(yaml); + model.setName(name); + model.addPolicyModel(policyModel); + model.setLoopElementType("OPERATIONAL_POLICY"); + return model; + } + + private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, String policyAcronym, + String policyVariant) { + return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); + } + + private LoopTemplate getLoopTemplate(String name, String blueprint, Integer maxInstancesAllowed) { + LoopTemplate template = new LoopTemplate(name, blueprint, maxInstancesAllowed, null); + template.addLoopElementModel(loopElementModel); + return template; + } + + /** + * This tests compareTo method. + */ + @Test + public void compareToTest() { + LoopTemplateLoopElementModel model1 = new LoopTemplateLoopElementModel(); + LoopTemplateLoopElementModel model2 = new LoopTemplateLoopElementModel(); + assertThat(model1.compareTo(model2)).isEqualTo(1); + + model1.setFlowOrder(2); + assertThat(model1.compareTo(model2)).isEqualTo(-1); + + model2.setFlowOrder(3); + assertThat(model1.compareTo(model2)).isEqualTo(1); + } + + /** + * This tests equals method. + */ + @Test + public void equalsTest() { + LoopTemplateLoopElementModel model1 = new LoopTemplateLoopElementModel(); + LoopTemplateLoopElementModel model2 = new LoopTemplateLoopElementModel(); + + assertThat(model1.equals(model2)).isTrue(); + + model1.setLoopTemplate(loopTemplate); + assertThat(model1.equals(model2)).isFalse(); + model2.setLoopTemplate(loopTemplate); + assertThat(model1.equals(model2)).isTrue(); + + model1.setLoopElementModel(loopElementModel); + assertThat(model1.equals(model2)).isFalse(); + model2.setLoopElementModel(loopElementModel); + assertThat(model1.equals(model2)).isTrue(); + + model1.setFlowOrder(1); + assertThat(model1.equals(model2)).isTrue(); + model2.setFlowOrder(2); + assertThat(model1.equals(model2)).isTrue(); + } + +} diff --git a/src/test/java/org/onap/policy/clamp/loop/LoopTemplatesServiceItCase.java b/src/test/java/org/onap/policy/clamp/loop/LoopTemplatesServiceItCase.java new file mode 100644 index 000000000..d608075fc --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/LoopTemplatesServiceItCase.java @@ -0,0 +1,146 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; +import java.util.SortedSet; +import javax.transaction.Transactional; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.LoopTemplateLoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplatesService; +import org.onap.policy.clamp.loop.template.LoopType; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class LoopTemplatesServiceItCase { + + @Autowired + LoopTemplatesService loopTemplatesService; + + private static final String POLICY_MODEL_TYPE_1 = "org.onap.test"; + private static final String VERSION = "1.0.0"; + + private LoopElementModel getLoopElementModel(String yaml, String name, String loopElementType, + String createdBy, PolicyModel policyModel) { + LoopElementModel model = new LoopElementModel(name, loopElementType, yaml); + model.setBlueprint(""); + model.setDcaeBlueprintId(""); + model.addPolicyModel(policyModel); + return model; + } + + private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, + String policyAcronym, String createdBy) { + return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); + } + + private LoopTemplate getLoopTemplate(String name, String blueprint, String createdBy, Integer maxInstancesAllowed) { + LoopTemplate template = + new LoopTemplate(name, blueprint, maxInstancesAllowed, null); + template.addLoopElementModel(getLoopElementModel("yaml", "microService1", "MicroService", + createdBy, getPolicyModel(POLICY_MODEL_TYPE_1, "yaml", VERSION, "MS1", createdBy))); + template.setAllowedLoopType(LoopType.OPEN); + return template; + } + + @Test + @Transactional + public void shouldSaveOrUpdateLoopTemplate() { + LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); + LoopTemplate actualLoopTemplate = + loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); + + assertNotNull(actualLoopTemplate); + assertThat(loopTemplate.getName()).isEqualTo("TemplateName"); + assertThat(loopTemplate.getAllowedLoopType()).isEqualTo(LoopType.OPEN); + } + + @Test + @Transactional + public void shouldReturnAllLoopTemplates() { + LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); + loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); + List loopTemplateList = loopTemplatesService.getAllLoopTemplates(); + + assertNotNull(loopTemplateList); + } + + @Test + @Transactional + public void shouldReturnLoopTemplateNames() { + LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); + loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); + List loopTemplateNames = loopTemplatesService.getLoopTemplateNames(); + + assertNotNull(loopTemplateNames); + assertEquals("TemplateName", loopTemplateNames.get(0)); + } + + @Test + @Transactional + public void shouldReturnLoopTemplate() { + LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); + loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); + LoopTemplate actualLoopTemplate = loopTemplatesService.getLoopTemplate("TemplateName"); + + assertNotNull(actualLoopTemplate); + assertThat(loopTemplate).isEqualTo(actualLoopTemplate); + assertThat(loopTemplate.getName()).isEqualTo(actualLoopTemplate.getName()); + assertThat(loopTemplate.getMaximumInstancesAllowed()) + .isEqualTo(actualLoopTemplate.getMaximumInstancesAllowed()); + SortedSet loopElementModelsUsed = + loopTemplate.getLoopElementModelsUsed(); + LoopTemplateLoopElementModel loopTemplateLoopElementModel = loopElementModelsUsed.first(); + assertThat(loopTemplateLoopElementModel.getLoopElementModel().getName()) + .isEqualTo("microService1"); + assertThat(loopTemplateLoopElementModel.getLoopTemplate().getName()) + .isEqualTo("TemplateName"); + assertNull(actualLoopTemplate.getBlueprint()); + assertNull(actualLoopTemplate.getModelService()); + } + + @Test + @Transactional + public void shouldDeleteLoopTemplate() { + LoopTemplate loopTemplate = getLoopTemplate("TemplateName", null, "xyz", -1); + loopTemplatesService.saveOrUpdateLoopTemplate(loopTemplate); + loopTemplatesService.deleteLoopTemplate("TemplateName"); + LoopTemplate actualLoopTemplate = loopTemplatesService.getLoopTemplate("TemplateName"); + assertNull(actualLoopTemplate); + } + +} diff --git a/src/test/java/org/onap/policy/clamp/loop/LoopToJsonTest.java b/src/test/java/org/onap/policy/clamp/loop/LoopToJsonTest.java new file mode 100644 index 000000000..0fc4b0b5c --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/LoopToJsonTest.java @@ -0,0 +1,173 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import java.io.IOException; +import java.util.Random; +import org.junit.Test; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.log.LogType; +import org.onap.policy.clamp.loop.log.LoopLog; +import org.onap.policy.clamp.loop.service.Service; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; + +public class LoopToJsonTest { + + private Gson gson = new Gson(); + + private OperationalPolicy getOperationalPolicy(String configJson, String name) { + return new OperationalPolicy(name, null, gson.fromJson(configJson, JsonObject.class), + getPolicyModel("org.onap.policy.drools.legacy", "yaml", "1.0.0", "Drools", "type1"), null, null, null); + } + + private Loop getLoop(String name, String blueprint, String globalPropertiesJson, + String dcaeId, String dcaeUrl, String dcaeBlueprintId) + throws JsonSyntaxException, IOException { + Loop loop = new Loop(name); + loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, JsonObject.class)); + loop.setLastComputedState(LoopState.DESIGN); + loop.setDcaeDeploymentId(dcaeId); + loop.setDcaeDeploymentStatusUrl(dcaeUrl); + return loop; + } + + private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, + String policyTosca, String jsonProperties, boolean shared) { + MicroServicePolicy microService = new MicroServicePolicy(name, new PolicyModel(modelType, policyTosca, "1.0.0"), + shared, + gson.fromJson(jsonRepresentation, JsonObject.class), null, null, null); + microService.setConfigurationsJson(new Gson().fromJson(jsonProperties, JsonObject.class)); + return microService; + } + + private LoopElementModel getLoopElementModel(String yaml, String name, PolicyModel policyModel) { + LoopElementModel model = new LoopElementModel(); + model.setBlueprint(yaml); + model.setName(name); + model.addPolicyModel(policyModel); + model.setLoopElementType("OPERATIONAL_POLICY"); + return model; + } + + private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, String policyAcronym, + String policyVariant) { + return new PolicyModel(policyType, policyModelTosca, version, policyAcronym); + } + + private LoopTemplate getLoopTemplate(String name, String blueprint, Integer maxInstancesAllowed) { + LoopTemplate template = new LoopTemplate(name, blueprint, maxInstancesAllowed, null); + template.addLoopElementModel(getLoopElementModel("yaml", "microService1", + getPolicyModel("org.onap.policy.drools", "yaml", "1.0.0", "Drools", "type1"))); + return template; + } + + private LoopLog getLoopLog(LogType type, String message, Loop loop) { + LoopLog log = new LoopLog(message, type, "CLAMP", loop); + log.setId(Long.valueOf(new Random().nextInt())); + return log; + } + + /** + * This tests a GSON encode/decode. + * + * @throws IOException In case of failure + */ + @Test + public void loopGsonTest() throws IOException { + Loop loopTest = getLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", + "123456789", "https://dcaetest.org", "UUID-blueprint"); + OperationalPolicy opPolicy = this.getOperationalPolicy( + ResourceFileUtils.getResourceAsString("tosca/operational-policy-properties.json"), "GuardOpPolicyTest"); + loopTest.addOperationalPolicy(opPolicy); + MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", + "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0", + "{\"param1\":\"value1\"}", true); + loopTest.addMicroServicePolicy(microServicePolicy); + LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest); + loopTest.addLog(loopLog); + LoopTemplate loopTemplate = getLoopTemplate("templateName", "yaml", 1); + loopTest.setLoopTemplate(loopTemplate); + + String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest); + assertThat(jsonSerialized).isNotNull().isNotEmpty(); + System.out.println(jsonSerialized); + Loop loopTestDeserialized = JsonUtils.GSON_JPA_MODEL.fromJson(jsonSerialized, Loop.class); + assertNotNull(loopTestDeserialized); + assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest, "svgRepresentation", "blueprint", + "components"); + assertThat(loopTestDeserialized.getComponent("DCAE").getState()) + .isEqualToComparingFieldByField(loopTest.getComponent("DCAE").getState()); + assertThat(loopTestDeserialized.getComponent("POLICY").getState()).isEqualToComparingOnlyGivenFields( + loopTest.getComponent("POLICY").getState(), "stateName", "description"); + // blueprint not exposed so wont be deserialized + + assertThat(loopTestDeserialized.getOperationalPolicies()).containsExactly(opPolicy); + assertThat(loopTestDeserialized.getMicroServicePolicies()).containsExactly(microServicePolicy); + assertThat(loopTestDeserialized.getLoopLogs()).containsExactly(loopLog); + assertThat((LoopLog) loopTestDeserialized.getLoopLogs().toArray()[0]).isEqualToIgnoringGivenFields(loopLog, + "loop"); + + // Verify the loop template + assertThat(loopTestDeserialized.getLoopTemplate()).isEqualTo(loopTemplate); + } + + /** + * This tests the service object GSON encode/decode. + * + * @throws IOException In case of issues + */ + @Test + public void loopServiceTest() throws IOException { + Loop loopTest2 = getLoop("ControlLoopTest", "yamlcontent", "{\"testname\":\"testvalue\"}", + "123456789", "https://dcaetest.org", "UUID-blueprint"); + + JsonObject jsonModel = new GsonBuilder().create() + .fromJson(ResourceFileUtils.getResourceAsString("tosca/model-properties.json"), JsonObject.class); + Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(), + jsonModel.get("resourceDetails").getAsJsonObject(), "1.0"); + loopTest2.setModelService(service); + String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest2); + assertThat(jsonSerialized).isNotNull().isNotEmpty(); + System.out.println(jsonSerialized); + + Loop loopTestDeserialized = JsonUtils.GSON_JPA_MODEL.fromJson(jsonSerialized, Loop.class); + assertNotNull(loopTestDeserialized); + assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest2, "modelService", "svgRepresentation", + "blueprint", "components"); + } +} diff --git a/src/test/java/org/onap/policy/clamp/loop/PolicyComponentTest.java b/src/test/java/org/onap/policy/clamp/loop/PolicyComponentTest.java new file mode 100644 index 000000000..ea8785855 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/PolicyComponentTest.java @@ -0,0 +1,297 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import java.io.IOException; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.components.external.ExternalComponentState; +import org.onap.policy.clamp.loop.components.external.PolicyComponent; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.policy.clamp.policy.operational.OperationalPolicy; + +public class PolicyComponentTest { + + /** + * Test the computeState method. + * oldState newState expectedFinalState + * NOT_SENT SENT_AND_DEPLOYED NOT_SENT + * NOT_SENT SENT NOT_SENT + * NOT_SENT NOT_SENT NOT_SENT + * NOT_SENT IN_ERROR IN_ERROR + */ + @Test + public void computeStateTestOriginalStateUnknown() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + Exchange exchange2 = Mockito.mock(Exchange.class); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getExchange()).thenReturn(exchange2); + // policy found + deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + PolicyComponent policy = new PolicyComponent(); + + ExternalComponentState state = policy.computeState(exchange); + assertThat(state.getStateName()).isEqualTo("SENT_AND_DEPLOYED"); + // policy found + not deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state2 = policy.computeState(exchange); + assertThat(state2.getStateName()).isEqualTo("SENT"); + // policy not found + not deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state4 = policy.computeState(exchange); + assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); + // policy not found + deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state3 = policy.computeState(exchange); + assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); + } + + /** + * Test the computeState method. + * oldState newState expectedFinalState + * NOT_SENT SENT_AND_DEPLOYED NOT_SENT + * NOT_SENT SENT NOT_SENT + * NOT_SENT NOT_SENT NOT_SENT + * NOT_SENT IN_ERROR IN_ERROR + */ + @Test + public void computeStateTestOriginalStateNotSent() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + Exchange exchange2 = Mockito.mock(Exchange.class); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getExchange()).thenReturn(exchange2); + // policy found + deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + PolicyComponent policy = new PolicyComponent(); + ExternalComponentState notSent = new ExternalComponentState("NOT_SENT", + "The policies defined have NOT yet been created on the policy engine", 90); + policy.setState(notSent); + ExternalComponentState state = policy.computeState(exchange); + assertThat(state.getStateName()).isEqualTo("NOT_SENT"); + // policy found + not deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state2 = policy.computeState(exchange); + assertThat(state2.getStateName()).isEqualTo("NOT_SENT"); + // policy not found + not deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state4 = policy.computeState(exchange); + assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); + // policy not found + deployed + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state3 = policy.computeState(exchange); + assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); + } + + + /** + * Test the computeState method. + * oldState newState expectedFinalState + * SENT SENT SENT + * SENT SENT_AND_DEPLOYED SENT + * SENT IN_ERROR IN_ERROR + * SENT NOT_SENT NOT_SENT + */ + @Test + public void computeStateTestOriginalStateSent() throws IOException { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + Exchange exchange2 = Mockito.mock(Exchange.class); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getExchange()).thenReturn(exchange2); + PolicyComponent policy = new PolicyComponent(); + ExternalComponentState sent = new ExternalComponentState("SENT", + "The policies defined have been created but NOT deployed on the policy engine", 50); + policy.setState(sent); + // new policy state SENT + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state = policy.computeState(exchange); + assertThat(state.getStateName()).isEqualTo("SENT"); + // new policy state SENT_AND_DEPLOYED + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state2 = policy.computeState(exchange); + assertThat(state2.getStateName()).isEqualTo("SENT"); + // new policy state IN_ERROR + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state3 = policy.computeState(exchange); + assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); + // new policy state NOT_SENT + policy.setState(sent); + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state4 = policy.computeState(exchange); + assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); + } + + /** + * Test the computeState method. + * oldState newState expectedFinalState + * SENT_AND_DEPLOYED SENT_AND_DEPLOYED SENT_AND_DEPLOYED + * SENT_AND_DEPLOYED SENT SENT + * SENT_AND_DEPLOYED IN_ERROR IN_ERROR + * SENT_AND_DEPLOYED NOT_SENT NOT_SENT + */ + @Test + public void computeStateTestOriginalStateSentAndDeployed() throws IOException { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + Exchange exchange2 = Mockito.mock(Exchange.class); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getExchange()).thenReturn(exchange2); + PolicyComponent policy = new PolicyComponent(); + ExternalComponentState sendDeployed = new ExternalComponentState("SENT_AND_DEPLOYED", + "The policies defined have been created and deployed on the policy engine", 10); + policy.setState(sendDeployed); + // new policy state SENT_AND_DEPLOYED + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state = policy.computeState(exchange); + assertThat(state.getStateName()).isEqualTo("SENT_AND_DEPLOYED"); + // new policy state SENT + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state2 = policy.computeState(exchange); + assertThat(state2.getStateName()).isEqualTo("SENT"); + // new policy state IN_ERROR + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state3 = policy.computeState(exchange); + assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); + // new policy state NOT_SENT + policy.setState(sendDeployed); + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state4 = policy.computeState(exchange); + assertThat(state4.getStateName()).isEqualTo("NOT_SENT"); + } + + + /** + * Test the computeState method. + * oldState newState expectedFinalState + * IN_ERROR SENT_AND_DEPLOYED IN_ERROR + * IN_ERROR SENT IN_ERROR + * IN_ERROR IN_ERROR IN_ERROR + * IN_ERROR NOT_SENT IN_ERROR + */ + @Test + public void computeStateTestOriginalStateInError() throws IOException { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + Exchange exchange2 = Mockito.mock(Exchange.class); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getExchange()).thenReturn(exchange2); + PolicyComponent policy = new PolicyComponent(); + ExternalComponentState inError = new ExternalComponentState("IN_ERROR", + "There was an error during the sending to policy, the policy engine may be corrupted or inconsistent", + 100); + policy.setState(inError); + // new policy state SENT_AND_DEPLOYED + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state = policy.computeState(exchange); + assertThat(state.getStateName()).isEqualTo("IN_ERROR"); + // new policy state SENT + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(true); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state2 = policy.computeState(exchange); + assertThat(state2.getStateName()).isEqualTo("IN_ERROR"); + // new policy state IN_ERROR + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(true); + ExternalComponentState state3 = policy.computeState(exchange); + assertThat(state3.getStateName()).isEqualTo("IN_ERROR"); + // new policy state NOT_SENT + Mockito.when(exchange2.getProperty("policyFound")).thenReturn(false); + Mockito.when(exchange2.getProperty("policyDeployed")).thenReturn(false); + ExternalComponentState state4 = policy.computeState(exchange); + + assertThat(state4.getStateName()).isEqualTo("IN_ERROR"); + } + + /** + * Test the create policies payload PdpGroup test. + */ + @Test + public void createPoliciesPayloadPdpGroupTest() throws IOException { + Loop loopTest = new Loop("ControlLoopTest"); + PolicyModel policyModel1 = new PolicyModel("onap.policies.monitoring.test", null, "1.0.0"); + + MicroServicePolicy microServicePolicy = new MicroServicePolicy("configPolicyTest", policyModel1, true, + new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), null, "pdpGroup1", "pdpSubgroup1"); + loopTest.addMicroServicePolicy(microServicePolicy); + + MicroServicePolicy microServicePolicy2 = new MicroServicePolicy("configPolicyTest2", policyModel1, true, + new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), null, "pdpGroup2", "pdpSubgroup1"); + loopTest.addMicroServicePolicy(microServicePolicy2); + + PolicyModel policyModel2 = new PolicyModel("onap.policies.monitoring.test2", null, + "1.0.0"); + OperationalPolicy opPolicy = + new OperationalPolicy("opPolicy", new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), + new Gson().fromJson("{\"jsonschema\":\"schema\"}", JsonObject.class), policyModel2, null, + "pdpGroup2", + "pdpSubgroup2"); + + loopTest.addOperationalPolicy(opPolicy); + OperationalPolicy opLegacyPolicy = + new OperationalPolicy("opLegacyPolicy", new Gson().fromJson( + "{\"guard_policies\":[{\"policy-id\":\"guard1\"}]}", JsonObject.class), + new Gson().fromJson("{\"jsonschema\":\"schema\"}", JsonObject.class), policyModel2, null, + "pdpGroup2", + "pdpSubgroup2"); + + loopTest.addOperationalPolicy(opLegacyPolicy); + + LoopTemplate loopTemplate = new LoopTemplate("test", "yaml", 1, null); + loopTemplate.setDcaeBlueprintId("UUID-blueprint"); + loopTest.setLoopTemplate(loopTemplate); + + String payload = PolicyComponent.createPoliciesPayloadPdpGroup(loopTest, "POST"); + String expectedRes = ResourceFileUtils.getResourceAsString("tosca/pdp-group-policy-payload.json"); + + assertThat(payload).isEqualTo(expectedRes); + } +} diff --git a/src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java b/src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java new file mode 100644 index 000000000..e7df80cd8 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java @@ -0,0 +1,312 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.stream.Collectors; +import javax.transaction.Transactional; +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelId; +import org.onap.policy.clamp.loop.template.PolicyModelsRepository; +import org.onap.policy.clamp.loop.template.PolicyModelsService; +import org.onap.policy.clamp.policy.pdpgroup.PdpGroup; +import org.onap.policy.clamp.policy.pdpgroup.PdpSubgroup; +import org.onap.policy.clamp.policy.pdpgroup.PolicyModelKey; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class PolicyModelServiceItCase { + + @Autowired + PolicyModelsService policyModelsService; + + @Autowired + PolicyModelsRepository policyModelsRepository; + + private static final String POLICY_MODEL_TYPE_1 = "org.onap.testos"; + private static final String POLICY_MODEL_TYPE_1_VERSION_1 = "1.0.0"; + + private static final String POLICY_MODEL_TYPE_2 = "org.onap.testos2"; + private static final String POLICY_MODEL_TYPE_3 = "org.onap.testos3"; + private static final String POLICY_MODEL_TYPE_2_VERSION_1 = "1.0.0"; + private static final String POLICY_MODEL_TYPE_3_VERSION_1 = "1.0.0"; + private static final String POLICY_MODEL_TYPE_2_VERSION_2 = "2.0.0"; + + private PolicyModel getPolicyModel(String policyType, String policyModelTosca, String version, + String policyAcronym, String policyVariant, String createdBy) { + PolicyModel policyModel = new PolicyModel(); + policyModel.setCreatedBy(createdBy); + policyModel.setPolicyAcronym(policyAcronym); + policyModel.setPolicyModelTosca(policyModelTosca); + policyModel.setPolicyModelType(policyType); + policyModel.setUpdatedBy(createdBy); + policyModel.setVersion(version); + return policyModel; + } + + /** + * This test the create policy Model. + */ + @Test + @Transactional + public void shouldCreatePolicyModel() { + // given + PolicyModel policyModel = getPolicyModel(POLICY_MODEL_TYPE_1, "yaml", + POLICY_MODEL_TYPE_1_VERSION_1, "TEST", "VARIANT", "user"); + + // when + PolicyModel actualPolicyModel = policyModelsService.saveOrUpdatePolicyModel(policyModel); + + // then + assertThat(actualPolicyModel).isNotNull(); + assertThat(actualPolicyModel).isEqualTo(policyModelsRepository + .findById(new PolicyModelId(actualPolicyModel.getPolicyModelType(), + actualPolicyModel.getVersion())) + .get()); + assertThat(actualPolicyModel.getPolicyModelType()) + .isEqualTo(policyModel.getPolicyModelType()); + Assertions.assertThat(actualPolicyModel.getCreatedBy()).isEqualTo("Not found"); + Assertions.assertThat(actualPolicyModel.getCreatedDate()).isNotNull(); + assertThat(actualPolicyModel.getPolicyAcronym()).isEqualTo(policyModel.getPolicyAcronym()); + assertThat(actualPolicyModel.getPolicyModelTosca()) + .isEqualTo(policyModel.getPolicyModelTosca()); + Assertions.assertThat(actualPolicyModel.getUpdatedBy()).isEqualTo("Not found"); + Assertions.assertThat(actualPolicyModel.getUpdatedDate()).isNotNull(); + assertThat(actualPolicyModel.getVersion()).isEqualTo(policyModel.getVersion()); + + assertThat( + policyModelsService.getPolicyModel(POLICY_MODEL_TYPE_1, POLICY_MODEL_TYPE_1_VERSION_1)) + .isEqualToIgnoringGivenFields(policyModel, "createdDate", "updatedDate", + "createdBy", "updatedBy"); + } + + /** + * This tests a create Policy Model from Tosca. + * + * @throws IOException In case of failure + */ + @Test + @Transactional + public void shouldCreatePolicyModelFromTosca() throws IOException { + String toscaModelYaml = + ResourceFileUtils.getResourceAsString("tosca/tosca_with_metadata.yaml"); + PolicyModel policyModel = policyModelsService.createNewPolicyModelFromTosca(toscaModelYaml); + + assertThat(policyModelsService.getAllPolicyModels()).contains(policyModel); + + assertThat(policyModelsService.getPolicyModelTosca(policyModel.getPolicyModelType(), + policyModel.getVersion())).contains(toscaModelYaml); + } + + /** + * This tests a update Policy Model. + * + * @throws IOException In case of failure + */ + @Test + @Transactional + public void shouldUpdatePolicyModel() throws IOException { + String toscaModelYaml = + ResourceFileUtils.getResourceAsString("tosca/tosca_with_metadata.yaml"); + PolicyModel policyModel = policyModelsService.createNewPolicyModelFromTosca(toscaModelYaml); + String newToscaModelYaml = + ResourceFileUtils.getResourceAsString("tosca/tosca_metadata_clamp_possible_values.yaml"); + + PolicyModel updatedPolicyModel = policyModelsService.updatePolicyModelTosca( + policyModel.getPolicyModelType(), policyModel.getVersion(), newToscaModelYaml); + + assertThat(updatedPolicyModel.getPolicyModelTosca()).isEqualTo(newToscaModelYaml); + + } + + /** + * This tests a getAllPolicyModelTypes get. + */ + @Test + @Transactional + public void shouldReturnAllPolicyModelTypes() { + // given + PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel1); + PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel2); + List policyModelTypesList = policyModelsService.getAllPolicyModelTypes(); + + assertThat(policyModelTypesList).contains(policyModel1.getPolicyModelType(), + policyModel2.getPolicyModelType()); + } + + /** + * This tests a getAllPolicyModels get. + */ + @Test + @Transactional + public void shouldReturnAllPolicyModels() { + PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel1); + PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel2); + + assertThat(policyModelsService.getAllPolicyModels()).contains(policyModel1, policyModel2); + } + + /** + * This tests a getAllPolicyModelsByType get. + */ + @Test + @Transactional + public void shouldReturnAllModelsByType() { + PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel1); + PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel2); + + assertThat(policyModelsService.getAllPolicyModelsByType(POLICY_MODEL_TYPE_2)) + .contains(policyModel1, policyModel2); + } + + /** + * This tests the sorting of policyModel. + */ + @Test + @Transactional + public void shouldReturnSortedSet() { + PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_1, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel1); + PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel2); + PolicyModel policyModel3 = getPolicyModel(POLICY_MODEL_TYPE_3, "yaml", + POLICY_MODEL_TYPE_3_VERSION_1, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel3); + + SortedSet sortedSet = new TreeSet<>(); + policyModelsService.getAllPolicyModels().forEach(sortedSet::add); + List listToCheck = + sortedSet + .stream().filter(policy -> policy.equals(policyModel3) + || policy.equals(policyModel2) || policy.equals(policyModel1)) + .collect(Collectors.toList()); + assertThat(listToCheck.get(0)).isEqualByComparingTo(policyModel2); + assertThat(listToCheck.get(1)).isEqualByComparingTo(policyModel1); + assertThat(listToCheck.get(2)).isEqualByComparingTo(policyModel3); + } + + /** + * This tests the pdpgroup GSON encode/decode and saving. + */ + @Test + @Transactional + public void shouldAddPdpGroupInfo() { + PolicyModel policyModel1 = getPolicyModel(POLICY_MODEL_TYPE_1, "yaml", + POLICY_MODEL_TYPE_1_VERSION_1, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel1); + PolicyModel policyModel2 = getPolicyModel(POLICY_MODEL_TYPE_2, "yaml", + POLICY_MODEL_TYPE_2_VERSION_2, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel2); + PolicyModel policyModel3 = getPolicyModel(POLICY_MODEL_TYPE_3, "yaml", + POLICY_MODEL_TYPE_3_VERSION_1, "TEST", "VARIANT", "user"); + policyModelsService.saveOrUpdatePolicyModel(policyModel3); + + PolicyModelKey type1 = new PolicyModelKey("org.onap.testos", "1.0.0"); + PolicyModelKey type2 = new PolicyModelKey("org.onap.testos2", "2.0.0"); + + PdpSubgroup pdpSubgroup1 = new PdpSubgroup(); + pdpSubgroup1.setPdpType("subGroup1"); + List pdpTypeList = new LinkedList(); + pdpTypeList.add(type1); + pdpTypeList.add(type2); + pdpSubgroup1.setSupportedPolicyTypes(pdpTypeList); + + PolicyModelKey type3 = new PolicyModelKey("org.onap.testos3", "2.0.0"); + PdpSubgroup pdpSubgroup2 = new PdpSubgroup(); + pdpSubgroup2.setPdpType("subGroup2"); + List pdpTypeList2 = new LinkedList(); + pdpTypeList2.add(type2); + pdpTypeList2.add(type3); + pdpSubgroup2.setSupportedPolicyTypes(pdpTypeList2); + + List pdpSubgroupList = new LinkedList(); + pdpSubgroupList.add(pdpSubgroup1); + + PdpGroup pdpGroup1 = new PdpGroup(); + pdpGroup1.setName("pdpGroup1"); + pdpGroup1.setPdpGroupState("ACTIVE"); + pdpGroup1.setPdpSubgroups(pdpSubgroupList); + + List pdpSubgroupList2 = new LinkedList(); + pdpSubgroupList2.add(pdpSubgroup1); + pdpSubgroupList2.add(pdpSubgroup2); + PdpGroup pdpGroup2 = new PdpGroup(); + pdpGroup2.setName("pdpGroup2"); + pdpGroup2.setPdpGroupState("ACTIVE"); + pdpGroup2.setPdpSubgroups(pdpSubgroupList2); + + List pdpGroupList = new LinkedList(); + pdpGroupList.add(pdpGroup1); + pdpGroupList.add(pdpGroup2); + policyModelsService.updatePdpGroupInfo(pdpGroupList); + + JsonObject res1 = + policyModelsService.getPolicyModel("org.onap.testos", "1.0.0").getPolicyPdpGroup(); + String expectedRes1 = + "{\"supportedPdpGroups\":[{\"pdpGroup1\":[\"subGroup1\"]},{\"pdpGroup2\":[\"subGroup1\"]}]}"; + JsonObject expectedJson1 = JsonUtils.GSON.fromJson(expectedRes1, JsonObject.class); + assertThat(res1).isEqualTo(expectedJson1); + + JsonObject res2 = + policyModelsService.getPolicyModel("org.onap.testos2", "2.0.0").getPolicyPdpGroup(); + String expectedRes2 = + "{\"supportedPdpGroups\":[{\"pdpGroup1\":[\"subGroup1\"]},{\"pdpGroup2\":[\"subGroup1\",\"subGroup2\"]}]}"; + JsonObject expectedJson2 = JsonUtils.GSON.fromJson(expectedRes2, JsonObject.class); + assertThat(res2).isEqualTo(expectedJson2); + + JsonObject res3 = + policyModelsService.getPolicyModel("org.onap.testos3", "1.0.0").getPolicyPdpGroup(); + assertThat(res3).isNull(); + } +} diff --git a/src/test/java/org/onap/policy/clamp/loop/ServiceTest.java b/src/test/java/org/onap/policy/clamp/loop/ServiceTest.java new file mode 100644 index 000000000..8f28299fd --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/ServiceTest.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.loop; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonObject; +import org.junit.Test; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.service.Service; + +public class ServiceTest { + + @Test + public void equalMethodTest() { + String serviceStr1 = "{\"name\": \"vLoadBalancerMS\", \"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fce0\"}"; + String serviceStr2 = "{\"name\": \"vLoadBalancerMS2\", \"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fce0\"}"; + String serviceStr3 = "{\"name\": \"vLoadBalancerMS\",\"UUID\": \"63cac700-ab9a-4115-a74f-7eac85e3fc11\"}"; + String resourceStr = "{\"CP\": {}}"; + + Service service1 = new Service(JsonUtils.GSON.fromJson(serviceStr1, JsonObject.class), + JsonUtils.GSON.fromJson(resourceStr, JsonObject.class), "1.0"); + + Service service2 = new Service(JsonUtils.GSON.fromJson(serviceStr2, JsonObject.class), null, "1.0"); + + Service service3 = new Service(JsonUtils.GSON.fromJson(serviceStr3, JsonObject.class), + JsonUtils.GSON.fromJson(resourceStr, JsonObject.class), "1.0"); + + assertThat(service1.equals(service2)).isEqualTo(true); + assertThat(service1.equals(service3)).isEqualTo(false); + } + +} diff --git a/src/test/java/org/onap/policy/clamp/loop/deploy/BlueprintInputParametersTest.java b/src/test/java/org/onap/policy/clamp/loop/deploy/BlueprintInputParametersTest.java new file mode 100644 index 000000000..f7f6baa0c --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/loop/deploy/BlueprintInputParametersTest.java @@ -0,0 +1,125 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications copyright (c) 2019 Nokia + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ + * 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.policy.clamp.loop.deploy; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.LinkedHashSet; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.Loop; +import org.onap.policy.clamp.loop.template.LoopElementModel; +import org.onap.policy.clamp.loop.template.LoopTemplate; +import org.onap.policy.clamp.policy.microservice.MicroServicePolicy; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; + +public class BlueprintInputParametersTest { + + /** + * getDeploymentParametersinJsonMultiBlueprintsTest. + * + * @throws IOException in case of failure + * @throws SdcToscaParserException in case of failure + */ + @Test + public void getDeploymentParametersinJsonMultiBlueprintsTest() throws IOException, SdcToscaParserException { + + + MicroServicePolicy umService1 = Mockito.mock(MicroServicePolicy.class); + Mockito.when(umService1.getName()).thenReturn("testName1"); + + LoopElementModel loopElement = Mockito.mock(LoopElementModel.class); + String blueprint1 = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca.yaml"); + Mockito.when(loopElement.getBlueprint()).thenReturn(blueprint1); + Mockito.when(umService1.getLoopElementModel()).thenReturn(loopElement); + + MicroServicePolicy umService2 = Mockito.mock(MicroServicePolicy.class); + Mockito.when(umService2.getName()).thenReturn("testName2"); + + LoopElementModel loopElement2 = Mockito.mock(LoopElementModel.class); + String blueprint2 = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca_2.yaml"); + Mockito.when(loopElement2.getBlueprint()).thenReturn(blueprint2); + Mockito.when(umService2.getLoopElementModel()).thenReturn(loopElement2); + + MicroServicePolicy umService3 = Mockito.mock(MicroServicePolicy.class); + Mockito.when(umService3.getName()).thenReturn("testName3"); + + LoopElementModel loopElement3 = Mockito.mock(LoopElementModel.class); + String blueprint3 = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca_3.yaml"); + Mockito.when(loopElement3.getBlueprint()).thenReturn(blueprint3); + Mockito.when(umService3.getLoopElementModel()).thenReturn(loopElement3); + + LinkedHashSet umServiceSet = new LinkedHashSet<>(); + umServiceSet.add(umService1); + umServiceSet.add(umService2); + umServiceSet.add(umService3); + Loop loop = Mockito.mock(Loop.class); + Mockito.when(loop.getMicroServicePolicies()).thenReturn(umServiceSet); + + LoopTemplate template = Mockito.mock(LoopTemplate.class); + Mockito.when(template.getUniqueBlueprint()).thenReturn(false); + Mockito.when(loop.getLoopTemplate()).thenReturn(template); + + JsonObject paramJson = DcaeDeployParameters.getDcaeDeploymentParametersInJson(loop); + + Assert.assertEquals(JsonUtils.GSON_JPA_MODEL.toJson(paramJson), + ResourceFileUtils.getResourceAsString( + "example/sdc/expected-result/deployment-parameters-multi-blueprints.json")); + } + + /** + * getDeploymentParametersInJsonSingleBlueprintTest. + * + * @throws IOException In case of failure + * @throws SdcToscaParserException In case of failure + */ + @Test + public void getDeploymentParametersInJsonSingleBlueprintTest() throws IOException, SdcToscaParserException { + Loop loop = Mockito.mock(Loop.class); + + MicroServicePolicy umService1 = Mockito.mock(MicroServicePolicy.class); + Mockito.when(umService1.getName()).thenReturn("testName1"); + LinkedHashSet umServiceSet = new LinkedHashSet(); + umServiceSet.add(umService1); + Mockito.when(loop.getMicroServicePolicies()).thenReturn(umServiceSet); + + LoopTemplate template = Mockito.mock(LoopTemplate.class); + Mockito.when(template.getUniqueBlueprint()).thenReturn(true); + String blueprint = ResourceFileUtils.getResourceAsString("example/sdc/blueprint-dcae/tca.yaml"); + Mockito.when(template.getBlueprint()).thenReturn(blueprint); + Mockito.when(loop.getLoopTemplate()).thenReturn(template); + + JsonObject paramJson = DcaeDeployParameters.getDcaeDeploymentParametersInJson(loop); + + Assert.assertEquals(JsonUtils.GSON_JPA_MODEL.toJson(paramJson), + ResourceFileUtils.getResourceAsString( + "example/sdc/expected-result/deployment-parameters-single-blueprint.json")); + } +} diff --git a/src/test/java/org/onap/policy/clamp/policy/downloader/PolicyEngineControllerTestItCase.java b/src/test/java/org/onap/policy/clamp/policy/downloader/PolicyEngineControllerTestItCase.java new file mode 100644 index 000000000..657adf1d1 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/policy/downloader/PolicyEngineControllerTestItCase.java @@ -0,0 +1,117 @@ +package org.onap.policy.clamp.policy.downloader; +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 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============================================ + * =================================================================== + * + */ + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import java.io.IOException; +import java.time.Instant; +import java.util.List; +import javax.transaction.Transactional; +import org.json.simple.parser.ParseException; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.onap.policy.clamp.loop.template.PolicyModelId; +import org.onap.policy.clamp.loop.template.PolicyModelsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +@ActiveProfiles({"clamp-default", "clamp-policy-controller"}) +public class PolicyEngineControllerTestItCase { + + @Autowired + PolicyEngineController policyController; + + @Autowired + PolicyModelsRepository policyModelsRepository; + + /** + * This method tests a fake synchronization with the emulator. + * + * @throws JsonSyntaxException In case of issues + * @throws IOException In case of issues + * @throws InterruptedException In case of issues + */ + @Test + @Transactional + public void synchronizeAllPoliciesTest() throws JsonSyntaxException, IOException, InterruptedException { + policyController.synchronizeAllPolicies(); + Instant firstExecution = policyController.getLastInstantExecuted(); + assertThat(firstExecution).isNotNull(); + List policyModelsList = policyModelsRepository.findAll(); + assertThat(policyModelsList.size()).isGreaterThanOrEqualTo(5); + assertThat(policyModelsList).contains(new PolicyModel("onap.policies.controlloop.operational.common.Drools", + null, "1.0.0")); + assertThat(policyModelsList).contains(new PolicyModel("onap.policies.controlloop.operational.common.Apex", + null, "1.0.0")); + assertThat(policyModelsList) + .contains(new PolicyModel("onap.policies.controlloop.guard.common.FrequencyLimiter", null, "1.0.0")); + assertThat(policyModelsList) + .contains(new PolicyModel("onap.policies.controlloop.guard.common.Blacklist", null, "1.0.0")); + assertThat(policyModelsList) + .contains(new PolicyModel("onap.policies.controlloop.guard.common.MinMax", null, "2.0.0")); + + // Re-do it to check that there is no issue with duplicate key + policyController.synchronizeAllPolicies(); + Instant secondExecution = policyController.getLastInstantExecuted(); + assertThat(secondExecution).isNotNull(); + + assertThat(firstExecution).isBefore(secondExecution); + } + + @Test + @Transactional + public void downloadPdpGroupsTest() throws JsonSyntaxException, IOException, InterruptedException, ParseException { + PolicyModel policyModel1 = new PolicyModel("onap.policies.monitoring.test", null, "1.0.0"); + policyModelsRepository.saveAndFlush(policyModel1); + PolicyModel policyModel2 = new PolicyModel("onap.policies.controlloop.Operational", null, "1.0.0"); + policyModelsRepository.saveAndFlush(policyModel2); + + policyController.downloadPdpGroups(); + + List policyModelsList = policyModelsRepository.findAll(); + assertThat(policyModelsList.size()).isGreaterThanOrEqualTo(2); + + PolicyModel policy1 = policyModelsRepository + .getOne(new PolicyModelId("onap.policies.monitoring.test", "1.0.0")); + PolicyModel policy2 = policyModelsRepository + .getOne(new PolicyModelId("onap.policies.controlloop.Operational", "1.0.0")); + + String expectedRes1 = "{\"supportedPdpGroups\":[{\"monitoring\":[\"xacml\"]}]}"; + JsonObject expectedJson1 = JsonUtils.GSON.fromJson(expectedRes1, JsonObject.class); + assertThat(policy1.getPolicyPdpGroup()).isEqualTo(expectedJson1); + String expectedRes2 = "{\"supportedPdpGroups\":[{\"controlloop\":[\"apex\",\"drools\"]}]}"; + JsonObject expectedJson2 = JsonUtils.GSON.fromJson(expectedRes2, JsonObject.class); + assertThat(policy2.getPolicyPdpGroup()).isEqualTo(expectedJson2); + + } +} diff --git a/src/test/java/org/onap/policy/clamp/policy/microservice/MicroServicePayloadTest.java b/src/test/java/org/onap/policy/clamp/policy/microservice/MicroServicePayloadTest.java new file mode 100644 index 000000000..4bb850c35 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/policy/microservice/MicroServicePayloadTest.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.microservice; + +import com.google.gson.JsonObject; +import java.io.IOException; +import org.junit.Test; +import org.onap.policy.clamp.clds.util.JsonUtils; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.template.PolicyModel; +import org.skyscreamer.jsonassert.JSONAssert; + +public class MicroServicePayloadTest { + + @Test + public void testPayloadConstruction() throws IOException { + MicroServicePolicy policy = new MicroServicePolicy("testPolicy", new PolicyModel( + "onap.policies.monitoring.cdap.tca.hi.lo.app", + ResourceFileUtils.getResourceAsString("tosca/tosca_example.yaml"), "1.0.0"), false, null, null, null, + null); + policy.setConfigurationsJson(JsonUtils.GSON.fromJson( + ResourceFileUtils.getResourceAsString("tosca/micro-service-policy-properties.json"), JsonObject.class)); + JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/micro-service-policy-payload.json"), + policy.createPolicyPayload(), false); + } +} diff --git a/src/test/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java b/src/test/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java new file mode 100644 index 000000000..136430c8f --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.operational; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import java.io.IOException; +import org.junit.Test; +import org.onap.policy.clamp.clds.util.ResourceFileUtils; +import org.onap.policy.clamp.loop.service.Service; +import org.skyscreamer.jsonassert.JSONAssert; + +public class OperationalPolicyRepresentationBuilderTest { + + @Test + public void testOperationalPolicyPayloadConstruction() throws IOException { + JsonObject jsonModel = new GsonBuilder().create().fromJson(ResourceFileUtils + .getResourceAsString("tosca/model-properties-operational-policy.json"), JsonObject.class); + Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(), + jsonModel.get("resourceDetails").getAsJsonObject(), "1.0"); + + JsonObject jsonSchema = OperationalPolicyRepresentationBuilder.generateOperationalPolicySchema(service); + + assertThat(jsonSchema).isNotNull(); + + JSONAssert.assertEquals(ResourceFileUtils.getResourceAsString("tosca/operational-policy-json-schema.json"), + new GsonBuilder().create().toJson(jsonSchema), false); + } + + @Test + public void testOperationalPolicyPayloadConstructionForCds() throws IOException { + JsonObject jsonModel = new GsonBuilder().create() + .fromJson(ResourceFileUtils.getResourceAsString("tosca/model-properties-cds.json"), JsonObject.class); + Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(), + jsonModel.get("resourceDetails").getAsJsonObject(), + "1.0"); + + JsonObject jsonSchema = OperationalPolicyRepresentationBuilder.generateOperationalPolicySchema(service); + assertThat(jsonSchema).isNotNull(); + JSONAssert.assertEquals( + ResourceFileUtils.getResourceAsString("tosca/operational-policy-cds-payload-with-list.json"), + new GsonBuilder().create().toJson(jsonSchema), false); + } +} diff --git a/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupTest.java b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupTest.java new file mode 100644 index 000000000..699693de0 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupTest.java @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.pdpgroup; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import org.junit.Test; + +public class PdpGroupTest { + + + @Test + public void testGetSupportedSubgroups() throws IOException { + PdpGroup pdpGroup1 = new PdpGroup(); + pdpGroup1.setName("pdpGroup1"); + pdpGroup1.setPdpGroupState("INACTIVE"); + assertThat(pdpGroup1.getSupportedSubgroups("test", "1.0.0")).isNull(); + + PdpGroup pdpGroup2 = new PdpGroup(); + pdpGroup2.setName("pdpGroup2"); + pdpGroup2.setPdpGroupState("ACTIVE"); + + PolicyModelKey type1 = new PolicyModelKey("type1", "1.0.0"); + PolicyModelKey type2 = new PolicyModelKey("type2", "2.0.0"); + + PdpSubgroup pdpSubgroup1 = new PdpSubgroup(); + pdpSubgroup1.setPdpType("subGroup1"); + List pdpTypeList = new LinkedList(); + pdpTypeList.add(type1); + pdpTypeList.add(type2); + pdpSubgroup1.setSupportedPolicyTypes(pdpTypeList); + + PolicyModelKey type3 = new PolicyModelKey("type3", "1.0.0"); + PdpSubgroup pdpSubgroup2 = new PdpSubgroup(); + pdpSubgroup2.setPdpType("subGroup2"); + List pdpTypeList2 = new LinkedList(); + pdpTypeList2.add(type2); + pdpTypeList2.add(type3); + pdpSubgroup2.setSupportedPolicyTypes(pdpTypeList2); + + List pdpSubgroupList = new LinkedList(); + pdpSubgroupList.add(pdpSubgroup1); + pdpSubgroupList.add(pdpSubgroup2); + pdpGroup2.setPdpSubgroups(pdpSubgroupList); + + JsonObject res1 = pdpGroup2.getSupportedSubgroups("type2", "2.0.0"); + assertThat(res1.get("pdpGroup2")).isNotNull(); + JsonArray resSubList = res1.getAsJsonArray("pdpGroup2"); + assertThat(resSubList.size()).isEqualTo(2); + assertThat(resSubList.toString().contains("subGroup1")).isTrue(); + assertThat(resSubList.toString().contains("subGroup2")).isTrue(); + + JsonObject res2 = pdpGroup2.getSupportedSubgroups("type1", "1.0.0"); + assertThat(res2.get("pdpGroup2")).isNotNull(); + JsonArray resSubList2 = res2.getAsJsonArray("pdpGroup2"); + assertThat(resSubList2.size()).isEqualTo(1); + + assertThat(pdpGroup2.getSupportedSubgroups("type3", "1.0.1")).isNull(); + } +} diff --git a/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKeyTest.java b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKeyTest.java new file mode 100644 index 000000000..d4cf27392 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PolicyModelKeyTest.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.policy.pdpgroup; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import org.junit.Test; + +public class PolicyModelKeyTest { + + @Test + public void testEqualsMethod() throws IOException { + PolicyModelKey key1 = new PolicyModelKey("name1", "1.0.0"); + PolicyModelKey key2 = new PolicyModelKey(null, "1.0.0"); + PolicyModelKey key3 = new PolicyModelKey("name1", null); + + assertThat(key1.equals(null)).isFalse(); + assertThat(key1.equals("key2")).isFalse(); + + assertThat(key2.equals(key1)).isFalse(); + assertThat(key3.equals(key1)).isFalse(); + + PolicyModelKey key4 = new PolicyModelKey("name2", "1.0.0"); + PolicyModelKey key5 = new PolicyModelKey("name1", "2.0.0"); + assertThat(key1.equals(key4)).isFalse(); + assertThat(key1.equals(key5)).isFalse(); + + PolicyModelKey key6 = new PolicyModelKey("name(.*)", "1.0.0"); + PolicyModelKey key7 = new PolicyModelKey("name1", "1.0.0"); + assertThat(key1.equals(key6)).isTrue(); + assertThat(key1.equals(key7)).isTrue(); + } +} diff --git a/src/test/java/org/onap/policy/clamp/tosca/DictionaryServiceItCase.java b/src/test/java/org/onap/policy/clamp/tosca/DictionaryServiceItCase.java new file mode 100644 index 000000000..fdde53a21 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/tosca/DictionaryServiceItCase.java @@ -0,0 +1,247 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.tosca; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; +import javax.persistence.EntityNotFoundException; +import javax.transaction.Transactional; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.clamp.clds.Application; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class DictionaryServiceItCase { + + @Autowired + private DictionaryService dictionaryService; + + @Autowired + private DictionaryElementsRepository dictionaryElementsRepository; + + private DictionaryElement getDictionaryElement(String shortName, String name, + String description, String type, String subDictionaryName) { + + return new DictionaryElement(name, shortName, description, type, subDictionaryName); + + } + + private Dictionary getSimpleDictionaryExample() { + + Dictionary dictionary = new Dictionary("Dictionary1", 0, null); + + dictionary.addDictionaryElements(getDictionaryElement("DE1", "DictionaryElement1", + "DictionaryElement1", "string", null)); + + dictionary.addDictionaryElements(getDictionaryElement("DE2", "DictionaryElement2", + "DictionaryElement2", "number", null)); + + return dictionary; + } + + private Dictionary getSecondaryDictionaryExample() { + + Dictionary dictionary = new Dictionary("SecondaryDict", 1, "string"); + + dictionary.addDictionaryElements(getDictionaryElement("SDE1", "SecondaryDictElement1", + "SecondaryDictElement1", "string", null)); + + dictionary.addDictionaryElements(getDictionaryElement("SDE2", "SecondaryDictElement2", + "SecondaryDictElement2", "string", null)); + + return dictionary; + } + + /** + * Test to validate that Dictionary is created. + */ + @Test + @Transactional + public void shouldCreateDictionary() { + Dictionary dictionary = getSimpleDictionaryExample(); + Dictionary actualDictionary = dictionaryService.saveOrUpdateDictionary(dictionary); + assertNotNull(actualDictionary); + assertThat(actualDictionary).isEqualTo(dictionary); + assertThat(actualDictionary.getName()).isEqualTo(dictionary.getName()); + + assertThat(actualDictionary.getDictionaryElements()).contains( + dictionaryElementsRepository.findById("DE1").get(), + dictionaryElementsRepository.findById("DE2").get()); + } + + /** + * Test to validate a DictionaryElement is created for a Dictionary. + */ + @Test + @Transactional + public void shouldCreateorUpdateDictionaryElement() { + Dictionary dictionary = getSimpleDictionaryExample(); + Dictionary actualDictionary = dictionaryService.saveOrUpdateDictionary(dictionary); + DictionaryElement dictionaryElement = + getDictionaryElement("DictionaryElement3", "DE3", "DictionaryElement3", "date", null); + actualDictionary.addDictionaryElements(dictionaryElement); + Dictionary updatedDictionary = dictionaryService + .saveOrUpdateDictionaryElement(actualDictionary.getName(), actualDictionary); + assertNotNull(updatedDictionary); + assertTrue(updatedDictionary.getDictionaryElements().contains(dictionaryElement)); + assertThat(updatedDictionary.getName()).isEqualTo(actualDictionary.getName()); + // update the dictionary element. + dictionaryElement.setDescription("DictionaryElement3 New Description"); + Dictionary dictionary3 = new Dictionary("Dictionary1", 0, null); + dictionary3.addDictionaryElements(dictionaryElement); + Dictionary updatedDictionary2 = + dictionaryService.saveOrUpdateDictionaryElement(dictionary3.getName(), dictionary3); + + assertNotNull(updatedDictionary2); + assertTrue(updatedDictionary2.getDictionaryElements().contains(dictionaryElement)); + updatedDictionary2.getDictionaryElements().forEach(element -> { + if (element.equals(dictionaryElement)) { + assertTrue(element.getDescription().equals(dictionaryElement.getDescription())); + } + }); + + } + + /** + * Test to validate that All Dictionaries are retrieved. + */ + @Test + @Transactional + public void shouldReturnAllDictionaries() { + Dictionary dictionary = getSimpleDictionaryExample(); + Dictionary secondaryDictionary = getSecondaryDictionaryExample(); + dictionaryService.saveOrUpdateDictionary(dictionary); + dictionaryService.saveOrUpdateDictionary(secondaryDictionary); + + List list = dictionaryService.getAllDictionaries(); + assertNotNull(list); + assertThat(list).contains(dictionary, secondaryDictionary); + } + + /** + * Test to validate one Dictionary is returned. + */ + @Test + @Transactional + public void shouldReturnOneDictionary() { + Dictionary dictionary = getSimpleDictionaryExample(); + dictionaryService.saveOrUpdateDictionary(dictionary); + + Dictionary returnedDictionary = dictionaryService.getDictionary("Dictionary1"); + assertNotNull(returnedDictionary); + assertThat(returnedDictionary).isEqualTo(dictionary); + assertThat(returnedDictionary.getDictionaryElements()) + .isEqualTo(dictionary.getDictionaryElements()); + } + + /** + * Test to validate one Dictionary is returned. + */ + @Test + @Transactional + public void shouldReturnEntityNotFoundException() { + try { + dictionaryService.getDictionary("Test"); + } catch (Exception e) { + assertThat(e).isInstanceOf(EntityNotFoundException.class); + assertTrue(e.getMessage().equals("Couldn't find Dictionary named: Test")); + } + } + + /** + * Test to validate Dictionary is deleted. + */ + @Test + @Transactional + public void shouldDeleteDictionaryByObject() { + Dictionary dictionary = getSimpleDictionaryExample(); + Dictionary returnedDictionary = dictionaryService.saveOrUpdateDictionary(dictionary); + + dictionaryService.deleteDictionary(returnedDictionary); + try { + dictionaryService.getDictionary("Dictionary1"); + } catch (EntityNotFoundException e) { + assertTrue(e.getMessage().equals("Couldn't find Dictionary named: Dictionary1")); + } + } + + /** + * Test to validate Dictionary is deleted by Name. + */ + @Test + @Transactional + public void shouldDeleteDictionaryByName() { + Dictionary dictionary = getSimpleDictionaryExample(); + dictionaryService.saveOrUpdateDictionary(dictionary); + dictionaryService.deleteDictionary(dictionary.getName()); + try { + dictionaryService.getDictionary("Dictionary1"); + } catch (EntityNotFoundException e) { + assertTrue(e.getMessage().equals("Couldn't find Dictionary named: Dictionary1")); + } + } + + /** + * Test to validate DictionaryElements is deleted by Name. + */ + @Test + @Transactional + public void shouldDeleteDictionaryElementsByName() { + Dictionary dictionary = getSimpleDictionaryExample(); + dictionaryService.saveOrUpdateDictionary(dictionary); + DictionaryElement dictionaryElement = + dictionaryElementsRepository.findById("DE1").orElse(null); + assertNotNull(dictionaryElement); + dictionaryService.deleteDictionaryElement("Dictionary1", "DE1"); + dictionary = dictionaryService.getDictionary("Dictionary1"); + DictionaryElement deletedDictionaryElement = + dictionaryElementsRepository.findById("DE1").orElse(null); + assertThat(deletedDictionaryElement).isNotIn(dictionary.getDictionaryElements()); + } + + /** + * Test to validate all secondary level dictionary names are returned. + */ + @Test + @Transactional + public void shouldReturnAllSecondaryLevelDictionaryNames() { + Dictionary dictionary = getSecondaryDictionaryExample(); + dictionaryService.saveOrUpdateDictionary(dictionary); + + Dictionary dictionary2 = new Dictionary("SecondaryDict2", 1, "string"); + dictionaryService.saveOrUpdateDictionary(dictionary2); + List secondaryDictionaryNames = + dictionaryService.getAllSecondaryLevelDictionaryNames(); + + assertNotNull(secondaryDictionaryNames); + assertThat(secondaryDictionaryNames).contains(dictionary.getName(), dictionary2.getName()); + } +} diff --git a/src/test/java/org/onap/policy/clamp/util/PassDecoderTest.java b/src/test/java/org/onap/policy/clamp/util/PassDecoderTest.java new file mode 100644 index 000000000..83e894130 --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/util/PassDecoderTest.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; + +public class PassDecoderTest { + + private final String encrypted = "enc:WWCxchk4WGBNSvuzLq3MLjMs5ObRybJtts5AI0XD1Vc"; + + @Test + public final void testDecryptionNoKeyfile() throws Exception { + String decodedPass = PassDecoder.decode(encrypted, null); + assertEquals(decodedPass, encrypted); + } + + @Test + public final void testDecryptionNoPassword() throws Exception { + String decodedPass = PassDecoder.decode(null, "classpath:clds/aaf/org.onap.clamp.keyfile"); + assertNull(decodedPass); + } + + @Test + public final void testDecryption() throws Exception { + String decodedPass = PassDecoder.decode(encrypted, "classpath:clds/aaf/org.onap.clamp.keyfile"); + assertEquals(decodedPass, "China in the Spring"); + } +} diff --git a/src/test/java/org/onap/policy/clamp/util/SemanticVersioningTest.java b/src/test/java/org/onap/policy/clamp/util/SemanticVersioningTest.java new file mode 100644 index 000000000..604ce55db --- /dev/null +++ b/src/test/java/org/onap/policy/clamp/util/SemanticVersioningTest.java @@ -0,0 +1,91 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.policy.clamp.util; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class SemanticVersioningTest { + + /** + * compare test. + */ + @Test + public void compareTest() { + assertThat(SemanticVersioning.compare("1.0.0", "2.0.0")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("1.5.0", "2.0.0")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("1.5.0", "2.1.0")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("1.5.3", "2.0.0")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("2.5.3", "2.6.0")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("2.5", "2.5.1")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("2.5.0", "2.5.1")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("2.5.0.0", "2.5.1")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("2.5.1.0", "2.5.1")).isEqualTo(1); + + assertThat(SemanticVersioning.compare("2.0.0", "1.0.0")).isEqualTo(1); + assertThat(SemanticVersioning.compare("2.0.0", "1.5.0")).isEqualTo(1); + assertThat(SemanticVersioning.compare("2.1.0", "1.5.0")).isEqualTo(1); + assertThat(SemanticVersioning.compare("2.0.0", "1.5.3")).isEqualTo(1); + assertThat(SemanticVersioning.compare("2.6.0", "2.5.3")).isEqualTo(1); + assertThat(SemanticVersioning.compare("2.5.1", "2.5")).isEqualTo(1); + assertThat(SemanticVersioning.compare("2.5.1", "2.5.0")).isEqualTo(1); + assertThat(SemanticVersioning.compare("2.5.1", "2.5.0.0")).isEqualTo(1); + assertThat(SemanticVersioning.compare("1", "1.2.3.0")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("1.2", "1")).isEqualTo(1); + } + + /** + * Compare test. + */ + @Test + public void compareEqualsTest() { + assertThat(SemanticVersioning.compare("1.0.0", "1.0.0")).isEqualTo(0); + assertThat(SemanticVersioning.compare("1.0.0.0", "1.0.0")).isEqualTo(1); + assertThat(SemanticVersioning.compare("1.2.3", "1.2.3")).isEqualTo(0); + assertThat(SemanticVersioning.compare("1.2.3", "1.2.3.0")).isEqualTo(-1); + + } + + /** + * Compare with null. + */ + @Test + public void compareNullTest() { + assertThat(SemanticVersioning.compare(null, null)).isEqualTo(0); + assertThat(SemanticVersioning.compare(null, "1.0")).isEqualTo(-1); + assertThat(SemanticVersioning.compare("1.0", null)).isEqualTo(1); + } + + /** + * Increment major version test. + */ + @Test + public void incrementVersionTest() { + assertThat(SemanticVersioning.incrementMajorVersion("1.0")).isEqualTo("2.0.0"); + assertThat(SemanticVersioning.incrementMajorVersion("1.0.0")).isEqualTo("2.0.0"); + assertThat(SemanticVersioning.incrementMajorVersion("1")).isEqualTo("2.0.0"); + assertThat(SemanticVersioning.incrementMajorVersion("1.2.3")).isEqualTo("2.0.0"); + } +} -- cgit 1.2.3-korg