Merge "Allow additional parameters to deployment"
authorSébastien Determe <sd378r@intl.att.com>
Fri, 23 Mar 2018 08:21:14 +0000 (08:21 +0000)
committerGerrit Code Review <gerrit@onap.org>
Fri, 23 Mar 2018 08:21:14 +0000 (08:21 +0000)
113 files changed:
extra/docker/clamp/config/clds-policy-config-sdc_proxy.properties [deleted file]
extra/docker/clamp/config/clds-reference-sdc_proxy.properties [deleted file]
extra/docker/clamp/docker-compose.yml
extra/docker/elk/.env [new file with mode: 0644]
extra/docker/elk/README.md [new file with mode: 0644]
extra/docker/elk/docker-compose.yml [new file with mode: 0644]
extra/docker/elk/es_backup/default.json [new file with mode: 0644]
extra/docker/elk/logstash-conf/logstash.conf [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/ds_mocker.py [new file with mode: 0755]
extra/docker/elk/tools/DMaaPServiceMocker/event_abated.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/event_onset.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_active.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_final_failed.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_final_open.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_final_success.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_operation.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_operation_failure.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_operation_success.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_rejected_disabled.json [new file with mode: 0644]
extra/docker/elk/tools/DMaaPServiceMocker/notification_rejected_missing.json [new file with mode: 0644]
extra/docker/elk/tools/EsAutoQuery/autoQueryLoop.sh [new file with mode: 0755]
extra/docker/elk/tools/EsAutoQuery/closedLoopAlarmDuration.json [new file with mode: 0644]
extra/docker/elk/tools/EsAutoQuery/timeSince.json [new file with mode: 0644]
pom.xml
src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserFilesConfiguration.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java
src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/model/CldsModel.java
src/main/java/org/onap/clamp/clds/sdc/controller/SdcSingleController.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstaller.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/service/CldsService.java
src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java
src/main/resources/META-INF/resources/designer/css/jquery.dataTables_themeroller.css [deleted file]
src/main/resources/META-INF/resources/designer/css/plugins/dataTables.bootstrap.css [deleted file]
src/main/resources/META-INF/resources/designer/index.html
src/main/resources/application.properties
src/main/resources/clds/blueprint-parser-mapping.json [new file with mode: 0644]
src/main/resources/clds/camel/flexible-flow.xml
src/main/resources/clds/templates/bpmn/holmes-img.xml [new file with mode: 0644]
src/main/resources/clds/templates/bpmn/holmes-template.xml [new file with mode: 0644]
src/main/resources/clds/templates/bpmn/tca-img.xml [new file with mode: 0644]
src/main/resources/clds/templates/bpmn/tca-template.xml [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/it/CldsTemplateServiceItCase.java
src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java
src/test/resources/application.properties
src/test/resources/clds/blueprint-parser-mapping.json [new file with mode: 0644]
src/test/resources/clds/templates/bpmn/holmes-img.xml [new file with mode: 0644]
src/test/resources/clds/templates/bpmn/holmes-template.xml [new file with mode: 0644]
src/test/resources/clds/templates/bpmn/tca-img.xml [new file with mode: 0644]
src/test/resources/clds/templates/bpmn/tca-template.xml [new file with mode: 0644]
src/test/resources/example/dao/template-doc-content.json [new file with mode: 0644]
src/test/resources/example/sdc/blueprint-dcae/holmes.yaml [new file with mode: 0644]
src/test/resources/example/sdc/blueprint-dcae/not-recognized.yaml [new file with mode: 0644]
src/test/resources/example/sdc/blueprint-dcae/tca.yaml [new file with mode: 0644]
src/test/resources/http-cache/example/pdp/api/getConfig/.file [new file with mode: 0644]
src/test/resources/http-cache/example/pdp/api/getConfig/.header [new file with mode: 0644]
src/test/resources/http-cache/example/pdp/api/pushPolicy/.file [new file with mode: 0644]
src/test/resources/http-cache/example/pdp/api/pushPolicy/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources&#63;resourceType=VFC/.header with 100% similarity]
src/test/resources/http-cache/example/pdp/api/updatePolicy/.file [new file with mode: 0644]
src/test/resources/http-cache/example/pdp/api/updatePolicy/.header [new file with mode: 0644]
src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=CVFC/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources&#63;resourceType=CVFC/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=CVFC/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources&#63;resourceType=CVFC/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=VF/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources&#63;resourceType=VF/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=VF/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources&#63;resourceType=VF/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=VFC/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources&#63;resourceType=VFC/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=VFC/.header [new file with mode: 0644]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/228aac11-6e48-4412-afbf-327c5c3b04fb/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/228aac11-6e48-4412-afbf-327c5c3b04fb/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/228aac11-6e48-4412-afbf-327c5c3b04fb/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/228aac11-6e48-4412-afbf-327c5c3b04fb/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/2bbcbcce-f9e2-4f5d-b975-1f1122d3226c/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/2bbcbcce-f9e2-4f5d-b975-1f1122d3226c/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/2bbcbcce-f9e2-4f5d-b975-1f1122d3226c/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/2bbcbcce-f9e2-4f5d-b975-1f1122d3226c/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/38b62ebd-276a-48e8-948b-de76c81d6686/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/38b62ebd-276a-48e8-948b-de76c81d6686/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/38b62ebd-276a-48e8-948b-de76c81d6686/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/38b62ebd-276a-48e8-948b-de76c81d6686/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/68bb176c-8d5f-4d27-8407-fd8d9e5910eb/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/68bb176c-8d5f-4d27-8407-fd8d9e5910eb/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/68bb176c-8d5f-4d27-8407-fd8d9e5910eb/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/68bb176c-8d5f-4d27-8407-fd8d9e5910eb/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/701bf7b7-ddf1-4658-af5f-66c815348fd3/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/701bf7b7-ddf1-4658-af5f-66c815348fd3/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/701bf7b7-ddf1-4658-af5f-66c815348fd3/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/701bf7b7-ddf1-4658-af5f-66c815348fd3/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/8fb4db8b-1d1f-4369-8611-0375d86f0051/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/8fb4db8b-1d1f-4369-8611-0375d86f0051/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/8fb4db8b-1d1f-4369-8611-0375d86f0051/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/8fb4db8b-1d1f-4369-8611-0375d86f0051/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/948da0c9-536e-4688-85eb-d906fe7324b3/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/948da0c9-536e-4688-85eb-d906fe7324b3/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/948da0c9-536e-4688-85eb-d906fe7324b3/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/948da0c9-536e-4688-85eb-d906fe7324b3/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/98c27d0b-9395-4f8b-87ab-e076cd1f627e/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/98c27d0b-9395-4f8b-87ab-e076cd1f627e/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/98c27d0b-9395-4f8b-87ab-e076cd1f627e/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/98c27d0b-9395-4f8b-87ab-e076cd1f627e/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/a004b0d8-54bd-4ede-9311-c75dc608e9fd/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/a004b0d8-54bd-4ede-9311-c75dc608e9fd/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/a004b0d8-54bd-4ede-9311-c75dc608e9fd/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/a004b0d8-54bd-4ede-9311-c75dc608e9fd/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/a01ebd00-4b64-4607-8422-c3733735800d/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/a01ebd00-4b64-4607-8422-c3733735800d/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/a01ebd00-4b64-4607-8422-c3733735800d/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/a01ebd00-4b64-4607-8422-c3733735800d/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/b339e576-e433-4be4-8a43-258f629c4e79/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/b339e576-e433-4be4-8a43-258f629c4e79/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/b339e576-e433-4be4-8a43-258f629c4e79/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/b339e576-e433-4be4-8a43-258f629c4e79/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/c041f64d-8d8f-4f89-906f-79dccc63e7f5/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/c041f64d-8d8f-4f89-906f-79dccc63e7f5/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/c041f64d-8d8f-4f89-906f-79dccc63e7f5/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/c041f64d-8d8f-4f89-906f-79dccc63e7f5/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/c8a01686-2762-483c-98ad-a66606b9947f/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/c8a01686-2762-483c-98ad-a66606b9947f/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/c8a01686-2762-483c-98ad-a66606b9947f/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/c8a01686-2762-483c-98ad-a66606b9947f/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/cca286e8-5ac0-451c-b874-8cc307181e10/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/cca286e8-5ac0-451c-b874-8cc307181e10/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/cca286e8-5ac0-451c-b874-8cc307181e10/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/cca286e8-5ac0-451c-b874-8cc307181e10/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/d6a5add1-162a-4966-80a6-8ba53d83b17f/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/d6a5add1-162a-4966-80a6-8ba53d83b17f/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/d6a5add1-162a-4966-80a6-8ba53d83b17f/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/d6a5add1-162a-4966-80a6-8ba53d83b17f/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/f2686c0f-11c5-4cab-83bd-b0f2cc35bf4d/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/f2686c0f-11c5-4cab-83bd-b0f2cc35bf4d/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/resources/f2686c0f-11c5-4cab-83bd-b0f2cc35bf4d/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/resources/f2686c0f-11c5-4cab-83bd-b0f2cc35bf4d/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/services/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/services/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/services/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/services/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/metadata/.header with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts/.file [new file with mode: 0644]
src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts/.header [new file with mode: 0644]
src/test/resources/http-cache/example/sdc/v1/catalog/services/aecb6332-e906-4334-9f04-93ba4926f6c2/metadata/.file [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/services/aecb6332-e906-4334-9f04-93ba4926f6c2/metadata/.file with 100% similarity]
src/test/resources/http-cache/example/sdc/v1/catalog/services/aecb6332-e906-4334-9f04-93ba4926f6c2/metadata/.header [moved from src/test/resources/http-cache/sdc-example/sdc/v1/catalog/services/aecb6332-e906-4334-9f04-93ba4926f6c2/metadata/.header with 100% similarity]
src/test/resources/http-cache/sdc_proxy.py [deleted file]
src/test/resources/http-cache/start_http_cache.sh
src/test/resources/http-cache/third_party_proxy.py [new file with mode: 0755]

diff --git a/extra/docker/clamp/config/clds-policy-config-sdc_proxy.properties b/extra/docker/clamp/config/clds-policy-config-sdc_proxy.properties
deleted file mode 100644 (file)
index 3786c16..0000000
+++ /dev/null
@@ -1,37 +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============================================
-# ===================================================================
-# ECOMP is a trademark and service mark of AT&T Intellectual Property.
-###
-
-# Configuration Settings for Policy Engine Components
-PDP_URL1=http://sdc_proxy:8085/pdp/ , testpdp, alpha123
-PDP_URL2=http://sdc_proxy:8085/pdp/ , testpdp, alpha123
-NOTIFICATION_TYPE=websocket
-NOTIFICATION_UEB_SERVERS=localhost
-NOTIFICATION_TOPIC=
-CLIENT_ID=myclientid
-# base64 encoding
-#CLIENT_KEY=ChlakDuk
-CLIENT_KEY=5CE79532B3A2CB4D132FC0C04BF916A7
-#DEVL for development
-#TEST for Test environments
-#PROD for prod environments
-ENVIRONMENT=TEST
\ No newline at end of file
diff --git a/extra/docker/clamp/config/clds-reference-sdc_proxy.properties b/extra/docker/clamp/config/clds-reference-sdc_proxy.properties
deleted file mode 100644 (file)
index a97a043..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-###\r
-# ============LICENSE_START=======================================================\r
-# ONAP CLAMP\r
-# ================================================================================\r
-# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights\r
-#                             reserved.\r
-# ================================================================================\r
-# Licensed under the Apache License, Version 2.0 (the "License");\r
-# you may not use this file except in compliance with the License.\r
-# You may obtain a copy of the License at\r
-#\r
-# http://www.apache.org/licenses/LICENSE-2.0\r
-#\r
-# Unless required by applicable law or agreed to in writing, software\r
-# distributed under the License is distributed on an "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-# See the License for the specific language governing permissions and\r
-# limitations under the License.\r
-# ============LICENSE_END============================================\r
-# ===================================================================\r
-# ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
-###\r
-\r
-#\r
-# Poperties for CLDS\r
-#\r
-#\r
-# DCAE request build properties\r
-#\r
-dcae.template={"properties":{"service_name":"","service_ids":[],"vnf_ids":[],"location_ids":[]},"template":{"tca":{"dcae":{"inputTopic":"","outputTopic":"","closedLoopControlName":"","closedLoopEventClient":"configuration.dcae.microservice.tca.xml","policyName":"","policyScope":"service=vSCP;resource=F5;type=configuration","policyVersion":"v0.0.1","serviceConfigurations":{}}}}}\r
-dcae.decode.service_ids={"vUSP":["vUSP - vCTS"],"Trinity":["ASBGv TLS VNF","ASBGv No TLS","ASBGv (NO TLS) VNF","ASBGv TLS","NSBGv VNF","NSBGv"],"vSCP":["AKRON_vSCP_F5_FW-SVC/vSCP_F5_FW 1","ALLEN_vSCP_F5_FW-SVC/vSCP_F5_FW 1"],"vProbes":["vProbes - FW"]}\r
-dcae.deployment.template={"serviceTypeId": "???", "inputs": {"aaiEnrichmentHost": "10.0.1.1", "enableAAIEnrichment": "true", "subscriberHostName" : "10.0.11.1", "publisherHostName" : "10.0.11.1"}}\r
-#\r
-# SDC request blueprint properties\r
-#\r
-sdc.template={}\r
-sdc.decode.service_ids={}\r
-#\r
-#\r
-# General Policy request properties\r
-#\r
-policy.onap.name=DCAE\r
-policy.pdp.group=default\r
-policy.ms.type=MicroService\r
-policy.ms.policyNamePrefix=Config_MS_\r
-policy.op.type=BRMS_Param\r
-policy.op.policyNamePrefix=Config_BRMS_Param_\r
-\r
-# TCA MicroService Policy request build properties\r
-#\r
-tca.policyid.prefix=DCAE.Config_\r
-tca.policy.template={"service": "tca_policy", "version": "1.0.0", "location": "SampleServiceLocation", "configName": "SampleConfigName", "uuid": "test", "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e", "templateVersion": "OpenSource.version.1", "policyName": "MicroServicevCPE", "description": "MicroService Policy", "priority": "1", "riskType": "SampleRiskType", "riskLevel": "1", "guard": "False","content":{"tca_policy": {}}}\r
-tca.template= {"domain": "measurementsForVfScaling", "metricsPerEventName": [{"eventName": "???", "controlLoopSchemaType":"VNF","policyScope": "DCAE","policyName": "???","policyVersion": "v0.0.1","thresholds": []}]}\r
-tca.thresholds.template={"closedLoopControlName": "???", "version": "1.0.2","fieldPath": "?????", "thresholdValue": 0,"direction": "???","severity": "MAJOR", "closedLoopEventStatus": "???"}\r
-\r
-#\r
-#\r
-# Operational Policy request build properties\r
-#\r
-op.policyDescription=from clds\r
-# default\r
-op.templateName=ClosedLoopvUSP\r
-op.operationTopic=APPC-CL\r
-op.notificationTopic=POLICY-CL-MGT\r
-op.controller=amsterdam\r
-op.policy.appc=APPC\r
-# by service: vSCP\r
-op.templateName.vSCP=ClosedLoopTemplate\r
-op.controller.vSCP=1607-f5fw\r
-op.eNodeB.templateName=ClosedLoopControlName\r
-op.eNodeB.operationTopic=com.onap.sdnr.RanCLRequest-v00\r
-op.eNodeB.notificationTopic=com.onap-policy.IST-ENODEB-CL\r
-op.eNodeB.controller=amsterdam\r
-op.eNodeB.recipe={"eNodeBRecipes":[{"Actor":"AOTS","Recipe":"checkENodeBTicketHours","ParentPolicy":"","PPConditions":"","Retry":"0","TimeLimit":"120"},{"Actor":"AOTS","Recipe":"checkEquipmentStatus","ParentPolicy":"checkENodeBTicketHours","PPConditions":"Success","Retry":"0","TimeLimit":"120"},{"Actor":"AOTS","Recipe":"checkEimStatus","ParentPolicy":"checkEquipmentStatus","PPConditions":"Success","Retry":"0","TimeLimit":"120"},{"Actor":"AOTS","Recipe":"checkMaintenanceWindow","ParentPolicy":"checkEimStatus","PPConditions":"Success","Retry":"0","TimeLimit":"120"},{"Actor":"SDNR","Recipe":"Reset","ParentPolicy":"checkMaintenanceWindow","PPConditions":"Success","Retry":"","TimeLimit":""}]}\r
-op.eNodeB.timeWindow=35\r
-op.eNodeB.limit=2\r
-op.eNodeB.period=10s\r
-#\r
-# Sdc service properties\r
-sdc.catalog.url=http://sdc_proxy:8085/sdc/v1/catalog/\r
-sdc.hostUrl=http://sdc_proxy:8085\r
-sdc.serviceUrl=http://sdc_proxy:8085/sdc/v1/catalog/services\r
-sdc.serviceUsername=clamp\r
-sdc.servicePassword=b7acccda32b98c5bb7acccda32b98c5b05D511BD6D93626E90D18E9D24D9B78CD34C7EE8012F0A189A28763E82271E50A5D4EC10C7D93E06E0A2D27CAE66B981\r
-sdc.artifactLabel=blueprintclampcockpit\r
-sdc.sdcX-InstanceID=CLAMP\r
-sdc.artifactType=DCAE_INVENTORY_BLUEPRINT\r
-sdc.locationArtifactLabel=locationclampcockpit\r
-sdc.locationArtifactType=DCAE_INVENTORY_JSON\r
-sdc.InstanceID=X-ECOMP-InstanceID\r
-sdc.header.requestId = X-ECOMP-RequestID\r
-#\r
-#\r
-ui.location.default={"DC1":"Data Center 1","DC2":"Data Center 2","DC3":"Data Center 3"}\r
-ui.alarm.default={"Reports a transient alarm condition when an incoming CDR cannot be decoded successfully":"vCCF: Reports a transient alarm condition when an incoming CDR cannot be decoded successfully","Reports a transient alarm condition when an incoming ACR message cannot be decoded successfully":"vCCF: Reports a transient alarm condition when an incoming ACR message cannot be decoded successfully","Reports a transient alarm condition when a CDR validation fails":"vCCF: Reports a transient alarm condition when a CDR validation fails","Reports a transient alarm condition when an incoming GTP' message cannot be decoded successfully":"vCCF: Reports a transient alarm condition when an incoming GTP' message cannot be decoded successfully","Reports a transient alarm condition when an incoming CDR file cannot be decoded successfully":"vCCF: Reports a transient alarm condition when an incoming CDR file cannot be decoded successfully","Reports a transient alarm condition when an incoming Sh/Dh file cannot be decoded successfully":"vCCF: Reports a transient alarm condition when an incoming Sh/Dh file cannot be decoded successfully","Reports a transient alarm condition when an incoming ACR message is in conflict with former ACR in one diameter session":"vCCF: Reports a transient alarm condition when an incoming ACR message is in conflict with former ACR in one diameter session","Reports a transient alarm condition when an outgoing Ro message send fails":"vCCF: Reports a transient alarm condition when an outgoing Ro message send fails","Reports a transient alarm condition when an outgoing GTP' message send fails":"vCCF: Reports a transient alarm condition when an outgoing GTP' message send fails","Reports a transient alarm condition when an outgoing Sh/Dh message send fails":"vCCF: Reports a transient alarm condition when an outgoing Sh/Dh message send fails","Reports an alarm when build or send Rf message fail":"vCCF: Reports an alarm when build or send Rf message fail","Reports a transient alarm condition when an abnormal incoming CCA message":"vCCF: Reports a transient alarm condition when an abnormal incoming CCA message","Reports a transient alarm condition when there is an abnormal incoming Sh/Dh message":"vCCF: Reports a transient alarm condition when there is an abnormal incoming Sh/Dh message","For Rf interface, if IeCCF receives a message with incorrect value for session id.":"vCCF: For Rf interface, if IeCCF receives a message with incorrect value for session id.","Reports an alarm when CPU usage exceeds the major threshold, the local database exceeds the critical threshold, or the ACR partition exceeds the major threshold":"vCCF: Reports an alarm when CPU usage exceeds the major threshold, the local database exceeds the critical threshold, or the ACR partition exceeds the major threshold","Reports an alarm when CPU usage exceeds the minor threshold, the local database exceeds the major threshold, or the ACR partition exceeds the minor threshold":"vCCF: Reports an alarm when CPU usage exceeds the minor threshold, the local database exceeds the major threshold, or the ACR partition exceeds the minor threshold","Reports an alarm when CPU usage exceeds the critical threshold, the local database exceeds the major threshold, or the CDR partition exceeds the critical threshold":"vCCF: Reports an alarm when CPU usage exceeds the critical threshold, the local database exceeds the major threshold, or the CDR partition exceeds the critical threshold","Reports an alarm when CPU usage exceeds the major threshold or CDR partition exceeds the major threshold":"vCCF: Reports an alarm when CPU usage exceeds the major threshold or CDR partition exceeds the major threshold","Reports an alarm when external DB usage exceeds the major threshold":"vCCF: Reports an alarm when external DB usage exceeds the major threshold","If IeCCF comes to the status \\"Stop processing ACR records in ACRDB\\".":"vCCF: If IeCCF comes to the status \\"Stop processing ACR records in ACRDB\\".","If IeCCF comes to the status \\"Flush ACR is invoked\\".":"vCCF: If IeCCF comes to the status \\"Flush ACR is invoked\\".","Reports a transient alarm condition when the workflow definition table is provisioned wrongly":"vCCF: Reports a transient alarm condition when the workflow definition table is provisioned wrongly","Reports a transient alarm condition when the Action Definition table is provisioned wrongly":"vCCF: Reports a transient alarm condition when the Action Definition table is provisioned wrongly","Reports a transient alarm condition when the Ro Host Configuration is provisioned wrongly":"vCCF: Reports a transient alarm condition when the Ro Host Configuration is provisioned wrongly","Reports a transient alarm condition when the Sh Host Configuration is provisioned wrongly":"vCCF: Reports a transient alarm condition when the Sh Host Configuration is provisioned wrongly","Reports a transient alarm condition when a specific dictionary or rule does not exist":"vCCF: Reports a transient alarm condition when a specific dictionary or rule does not exist","Reports a transient alarm condition when failure occurs when mapping Rf message to XDR":"vCCF: Reports a transient alarm condition when failure occurs when mapping Rf message to XDR","Reports a transient alarm condition when failure occurs in aggregating process":"vCCF: Reports a transient alarm condition when failure occurs in aggregating process","Reports a transient alarm condition when failure happens in correlating process":"vCCF: Reports a transient alarm condition when failure happens in correlating process","Reports a transient alarm condition when failure occurs in generating CDR":"vCCF: Reports a transient alarm condition when failure occurs in generating CDR","Reports a transient alarm condition when failure occurs in constructing CCR message from XDR":"vCCF: Reports a transient alarm condition when failure occurs in constructing CCR message from XDR","Reports a transient alarm condition when an ACR/XER/BER/INC record write to bad file":"vCCF: Reports a transient alarm condition when an ACR/XER/BER/INC record write to bad file","Reports an alarm condition when aggregation or correlation central database connection is lost":"vCCF: Reports an alarm condition when aggregation or correlation central database connection is lost","Reports an alarm condition when a specific failure happens in database operations":"vCCF: Reports an alarm condition when a specific failure happens in database operations","Reports an alarm condition when DB capacity has been consumed to critical threshold":"vCCF: Reports an alarm condition when DB capacity has been consumed to critical threshold","Reports an alarm condition when DB capacity has been consumed to major threshold":"vCCF: Reports an alarm condition when DB capacity has been consumed to major threshold","Reports an alarm condition when DB capacity has been consumed to minor threshold.":"vCCF: Reports an alarm condition when DB capacity has been consumed to minor threshold.","Reports an alarm condition when application cannot deliver CDR to CDRSCH subsystem":"vCCF: Reports an alarm condition when application cannot deliver CDR to CDRSCH subsystem","Reports an alarm condition when some fields of ACR file header have error value and this ACR file cannot be processed further":"vCCF: Reports an alarm condition when some fields of ACR file header have error value and this ACR file cannot be processed further","Reports an alarm condition when some fields of ACR file header have invalid value and this ACR file can be processed further":"vCCF: Reports an alarm condition when some fields of ACR file header have invalid value and this ACR file can be processed further","Reports an alarm condition when the ACR file loses some ACR records":"vCCF: Reports an alarm condition when the ACR file loses some ACR records","Reports an alarm condition when some fields of ACR record header have error value and this ACR record and the following ACR records cannot be processed further":"vCCF: Reports an alarm condition when some fields of ACR record header have error value and this ACR record and the following ACR records cannot be processed further","Reports an alarm condition when error occurs in processing CDR/ACR files":"vCCF: Reports an alarm condition when error occurs in processing CDR/ACR files","Reports an alarm condition when CDR partition has been consumed to critical threshold":"vCCF: Reports an alarm condition when CDR partition has been consumed to critical threshold","Reports an alarm condition when CDR partition has been consumed to major threshold.":"vCCF: Reports an alarm condition when CDR partition has been consumed to major threshold.","Reports an alarm condition when CDR partition has been consumed to minor threshold":"vCCF: Reports an alarm condition when CDR partition has been consumed to minor threshold","Reports an alarm condition when ACR partition has been consumed to critical threshold":"vCCF: Reports an alarm condition when ACR partition has been consumed to critical threshold","Reports an alarm condition when ACR partition has been consumed to major threshold":"vCCF: Reports an alarm condition when ACR partition has been consumed to major threshold","Reports an alarm condition when ACR partition has been consumed to minor threshold":"vCCF: Reports an alarm condition when ACR partition has been consumed to minor threshold","Reports an alarm condition when CPU consumption reaches critical threshold":"vCCF: Reports an alarm condition when CPU consumption reaches critical threshold","Reports an alarm condition when CPU consumption reaches major threshold":"vCCF: Reports an alarm condition when CPU consumption reaches major threshold","Reports an alarm condition when CPU consumption reaches minor threshold":"vCCF: Reports an alarm condition when CPU consumption reaches minor threshold","Service shall monitor * number of partial CDR * number of incompleted CDR * number of unacceptable CDR If any one exceeds a configurable threshold in a configrable interval.":"vCCF: Service shall monitor * number of partial CDR * number of incompleted CDR * number of unacceptable CDR If any one exceeds a configurable threshold in a configrable interval.","CDR size exceed the platform capacity.":"vCCF: CDR size exceed the platform capacity.","Service shall monitor number of ACR without AII AVP, If it exceeds a configurable threshold in a configurable interval.":"vCCF: Service shall monitor number of ACR without AII AVP, If it exceeds a configurable threshold in a configurable interval.","Service shall monitor CDR cut due to ECCF_ACRNUMBER_IN_DB, If it exceeds a configurable threshold in a configurable interval.":"vCCF: Service shall monitor CDR cut due to ECCF_ACRNUMBER_IN_DB, If it exceeds a configurable threshold in a configurable interval.","External Node of this Cluster is overload":"vCCF: External Node of this Cluster is overload","bdb_high_latency":"vCCF-vDB: bdb_high_latency","bdb_high_throughput":"vCCF-vDB: bdb_high_throughput","bdb_size":"vCCF-vDB: bdb_size","cluster_inconsistent_rl_sw":"vCCF-vDB: cluster_inconsistent_rl_sw","cluster_node_remove_abort_failed":"vCCF-vDB: cluster_node_remove_abort_failed","cluster_node_remove_failed":"vCCF-vDB: cluster_node_remove_failed","cluster_ram_overcommit":"vCCF-vDB: cluster_ram_overcommit","cluster_rebalance_failed":"vCCF-vDB: cluster_rebalance_failed","cluster_too_few_nodes_for_replication":"vCCF-vDB: cluster_too_few_nodes_for_replication","node_cpu_utilization":"vCCF-vDB: node_cpu_utilization","node_ephemeral_storage":"vCCF-vDB: node_ephemeral_storage","node_failed":"vCCF-vDB: node_failed","node_memory":"vCCF-vDB: node_memory","node_net_throughput":"vCCF-vDB: node_net_throughput","node_offline_failed":"vCCF-vDB: node_offline_failed","node_offline_abort_failed":"vCCF-vDB: node_offline_abort_failed","node_online_failed":"vCCF-vDB: node_online_failed","OAM NODE-<OAME-hostname> IS NOT ACTIVE ":"vCCF-vDB: OAM NODE-<OAME-hostname> IS NOT ACTIVE ","LSS_asdaCommunicationFailure":"vCTS: LSS_asdaCommunicationFailure","LSS_ccdbCommunicationFailure":"vCTS: LSS_ccdbCommunicationFailure","LSS_cpiCTS3xxFailRate":"vCTS: LSS_cpiCTS3xxFailRate","LSS_cpiCTS4xxFailRate":"vCTS: LSS_cpiCTS4xxFailRate","LSS_cpiCTS5xxFailRate":"vCTS: LSS_cpiCTS5xxFailRate","LSS_cpiCTS6xxFailRate":"vCTS: LSS_cpiCTS6xxFailRate","LSS_cpiCTSSIPRetransmitInvite":"vCTS: LSS_cpiCTSSIPRetransmitInvite","LSS_cpiCTSSIPRetransmitNonInvite":"vCTS: LSS_cpiCTSSIPRetransmitNonInvite","LSS_glsInvalidCellId":"vCTS: LSS_glsInvalidCellId","LSS_glsServerUnavailable":"vCTS: LSS_glsServerUnavailable","LSS_hlrSyncConnection":"vCTS: LSS_hlrSyncConnection","LSS_hlrSyncQueue":"vCTS: LSS_hlrSyncQueue","LSS_lispBufferFullExternalLIG":"vCTS: LSS_lispBufferFullExternalLIG","LSS_prdbConnectWithAlternateFailure":"vCTS: LSS_prdbConnectWithAlternateFailure","LSS_prdbSyncDataToAlternateFailure":"vCTS: LSS_prdbSyncDataToAlternateFailure","LSS_preAllocatedResourceOverload":"vCTS: LSS_preAllocatedResourceOverload","LSS_prifSocketError":"vCTS: LSS_prifSocketError","LSS_prsCallInstanceExceeded":"vCTS: LSS_prsCallInstanceExceeded","LSS_prsCpuOverload":"vCTS: LSS_prsCpuOverload","LSS_prsDatabaseMigrationFailure":"vCTS: LSS_prsDatabaseMigrationFailure","LSS_prsFailureToConnectWithPRDB":"vCTS: LSS_prsFailureToConnectWithPRDB","LSS_prsQueueExceeded":"vCTS: LSS_prsQueueExceeded","LSS_smdiSocketError":"vCTS: LSS_smdiSocketError","LSS_socketError":"vCTS: LSS_socketError","LSS_softwareComponentDown":"vCTS: LSS_softwareComponentDown","LSS_tlsInitError":"vCTS: LSS_tlsInitError","LSS_usageOfSyncTable":"vCTS: LSS_usageOfSyncTable","LSS_utHttpProxyConnectionDown ":"vCTS: LSS_utHttpProxyConnectionDown ","LSS_wpifSocketError":"vCTS: LSS_wpifSocketError","LSS_acrTemporaryBufferOverload":"vCTS: LSS_acrTemporaryBufferOverload","LSS_adnsExtendedTTLcaching":"vCTS: LSS_adnsExtendedTTLcaching","LSS_adnsQueryFailureCaching":"vCTS: LSS_adnsQueryFailureCaching","LSS_adnsQueueCongestion":"vCTS: LSS_adnsQueueCongestion","LSS_asdaRequestQueue":"vCTS: LSS_asdaRequestQueue","LSS_capacityLicenseKeyExpiration":"vCTS: LSS_capacityLicenseKeyExpiration","LSS_capacityLicenseKeyNearExpiration":"vCTS: LSS_capacityLicenseKeyNearExpiration","LSS_capacityLicenseKeyValidationError":"vCTS: LSS_capacityLicenseKeyValidationError","LSS_cardConnectionLost":"vCTS: LSS_cardConnectionLost","LSS_cpiAlrmCritical":"vCTS: LSS_cpiAlrmCritical","LSS_cpiAlrmMajor":"vCTS: LSS_cpiAlrmMajor","LSS_cpiAlrmMinor":"vCTS: LSS_cpiAlrmMinor","LSS_cpiAlrmWarning":"vCTS: LSS_cpiAlrmWarning","LSS_cpiAsrtEsc":"vCTS: LSS_cpiAsrtEsc","LSS_cpiAsrtNonEsc":"vCTS: LSS_cpiAsrtNonEsc","LSS_cpiAsrtNonEscCritical":"vCTS: LSS_cpiAsrtNonEscCritical","LSS_cpiAsrtNonEscMajor":"vCTS: LSS_cpiAsrtNonEscMajor","LSS_cpiAsrtNonEscMinor":"vCTS: LSS_cpiAsrtNonEscMinor","LSS_cpiAudErrCount":"vCTS: LSS_cpiAudErrCount","LSS_cpiAudManAct":"vCTS: LSS_cpiAudManAct","LSS_cpiAudNewEvent":"vCTS: LSS_cpiAudNewEvent","LSS_cpiCompleteRateAlarm":"vCTS: LSS_cpiCompleteRateAlarm","LSS_cpiDropMGAllocConnReq":"vCTS: LSS_cpiDropMGAllocConnReq","LSS_cpiDropRateAlarm":"vCTS: LSS_cpiDropRateAlarm","LSS_cpiExceptionService":"vCTS: LSS_cpiExceptionService","LSS_cpiFailRateAlarm":"vCTS: LSS_cpiFailRateAlarm","LSS_cpiFailSCTPFastRetransIncr":"vCTS: LSS_cpiFailSCTPFastRetransIncr","LSS_cpiFailSCTPFastRetransRate":"vCTS: LSS_cpiFailSCTPFastRetransRate","LSS_cpiFailSCTPSRTT1Incr":"vCTS: LSS_cpiFailSCTPSRTT1Incr","LSS_cpiFailSCTPSRTT2Incr":"vCTS: LSS_cpiFailSCTPSRTT2Incr","LSS_cpiFailSCTPT3RetransIncr":"vCTS: LSS_cpiFailSCTPT3RetransIncr","LSS_cpiFailSCTPT3RetransRate":"vCTS: LSS_cpiFailSCTPT3RetransRate","LSS_cpiFileSysUsage":"vCTS: LSS_cpiFileSysUsage","LSS_cpiMemAllocFail":"vCTS: LSS_cpiMemAllocFail","LSS_cpiNumOfLICDRDel":"vCTS: LSS_cpiNumOfLICDRDel","LSS_cpiReinitServiceSelf":"vCTS: LSS_cpiReinitServiceSelf","LSS_cpiSIPRetransmitInvite":"vCTS: LSS_cpiSIPRetransmitInvite","LSS_cpiSIPRetransmitNonInvite":"vCTS: LSS_cpiSIPRetransmitNonInvite","LSS_cpiSS7DropSCTPPktsRcvd":"vCTS: LSS_cpiSS7DropSCTPPktsRcvd","LSS_cpiSS7FailSCTPFastRetransRate":"vCTS: LSS_cpiSS7FailSCTPFastRetransRate","LSS_cpiStabilityAlarm":"vCTS: LSS_cpiStabilityAlarm","LSS_cpuOverload":"vCTS: LSS_cpuOverload","LSS_databaseConnectionLost":"vCTS: LSS_databaseConnectionLost","LSS_databaseReplicationLinkDown":"vCTS: LSS_databaseReplicationLinkDown","LSS_databaseSizeExhausted":"vCTS: LSS_databaseSizeExhausted","LSS_dbHighCpuUtilization":"vCTS: LSS_dbHighCpuUtilization","LSS_dbOffline":"vCTS: LSS_dbOffline","LSS_dbStatusUnexpected":"vCTS: LSS_dbStatusUnexpected","LSS_degradedResource":"vCTS: LSS_degradedResource","LSS_degrow":"vCTS: LSS_degrow","LSS_deviceServerCxnLost":"vCTS: LSS_deviceServerCxnLost","LSS_diamLinkDown":"vCTS: LSS_diamLinkDown","LSS_diamMaxClientsExceeded":"vCTS: LSS_diamMaxClientsExceeded","LSS_dnsThreshold":"vCTS: LSS_dnsThreshold","LSS_ethernetError":"vCTS: LSS_ethernetError","LSS_ethernetLinkDown":"vCTS: LSS_ethernetLinkDown","LSS_externalConnectivity":"vCTS: LSS_externalConnectivity","LSS_featureLicenseExpiration":"vCTS: LSS_featureLicenseExpiration","LSS_featureLicenseKeyNearExpiration":"vCTS: LSS_featureLicenseKeyNearExpiration","LSS_featureLockValidationError":"vCTS: LSS_featureLockValidationError","LSS_fqdnError":"vCTS: LSS_fqdnError","LSS_fru":"vCTS: LSS_fru","LSS_gatewayCongestion":"vCTS: LSS_gatewayCongestion","LSS_gatewayForcedOOS":"vCTS: LSS_gatewayForcedOOS","LSS_gatewayProvisioningError":"vCTS: LSS_gatewayProvisioningError","LSS_gatewayUnreachable":"vCTS: LSS_gatewayUnreachable","LSS_gatewayUnregistered":"vCTS: LSS_gatewayUnregistered","LSS_globalParameterNotFound":"vCTS: LSS_globalParameterNotFound","LSS_grow":"vCTS: LSS_grow","LSS_h248MessageBufferDepletion":"vCTS: LSS_h248MessageBufferDepletion","LSS_hostDown":"vCTS: LSS_hostDown","LSS_hostReset":"vCTS: LSS_hostReset","LSS_invalidGateway":"vCTS: LSS_invalidGateway","LSS_iriLinkDown":"vCTS: LSS_iriLinkDown","LSS_ldapServerConnectionLost":"vCTS: LSS_ldapServerConnectionLost","LSS_llcDown":"vCTS: LSS_llcDown","LSS_logicalLinkDown":"vCTS: LSS_logicalLinkDown","LSS_logicalLinkNotFound":"vCTS: LSS_logicalLinkNotFound","LSS_logRotateThreshold":"vCTS: LSS_logRotateThreshold","LSS_memoryOverload":"vCTS: LSS_memoryOverload","LSS_nodeConfigFailure":"vCTS: LSS_nodeConfigFailure","LSS_nodeGroupOOS":"vCTS: LSS_nodeGroupOOS","LSS_nodeOOS":"vCTS: LSS_nodeOOS","LSS_nonCompliantFaultGroupMemberState":"vCTS: LSS_nonCompliantFaultGroupMemberState","LSS_nonCsAddrChannelDepletion":"vCTS: LSS_nonCsAddrChannelDepletion","LSS_numberOfTuplesInUse":"vCTS: LSS_numberOfTuplesInUse","LSS_osSecInfoModificationDetected":"vCTS: LSS_osSecInfoModificationDetected","LSS_osSecInformationMissing":"vCTS: LSS_osSecInformationMissing","LSS_osSecUnexpectedInformation":"vCTS: LSS_osSecUnexpectedInformation","LSS_pdnsMySqlReplication":"vCTS: LSS_pdnsMySqlReplication","LSS_pktCorruptionDetectedViaRCCLANCheck":"vCTS: LSS_pktCorruptionDetectedViaRCCLANCheck","LSS_platformCommandFailure":"vCTS: LSS_platformCommandFailure","LSS_pmDataNotCollected":"vCTS: LSS_pmDataNotCollected","LSS_processDown":"vCTS: LSS_processDown","LSS_processNotStarted":"vCTS: LSS_processNotStarted","LSS_provisioningInhibitedMode":"vCTS: LSS_provisioningInhibitedMode","LSS_rccInhibitedMode":"vCTS: LSS_rccInhibitedMode","LSS_remotedbLinkDown":"vCTS: LSS_remotedbLinkDown","LSS_remoteQueryServerFailure":"vCTS: LSS_remoteQueryServerFailure","LSS_restore":"vCTS: LSS_restore","LSS_serviceCFGDataTimestampError":"vCTS: LSS_serviceCFGDataTimestampError","LSS_serviceCommCxnLost":"vCTS: LSS_serviceCommCxnLost","LSS_serviceOnewayCommunication":"vCTS: LSS_serviceOnewayCommunication","LSS_sheddingOverload":"vCTS: LSS_sheddingOverload","LSS_simxml":"vCTS: LSS_simxml","LSS_sipLinkSetMaxQuarantineList":"vCTS: LSS_sipLinkSetMaxQuarantineList","LSS_sipLinkSetUnavailable":"vCTS: LSS_sipLinkSetUnavailable","LSS_sipLinkUnavailable":"vCTS: LSS_sipLinkUnavailable","LSS_softwareAllocatedResourceOverload":"vCTS: LSS_softwareAllocatedResourceOverload","LSS_softwareComponentStandbyNotReady":"vCTS: LSS_softwareComponentStandbyNotReady","LSS_softwareLicense":"vCTS: LSS_softwareLicense","LSS_svcdegrow":"vCTS: LSS_svcdegrow","LSS_svcgrow":"vCTS: LSS_svcgrow","LSS_swVersionMismatch":"vCTS: LSS_swVersionMismatch","LSS_tftpDownloadCorrupt":"vCTS: LSS_tftpDownloadCorrupt","LSS_timeStampValueOutOfSystemRange":"vCTS: LSS_timeStampValueOutOfSystemRange","LSS_transactionHandlerBlockDepletion":"vCTS: LSS_transactionHandlerBlockDepletion","LSS_upgrade":"vCTS: LSS_upgrade","SYS_BackupFailure":"vCTS: SYS_BackupFailure","SYS_Configuration":"vCTS: SYS_Configuration","SYS_COTRecordTransferFailure":"vCTS: SYS_COTRecordTransferFailure","SYS_CPM_USERDATA_INCONSITENCY":"vCTS: SYS_CPM_USERDATA_INCONSITENCY","SYS_CPM_USERDATA_RESTORED":"vCTS: SYS_CPM_USERDATA_RESTORED","SYS_EventQueueCapacity":"vCTS: SYS_EventQueueCapacity","SYS_ICMPFailure":"vCTS: SYS_ICMPFailure","SYS_IPsecConfig":"vCTS: SYS_IPsecConfig","SYS_LinkDown":"vCTS: SYS_LinkDown","SYS_NotifyDisabled":"vCTS: SYS_NotifyDisabled","SYS_NotifyLocked":"vCTS: SYS_NotifyLocked","SYS_NumTL1MeasThresh":"vCTS: SYS_NumTL1MeasThresh","SYS_RADIUS_TO_LDAP_FAILURE":"vCTS: SYS_RADIUS_TO_LDAP_FAILURE","SYS_ROOT_ACCESS_DENIED":"vCTS: SYS_ROOT_ACCESS_DENIED","SYS_ROOT_FTP_VIOLATION":"vCTS: SYS_ROOT_FTP_VIOLATION","SYS_ROOT_LOGIN_VIOLATION":"vCTS: SYS_ROOT_LOGIN_VIOLATION","SYS_ROOT_SSH_LOGIN_VIOLATION":"vCTS: SYS_ROOT_SSH_LOGIN_VIOLATION","SYS_SetupAAAFailure":"vCTS: SYS_SetupAAAFailure","SYS_SNETrapOverload":"vCTS: SYS_SNETrapOverload","SYS_SNMPAuthenticationFailure":"vCTS: SYS_SNMPAuthenticationFailure","SYS_SNMPFailure":"vCTS: SYS_SNMPFailure","SYS_SU_TO_ROOT_FAILURE":"vCTS: SYS_SU_TO_ROOT_FAILURE","SYS_SYSTEMTrapOverload":"vCTS: SYS_SYSTEMTrapOverload","SYS_ThresholdCrossed":"vCTS: SYS_ThresholdCrossed","SYS_UndiscoveredObject":"vCTS: SYS_UndiscoveredObject","SYS_WriteAAAFailure":"vCTS: SYS_WriteAAAFailure","jnxSpaceDiskUsageRising":"vDBE-EMS-Juniper: jnxSpaceDiskUsageRising","jnxSpaceDiskUsageRisingCleared":"vDBE-EMS-Juniper: jnxSpaceDiskUsageRisingCleared","jnxSpaceSwapUsageRising":"vDBE-EMS-Juniper: jnxSpaceSwapUsageRising","jnxSpaceSwapUsageRisingCleared":"vDBE-EMS-Juniper: jnxSpaceSwapUsageRisingCleared","jnxSpaceCPULARising":"vDBE-EMS-Juniper: jnxSpaceCPULARising","jnxSpaceCPULARisingCleared":"vDBE-EMS-Juniper: jnxSpaceCPULARisingCleared","jnxSpaceWebpProxyProcessDown":"vDBE-EMS-Juniper: jnxSpaceWebpProxyProcessDown","jnxSpaceWebpProxyProcessUp":"vDBE-EMS-Juniper: jnxSpaceWebpProxyProcessUp","jnxSpaceNMAProcessDown":"vDBE-EMS-Juniper: jnxSpaceNMAProcessDown","jnxSpaceNMAProcessUp":"vDBE-EMS-Juniper: jnxSpaceNMAProcessUp","jnxSpaceJbossProcessDown":"vDBE-EMS-Juniper: jnxSpaceJbossProcessDown","jnxSpaceJbossProcessUp":"vDBE-EMS-Juniper: jnxSpaceJbossProcessUp","jnxSpaceMysqlProcessDown":"vDBE-EMS-Juniper: jnxSpaceMysqlProcessDown","jnxSpaceMysqlProcessUp":"vDBE-EMS-Juniper: jnxSpaceMysqlProcessUp","jnxSpacePostgresqlProcessDown":"vDBE-EMS-Juniper: jnxSpacePostgresqlProcessDown","jnxSpacePostgresqlProcessUp":"vDBE-EMS-Juniper: jnxSpacePostgresqlProcessUp","jnxSpaceWatchdogStopped":"vDBE-EMS-Juniper: jnxSpaceWatchdogStopped","jnxSpaceWatchdogStarted":"vDBE-EMS-Juniper: jnxSpaceWatchdogStarted","jnxSpaceSNAProcessDown":"vDBE-EMS-Juniper: jnxSpaceSNAProcessDown","jnxSpaceSNAProcessUp":"vDBE-EMS-Juniper: jnxSpaceSNAProcessUp","jnxSpaceNodeDown":"vDBE-EMS-Juniper: jnxSpaceNodeDown","jnxSpaceNodeUp":"vDBE-EMS-Juniper: jnxSpaceNodeUp"," jnxSpaceNodeRemoval":"vDBE-EMS-Juniper:  jnxSpaceNodeRemoval","jnxCmCfgChange":"vDBE-Juniper: jnxCmCfgChange","jnxCmRescueChange":"vDBE-Juniper: jnxCmRescueChange","jnxEventTrap":"vDBE-Juniper: jnxEventTrap","jnxJsFwAuthFailure":"vDBE-Juniper: jnxJsFwAuthFailure","jnxJsFwAuthServiceUp":"vDBE-Juniper: jnxJsFwAuthServiceUp","jnxJsFwAuthServiceDown":"vDBE-Juniper: jnxJsFwAuthServiceDown","jnxJsFwAuthCapacityExceeded":"vDBE-Juniper: jnxJsFwAuthCapacityExceeded","jnxJsIdpSignatureUpdate":"vDBE-Juniper: jnxJsIdpSignatureUpdate","jnxJsIdpAttackLog":"vDBE-Juniper: jnxJsIdpAttackLog","jnxJsSrcNatPoolThresholdStatus":"vDBE-Juniper: jnxJsSrcNatPoolThresholdStatus","jnxJsNatRuleThresholdStatus":"vDBE-Juniper: jnxJsNatRuleThresholdStatus","jnxJsScreenAttack":"vDBE-Juniper: jnxJsScreenAttack","jnxJsScreenCfgChange":"vDBE-Juniper: jnxJsScreenCfgChange","jnxJsAvPatternUpdateTrap":"vDBE-Juniper: jnxJsAvPatternUpdateTrap","jnxJsChassisClusterSwitchover":"vDBE-Juniper: jnxJsChassisClusterSwitchover","jnxJsChClusterIntfTrap":"vDBE-Juniper: jnxJsChClusterIntfTrap","jnxJsChClusterSpuMismatchTrap":"vDBE-Juniper: jnxJsChClusterSpuMismatchTrap","jnxJsChClusterWeightTrap":"vDBE-Juniper: jnxJsChClusterWeightTrap","jnxLicenseGraceExpired":"vDBE-Juniper: jnxLicenseGraceExpired","jnxLicenseGraceAboutToExpire":"vDBE-Juniper: jnxLicenseGraceAboutToExpire","jnxLicenseAboutToExpire":"vDBE-Juniper: jnxLicenseAboutToExpire","jnxLicenseInfringeCumulative":"vDBE-Juniper: jnxLicenseInfringeCumulative","jnxLicenseInfringeSingle":"vDBE-Juniper: jnxLicenseInfringeSingle","jnxNatAddrPoolThresholdStatus":"vDBE-Juniper: jnxNatAddrPoolThresholdStatus","jnxSyslogTrap":"vDBE-Juniper: jnxSyslogTrap","jnxAccessAuthServiceUp":"vDBE-Juniper: jnxAccessAuthServiceUp","jnxAccessAuthServiceDown":"vDBE-Juniper: jnxAccessAuthServiceDown","jnxAccessAuthServerDisabled":"vDBE-Juniper: jnxAccessAuthServerDisabled","jnxAccessAuthServerEnabled":"vDBE-Juniper: jnxAccessAuthServerEnabled","jnxAccessAuthAddressPoolHighThreshold":"vDBE-Juniper: jnxAccessAuthAddressPoolHighThreshold","jnxAccessAuthAddressPoolAbateThreshold":"vDBE-Juniper: jnxAccessAuthAddressPoolAbateThreshold","jnxAccessAuthAddressPoolOutOfAddresses":"vDBE-Juniper: jnxAccessAuthAddressPoolOutOfAddresses","jnxAccessAuthAddressPoolOutOfMemory":"vDBE-Juniper: jnxAccessAuthAddressPoolOutOfMemory","LEVEL_WARNING_CPU":"vMRF: LEVEL_WARNING_CPU","LEVEL_MAJOR_CPU":"vMRF: LEVEL_MAJOR_CPU","LEVEL_CRITICAL_CPU":"vMRF: LEVEL_CRITICAL_CPU","LEVEL_WARNING_MEM":"vMRF: LEVEL_WARNING_MEM","LEVEL_MAJOR_MEM":"vMRF: LEVEL_MAJOR_MEM","LEVEL_CRITICAL_MEM":"vMRF: LEVEL_CRITICAL_MEM","LEVEL_WARNING_DISK":"vMRF: LEVEL_WARNING_DISK","LEVEL_MAJOR_DISK":"vMRF: LEVEL_MAJOR_DISK","LEVEL_CRITICAL_DISK":"vMRF: LEVEL_CRITICAL_DISK","LEVEL_WARNING_RTPBANDWIDTH":"vMRF: LEVEL_WARNING_RTPBANDWIDTH","LEVEL_MAJOR_RTPBANDWIDTH":"vMRF: LEVEL_MAJOR_RTPBANDWIDTH","LEVEL_CRITICAL_RTPBANDWIDTH":"vMRF: LEVEL_CRITICAL_RTPBANDWIDTH","LEVEL_WARNING_RTPINPACKETLOSS":"vMRF: LEVEL_WARNING_RTPINPACKETLOSS","LEVEL_MAJOR_RTPINPACKETLOSS":"vMRF: LEVEL_MAJOR_RTPINPACKETLOSS","LEVEL_CRITICAL_RTPINPACKETLOSS":"vMRF: LEVEL_CRITICAL_RTPINPACKETLOSS","LEVEL_WARNING_RTPOUTPACKETLOSS":"vMRF: LEVEL_WARNING_RTPOUTPACKETLOSS","LEVEL_MAJOR_RTPOUTPACKETLOSS":"vMRF: LEVEL_MAJOR_RTPOUTPACKETLOSS","LEVEL_CRITICAL_RTPOUTPACKETLOSS":"vMRF: LEVEL_CRITICAL_RTPOUTPACKETLOSS","LEVEL_WARNING_TCPLOSTRETRANSMITRATE":"vMRF: LEVEL_WARNING_TCPLOSTRETRANSMITRATE","LEVEL_MAJOR_TCPLOSTRETRANSMITRATE":"vMRF: LEVEL_MAJOR_TCPLOSTRETRANSMITRATE","LEVEL_CRITICAL_TCPLOSTRETRANSMITRATE":"vMRF: LEVEL_CRITICAL_TCPLOSTRETRANSMITRATE","LEVEL_WARNING_TCPLOSSFAILURERATE":"vMRF: LEVEL_WARNING_TCPLOSSFAILURERATE","LEVEL_MAJOR_TCPLOSSFAILURERATE":"vMRF: LEVEL_MAJOR_TCPLOSSFAILURERATE","LEVEL_CRITICAL_TCPLOSSFAILURERATE":"vMRF: LEVEL_CRITICAL_TCPLOSSFAILURERATE","LEVEL_CRITICAL_RTPLINKDOWN":"vMRF: LEVEL_CRITICAL_RTPLINKDOWN","TARGET_REACHABLE":"vMRF: TARGET_REACHABLE","PUBLICATION_ERROR":"vMRF: PUBLICATION_ERROR","REMOTE_SERVER_SYNCHRONIZATION_ERROR":"vMRF: REMOTE_SERVER_SYNCHRONIZATION_ERROR","TRANSCODER_TOOL_EXEC_ERROR":"vMRF: TRANSCODER_TOOL_EXEC_ERROR","CLIENT_SYNCHRONIZATION_ERROR":"vMRF: CLIENT_SYNCHRONIZATION_ERROR","CLUSTER_UNREACHABLE":"vMRF: CLUSTER_UNREACHABLE","REMOTE_NODE_OFFLINE":"vMRF: REMOTE_NODE_OFFLINE","IPADDR_STOPPED":"vMRF: IPADDR_STOPPED","MRFC_STOPPED":"vMRF: MRFC_STOPPED","MNGT_STOPPED":"vMRF: MNGT_STOPPED","IPADDR_STARTED":"vMRF: IPADDR_STARTED","MRFC_STARTED":"vMRF: MRFC_STARTED","MNGT_STARTED":"vMRF: MNGT_STARTED","VOLATTACH_FAILED":"vMRF: VOLATTACH_FAILED","VOLDETACH_FAILED":"vMRF: VOLDETACH_FAILED","VOLDEL":"vMRF: VOLDEL","VOLCORRUPT":"vMRF: VOLCORRUPT","VOLFOREIGN":"vMRF: VOLFOREIGN","ACTIVE_ALARM_TABLE_PURGE":"vMRF: ACTIVE_ALARM_TABLE_PURGE","GENERIC_FORMER_STATELESS":"vMRF: GENERIC_FORMER_STATELESS","GENERIC_FORMER_STATEFUL":"vMRF: GENERIC_FORMER_STATEFUL","NO_MORE_ALARM_DESCRIPTION":"vMRF: NO_MORE_ALARM_DESCRIPTION","SERVICE_PROCESS_ENDS":"vMRF: SERVICE_PROCESS_ENDS","DEFENSE_STOPPED":"vMRF: DEFENSE_STOPPED","USER_ACCOUNT_LOCKED":"vMRF: USER_ACCOUNT_LOCKED","CONNECTION_SQL_NOT_ESTABLISHED":"vMRF: CONNECTION_SQL_NOT_ESTABLISHED","FALSE_ALARM":"vMRF: FALSE_ALARM","RADIUS SERVER HS":"vMRF: RADIUS SERVER HS","DRM_PACKAGER_IS_NOT_AVAILABLE":"vMRF: DRM_PACKAGER_IS_NOT_AVAILABLE","DRM_LICENSE_BUILDER_IS_NOT_AVAILABLE":"vMRF: DRM_LICENSE_BUILDER_IS_NOT_AVAILABLE","ERROR_WHILE_CREATING_PLAYLIST_MANAGER_FILE":"vMRF: ERROR_WHILE_CREATING_PLAYLIST_MANAGER_FILE","ERROR_WHILE_BUILDING_PLAYLIST_XML_REPRESENTATION":"vMRF: ERROR_WHILE_BUILDING_PLAYLIST_XML_REPRESENTATION","PLAYLIST_FILE_TO_PUBLISH_NOT_FOUND":"vMRF: PLAYLIST_FILE_TO_PUBLISH_NOT_FOUND","COULD_NOT_CONNECT_TO_PVNS_SERVER":"vMRF: COULD_NOT_CONNECT_TO_PVNS_SERVER","HTTP_OR_HTTPCLIENT_EXCEPTION_HAS_OCCURRED":"vMRF: HTTP_OR_HTTPCLIENT_EXCEPTION_HAS_OCCURRED","I/O_ERROR_WHILE_PUBLISHING_PLAYLIST_FILE":"vMRF: I/O_ERROR_WHILE_PUBLISHING_PLAYLIST_FILE","ERROR_WHILE_REQUESTING_SDP_FILE":"vMRF: ERROR_WHILE_REQUESTING_SDP_FILE","ERROR_WHILE_REQUESTING_SDP_FILE:_REMOTE_EXCEPTION":"vMRF: ERROR_WHILE_REQUESTING_SDP_FILE:_REMOTE_EXCEPTION","NO_STREAMING_RESOURCES":"vMRF: NO_STREAMING_RESOURCES","NO_STREAMING_MODULES_REGISTERED":"vMRF: NO_STREAMING_MODULES_REGISTERED","SM_FAILURE":"vMRF: SM_FAILURE","MISSING_FILE_OR_ENCODER":"vMRF: MISSING_FILE_OR_ENCODER","INVALID_RANGE":"vMRF: INVALID_RANGE","THRESHOLD_VALUE_EXCEEDED":"vMRF: THRESHOLD_VALUE_EXCEEDED","TICKET_QUEUE_FULL":"vMRF: TICKET_QUEUE_FULL","PARSING_INITIALIZATION_EXCEPTION":"vMRF: PARSING_INITIALIZATION_EXCEPTION","CUSTOMERCARE_INTERNAL_EXCEPTION":"vMRF: CUSTOMERCARE_INTERNAL_EXCEPTION","PARSING_EXCEPTION":"vMRF: PARSING_EXCEPTION","I/O_PROBLEM":"vMRF: I/O_PROBLEM","INEXISTENT_FILE_OR_FOLDER":"vMRF: INEXISTENT_FILE_OR_FOLDER","FILE_NOT_IN_XML_FORMAT":"vMRF: FILE_NOT_IN_XML_FORMAT","SERVICE_STATE_CHANGE":"vMRF: SERVICE_STATE_CHANGE","MONITORED_FILE_UPDATE_ERROR":"vMRF: MONITORED_FILE_UPDATE_ERROR","MONITORED_RPM_DELETED_ERROR":"vMRF: MONITORED_RPM_DELETED_ERROR","MONITORED_RPM_ADDED_ERROR":"vMRF: MONITORED_RPM_ADDED_ERROR","MONITORED_CHMOD_ERROR":"vMRF: MONITORED_CHMOD_ERROR","MONITORED_CHOWN_ERROR":"vMRF: MONITORED_CHOWN_ERROR","PASSWD_ROOT_ERROR":"vMRF: PASSWD_ROOT_ERROR","PASSWD_ERROR":"vMRF: PASSWD_ERROR","ROOTKIT_ERROR":"vMRF: ROOTKIT_ERROR","STARTUP_ERR_UNDEFINED_PORT":"vMRF: STARTUP_ERR_UNDEFINED_PORT","STARTUP_ERR_FAIL_FIND_HOSTNAME":"vMRF: STARTUP_ERR_FAIL_FIND_HOSTNAME","STARTUP_ERR_CF_MISSING":"vMRF: STARTUP_ERR_CF_MISSING","STARTUP_ERR_FAILED_TO_OPEN_CF":"vMRF: STARTUP_ERR_FAILED_TO_OPEN_CF","STARTUP_ERR_FAILED_TO_BIND_PORT":"vMRF: STARTUP_ERR_FAILED_TO_BIND_PORT","STARTUP_ERR_CFG_UNIT_MISSING":"vMRF: STARTUP_ERR_CFG_UNIT_MISSING","MCTR_INVALID_CODEC_NAME":"vMRF: MCTR_INVALID_CODEC_NAME","RTSP_SERVER_FAILURE":"vMRF: RTSP_SERVER_FAILURE","RTSP_SERVER_QUARANTINE":"vMRF: RTSP_SERVER_QUARANTINE","TRANSCODING_FAILURE":"vMRF: TRANSCODING_FAILURE","FILE_CACHE_FAILURE":"vMRF: FILE_CACHE_FAILURE","STARTUP_ERROR_INITIALIZATION_FAILED":"vMRF: STARTUP_ERROR_INITIALIZATION_FAILED","CONFERENCE_FAILURE":"vMRF: CONFERENCE_FAILURE","PLC_DEGRADATION_LOW":"vMRF: PLC_DEGRADATION_LOW","PLC_DEGRADATION_MEDIUM":"vMRF: PLC_DEGRADATION_MEDIUM","PLC_DEGRADATION_HIGH":"vMRF: PLC_DEGRADATION_HIGH","AUDIO_RESYNCH_LOW":"vMRF: AUDIO_RESYNCH_LOW","AUDIO_RESYNCH_MEDIUM":"vMRF: AUDIO_RESYNCH_MEDIUM","AUDIO_RESYNCH_HIGH":"vMRF: AUDIO_RESYNCH_HIGH","VIDEO_RESYNCH_LOW":"vMRF: VIDEO_RESYNCH_LOW","VIDEO_RESYNCH_MEDIUM":"vMRF: VIDEO_RESYNCH_MEDIUM","VIDEO_RESYNCH_HIGH":"vMRF: VIDEO_RESYNCH_HIGH","PLAY_FAILURES_LOW":"vMRF: PLAY_FAILURES_LOW","PLAY_FAILURES_MEDIUM":"vMRF: PLAY_FAILURES_MEDIUM","PLAY_FAILURES_HIGH":"vMRF: PLAY_FAILURES_HIGH","NOT_ENOUGH_FREE_CONFEREE":"vMRF: NOT_ENOUGH_FREE_CONFEREE","NO_LONGER_FREE_CONFERENCE_ROOM":"vMRF: NO_LONGER_FREE_CONFERENCE_ROOM","STARTUP_ERROR_FAIL_TO_READ_CF":"vMRF: STARTUP_ERROR_FAIL_TO_READ_CF","STARTUP_ERROR_SIP_ADAPTER_INIT":"vMRF: STARTUP_ERROR_SIP_ADAPTER_INIT","STARTUP_ERROR_MONITORING_INIT":"vMRF: STARTUP_ERROR_MONITORING_INIT","REGISTER_ERROR_FAILURE":"vMRF: REGISTER_ERROR_FAILURE","DRI_ERROR_FAILURE":"vMRF: DRI_ERROR_FAILURE","STARTUP_ERROR_STACK_CONFIGURATION":"vMRF: STARTUP_ERROR_STACK_CONFIGURATION","STARTUP_ERROR_CONF":"vMRF: STARTUP_ERROR_CONF","STARTUP_ERROR_UNDEFINED_PORT":"vMRF: STARTUP_ERROR_UNDEFINED_PORT","HOST_REMOVED":"vMRF: HOST_REMOVED","INTERCEPT_THRESHOLD_NB_DIALOG_ALLOCATED":"vMRF: INTERCEPT_THRESHOLD_NB_DIALOG_ALLOCATED","STARTUP_ERROR_STACK_CONF":"vMRF: STARTUP_ERROR_STACK_CONF","STARTUP_ERROR_CONFIGURATION":"vMRF: STARTUP_ERROR_CONFIGURATION","STARTUP_ERROR_FAILED_TO_RETRIEVE_HOSTNAME":"vMRF: STARTUP_ERROR_FAILED_TO_RETRIEVE_HOSTNAME","LEVEL_WARNING_CALL":"vMRF: LEVEL_WARNING_CALL","LEVEL_ALARM_MINOR_CALL":"vMRF: LEVEL_ALARM_MINOR_CALL","LEVEL_ALARM_MAJOR_CALL":"vMRF: LEVEL_ALARM_MAJOR_CALL","LEVEL_ALARM_MRFPoutOfService":"vMRF: LEVEL_ALARM_MRFPoutOfService","MRFP_CALL_REJECTED_Threshold #1":"vMRF: MRFP_CALL_REJECTED_Threshold #1","MRFP_CALL_REJECTED_Threshold #2":"vMRF: MRFP_CALL_REJECTED_Threshold #2","MRFP_CALL_REJECTED_Threshold #3":"vMRF: MRFP_CALL_REJECTED_Threshold #3","MRFP_CALL_RETRIED_Threshold #1":"vMRF: MRFP_CALL_RETRIED_Threshold #1","MRFP_CALL_RETRIED_Threshold #2":"vMRF: MRFP_CALL_RETRIED_Threshold #2","MRFP_CALL_RETRIED_Threshold #3":"vMRF: MRFP_CALL_RETRIED_Threshold #3","STARTUP_PUB_FILE_NOT_PRESENT":"vMRF: STARTUP_PUB_FILE_NOT_PRESENT","STARTUP_INF_FILE_NOT_PRESENT":"vMRF: STARTUP_INF_FILE_NOT_PRESENT","STARTUP_LIC_FILE_NOT_PRESENT":"vMRF: STARTUP_LIC_FILE_NOT_PRESENT","GENERIC_HARDWARE_PROBLEM":"vMRF: GENERIC_HARDWARE_PROBLEM","HARD_DRIVE_PROBLEM":"vMRF: HARD_DRIVE_PROBLEM","NETWORK_LINK_PROBLEM":"vMRF: NETWORK_LINK_PROBLEM","POWER_SUPPLY_PROBLEM":"vMRF: POWER_SUPPLY_PROBLEM","SMART_HARD_DRIVE_PROBLEM":"vMRF: SMART_HARD_DRIVE_PROBLEM","STARTUP_ERROR":"vMRF: STARTUP_ERROR","RESOURCE_NOT_ACCESSIBLE":"vMRF: RESOURCE_NOT_ACCESSIBLE","RESOURCE_ACCESSIBLE":"vMRF: RESOURCE_ACCESSIBLE","RESOURCE_FULL":"vMRF: RESOURCE_FULL","DRI_ALARM":"vMRF: DRI_ALARM","REGISTER_ERROR_CCF":"vMRF: REGISTER_ERROR_CCF","REGISTER_ERROR_EXTERNAL":"vMRF: REGISTER_ERROR_EXTERNAL","TIMEOUT_ERROR":"vMRF: TIMEOUT_ERROR","VXML_ERROR":"vMRF: VXML_ERROR","A Network Element is no longer available due to a connection failure":"vMVM: A Network Element is no longer available due to a connection failure","A MetaSphere server is reporting a fault with the configuration of its connection to MetaView":"vMVM: A MetaSphere server is reporting a fault with the configuration of its connection to MetaView","Configured OBS IPs don't match available OBS nodes. Configured but unavailable nodes include: [<IP address>]. Real nodes not configured include: []":"vMVM: Configured OBS IPs don't match available OBS nodes. Configured but unavailable nodes include: [<IP address>]. Real nodes not configured include: []","Service Assurance Server <IP address> cannot be contacted":"vMVM: Service Assurance Server <IP address> cannot be contacted","The primary MetaView Director has lost contact with the backup MetaView Director":"vMVM: The primary MetaView Director has lost contact with the backup MetaView Director","The active server has lost connection to the standby":"vMVM: The active server has lost connection to the standby","CrashCounter":"vprobes-vBE-Processing: CrashCounter","IsAlive":"vprobes-vBE-Processing: IsAlive","SwRestart":"vprobes-vLB: SwRestart","Repeated exceptions have occurred.":"vSBC-Metaswitch: Repeated exceptions have occurred.","A licensing limit is close to capacity.":"vSBC-Metaswitch: A licensing limit is close to capacity.","One or more feature packs have been breached.":"vSBC-Metaswitch: One or more feature packs have been breached.","The grace period on this Perimeta system will expire in less than 48 hours, after which calls will not be processed.":"vSBC-Metaswitch: The grace period on this Perimeta system will expire in less than 48 hours, after which calls will not be processed.","The grace period on this Perimeta system will expire in less than 7 days, after which calls will not be processed.":"vSBC-Metaswitch: The grace period on this Perimeta system will expire in less than 7 days, after which calls will not be processed.","The license on this Perimeta system will expire in less than 4 weeks.":"vSBC-Metaswitch: The license on this Perimeta system will expire in less than 4 weeks.","A Perimeta blade has become unlicensed.":"vSBC-Metaswitch: A Perimeta blade has become unlicensed.","Perimeta is licensed with a bypass certificate, which is valid until the time displayed.":"vSBC-Metaswitch: Perimeta is licensed with a bypass certificate, which is valid until the time displayed.","The number of licensed instances exceeded a threshold of the licensed limit.":"vSBC-Metaswitch: The number of licensed instances exceeded a threshold of the licensed limit.","The software token on the primary Distributed Capacity Manager will expire on the displayed date.":"vSBC-Metaswitch: The software token on the primary Distributed Capacity Manager will expire on the displayed date.","A capacity limit on the license installed on this Perimeta system does not match the largest limit across all systems in the deployment.":"vSBC-Metaswitch: A capacity limit on the license installed on this Perimeta system does not match the largest limit across all systems in the deployment.","An adjacency has voice quality alerts.":"vSBC-Metaswitch: An adjacency has voice quality alerts.","The number of calls being audited is congested.":"vSBC-Metaswitch: The number of calls being audited is congested.","Session Controller is rejecting calls because there is no valid active call policy set configured.":"vSBC-Metaswitch: Session Controller is rejecting calls because there is no valid active call policy set configured.","A call policy set is inactive because it has been misconfigured.":"vSBC-Metaswitch: A call policy set is inactive because it has been misconfigured.","Session Controller is inactive and rejecting calls.":"vSBC-Metaswitch: Session Controller is inactive and rejecting calls.","Sources have breached minor or major blacklist thresholds.":"vSBC-Metaswitch: Sources have breached minor or major blacklist thresholds.","Sources are blacklisted.":"vSBC-Metaswitch: Sources are blacklisted.","The blacklisting configuration will change as a result of upgrade and some configured blacklists or alerts will no longer be applied.":"vSBC-Metaswitch: The blacklisting configuration will change as a result of upgrade and some configured blacklists or alerts will no longer be applied.","A large number of downgrades and bans have been created as a result of blacklisting.":"vSBC-Metaswitch: A large number of downgrades and bans have been created as a result of blacklisting.","Session Controller is unable to track further sources for blacklisting.":"vSBC-Metaswitch: Session Controller is unable to track further sources for blacklisting.","A software protection switch was triggered.":"vSBC-Metaswitch: A software protection switch was triggered.","A disk area on a processor blade is nearly full.":"vSBC-Metaswitch: A disk area on a processor blade is nearly full.","Memory use is very high.":"vSBC-Metaswitch: Memory use is very high.","The primary processor-blade has lost contact with the backup.":"vSBC-Metaswitch: The primary processor-blade has lost contact with the backup.","An efix or patch has been applied to this system containing diagnostic versions of some software libraries.":"vSBC-Metaswitch: An efix or patch has been applied to this system containing diagnostic versions of some software libraries.","A software protection switch (SPS) was triggered. Call and registration state was lost.":"vSBC-Metaswitch: A software protection switch (SPS) was triggered. Call and registration state was lost.","The Ethernet Heartbeat between primary and backup processors has failed.":"vSBC-Metaswitch: The Ethernet Heartbeat between primary and backup processors has failed.","The Backplane Heartbeat between primary and backup processors has failed.":"vSBC-Metaswitch: The Backplane Heartbeat between primary and backup processors has failed.","A disk area on a processor blade reported an error.":"vSBC-Metaswitch: A disk area on a processor blade reported an error.","The system is upgrading.":"vSBC-Metaswitch: The system is upgrading.","An error with NTP functionality has been detected.":"vSBC-Metaswitch: An error with NTP functionality has been detected.","One or more users are locked out of the system.":"vSBC-Metaswitch: One or more users are locked out of the system.","The Craft Terminal user FTP directory on a processor blade is nearly full.":"vSBC-Metaswitch: The Craft Terminal user FTP directory on a processor blade is nearly full.","A scheduled configuration snapshot has failed.":"vSBC-Metaswitch: A scheduled configuration snapshot has failed.","The Session Controller is stopping as a result of administrator action.":"vSBC-Metaswitch: The Session Controller is stopping as a result of administrator action.","A Session Controller processor blade is stopping as a result of administrator action.":"vSBC-Metaswitch: A Session Controller processor blade is stopping as a result of administrator action.","An object could not be activated because its service address does not exist or is not fully specified.":"vSBC-Metaswitch: An object could not be activated because its service address does not exist or is not fully specified.","The hardware on a processor does not meet minimum requirements.":"vSBC-Metaswitch: The hardware on a processor does not meet minimum requirements.","The hardware expectations of the two processors are not the same.":"vSBC-Metaswitch: The hardware expectations of the two processors are not the same.","The read speed of the main hard disk on a processor blade is too slow.":"vSBC-Metaswitch: The read speed of the main hard disk on a processor blade is too slow.","An error has occurred reading from the hard disk on a processor blade.":"vSBC-Metaswitch: An error has occurred reading from the hard disk on a processor blade.","Backup and primary processor-blades have an inconsistent system role.":"vSBC-Metaswitch: Backup and primary processor-blades have an inconsistent system role.","Event: The system encountered a critical error and had to restart.":"vSBC-Metaswitch: Event: The system encountered a critical error and had to restart.","Event: A RADIUS server failed to respond to an authentication request.":"vSBC-Metaswitch: Event: A RADIUS server failed to respond to an authentication request.","Event: All configured RADIUS servers failed to respond to authentication requests.":"vSBC-Metaswitch: Event: All configured RADIUS servers failed to respond to authentication requests.","Event: The number of CPUs has changed.":"vSBC-Metaswitch: Event: The number of CPUs has changed.","Event: A user has been automatically deleted":"vSBC-Metaswitch: Event: A user has been automatically deleted","The primary processor blade has lost management connectivity":"vSBC-Metaswitch: The primary processor blade has lost management connectivity","Event: A processor blade is running with DPDK mode disabled when DPDK mode is,expected.":"vSBC-Metaswitch: Event: A processor blade is running with DPDK mode disabled when DPDK mode is,expected.","Event: Processor blade %1 is running with DPDK mode disabled when DPDK mode may be possible.":"vSBC-Metaswitch: Event: Processor blade %1 is running with DPDK mode disabled when DPDK mode may be possible.","Perimeta is attempting to resend cached billing records.":"vSBC-Metaswitch: Perimeta is attempting to resend cached billing records.","The Rf billing cache is full.":"vSBC-Metaswitch: The Rf billing cache is full.","The inbound call queue is congested.":"vSBC-Metaswitch: The inbound call queue is congested.","A configured realm group contains realms that are not available to the SBC.":"vSBC-Metaswitch: A configured realm group contains realms that are not available to the SBC.","An allowed MSC configuration is not connected to any physical MSCs.":"vSBC-Metaswitch: An allowed MSC configuration is not connected to any physical MSCs.","A SIP Peer has stopped responding to SIP OPTIONS pings.  MSW: 20160303: Alarm text is changed in v3.9 software to read: \\"An adjacency has lost connectivity, according to SIP OPTIONS pings\\"":"vSBC-Metaswitch: A SIP Peer has stopped responding to SIP OPTIONS pings.  MSW: 20160303: Alarm text is changed in v3.9 software to read: \\"An adjacency has lost connectivity, according to SIP OPTIONS pings\\"","An adjacency has failed as the listen socket could not be created. Check for configuration mismatches with the associated service interface.":"vSBC-Metaswitch: An adjacency has failed as the listen socket could not be created. Check for configuration mismatches with the associated service interface.","No suitable DNS records were found for a peer group's DNS hostname.":"vSBC-Metaswitch: No suitable DNS records were found for a peer group's DNS hostname.","One or more SIP peers from a peer group have stopped responding to SIP OPTIONS pings":"vSBC-Metaswitch: One or more SIP peers from a peer group have stopped responding to SIP OPTIONS pings","An adjacency has failed as its service network does not match the service network on its associated peer group.":"vSBC-Metaswitch: An adjacency has failed as its service network does not match the service network on its associated peer group.","An adjacency has failed as its configured TLS certificate could not be found.":"vSBC-Metaswitch: An adjacency has failed as its configured TLS certificate could not be found.","The caching function has not been initialized properly.":"vSBC-Metaswitch: The caching function has not been initialized properly.","An adjacency has failed as the listen socket could not be created.":"vSBC-Metaswitch: An adjacency has failed as the listen socket could not be created.","An adjacency is congested and may be rejecting calls.":"vSBC-Metaswitch: An adjacency is congested and may be rejecting calls.","There is an issue with a Diameter peer.":"vSBC-Metaswitch: There is an issue with a Diameter peer.","A realm is no longer reachable via any configured peers.":"vSBC-Metaswitch: A realm is no longer reachable via any configured peers.","An FQDN for a configured Diameter peer has failed to resolve to a valid IP address.":"vSBC-Metaswitch: An FQDN for a configured Diameter peer has failed to resolve to a valid IP address.","One or more peers resolved from a DNS lookup of a configured peer's address cannot be contacted":"vSBC-Metaswitch: One or more peers resolved from a DNS lookup of a configured peer's address cannot be contacted","An interface ARP or NDP probe has failed.":"vSBC-Metaswitch: An interface ARP or NDP probe has failed.","One or more IP address conflicts have been detected on service interfaces with zero criticality. If there are other probe failures, this alarm will remain raised until all conflicts are resolved.":"vSBC-Metaswitch: One or more IP address conflicts have been detected on service interfaces with zero criticality. If there are other probe failures, this alarm will remain raised until all conflicts are resolved.","One or more IP address conflicts have been detected on service interfaces with non-zero criticality. If there are other probe failures, this alarm will remain raised until all conflicts are resolved.":"vSBC-Metaswitch: One or more IP address conflicts have been detected on service interfaces with non-zero criticality. If there are other probe failures, this alarm will remain raised until all conflicts are resolved.","An interface device is running below the expected speed. This alarm was originally triggered by a probe failure on a service interface.":"vSBC-Metaswitch: An interface device is running below the expected speed. This alarm was originally triggered by a probe failure on a service interface.","An interface device is running above the expected speed.":"vSBC-Metaswitch: An interface device is running above the expected speed.","An IP address conflict has been detected on a management interface.":"vSBC-Metaswitch: An IP address conflict has been detected on a management interface.","An interface ICMP probe has failed.":"vSBC-Metaswitch: An interface ICMP probe has failed.","A High-Availability link has detected a connectivity issue.":"vSBC-Metaswitch: A High-Availability link has detected a connectivity issue.","An HA-link device is being reported as underspeed.":"vSBC-Metaswitch: An HA-link device is being reported as underspeed.","An IP address conflict has been detected on a replication interface.":"vSBC-Metaswitch: An IP address conflict has been detected on a replication interface.","The Session Controller has started.":"vSBC-Metaswitch: The Session Controller has started.","A statistic exceeded its configured thresholds.":"vSBC-Metaswitch: A statistic exceeded its configured thresholds.","One or more statistic has not been retrieved at least 3 times in a row.":"vSBC-Metaswitch: One or more statistic has not been retrieved at least 3 times in a row.","A Refresh Alarms request was triggered. Alarms not re-raised will be cleared in 5 minutes.":"vSBC-Metaswitch: A Refresh Alarms request was triggered. Alarms not re-raised will be cleared in 5 minutes.","A statistic has exceeded its configured thresholds.":"vSBC-Metaswitch: A statistic has exceeded its configured thresholds.","A Fallback Operation will soon be started":"vSBG: A Fallback Operation will soon be started","BRM, Auto Export Backup Failed":"vSBG: BRM, Auto Export Backup Failed","BRM, Scheduled Backup Failed":"vSBG: BRM, Scheduled Backup Failed","COM SA, AMF Component Cleanup Failed":"vSBG: COM SA, AMF Component Cleanup Failed","COM SA, AMF Component Instantiation Failed":"vSBG: COM SA, AMF Component Instantiation Failed","COM SA, AMF SI Unassigned":"vSBG: COM SA, AMF SI Unassigned","COM SA, CLM Cluster Node Unavailable":"vSBG: COM SA, CLM Cluster Node Unavailable","COM SA, MDF Detected Model Error":"vSBG: COM SA, MDF Detected Model Error","COM SA, Proxy Status of a Component Changed to Unproxied":"vSBG: COM SA, Proxy Status of a Component Changed to Unproxied","File Management, Number of Files in FileGroup Exceeded":"vSBG: File Management, Number of Files in FileGroup Exceeded","File Management, Max Size in FileGroup Exceeded":"vSBG: File Management, Max Size in FileGroup Exceeded","LOTC Disk Replication Communication":"vSBG: LOTC Disk Replication Communication","LOTC Disk Replication Consistency":"vSBG: LOTC Disk Replication Consistency","LOTC Disk Usage":"vSBG: LOTC Disk Usage","LOTC memory Usage":"vSBG: LOTC memory Usage","LOTC Time Synchronization":"vSBG: LOTC Time Synchronization","SBG, BGF Control Link Down":"vSBG: SBG, BGF Control Link Down","SBG, BGF Control Link Disabled":"vSBG: SBG, BGF Control Link Disabled","SBG, BGF Control Link Enabled":"vSBG: SBG, BGF Control Link Enabled","SBG, BGF Control Link Remote Locked":"vSBG: SBG, BGF Control Link Remote Locked","SBG, Charging Data Storage Maximum Records Reached":"vSBG: SBG, Charging Data Storage Maximum Records Reached","SBG, Charging Server Rejects Charging Data":"vSBG: SBG, Charging Server Rejects Charging Data","SBG, Excessive Packet Rate Detected ":"vSBG: SBG, Excessive Packet Rate Detected ","SBG, High Amount of Malformed Packets Received":"vSBG: SBG, High Amount of Malformed Packets Received","SBG, High Amount of STUN Packets Detected":"vSBG: SBG, High Amount of STUN Packets Detected","SBG, High Amount of TCP SYN Packets Received":"vSBG: SBG, High Amount of TCP SYN Packets Received","SBG, High Amount of UDP Packets Received ":"vSBG: SBG, High Amount of UDP Packets Received ","SBG, IP Address Blocked Due to Excessive Packet Rate":"vSBG: SBG, IP Address Blocked Due to Excessive Packet Rate","SBG, Lost Connectivity to Diameter Server":"vSBG: SBG, Lost Connectivity to Diameter Server","SBG, Mated Pair out of Service":"vSBG: SBG, Mated Pair out of Service","SBG, Network Unavailable for Media Handling":"vSBG: SBG, Network Unavailable for Media Handling","SBG, Non-emergency Call Released to Free Resources for Emergency Call":"vSBG: SBG, Non-emergency Call Released to Free Resources for Emergency Call","SBG, Not Enough Disk Space for Storing Charging Data":"vSBG: SBG, Not Enough Disk Space for Storing Charging Data","SBG, Payload Mated Pair Failure":"vSBG: SBG, Payload Mated Pair Failure","SBG, Payload Processor Failure":"vSBG: SBG, Payload Processor Failure","SBG, Processor Overloaded":"vSBG: SBG, Processor Overloaded","SBG, Registered User Set in Quarantine":"vSBG: SBG, Registered User Set in Quarantine","SBG, Registration Contacts Exceed Configured Threshold":"vSBG: SBG, Registration Contacts Exceed Configured Threshold","SBG, Sequential Restart Initiated":"vSBG: SBG, Sequential Restart Initiated","SBG, SIP Abuse Detected":"vSBG: SBG, SIP Abuse Detected","SBG, SIP Network Locked":"vSBG: SBG, SIP Network Locked","SBG, SIP Next Hop Reachable":"vSBG: SBG, SIP Next Hop Reachable","SBG, SIP Next Hop Unreachable":"vSBG: SBG, SIP Next Hop Unreachable","SBG, SIP Request Rejected by Network Throttling":"vSBG: SBG, SIP Request Rejected by Network Throttling","SBG, TLS Certificate Imported":"vSBG: SBG, TLS Certificate Imported","SBG, Trace Recording Session Number Limit Reached":"vSBG: SBG, Trace Recording Session Number Limit Reached","SBG, Trace Session Deactivated":"vSBG: SBG, Trace Session Deactivated","SBG, Trace Session Times Out":"vSBG: SBG, Trace Session Times Out","SBG, Unknown Media Type or Payload Type":"vSBG: SBG, Unknown Media Type or Payload Type"}\r
-#\r
-# if action.test.override is true, then any action will be marked as test=true (even if incoming action request had test=false); otherwise, test flag will be unchanged on the action request\r
-action.test.override=false\r
-# if action.insert.test.event is true, then insert event even if the action is set to test\r
-action.insert.test.event=false\r
-clds.service.cache.invalidate.after.seconds=120\r
-\r
-#DCAE Inventory Url Properties\r
-DCAE_INVENTORY_URL = http://dcae.api.simpledemo.onap.org:8080\r
-\r
-#DCAE Dispatcher Url Properties\r
-DCAE_DISPATCHER_URL = http://dcae.api.simpledemo.onap.org:8080\r
-dcae.header.requestId = X-ECOMP-RequestID\r
index c7e5fea..76992fd 100644 (file)
@@ -23,13 +23,11 @@ services:
     ports:
       - "8080:8080"
 
-  sdc_proxy:
+  third_party_proxy:
     image: python:2-slim
     volumes:
-      - "../../../src/test/resources/http-cache/sdc-example/:/sdc:ro"
+      - "../../../src/test/resources/http-cache/example/:/thirdparty:rw"
       - "../../../src/test/resources/http-cache/:/script/:ro"
-    depends_on:
-      - clamp
     ports:
       - "8085:8085"
-    command: /bin/sh -c "pip install requests && python /script/sdc_proxy.py --port 8085 --root /sdc"
+    command: /bin/sh -c "pip install requests &&  pip install simplejson && python -u /script/third_party_proxy.py -v true --port 8085 --root /thirdparty"
diff --git a/extra/docker/elk/.env b/extra/docker/elk/.env
new file mode 100644 (file)
index 0000000..4f1781d
--- /dev/null
@@ -0,0 +1,13 @@
+# docker compose related
+COMPOSE_PROJECT_NAME=clamp_elk
+
+# dmaap configuration for logstash
+dmaap_base_url=http://localhost:3904/
+dmaap_user=user
+dmaap_password=password
+dmaap_consumer_group=CG42
+dmaap_consumer_id=C42
+
+event_topic=EVENT_TOPIC
+notification_topic=NOTIFICATION_TOPIC
+request_topic=REQUEST_TOPIC
diff --git a/extra/docker/elk/README.md b/extra/docker/elk/README.md
new file mode 100644 (file)
index 0000000..04c2439
--- /dev/null
@@ -0,0 +1,32 @@
+CLAMP Dashboard
+===============
+
+ELK stack for CLAMP : Logstash is used to retrieve events and notifications from DMaaP and pushes them into Elasticsearch.
+Kibana is then used to extract statistics.
+
+
+Deployment instructions
+-----------------------
+
+Requirements: docker-compose
+
+1. Update configuration in docker-compose file
+2. `docker-compose up -d logstash kibana`
+3. `docker-compose run default`  # loads the dashboard configuration for Kibana
+
+
+Tools
+-----
+
+The following tools are available in the 'tools/' folder.
+
+
+### EsAutoQuery
+
+Small script ease Elasticsearch /painless/ field development.
+It reads a json file as a query for Elasticsearch, pushes it on the ES server, and display back the answer in a loop, each time the file is modified.
+
+
+### DMaaP Service Mocker
+
+Script that simulates control loop DMaaP services to provide sample data to logstash through DMaaP.
diff --git a/extra/docker/elk/docker-compose.yml b/extra/docker/elk/docker-compose.yml
new file mode 100644 (file)
index 0000000..ded2c6b
--- /dev/null
@@ -0,0 +1,74 @@
+version: '3.1'
+
+services:
+  elasticsearch:
+    image: elasticsearch
+    ports:
+      - 9200:9200
+    networks:
+      es_net:
+        aliases:
+          - elasticsearch
+
+  logstash:
+    image: logstash
+    volumes:
+      - ./logstash-conf:/config-dir
+    command: logstash -f /config-dir/logstash.conf
+    depends_on:
+      - elasticsearch
+    networks:
+      es_net:
+    environment:
+
+  kibana:
+    image: kibana
+    ports:
+      - 5601:5601
+    depends_on:
+      - elasticsearch
+    networks:
+      es_net:
+
+  backup:
+    image: taskrabbit/elasticsearch-dump
+    depends_on:
+      - elasticsearch
+    command:
+      - --input=http://elasticsearch:9200/.kibana
+      - --output=/backups/backup.json
+      - --type=data
+    volumes:
+      - ./es_backup/:/backups/
+    networks:
+      es_net:
+
+  restore:
+    image: taskrabbit/elasticsearch-dump
+    depends_on:
+      - elasticsearch
+    command:
+      - --output=http://elasticsearch:9200/.kibana
+      - --input=/backups/backup.json
+      - --type=data
+    volumes:
+      - ./es_backup/:/backups/
+    networks:
+      es_net:
+
+  default:
+    image: taskrabbit/elasticsearch-dump
+    depends_on:
+      - elasticsearch
+    command:
+      - --output=http://elasticsearch:9200/.kibana
+      - --input=/backups/default.json
+      - --type=data
+    volumes:
+      - ./es_backup/:/backups/
+    networks:
+      es_net:
+
+
+networks:
+  es_net:
diff --git a/extra/docker/elk/es_backup/default.json b/extra/docker/elk/es_backup/default.json
new file mode 100644 (file)
index 0000000..135cad0
--- /dev/null
@@ -0,0 +1,14 @@
+{"_index":".kibana","_type":"visualization","_id":"AWI967sW8kHy-lwNJZrR","_score":1,"_source":{"title":"TotalEventDurationTable","visState":"{\"title\":\"TotalEventDurationTable\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"type\":\"table\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"eventDuration\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","savedSearchId":"AWIk9P-qDjJ4k3sPXRcQ","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"}}}
+{"_index":".kibana","_type":"visualization","_id":"AWI922pp8kHy-lwNJZrP","_score":1,"_source":{"title":"CLEventDurationTables","visState":"{\"title\":\"CLEventDurationTables\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"type\":\"table\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"eventDuration\",\"customLabel\":\"Event Duration\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"split\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"_term\",\"row\":true}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"requestID.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"_term\"}}],\"listeners\":{}}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","savedSearchId":"AWIk9P-qDjJ4k3sPXRcQ","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"}}}
+{"_index":".kibana","_type":"visualization","_id":"AWI91Rvl8kHy-lwNJZrN","_score":1,"_source":{"title":"AverageEventDurationTable","visState":"{\"title\":\"AverageEventDurationTable\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"type\":\"table\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"eventDuration\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","savedSearchId":"AWIk9P-qDjJ4k3sPXRcQ","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"}}}
+{"_index":".kibana","_type":"index-pattern","_id":"AWIk7j2UDjJ4k3sPXRaY","_score":1,"_source":{"title":"logstash-*","timeFieldName":"closedLoopAlarmStart","notExpandable":true,"fields":"[{\"name\":\"@timestamp\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"@version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.cloud-region.identity-url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.cloud-region.identity-url.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.complex.physical-location-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.complex.physical-location-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.generic-vnf.service-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.generic-vnf.service-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.generic-vnf.vnf-name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.generic-vnf.vnf-name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.tenant.tenant-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.tenant.tenant-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.in-maint\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.in-maint.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.is-closed-loop-disabled\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.is-closed-loop-disabled.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.l-interface(network like '%oam%').l3-interface-ipv6-address-list.l3-inteface-ipv6-address\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.l-interface(network like '%oam%').l3-interface-ipv6-address-list.l3-inteface-ipv6-address.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.l-interface(nework like '%oam%').l3-interface-ipv4-address-list.l3-inteface-ipv4-address\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.l-interface(nework like '%oam%').l3-interface-ipv4-address-list.l3-inteface-ipv4-address.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.prov-status\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.prov-status.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.selflink\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.selflink.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.vserver-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.vserver-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.vserver-name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.vserver-name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"OPS_CL_timer\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"closedLoopAlarmEnd\",\"type\":\"date\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopAlarmStart\",\"type\":\"date\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopControlName\",\"type\":\"string\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"closedLoopControlName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopEventClient\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"closedLoopEventClient.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopEventStatus\",\"type\":\"string\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"closedLoopEventStatus.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"from\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"from.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.ip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.latitude\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.location\",\"type\":\"geo_point\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.longitude\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.actor\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.actor.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.end\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.operation\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.operation.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.start\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.subRequestId\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.subRequestId.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.target\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.target.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"notification\",\"type\":\"string\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"notification.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"notificationTime\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"notificationTime.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"policyName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"policyName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"policyScope\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"policyScope.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"policyVersion\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"policyVersion.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"requestID\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"requestID.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"target\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"target.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"target_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"target_type.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"triggerID\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"triggerID.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"triggerSourceName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"triggerSourceName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"version.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eventDuration\",\"type\":\"number\",\"count\":0,\"scripted\":true,\"script\":\"if (doc.get('closedLoopEventStatus.keyword').value == 'ABATED') {                                                                                            \\n   return doc.get('closedLoopAlarmEnd').value- doc.get('closedLoopAlarmStart').value;                                                                        \\n}                                                                                                                                                            \\nreturn null\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]","fieldFormatMap":"{\"eventDuration\":{\"id\":\"duration\",\"params\":{\"inputFormat\":\"milliseconds\"}}}"}}
+{"_index":".kibana","_type":"config","_id":"5.6.7","_score":1,"_source":{"buildNum":15610,"defaultIndex":"AWIk7j2UDjJ4k3sPXRaY"}}
+{"_index":".kibana","_type":"search","_id":"AWIk8yDIDjJ4k3sPXRbu","_score":1,"_source":{"title":"ONSET","description":"","hits":0,"columns":["closedLoopAlarmStart","closedLoopAlarmEnd","closedLoopControlName","closedLoopEventStatus","notification"],"sort":["closedLoopAlarmStart","desc"],"version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"highlightAll\":true,\"version\":true,\"query\":{\"match_all\":{}},\"filter\":[{\"meta\":{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"negate\":false,\"disabled\":false,\"alias\":null,\"type\":\"phrase\",\"key\":\"closedLoopEventStatus.keyword\",\"value\":\"ONSET\"},\"query\":{\"match\":{\"closedLoopEventStatus.keyword\":{\"query\":\"ONSET\",\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}}]}"}}}
+{"_index":".kibana","_type":"search","_id":"AWIk9P-qDjJ4k3sPXRcQ","_score":1,"_source":{"title":"ABATED","description":"","hits":0,"columns":["closedLoopAlarmStart","closedLoopAlarmEnd","closedLoopControlName","closedLoopEventStatus","notification"],"sort":["closedLoopAlarmStart","desc"],"version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"highlightAll\":true,\"version\":true,\"query\":{\"query_string\":{\"query\":\"closedLoopEventStatus: \\\"ABATED\\\"\",\"analyze_wildcard\":true}},\"filter\":[{\"meta\":{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"negate\":false,\"disabled\":false,\"alias\":\"ABATED\",\"type\":\"phrase\",\"key\":\"closedLoopEventStatus.keyword\",\"value\":\"ABATED\"},\"query\":{\"match\":{\"closedLoopEventStatus.keyword\":{\"query\":\"ABATED\",\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}},{\"meta\":{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"negate\":false,\"disabled\":true,\"alias\":\"ONSET\",\"type\":\"phrase\",\"key\":\"closedLoopEventStatus.keyword\",\"value\":\"ONSET\"},\"query\":{\"match\":{\"closedLoopEventStatus.keyword\":{\"query\":\"ONSET\",\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}}]}"}}}
+{"_index":".kibana","_type":"visualization","_id":"AWIk-IFsDjJ4k3sPXRdD","_score":1,"_source":{"title":"ClosedLoopActivations","visState":"{\"title\":\"ClosedLoopActivations\",\"type\":\"metric\",\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"gauge\",\"gauge\":{\"verticalSplit\":false,\"autoExtend\":false,\"percentageMode\":false,\"gaugeType\":\"Metric\",\"gaugeStyle\":\"Full\",\"backStyle\":\"Full\",\"orientation\":\"vertical\",\"colorSchema\":\"Green to Red\",\"gaugeColorMode\":\"None\",\"useRange\":false,\"colorsRange\":[{\"from\":0,\"to\":100}],\"invertColors\":false,\"labels\":{\"show\":true,\"color\":\"black\"},\"scale\":{\"show\":false,\"labels\":false,\"color\":\"#333\",\"width\":2},\"type\":\"simple\",\"style\":{\"fontSize\":60,\"bgColor\":false,\"labelColor\":false,\"subText\":\"\"}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}","uiStateJSON":"{\"vis\":{\"defaultColors\":{\"0 - 100\":\"rgb(0,104,55)\"},\"legendOpen\":false},\"spy\":{\"mode\":{\"name\":null,\"fill\":false}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"query\":{\"match_all\":{}},\"filter\":[{\"meta\":{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"negate\":false,\"disabled\":false,\"alias\":null,\"type\":\"phrase\",\"key\":\"closedLoopEventStatus.keyword\",\"value\":\"ONSET\"},\"query\":{\"match\":{\"closedLoopEventStatus.keyword\":{\"query\":\"ONSET\",\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}}]}"}}}
+{"_index":".kibana","_type":"visualization","_id":"AWIk-5O-DjJ4k3sPXRd1","_score":1,"_source":{"title":"ClosedLoopActivationsTable","visState":"{\"title\":\"ClosedLoopActivationsTable\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":true,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"type\":\"table\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","savedSearchId":"AWIk8yDIDjJ4k3sPXRbu","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"}}}
+{"_index":".kibana","_type":"visualization","_id":"AWIk_VLEDjJ4k3sPXReS","_score":1,"_source":{"title":"SuccessfulRestartsTable","visState":"{\"title\":\"SuccessfulRestartsTable\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":true,\"totalFunc\":\"sum\",\"type\":\"table\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","savedSearchId":"AWIk9P-qDjJ4k3sPXRcQ","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"}}}
+{"_index":".kibana","_type":"search","_id":"AWIlAjTaDjJ4k3sPXRe1","_score":1,"_source":{"title":"FAILURE NOTIFICATION","description":"","hits":0,"columns":["closedLoopAlarmStart","closedLoopAlarmEnd","closedLoopControlName","closedLoopEventStatus","notification"],"sort":["closedLoopAlarmStart","desc"],"version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"highlightAll\":true,\"version\":true,\"query\":{\"match_all\":{}},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"ABATED\",\"disabled\":true,\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"key\":\"closedLoopEventStatus.keyword\",\"negate\":false,\"type\":\"phrase\",\"value\":\"ABATED\"},\"query\":{\"match\":{\"closedLoopEventStatus.keyword\":{\"query\":\"ABATED\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"ONSET\",\"disabled\":true,\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"key\":\"closedLoopEventStatus.keyword\",\"negate\":false,\"type\":\"phrase\",\"value\":\"ONSET\"},\"query\":{\"match\":{\"closedLoopEventStatus.keyword\":{\"query\":\"ONSET\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"FAILURE NOTIFICATION\",\"disabled\":false,\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"key\":\"notification.keyword\",\"negate\":false,\"type\":\"phrase\",\"value\":\"FINAL: FAILURE\"},\"query\":{\"match\":{\"notification.keyword\":{\"query\":\"FINAL: FAILURE\",\"type\":\"phrase\"}}}}]}"}}}
+{"_index":".kibana","_type":"visualization","_id":"AWIlBLT7DjJ4k3sPXRe7","_score":1,"_source":{"title":"FailedRestartTable","visState":"{\"title\":\"FailedRestartTable\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\",\"type\":\"table\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","savedSearchId":"AWIlAjTaDjJ4k3sPXRe1","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"}}}
+{"_index":".kibana","_type":"index-pattern","_id":"AWIqPamARYxwAnBQhbeU","_score":1,"_source":{"title":"logstash-*","timeFieldName":"@timestamp","notExpandable":true,"fields":"[{\"name\":\"@timestamp\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"@version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.cloud-region.identity-url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.cloud-region.identity-url.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.complex.physical-location-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.complex.physical-location-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.generic-vnf.service-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.generic-vnf.service-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.generic-vnf.vnf-name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.generic-vnf.vnf-name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.tenant.tenant-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.tenant.tenant-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.in-maint\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.in-maint.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.is-closed-loop-disabled\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.is-closed-loop-disabled.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.l-interface(network like '%oam%').l3-interface-ipv6-address-list.l3-inteface-ipv6-address\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.l-interface(network like '%oam%').l3-interface-ipv6-address-list.l3-inteface-ipv6-address.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.l-interface(nework like '%oam%').l3-interface-ipv4-address-list.l3-inteface-ipv4-address\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.l-interface(nework like '%oam%').l3-interface-ipv4-address-list.l3-inteface-ipv4-address.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.prov-status\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.prov-status.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.selflink\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.selflink.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.vserver-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.vserver-id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.vserver-name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.vserver-name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"OPS_CL_timer\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"closedLoopAlarmEnd\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopAlarmStart\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopControlName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"closedLoopControlName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopEventClient\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"closedLoopEventClient.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"closedLoopEventStatus\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"closedLoopEventStatus.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"from\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"from.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.ip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.latitude\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.location\",\"type\":\"geo_point\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.longitude\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.actor\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.actor.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.end\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.message\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.message.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.operation\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.operation.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.outcome\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.outcome.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.start\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.subRequestId\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.subRequestId.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"history.target\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"history.target.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"notification\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"notification.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"notificationTime\",\"type\":\"date\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"policyName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"policyName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"policyScope\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"policyScope.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"policyVersion\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"policyVersion.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"requestID\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"requestID.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"target\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"target.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"target_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"target_type.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"triggerID\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"triggerID.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"triggerSourceName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"triggerSourceName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"version.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"When\",\"type\":\"number\",\"count\":1,\"scripted\":true,\"script\":\"long now = System.currentTimeMillis();                                                                                                                       \\nif (doc.get('closedLoopEventStatus.keyword').value == 'ABATED') {                                                                                            \\n   return now - doc.get('closedLoopAlarmEnd').value;                                                                                                         \\n}                                                                                                                                                            \\nif (doc.get('closedLoopEventStatus.keyword').value == 'ONSET') {                                                                                             \\n   return now - doc.get('closedLoopAlarmStart').value;                                                                                                       \\n}                                                                                                                                                            \\nif (doc.containsKey('notification.keyword')) {                                                                                                               \\n   return now - doc.get('notificationTime').value;                                                                                                           \\n}                                                                                                                                                            \\n                                                                                                                                                             \\nreturn null\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]","fieldFormatMap":"{\"When\":{\"id\":\"duration\",\"params\":{\"inputFormat\":\"milliseconds\"}}}"}}
+{"_index":".kibana","_type":"dashboard","_id":"AWI-9KyytmDBG_mksMZL","_score":1,"_source":{"title":"CLAMP Dashboard","hits":0,"description":"","panelsJSON":"[{\"size_x\":4,\"size_y\":3,\"panelIndex\":1,\"type\":\"visualization\",\"id\":\"AWIk_VLEDjJ4k3sPXReS\",\"col\":5,\"row\":1},{\"size_x\":4,\"size_y\":3,\"panelIndex\":2,\"type\":\"visualization\",\"id\":\"AWIlBLT7DjJ4k3sPXRe7\",\"col\":9,\"row\":1},{\"size_x\":6,\"size_y\":3,\"panelIndex\":3,\"type\":\"visualization\",\"id\":\"AWI967sW8kHy-lwNJZrR\",\"col\":1,\"row\":4},{\"size_x\":6,\"size_y\":3,\"panelIndex\":4,\"type\":\"visualization\",\"id\":\"AWI91Rvl8kHy-lwNJZrN\",\"col\":7,\"row\":4},{\"size_x\":4,\"size_y\":3,\"panelIndex\":5,\"type\":\"visualization\",\"id\":\"AWIk-IFsDjJ4k3sPXRdD\",\"col\":1,\"row\":1}]","optionsJSON":"{\"darkTheme\":false}","uiStateJSON":"{\"P-1\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-2\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-3\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-4\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}}","version":1,"timeRestore":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[{\"query\":{\"match_all\":{}}}],\"highlightAll\":true,\"version\":true}"}}}
diff --git a/extra/docker/elk/logstash-conf/logstash.conf b/extra/docker/elk/logstash-conf/logstash.conf
new file mode 100644 (file)
index 0000000..2b5a24e
--- /dev/null
@@ -0,0 +1,99 @@
+input {
+  http_poller {
+        urls => {
+            event_queue => {
+                method => get
+                url => "${dmaap_base_url}/events/${event_topic}/${dmaap_consumer_group}/${dmaap_consumer_id}?timeout=15000"
+                headers => {
+                    Accept => "application/json"
+                }
+                add_field => { "topic" => "${event_topic}" }
+            }
+            notification_queue => {
+                method => get
+                url => "${dmaap_base_url}/events/${notification_topic}/${dmaap_consumer_group}/${dmaap_consumer_id}?timeout=15000"
+                headers => {
+                    Accept => "application/json"
+                }
+                add_field => { "topic" => "${notification_topic}" }
+            }
+            request_queue => {
+                method => get
+                url => "${dmaap_base_url}/events/${request_topic}/${dmaap_consumer_group}/${dmaap_consumer_id}?timeout=15000"
+                headers => {
+                    Accept => "application/json"
+                }
+                add_field => { "topic" => "${request_topic}" }
+            }
+        }
+        socket_timeout => 30
+        request_timeout => 30
+        interval => 15
+        codec => "plain"
+  }
+}
+
+filter {
+    # avoid noise if no entry in the list
+    if [message] == "[]" {
+       drop { }
+    }
+
+    # parse json, split  the list into multiple events, and parse each event
+    json {
+         source => "[message]"
+         target => "message"
+    }
+    split {
+          field => "message"
+    }
+    json {
+         source => "message"
+    }
+    mutate { remove_field => [ "message" ] }
+    # express timestamps in milliseconds instead of microseconds
+    ruby {
+        code => "event.set('closedLoopAlarmStart', Integer(event.get('closedLoopAlarmStart')))"
+    }
+    date {
+        match => [ "closedLoopAlarmStart", UNIX_MS ]
+        target => "closedLoopAlarmStart"
+    }
+
+    if [closedLoopAlarmEnd] {
+        ruby {
+            code => "event.set('closedLoopAlarmEnd', Integer(event.get('closedLoopAlarmEnd')))"
+        }
+        date {
+            match => [ "closedLoopAlarmEnd", UNIX_MS ]
+            target => "closedLoopAlarmEnd"
+        }
+
+    }
+    #"yyyy-MM-dd HH:mm:ss"
+    if [notificationTime] {
+       mutate {
+              gsub => [
+                   "notificationTime", " ", "T"
+              ]
+       }
+       date {
+            match => [ "notificationTime", ISO8601 ]
+            target => "notificationTime"
+       }
+    }
+}
+output {
+    stdout {
+        codec => rubydebug
+    }
+
+    elasticsearch {
+        codec => "json"
+        hosts => [elasticsearch]
+        index => "logstash-%{+YYYY.MM.DD}" # creates daily indexes
+        doc_as_upsert => true
+
+    }
+
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/ds_mocker.py b/extra/docker/elk/tools/DMaaPServiceMocker/ds_mocker.py
new file mode 100755 (executable)
index 0000000..9891b8e
--- /dev/null
@@ -0,0 +1,218 @@
+#!/usr/bin/env python3
+import os
+import json
+import copy
+import random
+import requests
+import uuid
+import time
+from datetime import datetime
+
+def luck(n=2):
+    """ gives 1 chance out of n (default: 2) to return True """
+    assert n > 1
+    return bool(random.randint(0, n-1))
+def now_dmaap_timestamp():
+    return str(datetime.now().timestamp()).replace(".","")[:13]
+def now_notification_time():
+    return datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f+00:00")
+
+CONTROL_LOOP_NAMES = [
+    'ClosedLoop-vUSP-SIG-d925ed73-8231-4d02-9545-db4e101f88f8',
+    'ClosedLoop-vUSP-SIG-37b1c91e-fd6b-4abd-af15-771902d5fdb1',
+    'ClosedLoop-vUSP-SIG-c2597657-7113-4efb-a1f9-397a7a24c3e1',
+    'ClosedLoop-vUSP-SIG-a11318ba-4c61-46b8-a9da-bd40bec11d45',
+    'ClosedLoop-vUSP-SIG-5321c558-2254-4efb-ac24-99dd54edc94f',
+]
+
+TEMPLATES = {
+    'event_abated'                   :'event_abated.json',
+    'event_onset'                    :'event_onset.json',
+    'notification_active'            :'notification_active.json',
+    'notification_final_failed'      :'notification_final_failed.json',
+    'notification_final_open'        :'notification_final_open.json',
+    'notification_final_success'     :'notification_final_success.json',
+    'notification_operation_failure' :'notification_operation_failure.json',
+    'notification_operation'         :'notification_operation.json',
+    'notification_operation_success' :'notification_operation_success.json',
+    'notification_rejected_disabled' :'notification_rejected_disabled.json',
+    'notification_rejected_missing'  :'notification_rejected_missing.json',
+}
+
+for key in TEMPLATES:
+    with open(TEMPLATES[key]) as f:
+        content = f.read()
+    TEMPLATES[key] = json.loads(content)
+
+
+class DMaaPMessage(dict):
+
+    dmaap_host_url = "http://dmaap.host.url:9200/"
+    dmaap_username = None
+    dmaap_password = None
+
+    @classmethod
+    def from_template(cls, tmpl, **kwargs):
+        obj = cls()
+        obj.update(copy.deepcopy(TEMPLATES[tmpl]))
+        for keys,value in kwargs.items():
+            current_node = obj
+            keys = keys.split(".")
+            key = keys[0]
+            for i in range(len(keys) - 1):
+                current_node = current_node[keys[i]]
+                key = keys[i]
+            current_node[key] = value
+        return obj
+
+    def publish(self, topic):
+        url = "%s/events/%s" % (self.dmaap_host_url, topic)
+        auth = None
+        if self.dmaap_username and self.dmaap_password:
+            auth = (self.dmaap_username, self.dmaap_password)
+        response = requests.post(url, data=json.dumps(self), auth=auth)
+        return response.status_code
+
+class Event(DMaaPMessage):
+
+    topic = "DCAE-CL-EVENT"
+
+    @staticmethod
+    def abated(**kwargs):
+        return Event.from_template('event_abated', **kwargs)
+
+    @staticmethod
+    def onset(**kwargs):
+        return Event.from_template('event_onset', **kwargs)
+
+    def publish(self):
+        return super().publish(self.topic)
+
+
+class Notification(DMaaPMessage):
+
+    topic = "POLICY-CL-MGT"
+
+    @classmethod
+    def from_template(cls, tmpl, **kwargs):
+        kwargs['notificationTime'] = now_notification_time()
+        return super().from_template(tmpl, **kwargs)
+
+    @staticmethod
+    def active(**kwargs):
+        return Notification.from_template('notification_active', **kwargs)
+
+    @staticmethod
+    def final(**kwargs):
+        class FinalNotification(Notification):
+            @staticmethod
+            def success(**kwargs):
+                return FinalNotification.from_template('notification_final_success', **kwargs)
+            @staticmethod
+            def failed(**kwargs):
+                return FinalNotification.from_template('notification_final_failed', **kwargs)
+            @staticmethod
+            def open(**kwargs):
+                return FinalNotification.from_template('notification_final_open', **kwargs)
+        return FinalNotification
+
+    @staticmethod
+    def operation(**kwargs):
+        class OperationNotification(Notification):
+            @staticmethod
+            def success(**kwargs):
+                return OperationNotification.from_template('notification_operation_success', **kwargs)
+            @staticmethod
+            def failure(**kwargs):
+                return OperationNotification.from_template('notification_operation_failure', **kwargs)
+        return OperationNotification.from_template('notification_operation', **kwargs)
+
+    @staticmethod
+    def rejected(**kwargs):
+        class RejectedNotification(Notification):
+            @staticmethod
+            def disabled(**kwargs):
+                return RejectedNotification.from_template('notification_rejected_disabled', **kwargs)
+            @staticmethod
+            def missing_fields(**kwargs):
+                return RejectedNotification.from_template('notification_rejected_missing', **kwargs)
+
+        return RejectedNotification
+
+    def publish(self):
+        return super().publish(self.topic)
+
+
+
+class CLStatus(object):
+
+    def __init__(self, dmaap_url=None,
+                 missing=None, disabled=None, op_failure=None):
+        self._stopped = False
+        def maybe(thing):
+            if thing is None:
+                thing = not luck(10)
+            return thing
+        self._missing = maybe(missing)
+        self._disabled = maybe(disabled)
+        self._op_failure = maybe(op_failure)
+        self._config = dict(
+            requestID=str(uuid.uuid4()),
+            closedLoopControlName=CONTROL_LOOP_NAMES[random.randint(0, len(CONTROL_LOOP_NAMES) - 1)]
+        )
+
+    def __iter__(self):
+        return next(self)
+
+    def __next__(self):
+        if self._stopped:
+            raise StopIteration()
+        config = self._config
+        config.update(dict(closedLoopAlarmStart=now_dmaap_timestamp()))
+        yield Event.onset(**config)
+        if self._missing:
+            self._stopped = True
+            yield Notification.rejected().missing_fields(**config)
+            raise StopIteration()
+        elif self._disabled:
+            self._stopped = True
+            yield Notification.rejected().disabled(**config)
+            raise StopIteration()
+
+        yield Notification.active(**config)
+        yield Notification.operation(**config)
+
+        config['closedLoopAlarmEnd'] = now_dmaap_timestamp()
+        if self._op_failure:
+            yield Notification.operation().failure(**config)
+            self._stopped = True
+            yield Notification.final().failed(**config)
+        else:
+            yield Notification.operation().success(**config)
+            yield Event.abated(**config)
+            self._stopped = True
+            yield Notification.final().success(**config)
+        raise StopIteration()
+
+DMaaPMessage.dmaap_host_url = "http://uebsb93kcdc.it.att.com:3904"
+Event.topic = "APPC-TEST-AMDOCS1-1607-E2E"
+Notification.topic = "APPC-TEST-AMDOCS1-1607-IST"
+# Request.topic = "APPC-TEST-AMDOCS1-1607-RY303T"
+
+test_datas = [CLStatus(missing=False, disabled=False, op_failure=False) for i in range(45)]  \
+             + [CLStatus(missing=True, disabled=False, op_failure=False) for i in range(5)]  \
+             + [CLStatus(missing=False, disabled=True, op_failure=False) for i in range(6)]  \
+             + [CLStatus(missing=False, disabled=False, op_failure=True) for i in range(7)]
+random.shuffle(test_datas)
+random.shuffle(test_datas)
+
+for current_i, status in enumerate(test_datas):
+    time.sleep(random.randint(0,6))
+    for s in status:
+        # print(s)
+        status_code = s.publish()
+        if status_code != 200:
+            print("Error when publishing : status_code={}".format(status_code))
+            exit(1)
+        time.sleep(random.randint(0,3))
+    print("%03d,missing:%5s,disabled:%5s,op_failure:%5s - %s" % (current_i, status._missing, status._disabled, status._op_failure, status._config))
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/event_abated.json b/extra/docker/elk/tools/DMaaPServiceMocker/event_abated.json
new file mode 100644 (file)
index 0000000..ae0d4b7
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "closedLoopAlarmEnd": 1478710227625,
+  "closedLoopAlarmStart": 1478709727496,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "closedLoopEventStatus": "ABATED",
+  "from": "DCAE",
+  "policyName": "vFirewall",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/event_onset.json b/extra/docker/elk/tools/DMaaPServiceMocker/event_onset.json
new file mode 100644 (file)
index 0000000..223f096
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "closedLoopAlarmStart": 1478709385444,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "closedLoopEventStatus": "ONSET",
+  "from": "DCAE",
+  "policyName": "vFirewall",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "88e951ad-a07c-4748-9cef-34f32851a527",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_active.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_active.json
new file mode 100644 (file)
index 0000000..341a249
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "notification": "ACTIVE",
+  "notificationTime": "2016-11-09 16:46:29.721000+00:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_final_failed.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_final_failed.json
new file mode 100644 (file)
index 0000000..4891c7e
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmEnd": 1478710489739,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "history": [
+    {
+      "actor": "APPC",
+      "end": 1478637014434,
+      "message": "<APPC ERROR code/description>",
+      "operation": "RESTART",
+      "outcome": "FAILED",
+      "start": 1478637014430,
+      "subRequestId": "1",
+      "target": "vserver.vserver-name"
+    }
+  ],
+  "message": "actor=APPC,operation=RESTART,target=vserver.vserver-name,subRequestId=1,outcome=FAILED",
+  "notification": "FINAL: FAILURE",
+  "notificationTime": "2016-11-08 15:30:14.434000-05:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_final_open.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_final_open.json
new file mode 100644 (file)
index 0000000..da9e6e1
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "closedLoopAlarmEnd": 1478710489739,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "notification": "FINAL: OPEN",
+  "notificationTime": "2016-11-08 15:30:14.434000-05:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_final_success.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_final_success.json
new file mode 100644 (file)
index 0000000..3d027eb
--- /dev/null
@@ -0,0 +1,40 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmEnd": 1478710489739,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "history": [
+    {
+      "actor": "APPC",
+      "end": 1478709989738,
+      "operation": "RESTART",
+      "start": 1478709989734,
+      "subRequestId": "1",
+      "target": "vserver.vserver-name"
+    }
+  ],
+  "message": "actor=APPC,operation=RESTART,target=vserver.vserver-name,subRequestId=1",
+  "notification": "FINAL: SUCCESS",
+  "notificationTime": "2016-11-09 11:46:29.738000-05:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_operation.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_operation.json
new file mode 100644 (file)
index 0000000..341a249
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "notification": "ACTIVE",
+  "notificationTime": "2016-11-09 16:46:29.721000+00:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_operation_failure.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_operation_failure.json
new file mode 100644 (file)
index 0000000..5dbe33c
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "message": "<APPC ERROR code and/or message>",
+  "notification": "OPERATION: FAILURE",
+  "notificationTime": "2016-11-08 15:30:14.434000-05:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_operation_success.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_operation_success.json
new file mode 100644 (file)
index 0000000..9e18b97
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "message": "actor=APPC,operation=RESTART,target=vserver.vserver-name,subRequestId=1",
+  "notification": "OPERATION: SUCCESS",
+  "notificationTime": "2016-11-09 11:46:29.738000-05:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_rejected_disabled.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_rejected_disabled.json
new file mode 100644 (file)
index 0000000..3d94987
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "AAI": {
+    "cloud-region.identity-url": "http://1.2.3.4:5000/v2.0",
+    "complex.physical-location-id": "SNYSCA12",
+    "generic-vnf.service-id": "eb477a13-f380-401e-b2bd-f2d444c63e54",
+    "generic-vnf.vnf-name": "gupi1337p",
+    "tenant.tenant-id": "8f7b9a8a-8607-4a01-a5ef-0b26f569dcbb",
+    "vserver.is-closed-loop-disabled": "true",
+    "vserver.prov-status": "PROV",
+    "vserver.vserver-selflink": "https//2.3.4.5:1234/d5a992de-8a70-4d7d-b382-2bc6eea52317",
+    "vserver.vserver-id": "08f6c1f9-99e7-49f3-a662-c62b9f200d79",
+    "vserver.vserver-name": "gupi1337pm004"
+  },
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "message": "Closed Loop Disabled",
+  "notification": "REJECTED",
+  "notificationTime": "2016-05-11 15:09:23.896000+00:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/notification_rejected_missing.json b/extra/docker/elk/tools/DMaaPServiceMocker/notification_rejected_missing.json
new file mode 100644 (file)
index 0000000..c901401
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "AAI": {},
+  "OPS_CL_timer": 600,
+  "closedLoopAlarmStart": 1478709989621,
+  "closedLoopControlName": "ClosedLoop-3ffd062d-7589-43b2-865a-139b64e2d402",
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "from": "Policy",
+  "message": "Missing AAI tag",
+  "notification": "REJECTED",
+  "notificationTime": "2016-05-11 14:42:23.629000+00:00",
+  "policyName": "ClosedLoop.vUSP",
+  "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+  "policyVersion": "v0.0.1",
+  "requestID": "f889f60c-a715-48c0-801e-26428f6176b9",
+  "target": "vserver.vserver-name",
+  "target_type": "VM",
+  "version": "1.0.2"
+}
diff --git a/extra/docker/elk/tools/EsAutoQuery/autoQueryLoop.sh b/extra/docker/elk/tools/EsAutoQuery/autoQueryLoop.sh
new file mode 100755 (executable)
index 0000000..4929412
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+QUERY_FILE=${1:-query.json}
+INDEX=${2:-logstash-*}
+HOST_URL=${3:-http://localhost:9200}
+URL=$HOST_URL/$INDEX/_search
+
+function usage() {
+    echo "Usage: $0 [QUERY_FILE [INDEX [HOST_URL]]]"
+    echo
+    echo "This script automatically sends the query file to elasticsearch"
+    echo "each time it's modified."
+}
+
+if [ "${1}" == "--help" ];
+then
+    usage
+    exit 0
+fi
+
+echo "Querying '$URL' with '$QUERY_FILE'"
+while [ 1 ];
+do
+    curl -XGET "$URL" -H 'Content-Type: application/json' -d"@$QUERY_FILE" | js-beautify
+    echo
+    inotifywait -e modify query.json
+done
diff --git a/extra/docker/elk/tools/EsAutoQuery/closedLoopAlarmDuration.json b/extra/docker/elk/tools/EsAutoQuery/closedLoopAlarmDuration.json
new file mode 100644 (file)
index 0000000..5a29545
--- /dev/null
@@ -0,0 +1,34 @@
+{
+    "query" : {
+        "bool": {
+            "must": [
+                { "match": { "closedLoopEventStatus": "ABATED" } }
+            ]
+        }
+    },
+    "script_fields" : {
+        "closedLoopAlarmDuration" : {
+            "script" : {
+                "lang": "painless",
+                "source": "
+if (doc.get('closedLoopEventStatus.keyword').value == 'ABATED') {
+   return doc.get('closedLoopAlarmEnd').value - doc.get('closedLoopAlarmStart').value;
+}
+return null
+"
+            }
+        }
+        , "closedLoopAlarmStart" : {
+            "script" : {
+                "lang": "painless",
+                "source": "doc['closedLoopAlarmStart']"
+            }
+        }
+        , "closedLoopAlarmEnd" : {
+            "script" : {
+                "lang": "painless",
+                "source": "doc['closedLoopAlarmEnd']"
+            }
+        }
+    }
+}
diff --git a/extra/docker/elk/tools/EsAutoQuery/timeSince.json b/extra/docker/elk/tools/EsAutoQuery/timeSince.json
new file mode 100644 (file)
index 0000000..6ee1493
--- /dev/null
@@ -0,0 +1,51 @@
+{
+    "query" : {
+        "match_all": {}
+    },
+    "script_fields" : {
+        "timeSince" : {
+            "script" : {
+                "lang": "painless",
+                "source": "
+long now = System.currentTimeMillis();
+if (doc.get('closedLoopEventStatus.keyword').value == 'ABATED') {
+   return now - doc.get('closedLoopAlarmEnd').value;
+}
+if (doc.get('closedLoopEventStatus.keyword').value == 'ONSET') {
+   return now - doc.get('closedLoopAlarmStart').value;
+}
+if (doc.containsKey('notification.keyword')) {
+   return now - doc.get('notificationTime').value;
+}
+
+return null
+"
+            }
+        }
+        , "closedLoopAlarmStart" : {
+            "script" : {
+                "lang": "painless",
+                "source": "doc['closedLoopAlarmStart']"
+            }
+        }
+        , "closedLoopEventStatus" : {
+            "script" : {
+                "lang": "painless",
+                "source": "doc['closedLoopEventStatus.keyword']"
+            }
+        }
+        , "notification" : {
+            "script" : {
+                "lang": "painless",
+                "source": "doc['notification.keyword']"
+            }
+        }
+        , "notificationTime" : {
+            "script" : {
+                "lang": "painless",
+                "source": "doc['notificationTime'].value"
+            }
+        }
+
+    }
+}
diff --git a/pom.xml b/pom.xml
index 31997cd..76a2214 100644 (file)
--- a/pom.xml
+++ b/pom.xml
                                        <artifactId>sdc-tosca</artifactId>
                                        <version>1.2.2</version>
                                </dependency>
-                               
-                               
+
+
                </dependencies>
 
                <build>
                                                                                                                                <volumes>
                                                                                                                                                <bind>
                                                                                                                                                                <volume>${project.basedir}/src/test/resources/http-cache/:/usr/src/http-cache-app</volume>
-                                                                                                                                                               <volume>${project.basedir}/src/test/resources/http-cache/sdc-example/:/usr/src/http-cache-app/data-cache</volume>
+                                                                                                                                                               <volume>${project.basedir}/src/test/resources/http-cache/example/:/usr/src/http-cache-app/data-cache</volume>
                                                                                                                                                </bind>
                                                                                                                                </volumes>
                                                                                                                                <wait>
diff --git a/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserFilesConfiguration.java b/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserFilesConfiguration.java
new file mode 100644 (file)
index 0000000..10306b4
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * ============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============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.config.sdc;
+
+/**
+ * This class is used to decode the configuration found in
+ * application.properties, this is related to the blueprint mapping
+ * configuration that is used to create data in database, according to the
+ * blueprint content coming from SDC.
+ */
+public class BlueprintParserFilesConfiguration {
+
+    private String svgXmlFilePath;
+    private String bpmnXmlFilePath;
+
+    public String getBpmnXmlFilePath() {
+        return bpmnXmlFilePath;
+    }
+
+    public void setBpmnXmlFilePath(String bpmnXmlFilePath) {
+        this.bpmnXmlFilePath = bpmnXmlFilePath;
+    }
+
+    public String getSvgXmlFilePath() {
+        return svgXmlFilePath;
+    }
+
+    public void setSvgXmlFilePath(String svgXmlFilePath) {
+        this.svgXmlFilePath = svgXmlFilePath;
+    }
+}
diff --git a/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java b/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java
new file mode 100644 (file)
index 0000000..a78e895
--- /dev/null
@@ -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============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.config.sdc;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+/**
+ * This class is used to decode the configuration found in
+ * application.properties, this is related to the blueprint mapping
+ * configuration that is used to create data in database, according to the
+ * blueprint content coming from SDC.
+ */
+public class BlueprintParserMappingConfiguration {
+
+    private String blueprintKey;
+    private boolean dcaeDeployable;
+    private BlueprintParserFilesConfiguration files;
+
+    public String getBlueprintKey() {
+        return blueprintKey;
+    }
+
+    public void setBlueprintKey(String blueprintKey) {
+        this.blueprintKey = blueprintKey;
+    }
+
+    public BlueprintParserFilesConfiguration getFiles() {
+        return files;
+    }
+
+    public void setFiles(BlueprintParserFilesConfiguration filesConfig) {
+        this.files = filesConfig;
+    }
+
+    public boolean isDcaeDeployable() {
+        return dcaeDeployable;
+    }
+
+    public static List<BlueprintParserMappingConfiguration> createFromJson(InputStream json) throws IOException {
+        TypeReference<List<BlueprintParserMappingConfiguration>> mapType = new TypeReference<List<BlueprintParserMappingConfiguration>>() {
+        };
+        return new ObjectMapper().readValue(json, mapType);
+    }
+}
index f1a9618..f5c658c 100644 (file)
@@ -39,14 +39,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.io.Resource;
-import org.springframework.stereotype.Component;
 
 /**
  * This class maps the SDC config JSON file. This JSON can have multiple
  * sdc-controller config. So the json is loaded in a static way and the instance
  * must specify the controller name that it represents.
  */
-@Component
 public class SdcControllersConfiguration {
 
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcControllersConfiguration.class);
diff --git a/src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java b/src/main/java/org/onap/clamp/clds/config/spring/CldsSdcControllerConfiguration.java
new file mode 100644 (file)
index 0000000..09d4d63
--- /dev/null
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.config.spring;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.onap.clamp.clds.config.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.installer.CsarInstaller;
+import org.onap.clamp.clds.sdc.controller.installer.CsarInstallerImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+@Configuration
+@Profile("clamp-sdc-controller")
+public class CldsSdcControllerConfiguration {
+
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsSdcControllerConfiguration.class);
+    private List<SdcSingleController> sdcControllersList = new ArrayList<>();
+    @Autowired
+    private ClampProperties clampProp;
+    @Autowired
+    protected CsarInstaller csarInstaller;
+
+    @PostConstruct
+    public void loadSdcControllers() {
+        SdcControllersConfiguration sdcControllersConfig = getSdcControllersConfiguration();
+        sdcControllersConfig.getAllDefinedControllers().forEach((k, v) -> {
+            logger.info("Instantiating controller :" + k);
+            SdcSingleController sdcController = new SdcSingleController(clampProp, csarInstaller, v, true);
+            try {
+                sdcController.initSdc();
+            } catch (SdcControllerException e) {
+                logger.error("Exception caught during initialization of sdc controller", e);
+            }
+            sdcControllersList.add(sdcController);
+        });
+    }
+
+    @PreDestroy
+    public void killSdcControllers() {
+        sdcControllersList.forEach(e -> {
+            try {
+                e.closeSdc();
+            } catch (SdcControllerException e1) {
+                logger.error("Exception caught during initialization of sdc controller", e);
+            }
+        });
+    }
+
+    @Bean(name = "csarInstaller")
+    public CsarInstaller getCsarInstaller() {
+        return new CsarInstallerImpl();
+    }
+
+    @Bean(name = "sdcControllersConfiguration")
+    public SdcControllersConfiguration getSdcControllersConfiguration() {
+        return new SdcControllersConfiguration();
+    }
+}
\ No newline at end of file
index 02c70ca..34876bb 100644 (file)
@@ -43,33 +43,36 @@ import org.onap.clamp.clds.dao.CldsDao;
  */
 public class CldsModel {
 
-    private static final EELFLogger logger             = EELFManager.getInstance().getLogger(CldsModel.class);
-    private static final int        UUID_LENGTH        = 36;
-    private static final String     STATUS_DESIGN      = "DESIGN";
-    private static final String     STATUS_DISTRIBUTED = "DISTRIBUTED";
-    private static final String     STATUS_ACTIVE      = "ACTIVE";
-    private static final String     STATUS_STOPPED     = "STOPPED";
-    private static final String     STATUS_DELETING    = "DELETING";
-    private static final String     STATUS_ERROR       = "ERROR";
-    private static final String     STATUS_UNKNOWN     = "UNKNOWN";
-    private String                  id;
-    private String                  templateId;
-    private String                  templateName;
-    private String                  name;
-    private String                  controlNamePrefix;
-    private String                  controlNameUuid;
-    private String                  bpmnText;
-    private String                  propText;
-    private String                  imageText;
-    private String                  docText;
-    private String                  blueprintText;
-    private CldsEvent               event;
-    private String                  status;
-    private List<String>            permittedActionCd;
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsModel.class);
+    private static final int UUID_LENGTH = 36;
+    private static final String STATUS_DESIGN = "DESIGN";
+    private static final String STATUS_DISTRIBUTED = "DISTRIBUTED";
+    private static final String STATUS_ACTIVE = "ACTIVE";
+    private static final String STATUS_STOPPED = "STOPPED";
+    private static final String STATUS_DELETING = "DELETING";
+    private static final String STATUS_ERROR = "ERROR";
+    private static final String STATUS_UNKNOWN = "UNKNOWN";
+    private String id;
+    private String templateId;
+    private String templateName;
+    private String name;
+    private String controlNamePrefix;
+    private String controlNameUuid;
+    private String bpmnText;
+    private String propText;
+    private String imageText;
+    private String docText;
+    private String blueprintText;
+    private CldsEvent event;
+    private String status;
+    private List<String> permittedActionCd;
     private List<CldsModelInstance> cldsModelInstanceList;
-    private String                  typeId;
-    private String                  typeName;
-    private String                  deploymentId;
+    /**
+     * The service type Id received from DCAE by querying it
+     */
+    private String typeId;
+    private String typeName;
+    private String deploymentId;
 
     /**
      * Construct empty model.
@@ -95,7 +98,6 @@ public class CldsModel {
     public boolean canInventoryCall() {
         boolean canCall = false;
         /* Below checks the clds event is submit/resubmit */
-
         if ((event.isActionCd(CldsEvent.ACTION_SUBMIT) || event.isActionCd(CldsEvent.ACTION_RESUBMIT)
                 || event.isActionCd(CldsEvent.ACTION_SUBMITDCAE))) {
             canCall = true;
@@ -116,7 +118,6 @@ public class CldsModel {
      * set the status in the model
      */
     private void determineStatus() {
-
         status = STATUS_UNKNOWN;
         if (event == null || event.getActionCd() == null) {
             status = STATUS_DESIGN;
@@ -141,7 +142,6 @@ public class CldsModel {
         } else if (event.isActionAndStateCd(CldsEvent.ACTION_STOP, CldsEvent.ACTION_STATE_ANY)) {
             status = STATUS_STOPPED;
         }
-
     }
 
     /**
@@ -491,5 +491,4 @@ public class CldsModel {
     public List<String> getPermittedActionCd() {
         return permittedActionCd;
     }
-
 }
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
new file mode 100644 (file)
index 0000000..f8fef39
--- /dev/null
@@ -0,0 +1,317 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP CLAMP\r
+ * ================================================================================\r
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights\r
+ *                             reserved.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END============================================\r
+ * ===================================================================\r
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
+ */\r
+\r
+package org.onap.clamp.clds.sdc.controller;\r
+\r
+import com.att.eelf.configuration.EELFLogger;\r
+import com.att.eelf.configuration.EELFManager;\r
+\r
+import java.util.Date;\r
+\r
+import org.onap.clamp.clds.config.ClampProperties;\r
+import org.onap.clamp.clds.config.sdc.SdcSingleControllerConfiguration;\r
+import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;\r
+import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;\r
+import org.onap.clamp.clds.exception.sdc.controller.SdcControllerException;\r
+import org.onap.clamp.clds.exception.sdc.controller.SdcDownloadException;\r
+import org.onap.clamp.clds.exception.sdc.controller.SdcParametersException;\r
+import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;\r
+import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;\r
+import org.onap.clamp.clds.util.LoggingUtils;\r
+import org.openecomp.sdc.api.IDistributionClient;\r
+import org.openecomp.sdc.api.consumer.IDistributionStatusMessage;\r
+import org.openecomp.sdc.api.consumer.INotificationCallback;\r
+import org.openecomp.sdc.api.notification.IArtifactInfo;\r
+import org.openecomp.sdc.api.notification.INotificationData;\r
+import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;\r
+import org.openecomp.sdc.api.results.IDistributionClientResult;\r
+import org.openecomp.sdc.impl.DistributionClientFactory;\r
+import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;\r
+import org.openecomp.sdc.utils.DistributionActionResultEnum;\r
+import org.openecomp.sdc.utils.DistributionStatusEnum;\r
+\r
+/**\r
+ * This class handles one sdc controller defined in the config.\r
+ */\r
+public class SdcSingleController {\r
+\r
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcSingleController.class);\r
+    protected boolean isAsdcClientAutoManaged = false;\r
+    protected CsarInstaller csarInstaller;\r
+    protected ClampProperties refProp;\r
+    public static final String CONFIG_SDC_FOLDER = "sdc.csarFolder";\r
+\r
+    /**\r
+     * Inner class for Notification callback\r
+     */\r
+    private final class ASDCNotificationCallBack implements INotificationCallback {\r
+\r
+        private SdcSingleController asdcController;\r
+\r
+        ASDCNotificationCallBack(SdcSingleController controller) {\r
+            asdcController = controller;\r
+        }\r
+\r
+        /**\r
+         * This method can be called multiple times at the same moment. The\r
+         * controller must be thread safe !\r
+         */\r
+        @Override\r
+        public void activateCallback(INotificationData iNotif) {\r
+            Date startTime = new Date();\r
+            String event = "Receive a callback notification in ASDC, nb of resources: " + iNotif.getResources().size();\r
+            logger.debug(event);\r
+            asdcController.treatNotification(iNotif);\r
+            LoggingUtils.setTimeContext(startTime, new Date());\r
+            LoggingUtils.setResponseContext("0", "SDC Notification received and processed successfully",\r
+                    this.getClass().getName());\r
+        }\r
+    }\r
+\r
+    // ***** Controller STATUS code\r
+    protected int nbOfNotificationsOngoing = 0;\r
+\r
+    public int getNbOfNotificationsOngoing() {\r
+        return nbOfNotificationsOngoing;\r
+    }\r
+\r
+    private SdcSingleControllerStatus controllerStatus = SdcSingleControllerStatus.STOPPED;\r
+\r
+    protected final synchronized void changeControllerStatus(SdcSingleControllerStatus newControllerStatus) {\r
+        switch (newControllerStatus) {\r
+            case BUSY:\r
+                ++this.nbOfNotificationsOngoing;\r
+                this.controllerStatus = newControllerStatus;\r
+                break;\r
+            case IDLE:\r
+                if (this.nbOfNotificationsOngoing > 1) {\r
+                    --this.nbOfNotificationsOngoing;\r
+                } else {\r
+                    this.nbOfNotificationsOngoing = 0;\r
+                    this.controllerStatus = newControllerStatus;\r
+                }\r
+                break;\r
+            default:\r
+                this.controllerStatus = newControllerStatus;\r
+                break;\r
+        }\r
+    }\r
+\r
+    public final synchronized SdcSingleControllerStatus getControllerStatus() {\r
+        return this.controllerStatus;\r
+    }\r
+\r
+    // ***** END of Controller STATUS code\r
+    protected SdcSingleControllerConfiguration sdcConfig;\r
+    private IDistributionClient distributionClient;\r
+\r
+    public SdcSingleController(ClampProperties clampProp, CsarInstaller csarInstaller,\r
+            SdcSingleControllerConfiguration sdcSingleConfig, boolean isClientAutoManaged) {\r
+        this.isAsdcClientAutoManaged = isClientAutoManaged;\r
+        this.sdcConfig = sdcSingleConfig;\r
+        this.refProp = clampProp;\r
+        this.csarInstaller = csarInstaller;\r
+    }\r
+\r
+    /**\r
+     * This method initializes the SDC Controller and the SDC Client.\r
+     *\r
+     * @throws SdcControllerException\r
+     *             It throws an exception if the SDC Client cannot be\r
+     *             instantiated or if an init attempt is done when already\r
+     *             initialized\r
+     * @throws SdcParametersException\r
+     *             If there is an issue with the parameters provided\r
+     */\r
+    public void initSdc() throws SdcControllerException {\r
+        logger.debug("Attempt to initialize the SDC Controller");\r
+        if (this.getControllerStatus() != SdcSingleControllerStatus.STOPPED) {\r
+            throw new SdcControllerException("The controller is already initialized, call the closeSDC method first");\r
+        }\r
+        if (this.distributionClient == null) {\r
+            distributionClient = DistributionClientFactory.createDistributionClient();\r
+        }\r
+        IDistributionClientResult result = this.distributionClient.init(sdcConfig, new ASDCNotificationCallBack(this));\r
+        if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) {\r
+            logger.error("ASDC distribution client init failed with reason:" + result.getDistributionMessageResult());\r
+            this.changeControllerStatus(SdcSingleControllerStatus.STOPPED);\r
+            throw new SdcControllerException("Initialization of the SDC Controller failed with reason: "\r
+                    + result.getDistributionMessageResult());\r
+        }\r
+        result = this.distributionClient.start();\r
+        if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) {\r
+            logger.debug("SDC distribution client start failed with reason:" + result.getDistributionMessageResult());\r
+            this.changeControllerStatus(SdcSingleControllerStatus.STOPPED);\r
+            throw new SdcControllerException(\r
+                    "Startup of the SDC Controller failed with reason: " + result.getDistributionMessageResult());\r
+        }\r
+        this.changeControllerStatus(SdcSingleControllerStatus.IDLE);\r
+    }\r
+\r
+    /**\r
+     * This method closes the SDC Controller and the SDC Client.\r
+     *\r
+     * @throws SdcControllerException\r
+     *             It throws an exception if the SDC Client cannot be closed\r
+     *             because it's currently BUSY in processing notifications.\r
+     */\r
+    public void closeSdc() throws SdcControllerException {\r
+        if (this.getControllerStatus() == SdcSingleControllerStatus.BUSY) {\r
+            throw new SdcControllerException("Cannot close the ASDC controller as it's currently in BUSY state");\r
+        }\r
+        if (this.distributionClient != null) {\r
+            this.distributionClient.stop();\r
+            // If auto managed we can set it to Null, SdcController controls it.\r
+            // In the other case the client of this class has specified it, so\r
+            // we can't reset it\r
+            if (isAsdcClientAutoManaged) {\r
+                // Next init will initialize it with a new Sdc Client\r
+                this.distributionClient = null;\r
+            }\r
+        }\r
+        this.changeControllerStatus(SdcSingleControllerStatus.STOPPED);\r
+    }\r
+\r
+    /**\r
+     * This method processes the notification received from Sdc.\r
+     * \r
+     * @param iNotif\r
+     *            The INotificationData\r
+     */\r
+    public void treatNotification(INotificationData iNotif) {\r
+        CsarHandler csar = null;\r
+        try {\r
+            logger.info("Notification received for service UUID:" + iNotif.getServiceUUID());\r
+            this.changeControllerStatus(SdcSingleControllerStatus.BUSY);\r
+            csar = new CsarHandler(iNotif, this.sdcConfig.getSdcControllerName(),\r
+                    refProp.getStringValue(CONFIG_SDC_FOLDER));\r
+            if (csarInstaller.isCsarAlreadyDeployed(csar)) {\r
+                csar.save(downloadTheArtifact(csar.getArtifactElement()));\r
+                this.sendASDCNotification(NotificationType.DOWNLOAD, csar.getArtifactElement().getArtifactURL(),\r
+                        sdcConfig.getConsumerID(), iNotif.getDistributionID(), DistributionStatusEnum.DOWNLOAD_OK, null,\r
+                        System.currentTimeMillis());\r
+                csarInstaller.installTheCsar(csar);\r
+                this.sendASDCNotification(NotificationType.DEPLOY, csar.getArtifactElement().getArtifactURL(),\r
+                        sdcConfig.getConsumerID(), iNotif.getDistributionID(), DistributionStatusEnum.DEPLOY_OK, null,\r
+                        System.currentTimeMillis());\r
+            } else {\r
+                this.sendASDCNotification(NotificationType.DOWNLOAD, csar.getArtifactElement().getArtifactURL(),\r
+                        sdcConfig.getConsumerID(), iNotif.getDistributionID(),\r
+                        DistributionStatusEnum.ALREADY_DOWNLOADED, null, System.currentTimeMillis());\r
+                this.sendASDCNotification(NotificationType.DOWNLOAD, csar.getArtifactElement().getArtifactURL(),\r
+                        sdcConfig.getConsumerID(), iNotif.getDistributionID(), DistributionStatusEnum.ALREADY_DEPLOYED,\r
+                        null, System.currentTimeMillis());\r
+            }\r
+        } catch (SdcArtifactInstallerException e) {\r
+            logger.error("SdcArtifactInstallerException exception caught during the notification processing", e);\r
+            this.sendASDCNotification(NotificationType.DEPLOY, csar.getArtifactElement().getArtifactURL(),\r
+                    sdcConfig.getConsumerID(), iNotif.getDistributionID(), DistributionStatusEnum.DEPLOY_ERROR,\r
+                    e.getMessage(), System.currentTimeMillis());\r
+        } catch (SdcDownloadException e) {\r
+            logger.error("SdcDownloadException exception caught during the notification processing", e);\r
+            this.sendASDCNotification(NotificationType.DOWNLOAD, csar.getArtifactElement().getArtifactURL(),\r
+                    sdcConfig.getConsumerID(), iNotif.getDistributionID(), DistributionStatusEnum.DOWNLOAD_ERROR,\r
+                    e.getMessage(), System.currentTimeMillis());\r
+        } catch (CsarHandlerException e) {\r
+            logger.error("CsarHandlerException exception caught during the notification processing", e);\r
+            this.sendASDCNotification(NotificationType.DOWNLOAD, csar.getArtifactElement().getArtifactURL(),\r
+                    sdcConfig.getConsumerID(), iNotif.getDistributionID(), DistributionStatusEnum.DOWNLOAD_ERROR,\r
+                    e.getMessage(), System.currentTimeMillis());\r
+        } catch (SdcToscaParserException e) {\r
+            this.sendASDCNotification(NotificationType.DEPLOY, csar.getArtifactElement().getArtifactURL(),\r
+                    sdcConfig.getConsumerID(), iNotif.getDistributionID(), DistributionStatusEnum.DEPLOY_ERROR,\r
+                    e.getMessage(), System.currentTimeMillis());\r
+        } catch (RuntimeException e) {\r
+            logger.error("Unexpected exception caught during the notification processing", e);\r
+        } finally {\r
+            this.changeControllerStatus(SdcSingleControllerStatus.IDLE);\r
+        }\r
+    }\r
+\r
+    private enum NotificationType {\r
+        DOWNLOAD, DEPLOY\r
+    }\r
+\r
+    private IDistributionClientDownloadResult downloadTheArtifact(IArtifactInfo artifact) throws SdcDownloadException {\r
+        logger.debug("Trying to download the artifact : " + artifact.getArtifactURL() + " UUID: "\r
+                + artifact.getArtifactUUID());\r
+        IDistributionClientDownloadResult downloadResult;\r
+        try {\r
+            downloadResult = distributionClient.download(artifact);\r
+            if (null == downloadResult) {\r
+                logger.info("downloadResult is Null for: " + artifact.getArtifactUUID());\r
+                return null;\r
+            }\r
+        } catch (RuntimeException e) {\r
+            throw new SdcDownloadException("Exception caught when downloading the artifact", e);\r
+        }\r
+        if (DistributionActionResultEnum.SUCCESS.equals(downloadResult.getDistributionActionResult())) {\r
+            logger.info("Successfully downloaded the artifact " + artifact.getArtifactURL() + " UUID "\r
+                    + artifact.getArtifactUUID() + "Size of payload " + downloadResult.getArtifactPayload().length);\r
+        } else {\r
+            throw new SdcDownloadException("Artifact " + artifact.getArtifactName()\r
+                    + " could not be downloaded from ASDC URL " + artifact.getArtifactURL() + " UUID "\r
+                    + artifact.getArtifactUUID() + ")" + System.lineSeparator() + "Error message is "\r
+                    + downloadResult.getDistributionMessageResult() + System.lineSeparator());\r
+        }\r
+        return downloadResult;\r
+    }\r
+\r
+    private void sendASDCNotification(NotificationType notificationType, String artifactURL, String consumerID,\r
+            String distributionID, DistributionStatusEnum status, String errorReason, long timestamp) {\r
+        String event = "Sending " + notificationType.name() + "(" + status.name() + ")"\r
+                + " notification to ASDC for artifact:" + artifactURL;\r
+        if (errorReason != null) {\r
+            event = event + "(" + errorReason + ")";\r
+        }\r
+        logger.info(event);\r
+        String action = "";\r
+        try {\r
+            IDistributionStatusMessage message = new DistributionStatusMessage(artifactURL, consumerID, distributionID,\r
+                    status, timestamp);\r
+            switch (notificationType) {\r
+                case DOWNLOAD:\r
+                    if (errorReason != null) {\r
+                        this.distributionClient.sendDownloadStatus(message, errorReason);\r
+                    } else {\r
+                        this.distributionClient.sendDownloadStatus(message);\r
+                    }\r
+                    action = "sendDownloadStatus";\r
+                    break;\r
+                case DEPLOY:\r
+                    if (errorReason != null) {\r
+                        this.distributionClient.sendDeploymentStatus(message, errorReason);\r
+                    } else {\r
+                        this.distributionClient.sendDeploymentStatus(message);\r
+                    }\r
+                    action = "sendDeploymentdStatus";\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+        } catch (RuntimeException e) {\r
+            logger.warn("Unable to send the Sdc Notification (" + action + ") due to an exception", e);\r
+        }\r
+        logger.info("Sdc Notification sent successfully(" + action + ")");\r
+    }\r
+}\r
index 270286b..b113852 100644 (file)
 
 package org.onap.clamp.clds.sdc.controller.installer;
 
+import com.att.aft.dme2.internal.apache.commons.io.IOUtils;
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Enumeration;
 import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
 import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
 import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
 import org.openecomp.sdc.api.notification.IArtifactInfo;
 import org.openecomp.sdc.api.notification.INotificationData;
+import org.openecomp.sdc.api.notification.IResourceInstance;
 import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
 import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;
 import org.openecomp.sdc.tosca.parser.impl.SdcToscaParserFactory;
 
 /**
- * CsarDescriptor that will be used to deploy in CLAMP.
+ * 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 filePath;
+    private String csarFilePath;
     private String controllerName;
     private SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
     private ISdcCsarHelper sdcCsarHelper;
+    private String dcaeBlueprint;
+    private String blueprintArtifactName;
+    private String blueprintInvariantResourceUuid;
+    private String blueprintInvariantServiceUuid;
     public static final String CSAR_TYPE = "TOSCA_CSAR";
-    private String csarPath;
+    private INotificationData sdcNotification;
 
-    public CsarHandler(INotificationData iNotif, String controller, String sdcCsarPath) throws CsarHandlerException {
-        this.csarPath = sdcCsarPath;
+    public CsarHandler(INotificationData iNotif, String controller, String clampCsarPath) throws CsarHandlerException {
+        this.sdcNotification = iNotif;
         this.controllerName = controller;
         this.artifactElement = searchForUniqueCsar(iNotif);
-        this.filePath = buildFilePathForCsar(artifactElement);
+        this.csarFilePath = buildFilePathForCsar(artifactElement, clampCsarPath);
     }
 
-    private String buildFilePathForCsar(IArtifactInfo artifactElement) {
-        return csarPath + "/" + controllerName + "/" + artifactElement.getArtifactName();
+    private String buildFilePathForCsar(IArtifactInfo artifactElement, String clampCsarPath) {
+        return clampCsarPath + "/" + controllerName + "/" + artifactElement.getArtifactName();
     }
 
     private IArtifactInfo searchForUniqueCsar(INotificationData iNotif) throws CsarHandlerException {
@@ -77,21 +89,56 @@ public class CsarHandler {
         throw new CsarHandlerException("Unable to find a CSAR in the Sdc Notification");
     }
 
-    public void save(IDistributionClientDownloadResult resultArtifact)
+    public synchronized void save(IDistributionClientDownloadResult resultArtifact)
             throws SdcArtifactInstallerException, SdcToscaParserException {
         try {
             logger.info("Writing CSAR file : " + artifactElement.getArtifactURL() + " UUID "
                     + artifactElement.getArtifactUUID() + ")");
-            Path path = Paths.get(filePath);
+            Path path = Paths.get(csarFilePath);
             Files.createDirectories(path.getParent());
             Files.createFile(path);
-            try (FileOutputStream outFile = new FileOutputStream(filePath)) {
+            try (FileOutputStream outFile = new FileOutputStream(csarFilePath)) {
                 outFile.write(resultArtifact.getArtifactPayload(), 0, resultArtifact.getArtifactPayload().length);
             }
-            sdcCsarHelper = factory.getSdcCsarHelper(filePath);
+            sdcCsarHelper = factory.getSdcCsarHelper(csarFilePath);
+            this.loadDcaeBlueprint();
+            this.loadBlueprintArtifactDetails();
         } catch (IOException e) {
             throw new SdcArtifactInstallerException(
-                    "Exception caught when trying to write the CSAR on the file system to " + filePath, e);
+                    "Exception caught when trying to write the CSAR on the file system to " + csarFilePath, e);
+        }
+    }
+
+    private void loadBlueprintArtifactDetails() {
+        blueprintInvariantServiceUuid = this.getSdcNotification().getServiceInvariantUUID();
+        for (IResourceInstance resource : this.getSdcNotification().getResources()) {
+            if ("VF".equals(resource.getResourceType())) {
+                for (IArtifactInfo artifact : resource.getArtifacts()) {
+                    if ("DCAE_INVENTORY_BLUEPRINT".equals(artifact.getArtifactType())) {
+                        blueprintArtifactName = artifact.getArtifactName();
+                        blueprintInvariantResourceUuid = resource.getResourceInvariantUUID();
+                    }
+                }
+            }
+        }
+    }
+
+    private void loadDcaeBlueprint() throws IOException, SdcArtifactInstallerException {
+        List<ZipEntry> listEntries = new ArrayList<>();
+        try (ZipFile zipFile = new ZipFile(csarFilePath)) {
+            Enumeration<? extends ZipEntry> entries = zipFile.entries();
+            while (entries.hasMoreElements()) {
+                ZipEntry entry = entries.nextElement();
+                if (entry.getName().contains("DCAE_INVENTORY_BLUEPRINT")) {
+                    listEntries.add(entry);
+                }
+            }
+            if (listEntries.size() > 1) {
+                throw new SdcArtifactInstallerException("There are multiple entries in the DCAE inventory");
+            }
+            try (InputStream stream = zipFile.getInputStream(listEntries.get(0))) {
+                this.dcaeBlueprint = IOUtils.toString(stream);
+            }
         }
     }
 
@@ -100,10 +147,30 @@ public class CsarHandler {
     }
 
     public String getFilePath() {
-        return filePath;
+        return csarFilePath;
     }
 
-    public ISdcCsarHelper getSdcCsarHelper() {
+    public synchronized ISdcCsarHelper getSdcCsarHelper() {
         return sdcCsarHelper;
     }
+
+    public synchronized String getDcaeBlueprint() {
+        return dcaeBlueprint;
+    }
+
+    public INotificationData getSdcNotification() {
+        return sdcNotification;
+    }
+
+    public String getBlueprintArtifactName() {
+        return blueprintArtifactName;
+    }
+
+    public String getBlueprintInvariantResourceUuid() {
+        return blueprintInvariantResourceUuid;
+    }
+
+    public String getBlueprintInvariantServiceUuid() {
+        return blueprintInvariantServiceUuid;
+    }
 }
diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstaller.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstaller.java
new file mode 100644 (file)
index 0000000..739fc06
--- /dev/null
@@ -0,0 +1,33 @@
+/*-
+ * ============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============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.sdc.controller.installer;
+
+import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
+
+public interface CsarInstaller {
+
+    boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException;
+
+    public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException;
+}
diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java
new file mode 100644 (file)
index 0000000..cb10072
--- /dev/null
@@ -0,0 +1,197 @@
+/*-
+ * ============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============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.sdc.controller.installer;
+
+import com.att.aft.dme2.internal.apache.commons.io.IOUtils;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+
+import org.json.simple.parser.ParseException;
+import org.onap.clamp.clds.client.DcaeInventoryServices;
+import org.onap.clamp.clds.config.sdc.BlueprintParserFilesConfiguration;
+import org.onap.clamp.clds.config.sdc.BlueprintParserMappingConfiguration;
+import org.onap.clamp.clds.dao.CldsDao;
+import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
+import org.onap.clamp.clds.model.CldsModel;
+import org.onap.clamp.clds.model.CldsTemplate;
+import org.onap.clamp.clds.service.CldsService;
+import org.onap.clamp.clds.service.CldsTemplateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * This class will be instantiated by spring config, and used by Sdc Controller.
+ * There is no state kept by the bean. It's used to deploy the csar/notification
+ * received from SDC in DB.
+ */
+public class CsarInstallerImpl implements CsarInstaller {
+
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(CsarInstallerImpl.class);
+    private Map<String, BlueprintParserFilesConfiguration> bpmnMapping = new HashMap<>();
+    public static final String TEMPLATE_NAME_PREFIX = "DCAE-Designer-ClosedLoopTemplate-";
+    public static final String MODEL_NAME_PREFIX = "ClosedLoop-";
+    /**
+     * The file name that will be loaded by Spring.
+     */
+    @Value("${clamp.config.sdc.blueprint.parser.mapping:'classpath:/clds/blueprint-parser-mapping.json'}")
+    protected String blueprintMappingFile;
+    @Autowired
+    protected ApplicationContext appContext;
+    @Autowired
+    private CldsDao cldsDao;
+    @Autowired
+    CldsTemplateService cldsTemplateService;
+    @Autowired
+    CldsService cldsService;
+    @Autowired
+    DcaeInventoryServices dcaeInventoryService;
+
+    @PostConstruct
+    public void loadConfiguration() throws IOException {
+        BlueprintParserMappingConfiguration
+                .createFromJson(appContext.getResource(blueprintMappingFile).getInputStream()).stream()
+                .forEach(e -> bpmnMapping.put(e.getBlueprintKey(), e.getFiles()));
+    }
+
+    @Override
+    public boolean isCsarAlreadyDeployed(CsarHandler csar) throws SdcArtifactInstallerException {
+        return (CldsModel.retrieve(cldsDao, csar.getSdcCsarHelper().getServiceMetadata().getValue("name"),
+                false) != null) ? true : false;
+    }
+
+    @Override
+    public void installTheCsar(CsarHandler csar) throws SdcArtifactInstallerException {
+        try {
+            String serviceTypeId = queryDcaeToGetServiceTypeId(csar);
+            createFakeCldsModel(csar, createFakeCldsTemplate(csar, this.searchForRightMapping(csar)), serviceTypeId);
+        } catch (IOException e) {
+            throw new SdcArtifactInstallerException("Exception caught during the Csar installation in database", e);
+        } catch (ParseException e) {
+            throw new SdcArtifactInstallerException("Exception caught during the Dcae query to get ServiceTypeId", e);
+        }
+    }
+
+    private BlueprintParserFilesConfiguration searchForRightMapping(CsarHandler csar)
+            throws SdcArtifactInstallerException {
+        List<BlueprintParserFilesConfiguration> listConfig = new ArrayList<>();
+        Yaml yaml = new Yaml();
+        Map<String, Object> templateNodes = ((Map<String, Object>) ((Map<String, Object>) yaml
+                .load(csar.getDcaeBlueprint())).get("node_templates"));
+        bpmnMapping.entrySet().forEach(e -> {
+            if (templateNodes.keySet().stream().anyMatch(t -> t.contains(e.getKey()))) {
+                listConfig.add(e.getValue());
+            }
+        });
+        if (listConfig.size() > 1) {
+            throw new SdcArtifactInstallerException(
+                    "The code does not currently support multiple MicroServices in the blueprint");
+        } else if (listConfig.isEmpty()) {
+            throw new SdcArtifactInstallerException("There is no recognized MicroService found in the blueprint");
+        }
+        return listConfig.get(0);
+    }
+
+    private String searchForPolicyName(CsarHandler csar) throws SdcArtifactInstallerException {
+        String policyName = null;
+        Yaml yaml = new Yaml();
+        List<String> policyNameList = new ArrayList<>();
+        Map<String, Object> templateNodes = ((Map<String, Object>) ((Map<String, Object>) yaml
+                .load(csar.getDcaeBlueprint())).get("node_templates"));
+        templateNodes.entrySet().stream().filter(e -> e.getKey().contains("policy_")).forEach(ef -> {
+            String filteredPolicyName = (String) ((Map<String, Object>) ((Map<String, Object>) ef.getValue())
+                    .get("properties")).get("policy_filter");
+            if (policyName != null) {
+                policyNameList.add(filteredPolicyName);
+            } else {
+                String inputPolicyName = (String) ((Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>) ef
+                        .getValue()).get("properties")).get("policy_id")).get("get_input");
+                if (inputPolicyName != null) {
+                    policyNameList.add("get_input");
+                }
+            }
+        });
+        if (policyNameList.size() > 1) {
+            throw new SdcArtifactInstallerException(
+                    "The code does not currently support multiple Policy MicroServices in the blueprint");
+        } else if (policyNameList.isEmpty()) {
+            throw new SdcArtifactInstallerException(
+                    "There is no recognized Policy MicroService found in the blueprint");
+        }
+        return policyNameList.get(0);
+    }
+
+    private String queryDcaeToGetServiceTypeId(CsarHandler csar) throws IOException, ParseException {
+        return dcaeInventoryService.getDcaeInformation(csar.getBlueprintArtifactName(),
+                csar.getBlueprintInvariantServiceUuid(), csar.getBlueprintInvariantResourceUuid());
+    }
+
+    private CldsTemplate createFakeCldsTemplate(CsarHandler csar, BlueprintParserFilesConfiguration configFiles)
+            throws IOException, SdcArtifactInstallerException {
+        CldsTemplate template = new CldsTemplate();
+        template.setBpmnId("Sdc-Generated");
+        template.setBpmnText(
+                IOUtils.toString(appContext.getResource(configFiles.getBpmnXmlFilePath()).getInputStream()));
+        template.setPropText("{\"global\":[{\"name\":\"service\",\"value\":[\"" + csar.getDcaeBlueprint() + "\"]}]}");
+        template.setImageText(
+                IOUtils.toString(appContext.getResource(configFiles.getSvgXmlFilePath()).getInputStream()));
+        template.setName(TEMPLATE_NAME_PREFIX + csar.getSdcCsarHelper().getServiceMetadata().getValue("name"));
+        template.save(cldsDao, null);
+        return template;
+    }
+
+    private CldsModel createFakeCldsModel(CsarHandler csar, CldsTemplate cldsTemplate, String serviceTypeId)
+            throws SdcArtifactInstallerException {
+        CldsModel cldsModel = new CldsModel();
+        String policyName = searchForPolicyName(csar);
+        if (policyName.contains("*")) {
+            // It's a filter must add a specific prefix
+            cldsModel.setControlNamePrefix(policyName);
+        } else {
+            cldsModel.setControlNamePrefix(MODEL_NAME_PREFIX);
+        }
+        cldsModel.setName(csar.getSdcCsarHelper().getServiceMetadata().getValue("name"));
+        cldsModel.setBlueprintText(csar.getDcaeBlueprint());
+        cldsModel.setTemplateName(cldsTemplate.getName());
+        cldsModel.setTemplateId(cldsTemplate.getId());
+        // cldsModel.setDocText(cldsTemplate.getPropText());
+        cldsModel.setPropText("{\"global\":[{\"name\":\"service\",\"value\":[\""
+                + csar.getSdcNotification().getServiceInvariantUUID() + "\"]},{\"name\":\"vf\",\"value\":[\""
+                + csar.getBlueprintInvariantResourceUuid()
+                + "\"]},{\"name\":\"actionSet\",\"value\":[\"vnfRecipe\"]},{\"name\":\"location\",\"value\":[\"DC1\"]}]}");
+        cldsModel.setBpmnText(cldsTemplate.getBpmnText());
+        cldsModel.setTypeId(serviceTypeId);
+        cldsModel.save(cldsDao, null);
+        return cldsModel;
+    }
+}
index 675f3cf..c23d2ec 100644 (file)
@@ -68,13 +68,13 @@ import org.onap.clamp.clds.dao.CldsDao;
 import org.onap.clamp.clds.exception.CldsConfigException;
 import org.onap.clamp.clds.exception.policy.PolicyClientException;
 import org.onap.clamp.clds.exception.sdc.SdcCommunicationException;
-import org.onap.clamp.clds.model.CldsMonitoringDetails;
 import org.onap.clamp.clds.model.CldsDbServiceCache;
 import org.onap.clamp.clds.model.CldsEvent;
 import org.onap.clamp.clds.model.CldsHealthCheck;
 import org.onap.clamp.clds.model.CldsInfo;
 import org.onap.clamp.clds.model.CldsModel;
 import org.onap.clamp.clds.model.CldsModelProp;
+import org.onap.clamp.clds.model.CldsMonitoringDetails;
 import org.onap.clamp.clds.model.CldsServiceData;
 import org.onap.clamp.clds.model.CldsTemplate;
 import org.onap.clamp.clds.model.DcaeEvent;
@@ -412,10 +412,8 @@ public class CldsService extends SecureServiceBase {
             isAuthorizedForVf(model);
             String userId = getUserId();
             String actionStateCd = CldsEvent.ACTION_STATE_INITIATED;
-            String processDefinitionKey = "clds-process-action-wf";
             logger.info("PUT actionCd={}", actionCd);
             logger.info("PUT actionStateCd={}", actionStateCd);
-            logger.info("PUT processDefinitionKey={}", processDefinitionKey);
             logger.info("PUT modelName={}", modelName);
             logger.info("PUT test={}", test);
             logger.info("PUT bpmnText={}", model.getBpmnText());
@@ -806,8 +804,8 @@ public class CldsService extends SecureServiceBase {
     @Path("/deploy/{modelName}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response deployModel(@PathParam("action") String action, @PathParam("modelName") String modelName,
-            @QueryParam("test") String test, CldsModel model) {
+    public Response deployModel(@PathParam("modelName") String modelName,
+            CldsModel model) {
         Date startTime = new Date();
         LoggingUtils.setRequestContext("CldsService: Deploy model", getPrincipalName());
         Boolean errorCase = false;
@@ -874,8 +872,8 @@ public class CldsService extends SecureServiceBase {
     @Path("/undeploy/{modelName}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response unDeployModel(@PathParam("action") String action, @PathParam("modelName") String modelName,
-            @QueryParam("test") String test, CldsModel model) {
+    public Response unDeployModel(@PathParam("modelName") String modelName,
+            CldsModel model) {
         Date startTime = new Date();
         LoggingUtils.setRequestContext("CldsService: Undeploy model", getPrincipalName());
 
index 1b03922..7a9ee70 100644 (file)
@@ -38,7 +38,6 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
-import javax.xml.transform.TransformerException;
 
 import org.onap.clamp.clds.dao.CldsDao;
 import org.onap.clamp.clds.model.CldsTemplate;
@@ -156,8 +155,7 @@ public class CldsTemplateService extends SecureServiceBase {
     @Path("/template/{templateName}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public CldsTemplate putTemplate(@PathParam("templateName") String templateName, CldsTemplate cldsTemplate)
-            throws TransformerException, IOException {
+    public CldsTemplate putTemplate(@PathParam("templateName") String templateName, CldsTemplate cldsTemplate) {
         Date startTime = new Date();
         LoggingUtils.setRequestContext("CldsTemplateService: PUT template", getPrincipalName());
         isAuthorized(permissionUpdateTemplate);
@@ -166,15 +164,6 @@ public class CldsTemplateService extends SecureServiceBase {
         logger.info("PUT propText=" + cldsTemplate.getPropText());
         logger.info("PUT imageText=" + cldsTemplate.getImageText());
         cldsTemplate.setName(templateName);
-        String bpmnText = cldsTemplate.getBpmnText();
-        String imageText = cldsTemplate.getImageText();
-        String propText = cldsTemplate.getPropText();
-        cldsTemplate.setBpmnText(bpmnText);
-        cldsTemplate.setImageText(imageText);
-        cldsTemplate.setPropText(propText);
-        logger.info(" bpmnText : " + cldsTemplate.getBpmnText());
-        logger.info(" Image Text : " + cldsTemplate.getImageText());
-        logger.info(" Prop Text : " + cldsTemplate.getPropText());
         cldsTemplate.save(cldsDao, null);
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
diff --git a/src/main/resources/META-INF/resources/designer/css/jquery.dataTables_themeroller.css b/src/main/resources/META-INF/resources/designer/css/jquery.dataTables_themeroller.css
deleted file mode 100644 (file)
index 5a56d97..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Table styles
- */
-table.dataTable {
-  width: 100%;
-  margin: 0 auto;
-  clear: both;
-  border-collapse: separate;
-  border-spacing: 0;
-  /*
-   * Header and footer styles
-   */
-  /*
-   * Body styles
-   */
-}
-table.dataTable thead th,
-table.dataTable thead td,
-table.dataTable tfoot th,
-table.dataTable tfoot td {
-  padding: 4px 10px;
-}
-table.dataTable thead th,
-table.dataTable tfoot th {
-  font-weight: bold;
-}
-table.dataTable thead th:active,
-table.dataTable thead td:active {
-  outline: none;
-}
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting {
-  cursor: pointer;
-  *cursor: hand;
-}
-table.dataTable thead th div.DataTables_sort_wrapper {
-  position: relative;
-  padding-right: 10px;
-}
-table.dataTable thead th div.DataTables_sort_wrapper span {
-  position: absolute;
-  top: 50%;
-  margin-top: -8px;
-  right: -5px;
-}
-table.dataTable thead th.ui-state-default {
-  border-right-width: 0;
-}
-table.dataTable thead th.ui-state-default:last-child {
-  border-right-width: 1px;
-}
-table.dataTable tbody tr {
-  background-color: white;
-}
-table.dataTable tbody tr.selected {
-  background-color: #b0bed9;
-}
-table.dataTable tbody th,
-table.dataTable tbody td {
-  padding: 8px 10px;
-}
-table.dataTable th.center,
-table.dataTable td.center,
-table.dataTable td.dataTables_empty {
-  text-align: center;
-}
-table.dataTable th.right,
-table.dataTable td.right {
-  text-align: right;
-}
-table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
-  border-top: 1px solid #dddddd;
-}
-table.dataTable.row-border tbody tr:first-child th,
-table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
-table.dataTable.display tbody tr:first-child td {
-  border-top: none;
-}
-table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
-  border-top: 1px solid #dddddd;
-  border-right: 1px solid #dddddd;
-}
-table.dataTable.cell-border tbody tr th:first-child,
-table.dataTable.cell-border tbody tr td:first-child {
-  border-left: 1px solid #dddddd;
-}
-table.dataTable.cell-border tbody tr:first-child th,
-table.dataTable.cell-border tbody tr:first-child td {
-  border-top: none;
-}
-table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
-  background-color: #f9f9f9;
-}
-table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
-  background-color: #abb9d3;
-}
-table.dataTable.hover tbody tr:hover,
-table.dataTable.hover tbody tr.odd:hover,
-table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
-table.dataTable.display tbody tr.odd:hover,
-table.dataTable.display tbody tr.even:hover {
-  background-color: whitesmoke;
-}
-table.dataTable.hover tbody tr:hover.selected,
-table.dataTable.hover tbody tr.odd:hover.selected,
-table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
-table.dataTable.display tbody tr.odd:hover.selected,
-table.dataTable.display tbody tr.even:hover.selected {
-  background-color: #a9b7d1;
-}
-table.dataTable.order-column tbody tr > .sorting_1,
-table.dataTable.order-column tbody tr > .sorting_2,
-table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
-table.dataTable.display tbody tr > .sorting_2,
-table.dataTable.display tbody tr > .sorting_3 {
-  background-color: #f9f9f9;
-}
-table.dataTable.order-column tbody tr.selected > .sorting_1,
-table.dataTable.order-column tbody tr.selected > .sorting_2,
-table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
-table.dataTable.display tbody tr.selected > .sorting_2,
-table.dataTable.display tbody tr.selected > .sorting_3 {
-  background-color: #acbad4;
-}
-table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
-  background-color: #f1f1f1;
-}
-table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
-  background-color: #f3f3f3;
-}
-table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
-  background-color: whitesmoke;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
-  background-color: #a6b3cd;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
-  background-color: #a7b5ce;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
-  background-color: #a9b6d0;
-}
-table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
-  background-color: #f9f9f9;
-}
-table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
-  background-color: #fbfbfb;
-}
-table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
-  background-color: #fdfdfd;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
-  background-color: #acbad4;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
-  background-color: #adbbd6;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
-  background-color: #afbdd8;
-}
-table.dataTable.display tbody tr:hover > .sorting_1,
-table.dataTable.display tbody tr.odd:hover > .sorting_1,
-table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
-  background-color: #eaeaea;
-}
-table.dataTable.display tbody tr:hover > .sorting_2,
-table.dataTable.display tbody tr.odd:hover > .sorting_2,
-table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
-  background-color: #ebebeb;
-}
-table.dataTable.display tbody tr:hover > .sorting_3,
-table.dataTable.display tbody tr.odd:hover > .sorting_3,
-table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
-  background-color: #eeeeee;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
-  background-color: #a1aec7;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
-  background-color: #a2afc8;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
-  background-color: #a4b2cb;
-}
-
-table.dataTable,
-table.dataTable th,
-table.dataTable td {
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-
-/*
- * Control feature layout
- */
-.dataTables_wrapper {
-  position: relative;
-  clear: both;
-  *zoom: 1;
-  zoom: 1;
-}
-.dataTables_wrapper .dataTables_length {
-  float: left;
-}
-.dataTables_wrapper .dataTables_filter {
-  float: right;
-  text-align: right;
-}
-.dataTables_wrapper .dataTables_filter input {
-  margin-left: 0.5em;
-}
-.dataTables_wrapper .dataTables_info {
-  clear: both;
-  float: left;
-  padding-top: 0.55em;
-}
-.dataTables_wrapper .dataTables_paginate {
-  float: right;
-  text-align: right;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button {
-  box-sizing: border-box;
-  display: inline-block;
-  min-width: 1.5em;
-  padding: 0.5em;
-  margin-left: 2px;
-  text-align: center;
-  text-decoration: none !important;
-  cursor: pointer;
-  *cursor: hand;
-  color: #333333 !important;
-  border: 1px solid transparent;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button:active {
-  outline: none;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
-  border-top-left-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
-  border-top-right-radius: 3px;
-  border-bottom-right-radius: 3px;
-}
-.dataTables_wrapper .dataTables_processing {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  width: 100%;
-  height: 40px;
-  margin-left: -50%;
-  margin-top: -25px;
-  padding-top: 20px;
-  text-align: center;
-  font-size: 1.2em;
-  background-color: white;
-  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
-  /* Chrome,Safari4+ */
-  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-  /* Chrome10+,Safari5.1+ */
-  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-  /* FF3.6+ */
-  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-  /* IE10+ */
-  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-  /* Opera 11.10+ */
-  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-  /* W3C */
-}
-.dataTables_wrapper .dataTables_length,
-.dataTables_wrapper .dataTables_filter,
-.dataTables_wrapper .dataTables_info,
-.dataTables_wrapper .dataTables_processing,
-.dataTables_wrapper .dataTables_paginate {
-  color: #333333;
-}
-.dataTables_wrapper .dataTables_scroll {
-  clear: both;
-}
-.dataTables_wrapper .dataTables_scrollBody {
-  *margin-top: -1px;
-  -webkit-overflow-scrolling: touch;
-}
-.dataTables_wrapper .ui-widget-header {
-  font-weight: normal;
-}
-.dataTables_wrapper .ui-toolbar {
-  padding: 8px;
-}
-.dataTables_wrapper:after {
-  visibility: hidden;
-  display: block;
-  content: "";
-  clear: both;
-  height: 0;
-}
-
-@media screen and (max-width: 767px) {
-  .dataTables_wrapper .dataTables_length,
-  .dataTables_wrapper .dataTables_filter,
-  .dataTables_wrapper .dataTables_info,
-  .dataTables_wrapper .dataTables_paginate {
-    float: none;
-    text-align: center;
-  }
-  .dataTables_wrapper .dataTables_filter,
-  .dataTables_wrapper .dataTables_paginate {
-    margin-top: 0.5em;
-  }
-}
diff --git a/src/main/resources/META-INF/resources/designer/css/plugins/dataTables.bootstrap.css b/src/main/resources/META-INF/resources/designer/css/plugins/dataTables.bootstrap.css
deleted file mode 100644 (file)
index c07dac9..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-div.dataTables_length label {
-    float: left;
-    text-align: left;
-    font-weight: normal;
-}
-
-div.dataTables_length select {
-    width: 75px;
-}
-
-div.dataTables_filter label {
-    float: right;
-    font-weight: normal;
-}
-
-div.dataTables_filter input {
-    width: 16em;
-}
-
-div.dataTables_info {
-    padding-top: 8px;
-}
-
-div.dataTables_paginate {
-    float: right;
-    margin: 0;
-}
-
-div.dataTables_paginate ul.pagination {
-    margin: 2px 0;
-    white-space: nowrap;
-}
-
-table.dataTable,
-table.dataTable td,
-table.dataTable th {
-    -webkit-box-sizing: content-box;
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-}
-
-table.dataTable {
-    clear: both;
-    margin-top: 6px !important;
-    margin-bottom: 6px !important;
-    max-width: none !important;
-}
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
-    cursor: pointer;
-}
-
-table.dataTable thead .sorting {
-    background: url('../images/sort_both.png') no-repeat center right;
-}
-
-table.dataTable thead .sorting_asc {
-    background: url('../images/sort_asc.png') no-repeat center right;
-}
-
-table.dataTable thead .sorting_desc {
-    background: url('../images/sort_desc.png') no-repeat center right;
-}
-
-table.dataTable thead .sorting_asc_disabled {
-    background: url('../images/sort_asc_disabled.png') no-repeat center right;
-}
-
-table.dataTable thead .sorting_desc_disabled {
-    background: url('../images/sort_desc_disabled.png') no-repeat center right;
-}
-
-table.dataTable th:active {
-    outline: none;
-}
-
-/* Scrolling */
-
-div.dataTables_scrollHead table {
-    margin-bottom: 0 !important;
-    border-bottom-left-radius: 0;
-    border-bottom-right-radius: 0;
-}
-
-div.dataTables_scrollHead table thead tr:last-child th:first-child,
-div.dataTables_scrollHead table thead tr:last-child td:first-child {
-    border-bottom-left-radius: 0 !important;
-    border-bottom-right-radius: 0 !important;
-}
-
-div.dataTables_scrollBody table {
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-    border-top: none;
-}
-
-div.dataTables_scrollBody tbody tr:first-child th,
-div.dataTables_scrollBody tbody tr:first-child td {
-    border-top: none;
-}
-
-div.dataTables_scrollFoot table {
-    margin-top: 0 !important;
-    border-top: none;
-}
-
-/*
- * TableTools styles
- */
-
-.table tbody tr.active td,
-.table tbody tr.active th {
-    color: white;
-    background-color: #08C;
-}
-
-.table tbody tr.active:hover td,
-.table tbody tr.active:hover th {
-    background-color: #0075b0 !important;
-}
-
-.table tbody tr.active a {
-    color: white;
-}
-
-.table-striped tbody tr.active:nth-child(odd) td,
-.table-striped tbody tr.active:nth-child(odd) th {
-    background-color: #017ebc;
-}
-
-table.DTTT_selectable tbody tr {
-    cursor: pointer;
-}
-
-div.DTTT .btn {
-    font-size: 12px;
-    color: #333 !important;
-}
-
-div.DTTT .btn:hover {
-    text-decoration: none !important;
-}
-
-ul.DTTT_dropdown.dropdown-menu {
-    z-index: 2003;
-}
-
-ul.DTTT_dropdown.dropdown-menu a {
-    color: #333 !important; /* needed only when demo_page.css is included */
-}
-
-ul.DTTT_dropdown.dropdown-menu li {
-    position: relative;
-}
-
-ul.DTTT_dropdown.dropdown-menu li:hover a {
-    color: white !important;
-    background-color: #0088cc;
-}
-
-div.DTTT_collection_background {
-    z-index: 2002;
-}
-
-/* TableTools information display */
-
-div.DTTT_print_info.modal {
-    height: 150px;
-    margin-top: -75px;
-    text-align: center;
-}
-
-div.DTTT_print_info h6 {
-    margin: 1em;
-    font-size: 28px;
-    font-weight: normal;
-    line-height: 28px;
-}
-
-div.DTTT_print_info p {
-    font-size: 14px;
-    line-height: 20px;
-}
-
-/*
- * FixedColumns styles
- */
-
-div.DTFC_LeftHeadWrapper table,
-div.DTFC_LeftFootWrapper table,
-div.DTFC_RightHeadWrapper table,
-div.DTFC_RightFootWrapper table,
-table.DTFC_Cloned tr.even {
-    background-color: white;
-}
-
-div.DTFC_RightHeadWrapper table,
-div.DTFC_LeftHeadWrapper table {
-    margin-bottom: 0 !important;
-    border-top-right-radius: 0 !important;
-    border-bottom-left-radius: 0 !important;
-    border-bottom-right-radius: 0 !important;
-}
-
-div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
-div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
-div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
-div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
-    border-bottom-left-radius: 0 !important;
-    border-bottom-right-radius: 0 !important;
-}
-
-div.DTFC_RightBodyWrapper table,
-div.DTFC_LeftBodyWrapper table {
-    margin-bottom: 0 !important;
-    border-top: none;
-}
-
-div.DTFC_RightBodyWrapper tbody tr:first-child th,
-div.DTFC_RightBodyWrapper tbody tr:first-child td,
-div.DTFC_LeftBodyWrapper tbody tr:first-child th,
-div.DTFC_LeftBodyWrapper tbody tr:first-child td {
-    border-top: none;
-}
-
-div.DTFC_RightFootWrapper table,
-div.DTFC_LeftFootWrapper table {
-    border-top: none;
-}
index 5e0c725..8e2300f 100644 (file)
  
 
 <!-- DataTables CSS -->
-<link href="css/dataTables.bootstrap.css" rel="stylesheet">
 <link href="css/jquery.dataTables.css" rel="stylesheet">
 
-<link href="css/dataTables.tableTools.css" rel="stylesheet">
-<link href="css/dataTables.fixedColumns.css" rel="stylesheet">
-
-
 <link href="css/loading-bar.css" rel="stylesheet">
 <link href="css/navmenu.css" rel="stylesheet">
 <link href="css/dialogs.css" rel="stylesheet">
index f626e1a..5f6a0d6 100644 (file)
@@ -62,7 +62,7 @@ server.port=8080
 \r
 server.contextPath=/\r
 #Modified engine-rest applicationpath\r
-spring.profiles.active=clamp-default,clamp-spring-authentication\r
+spring.profiles.active=clamp-default,clamp-spring-authentication,clamp-sdc-controller\r
 \r
 #The max number of active threads in this pool\r
 server.tomcat.max-threads=200\r
@@ -178,6 +178,7 @@ clamp.config.sdc.InstanceID=X-ECOMP-InstanceID
 clamp.config.sdc.header.requestId = X-ECOMP-RequestID\r
 #\r
 clamp.config.sdc.csarFolder = /tmp/sdc-controllers\r
+clamp.config.sdc.blueprint.parser.mapping = classpath:/clds/blueprint-parser-mapping.json\r
 #\r
 clamp.config.ui.location.default=classpath:/clds/templates/ui-location-default.json\r
 clamp.config.ui.alarm.default=classpath:/clds/templates/ui-alarm-default.json\r
diff --git a/src/main/resources/clds/blueprint-parser-mapping.json b/src/main/resources/clds/blueprint-parser-mapping.json
new file mode 100644 (file)
index 0000000..a16ef0c
--- /dev/null
@@ -0,0 +1,16 @@
+[
+       {
+               "blueprintKey": "tca_",
+               "files": {
+                       "bpmnXmlFilePath": "classpath:/clds/templates/bpmn/tca-template.xml",
+                       "svgXmlFilePath": "classpath:/clds/templates/bpmn/tca-img.xml"
+               }
+       },
+       {
+               "blueprintKey": "holmes_",
+               "files": {
+                       "bpmnXmlFilePath": "classpath:/clds/templates/bpmn/holmes-template.xml",
+                       "svgXmlFilePath": "classpath:/clds/templates/bpmn/holmes-img.xml"
+               }
+       }
+]
index 7a3ebdb..b2a728d 100644 (file)
@@ -4,7 +4,6 @@
                                <choice>
                                                <when>
                                                                <simple> ${exchangeProperty.actionCd} == 'SUBMIT' || ${exchangeProperty.actionCd} == 'RESUBMIT'</simple>
-                                                               <to uri="bean:org.onap.clamp.clds.client.SdcSendReqDelegate" /> 
                                                                <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
                                                                <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
                                                                <to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
diff --git a/src/main/resources/clds/templates/bpmn/holmes-img.xml b/src/main/resources/clds/templates/bpmn/holmes-img.xml
new file mode 100644 (file)
index 0000000..f84b6a1
--- /dev/null
@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="utf-8"?>
+\n<!-- created with bpmn-js / http://bpmn.io -->
+\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+\n
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+               width="900" height="92" viewBox="44 134 900 92" version="1.1">
+               <defs>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmbu">
+                                               <path d="M 1 5 L 11 10 L 1 15 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="6" refY="6" id="markerSjdype4kmbw">
+                                               <circle cx="6" cy="6" r="3.5"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="8.5" refY="5" id="markerSjdype4kmby">
+                                               <path d="m 1 5 l 0 -3 l 7 3 l -7 3 z"
+                                                               style="stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmc0">
+                                               <path d="M 1 5 L 11 10 L 1 15"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-1" refY="10" id="markerSjdype4kmc2">
+                                               <path d="M 0 10 L 8 6 L 16 10 L 8 14 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-5" refY="10" id="markerSjdype4kmc4">
+                                               <path d="M 1 4 L 5 16"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" stroke="#000000" />
+                               </marker>
+               </defs>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1"
+                                               transform="matrix(1,0,0,1,50,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 2;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1_label"
+                                               transform="matrix(1,0,0,1,23,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="Holmes_0bsv00m"
+                                               transform="matrix(1,0,0,1,438,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <circle cx="15" cy="15" r="10" style="stroke-width: 1;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="11" y="20">H</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="39" y="43.5">Holmes</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="VesCollector_1ljyqg8"
+                                               transform="matrix(1,0,0,1,213,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="120,80 120,20 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <polyline points="20,0 20,80 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="14">V</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="26">E</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="38">S</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="25.5" y="43.5">VesCollector</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="Policy_114xo8j"
+                                               transform="matrix(1,0,0,1,678,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="0,40 60,0 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="43.5" y="43.5">Policy</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape selected" data-element-id="EndEvent_0b4m6bk"
+                                               transform="matrix(1,0,0,1,901,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 4;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                                               <g class=" djs-resizer djs-resizer-nw" transform="matrix(1,0,0,1,0,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-ne" transform="matrix(0,1,-1,0,36,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-se" transform="matrix(-1,0,0,-1,36,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-sw" transform="matrix(0,-1,1,0,0,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="EndEvent_0b4m6bk_label"
+                                               transform="matrix(1,0,0,1,874,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1c9hzec"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="80" y="174" width="139"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  86,180L213,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="86,180 213,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1c9hzec_label"
+                                               transform="matrix(1,0,0,1,104.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1ig3gix"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="327" y="174" width="117"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  333,180L438,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="333,180 438,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1ig3gix_label"
+                                               transform="matrix(1,0,0,1,340.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_0zwbn2r"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="552" y="174" width="132"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  558,180L678,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="558,180 678,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_0zwbn2r_label"
+                                               transform="matrix(1,0,0,1,573,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_0ox6r95"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="792" y="174" width="115"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  798,180L901,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="798,180 901,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_0ox6r95_label"
+                                               transform="matrix(1,0,0,1,804.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+</svg>
\ No newline at end of file
diff --git a/src/main/resources/clds/templates/bpmn/holmes-template.xml b/src/main/resources/clds/templates/bpmn/holmes-template.xml
new file mode 100644 (file)
index 0000000..0ea1587
--- /dev/null
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
+               xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
+               xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
+               <bpmn:process id="Process_1" isExecutable="false">
+                               <bpmn:startEvent id="StartEvent_1">
+                                               <bpmn:outgoing>SequenceFlow_1c9hzec</bpmn:outgoing>
+                               </bpmn:startEvent>
+                               <bpmn:holmes id="Holmes_0bsv00m">
+                                               <bpmn:incoming>SequenceFlow_1ig3gix</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_0zwbn2r</bpmn:outgoing>
+                               </bpmn:holmes>
+                               <bpmn:vesCollector id="VesCollector_1ljyqg8">
+                                               <bpmn:incoming>SequenceFlow_1c9hzec</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1ig3gix</bpmn:outgoing>
+                               </bpmn:vesCollector>
+                               <bpmn:policy id="Policy_114xo8j">
+                                               <bpmn:incoming>SequenceFlow_0zwbn2r</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_0ox6r95</bpmn:outgoing>
+                               </bpmn:policy>
+                               <bpmn:endEvent id="EndEvent_0b4m6bk">
+                                               <bpmn:incoming>SequenceFlow_0ox6r95</bpmn:incoming>
+                               </bpmn:endEvent>
+                               <bpmn:sequenceFlow id="SequenceFlow_1c9hzec"
+                                               sourceRef="StartEvent_1" targetRef="VesCollector_1ljyqg8" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1ig3gix"
+                                               sourceRef="VesCollector_1ljyqg8" targetRef="Holmes_0bsv00m" />
+                               <bpmn:sequenceFlow id="SequenceFlow_0zwbn2r"
+                                               sourceRef="Holmes_0bsv00m" targetRef="Policy_114xo8j" />
+                               <bpmn:sequenceFlow id="SequenceFlow_0ox6r95"
+                                               sourceRef="Policy_114xo8j" targetRef="EndEvent_0b4m6bk" />
+               </bpmn:process>
+               <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+                               <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
+                                               <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2"
+                                                               bpmnElement="StartEvent_1">
+                                                               <dc:Bounds x="50" y="162" width="36" height="36" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="Holmes_0bsv00m_di"
+                                                               bpmnElement="Holmes_0bsv00m">
+                                                               <dc:Bounds x="438" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="VesCollector_1ljyqg8_di"
+                                                               bpmnElement="VesCollector_1ljyqg8">
+                                                               <dc:Bounds x="213" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="Policy_114xo8j_di"
+                                                               bpmnElement="Policy_114xo8j">
+                                                               <dc:Bounds x="678" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="EndEvent_0b4m6bk_di"
+                                                               bpmnElement="EndEvent_0b4m6bk">
+                                                               <dc:Bounds x="901" y="162" width="36" height="36" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="874" y="198" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1c9hzec_di"
+                                                               bpmnElement="SequenceFlow_1c9hzec">
+                                                               <di:waypoint xsi:type="dc:Point" x="86" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="213" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="104.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1ig3gix_di"
+                                                               bpmnElement="SequenceFlow_1ig3gix">
+                                                               <di:waypoint xsi:type="dc:Point" x="333" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="438" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="340.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_0zwbn2r_di"
+                                                               bpmnElement="SequenceFlow_0zwbn2r">
+                                                               <di:waypoint xsi:type="dc:Point" x="558" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="678" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="573" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_0ox6r95_di"
+                                                               bpmnElement="SequenceFlow_0ox6r95">
+                                                               <di:waypoint xsi:type="dc:Point" x="798" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="901" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="804.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                               </bpmndi:BPMNPlane>
+               </bpmndi:BPMNDiagram>
+</bpmn:definitions>
\ No newline at end of file
diff --git a/src/main/resources/clds/templates/bpmn/tca-img.xml b/src/main/resources/clds/templates/bpmn/tca-img.xml
new file mode 100644 (file)
index 0000000..a2ec5af
--- /dev/null
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="utf-8"?><!-- created with bpmn-js / http://bpmn.io --><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+               width="924" height="92" viewBox="44 134 924 92" version="1.1">
+               <defs>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmnw">
+                                               <path d="M 1 5 L 11 10 L 1 15 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="6" refY="6" id="markerSjdype4kmny">
+                                               <circle cx="6" cy="6" r="3.5"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="8.5" refY="5" id="markerSjdype4kmo0">
+                                               <path d="m 1 5 l 0 -3 l 7 3 l -7 3 z"
+                                                               style="stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmo2">
+                                               <path d="M 1 5 L 11 10 L 1 15"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-1" refY="10" id="markerSjdype4kmo4">
+                                               <path d="M 0 10 L 8 6 L 16 10 L 8 14 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-5" refY="10" id="markerSjdype4kmo6">
+                                               <path d="M 1 4 L 5 16"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" stroke="#000000" />
+                               </marker>
+               </defs>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1"
+                                               transform="matrix(1,0,0,1,50,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 2;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1_label"
+                                               transform="matrix(1,0,0,1,23,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="VesCollector_1g9cmz0"
+                                               transform="matrix(1,0,0,1,207,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="120,80 120,20 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <polyline points="20,0 20,80 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="14">V</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="26">E</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="38">S</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="25.5" y="43.5">VesCollector</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="TCA_1d13unw"
+                                               transform="matrix(1,0,0,1,453,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="0,60 120,60 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="48" y="43.5">TCA</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="Policy_12lup3h"
+                                               transform="matrix(1,0,0,1,687,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="0,40 60,0 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="43.5" y="43.5">Policy</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape selected" data-element-id="EndEvent_16kg9fx"
+                                               transform="matrix(1,0,0,1,925,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 4;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                                               <g class=" djs-resizer djs-resizer-nw" transform="matrix(1,0,0,1,0,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-ne" transform="matrix(0,1,-1,0,36,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-se" transform="matrix(-1,0,0,-1,36,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-sw" transform="matrix(0,-1,1,0,0,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="EndEvent_16kg9fx_label"
+                                               transform="matrix(1,0,0,1,898,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1ahk7jg"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="80" y="174" width="133"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  86,180L207,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="86,180 207,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1ahk7jg_label"
+                                               transform="matrix(1,0,0,1,101.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_18ahat1"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="321" y="174" width="138"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  327,180L453,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="327,180 453,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_18ahat1_label"
+                                               transform="matrix(1,0,0,1,345,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1mo9gxb"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="567" y="174" width="126"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  573,180L687,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="573,180 687,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1mo9gxb_label"
+                                               transform="matrix(1,0,0,1,585,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1dgtrrq"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="801" y="174" width="130"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  807,180L925,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="807,180 925,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1dgtrrq_label"
+                                               transform="matrix(1,0,0,1,821,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+</svg>
\ No newline at end of file
diff --git a/src/main/resources/clds/templates/bpmn/tca-template.xml b/src/main/resources/clds/templates/bpmn/tca-template.xml
new file mode 100644 (file)
index 0000000..cc942ef
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
+               xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
+               xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
+               <bpmn:process id="Process_1" isExecutable="false">
+                               <bpmn:startEvent id="StartEvent_1">
+                                               <bpmn:outgoing>SequenceFlow_1ahk7jg</bpmn:outgoing>
+                               </bpmn:startEvent>
+                               <bpmn:vesCollector id="VesCollector_1g9cmz0">
+                                               <bpmn:incoming>SequenceFlow_1ahk7jg</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_18ahat1</bpmn:outgoing>
+                               </bpmn:vesCollector>
+                               <bpmn:tCA id="TCA_1d13unw">
+                                               <bpmn:incoming>SequenceFlow_18ahat1</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1mo9gxb</bpmn:outgoing>
+                               </bpmn:tCA>
+                               <bpmn:policy id="Policy_12lup3h">
+                                               <bpmn:incoming>SequenceFlow_1mo9gxb</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1dgtrrq</bpmn:outgoing>
+                               </bpmn:policy>
+                               <bpmn:endEvent id="EndEvent_16kg9fx">
+                                               <bpmn:incoming>SequenceFlow_1dgtrrq</bpmn:incoming>
+                               </bpmn:endEvent>
+                               <bpmn:sequenceFlow id="SequenceFlow_1ahk7jg"
+                                               sourceRef="StartEvent_1" targetRef="VesCollector_1g9cmz0" />
+                               <bpmn:sequenceFlow id="SequenceFlow_18ahat1"
+                                               sourceRef="VesCollector_1g9cmz0" targetRef="TCA_1d13unw" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1mo9gxb"
+                                               sourceRef="TCA_1d13unw" targetRef="Policy_12lup3h" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1dgtrrq"
+                                               sourceRef="Policy_12lup3h" targetRef="EndEvent_16kg9fx" />
+               </bpmn:process>
+               <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+                               <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
+                                               <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2"
+                                                               bpmnElement="StartEvent_1">
+                                                               <dc:Bounds x="50" y="162" width="36" height="36" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="VesCollector_1g9cmz0_di"
+                                                               bpmnElement="VesCollector_1g9cmz0">
+                                                               <dc:Bounds x="207" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="TCA_1d13unw_di"
+                                                               bpmnElement="TCA_1d13unw">
+                                                               <dc:Bounds x="453" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="Policy_12lup3h_di"
+                                                               bpmnElement="Policy_12lup3h">
+                                                               <dc:Bounds x="687" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="EndEvent_16kg9fx_di"
+                                                               bpmnElement="EndEvent_16kg9fx">
+                                                               <dc:Bounds x="925" y="162" width="36" height="36" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="898" y="198" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1ahk7jg_di"
+                                                               bpmnElement="SequenceFlow_1ahk7jg">
+                                                               <di:waypoint xsi:type="dc:Point" x="86" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="207" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="101.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_18ahat1_di"
+                                                               bpmnElement="SequenceFlow_18ahat1">
+                                                               <di:waypoint xsi:type="dc:Point" x="327" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="453" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="345" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1mo9gxb_di"
+                                                               bpmnElement="SequenceFlow_1mo9gxb">
+                                                               <di:waypoint xsi:type="dc:Point" x="573" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="687" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="585" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1dgtrrq_di"
+                                                               bpmnElement="SequenceFlow_1dgtrrq">
+                                                               <di:waypoint xsi:type="dc:Point" x="807" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="925" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="821" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                               </bpmndi:BPMNPlane>
+               </bpmndi:BPMNDiagram>
+
+</bpmn:definitions>
\ No newline at end of file
index 1caa637..be2997a 100644 (file)
@@ -35,7 +35,6 @@ import java.security.Principal;
 import java.util.List;
 
 import javax.ws.rs.core.SecurityContext;
-import javax.xml.transform.TransformerException;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -93,13 +92,7 @@ public class CldsTemplateServiceItCase {
         cldsTemplate.setBpmnText(bpmnText);
         cldsTemplate.setImageText(imageText);
         cldsTemplate.setPropText(bpmnPropText);
-        try {
-            cldsTemplateService.putTemplate("testModel", cldsTemplate);
-        } catch (IOException e) {
-            logger.error("IOException while saving template", e);
-        } catch (TransformerException ex) {
-            logger.error("Transforming exception while saving template.", ex);
-        }
+        cldsTemplateService.putTemplate("testModel", cldsTemplate);
     }
 
     @Test
diff --git a/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
new file mode 100644 (file)
index 0000000..b64e6a0
--- /dev/null
@@ -0,0 +1,113 @@
+/*-
+ * ============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============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.it.sdc.controller.installer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import com.att.aft.dme2.internal.apache.commons.io.IOUtils;
+import com.att.aft.dme2.internal.apache.commons.lang.RandomStringUtils;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.clamp.clds.dao.CldsDao;
+import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
+import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
+import org.onap.clamp.clds.model.CldsModel;
+import org.onap.clamp.clds.model.CldsTemplate;
+import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
+import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
+import org.onap.clamp.clds.sdc.controller.installer.CsarInstallerImpl;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;
+import org.openecomp.sdc.toscaparser.api.elements.Metadata;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.util.ReflectionTestUtils;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class CsarInstallerItCase {
+
+    private static final String sdcFolder = "/tmp/csar-handler-tests";
+    private static final String csarArtifactName = "testArtifact.csar";
+    @Autowired
+    private CsarInstaller csarInstaller;
+    @Autowired
+    private CldsDao cldsDao;
+
+    private void loadFile(String fileName) throws IOException {
+        ReflectionTestUtils.setField(csarInstaller, "blueprintMappingFile", fileName);
+        ((CsarInstallerImpl) csarInstaller).loadConfiguration();
+    }
+
+    @Test(expected = SdcArtifactInstallerException.class)
+    public void testInstallTheCsarFail()
+            throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException {
+        CsarHandler csarHandler = Mockito.mock(CsarHandler.class);
+        Mockito.when(csarHandler.getDcaeBlueprint()).thenReturn(IOUtils
+                .toString(ResourceFileUtil.getResourceAsStream("example/sdc/blueprint-dcae/not-recognized.yaml")));
+        csarInstaller.installTheCsar(csarHandler);
+        fail("Should have raised an SdcArtifactInstallerException");
+    }
+
+    @Test(expected = SdcArtifactInstallerException.class)
+    public void testInstallTheCsarTca()
+            throws SdcArtifactInstallerException, SdcToscaParserException, CsarHandlerException, IOException {
+        String generatedName = RandomStringUtils.randomAlphanumeric(5);
+        CsarHandler csarHandler = Mockito.mock(CsarHandler.class);
+        Mockito.when(csarHandler.getDcaeBlueprint())
+                .thenReturn(ResourceFileUtil.getResourceAsString("example/sdc/blueprint-dcae/tca.yaml"));
+        ISdcCsarHelper csarHelper = Mockito.mock(ISdcCsarHelper.class);
+        Metadata data = Mockito.mock(Metadata.class);
+        Mockito.when(data.getValue("name")).thenReturn(generatedName);
+        Mockito.when(csarHelper.getServiceMetadata()).thenReturn(data);
+        Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper);
+        csarInstaller.installTheCsar(csarHandler);
+        // Get the template back from DB
+        CldsTemplate templateFromDB = CldsTemplate.retrieve(cldsDao,
+                CsarInstallerImpl.TEMPLATE_NAME_PREFIX + generatedName, false);
+        assertNotNull(templateFromDB);
+        assertNotNull(templateFromDB.getBpmnText());
+        assertNotNull(templateFromDB.getImageText());
+        assertNotNull(templateFromDB.getPropText());
+        assertEquals(templateFromDB.getName(), CsarInstallerImpl.TEMPLATE_NAME_PREFIX + generatedName);
+        JSONAssert.assertEquals(templateFromDB.getPropText(),
+                ResourceFileUtil.getResourceAsString("example/dao/template-doc-content.json"), true);
+        // Get the Model back from DB
+        CldsModel modelFromDB = CldsModel.retrieve(cldsDao, generatedName, false);
+        assertNotNull(modelFromDB);
+        assertNotNull(modelFromDB.getBpmnText());
+        assertNotNull(modelFromDB.getImageText());
+        assertNotNull(modelFromDB.getPropText());
+        assertEquals(modelFromDB.getName(), generatedName);
+    }
+}
index d1b177d..34805d8 100644 (file)
@@ -38,7 +38,6 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.junit.AfterClass;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
@@ -54,13 +53,6 @@ public class CsarHandlerTest {
     private static final String sdcFolder = "/tmp/csar-handler-tests";
     private static final String csarArtifactName = "testArtifact.csar";
 
-    @AfterClass
-    public static void removeAllFiles() throws IOException {
-        // Do some cleanup
-        Path path = Paths.get(sdcFolder + "/test-controller/" + csarArtifactName);
-        Files.deleteIfExists(path);
-    }
-
     @Test
     public void testConstructor() throws CsarHandlerException {
         IArtifactInfo serviceArtifact = Mockito.mock(IArtifactInfo.class);
@@ -96,9 +88,18 @@ public class CsarHandlerTest {
         IDistributionClientDownloadResult resultArtifact = Mockito.mock(IDistributionClientDownloadResult.class);
         Mockito.when(resultArtifact.getArtifactPayload()).thenReturn(
                 IOUtils.toByteArray(ResourceFileUtil.getResourceAsStream("example/sdc/service-Simsfoimap0112.csar")));
+        // Test the save
         csar.save(resultArtifact);
         assertTrue((new File(sdcFolder + "/test-controller/" + csarArtifactName)).exists());
         assertEquals(csarArtifactName, csar.getArtifactElement().getArtifactName());
         assertNotNull(csar.getSdcCsarHelper());
+        // Test dcaeBlueprint
+        String blueprint = csar.getDcaeBlueprint();
+        assertNotNull(blueprint);
+        assertTrue(!blueprint.isEmpty());
+        assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1"));
+        // Do some cleanup
+        Path path = Paths.get(sdcFolder + "/test-controller/" + csarArtifactName);
+        Files.deleteIfExists(path);
     }
 }
index 413cfe7..55666e5 100644 (file)
@@ -62,7 +62,7 @@ server.port=8080
 \r
 server.contextPath=/\r
 #Modified engine-rest applicationpath\r
-spring.profiles.active=clamp-default,clamp-spring-authentication\r
+spring.profiles.active=clamp-default,clamp-spring-authentication,clamp-sdc-controller\r
 \r
 #The max number of active threads in this pool\r
 server.tomcat.max-threads=200\r
@@ -178,6 +178,7 @@ clamp.config.sdc.InstanceID=X-ECOMP-InstanceID
 clamp.config.sdc.header.requestId = X-ECOMP-RequestID\r
 #\r
 clamp.config.sdc.csarFolder = /tmp/sdc-tests\r
+clamp.config.sdc.blueprint.parser.mapping = classpath:/clds/blueprint-parser-mapping.json\r
 #\r
 clamp.config.ui.location.default=classpath:/clds/templates/ui-location-default.json\r
 clamp.config.ui.alarm.default=classpath:/clds/templates/ui-alarm-default.json\r
diff --git a/src/test/resources/clds/blueprint-parser-mapping.json b/src/test/resources/clds/blueprint-parser-mapping.json
new file mode 100644 (file)
index 0000000..a22e9fc
--- /dev/null
@@ -0,0 +1,18 @@
+[
+       {
+               "blueprintKey": "tca_",
+               "dcaeDeployable":"true",
+               "files": {
+                       "bpmnXmlFilePath": "classpath:/clds/templates/bpmn/tca-template.xml",
+                       "svgXmlFilePath": "classpath:/clds/templates/bpmn/tca-img.xml"
+               }
+       },
+       {
+               "blueprintKey": "holmes_",
+               "dcaeDeployable":"false",
+               "files": {
+                       "bpmnXmlFilePath": "classpath:/clds/templates/bpmn/holmes-template.xml",
+                       "svgXmlFilePath": "classpath:/clds/templates/bpmn/holmes-img.xml"
+               }
+       }
+]
diff --git a/src/test/resources/clds/templates/bpmn/holmes-img.xml b/src/test/resources/clds/templates/bpmn/holmes-img.xml
new file mode 100644 (file)
index 0000000..f84b6a1
--- /dev/null
@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="utf-8"?>
+\n<!-- created with bpmn-js / http://bpmn.io -->
+\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+\n
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+               width="900" height="92" viewBox="44 134 900 92" version="1.1">
+               <defs>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmbu">
+                                               <path d="M 1 5 L 11 10 L 1 15 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="6" refY="6" id="markerSjdype4kmbw">
+                                               <circle cx="6" cy="6" r="3.5"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="8.5" refY="5" id="markerSjdype4kmby">
+                                               <path d="m 1 5 l 0 -3 l 7 3 l -7 3 z"
+                                                               style="stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmc0">
+                                               <path d="M 1 5 L 11 10 L 1 15"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-1" refY="10" id="markerSjdype4kmc2">
+                                               <path d="M 0 10 L 8 6 L 16 10 L 8 14 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-5" refY="10" id="markerSjdype4kmc4">
+                                               <path d="M 1 4 L 5 16"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" stroke="#000000" />
+                               </marker>
+               </defs>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1"
+                                               transform="matrix(1,0,0,1,50,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 2;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1_label"
+                                               transform="matrix(1,0,0,1,23,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="Holmes_0bsv00m"
+                                               transform="matrix(1,0,0,1,438,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <circle cx="15" cy="15" r="10" style="stroke-width: 1;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="11" y="20">H</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="39" y="43.5">Holmes</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="VesCollector_1ljyqg8"
+                                               transform="matrix(1,0,0,1,213,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="120,80 120,20 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <polyline points="20,0 20,80 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="14">V</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="26">E</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="38">S</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="25.5" y="43.5">VesCollector</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="Policy_114xo8j"
+                                               transform="matrix(1,0,0,1,678,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="0,40 60,0 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="43.5" y="43.5">Policy</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape selected" data-element-id="EndEvent_0b4m6bk"
+                                               transform="matrix(1,0,0,1,901,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 4;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                                               <g class=" djs-resizer djs-resizer-nw" transform="matrix(1,0,0,1,0,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-ne" transform="matrix(0,1,-1,0,36,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-se" transform="matrix(-1,0,0,-1,36,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-sw" transform="matrix(0,-1,1,0,0,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="EndEvent_0b4m6bk_label"
+                                               transform="matrix(1,0,0,1,874,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1c9hzec"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="80" y="174" width="139"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  86,180L213,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="86,180 213,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1c9hzec_label"
+                                               transform="matrix(1,0,0,1,104.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1ig3gix"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="327" y="174" width="117"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  333,180L438,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="333,180 438,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1ig3gix_label"
+                                               transform="matrix(1,0,0,1,340.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_0zwbn2r"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="552" y="174" width="132"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  558,180L678,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="558,180 678,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_0zwbn2r_label"
+                                               transform="matrix(1,0,0,1,573,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_0ox6r95"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="792" y="174" width="115"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  798,180L901,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmbu&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="798,180 901,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_0ox6r95_label"
+                                               transform="matrix(1,0,0,1,804.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+</svg>
\ No newline at end of file
diff --git a/src/test/resources/clds/templates/bpmn/holmes-template.xml b/src/test/resources/clds/templates/bpmn/holmes-template.xml
new file mode 100644 (file)
index 0000000..0ea1587
--- /dev/null
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
+               xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
+               xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
+               <bpmn:process id="Process_1" isExecutable="false">
+                               <bpmn:startEvent id="StartEvent_1">
+                                               <bpmn:outgoing>SequenceFlow_1c9hzec</bpmn:outgoing>
+                               </bpmn:startEvent>
+                               <bpmn:holmes id="Holmes_0bsv00m">
+                                               <bpmn:incoming>SequenceFlow_1ig3gix</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_0zwbn2r</bpmn:outgoing>
+                               </bpmn:holmes>
+                               <bpmn:vesCollector id="VesCollector_1ljyqg8">
+                                               <bpmn:incoming>SequenceFlow_1c9hzec</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1ig3gix</bpmn:outgoing>
+                               </bpmn:vesCollector>
+                               <bpmn:policy id="Policy_114xo8j">
+                                               <bpmn:incoming>SequenceFlow_0zwbn2r</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_0ox6r95</bpmn:outgoing>
+                               </bpmn:policy>
+                               <bpmn:endEvent id="EndEvent_0b4m6bk">
+                                               <bpmn:incoming>SequenceFlow_0ox6r95</bpmn:incoming>
+                               </bpmn:endEvent>
+                               <bpmn:sequenceFlow id="SequenceFlow_1c9hzec"
+                                               sourceRef="StartEvent_1" targetRef="VesCollector_1ljyqg8" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1ig3gix"
+                                               sourceRef="VesCollector_1ljyqg8" targetRef="Holmes_0bsv00m" />
+                               <bpmn:sequenceFlow id="SequenceFlow_0zwbn2r"
+                                               sourceRef="Holmes_0bsv00m" targetRef="Policy_114xo8j" />
+                               <bpmn:sequenceFlow id="SequenceFlow_0ox6r95"
+                                               sourceRef="Policy_114xo8j" targetRef="EndEvent_0b4m6bk" />
+               </bpmn:process>
+               <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+                               <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
+                                               <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2"
+                                                               bpmnElement="StartEvent_1">
+                                                               <dc:Bounds x="50" y="162" width="36" height="36" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="Holmes_0bsv00m_di"
+                                                               bpmnElement="Holmes_0bsv00m">
+                                                               <dc:Bounds x="438" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="VesCollector_1ljyqg8_di"
+                                                               bpmnElement="VesCollector_1ljyqg8">
+                                                               <dc:Bounds x="213" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="Policy_114xo8j_di"
+                                                               bpmnElement="Policy_114xo8j">
+                                                               <dc:Bounds x="678" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="EndEvent_0b4m6bk_di"
+                                                               bpmnElement="EndEvent_0b4m6bk">
+                                                               <dc:Bounds x="901" y="162" width="36" height="36" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="874" y="198" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1c9hzec_di"
+                                                               bpmnElement="SequenceFlow_1c9hzec">
+                                                               <di:waypoint xsi:type="dc:Point" x="86" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="213" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="104.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1ig3gix_di"
+                                                               bpmnElement="SequenceFlow_1ig3gix">
+                                                               <di:waypoint xsi:type="dc:Point" x="333" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="438" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="340.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_0zwbn2r_di"
+                                                               bpmnElement="SequenceFlow_0zwbn2r">
+                                                               <di:waypoint xsi:type="dc:Point" x="558" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="678" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="573" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_0ox6r95_di"
+                                                               bpmnElement="SequenceFlow_0ox6r95">
+                                                               <di:waypoint xsi:type="dc:Point" x="798" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="901" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="804.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                               </bpmndi:BPMNPlane>
+               </bpmndi:BPMNDiagram>
+</bpmn:definitions>
\ No newline at end of file
diff --git a/src/test/resources/clds/templates/bpmn/tca-img.xml b/src/test/resources/clds/templates/bpmn/tca-img.xml
new file mode 100644 (file)
index 0000000..a2ec5af
--- /dev/null
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="utf-8"?><!-- created with bpmn-js / http://bpmn.io --><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+               width="924" height="92" viewBox="44 134 924 92" version="1.1">
+               <defs>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmnw">
+                                               <path d="M 1 5 L 11 10 L 1 15 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="6" refY="6" id="markerSjdype4kmny">
+                                               <circle cx="6" cy="6" r="3.5"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+                                               orient="auto" refX="8.5" refY="5" id="markerSjdype4kmo0">
+                                               <path d="m 1 5 l 0 -3 l 7 3 l -7 3 z"
+                                                               style="stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmo2">
+                                               <path d="M 1 5 L 11 10 L 1 15"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-1" refY="10" id="markerSjdype4kmo4">
+                                               <path d="M 0 10 L 8 6 L 16 10 L 8 14 Z"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#ffffff" stroke="#000000" />
+                               </marker>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="-5" refY="10" id="markerSjdype4kmo6">
+                                               <path d="M 1 4 L 5 16"
+                                                               style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+                                                               fill="#000000" stroke="#000000" />
+                               </marker>
+               </defs>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1"
+                                               transform="matrix(1,0,0,1,50,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 2;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="StartEvent_1_label"
+                                               transform="matrix(1,0,0,1,23,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="VesCollector_1g9cmz0"
+                                               transform="matrix(1,0,0,1,207,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="120,80 120,20 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <polyline points="20,0 20,80 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="14">V</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="26">E</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;">
+                                                                               <tspan x="5" y="38">S</tspan>
+                                                               </text>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="25.5" y="43.5">VesCollector</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="TCA_1d13unw"
+                                               transform="matrix(1,0,0,1,453,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="0,60 120,60 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="48" y="43.5">TCA</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="Policy_12lup3h"
+                                               transform="matrix(1,0,0,1,687,140)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+                                                               height="92"></rect>
+                                               <g class="djs-visual">
+                                                               <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+                                                                               style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+                                                               <polyline points="0,40 60,0 " style="stroke-width: 2;"
+                                                                               fill="none" stroke="#000000"></polyline>
+                                                               <text style="font-family: Arial,sans-serif; font-size: 12px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="43.5" y="43.5">Policy</tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="120" height="80"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape selected" data-element-id="EndEvent_16kg9fx"
+                                               transform="matrix(1,0,0,1,925,162)" style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+                                                               height="48"></rect>
+                                               <g class="djs-visual">
+                                                               <circle cx="18" cy="18" r="18" style="stroke-width: 4;"
+                                                                               stroke="#000000" fill="#ffffff"></circle>
+                                               </g>
+                                               <rect x="0" y="0" width="36" height="36"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                                               <g class=" djs-resizer djs-resizer-nw" transform="matrix(1,0,0,1,0,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-ne" transform="matrix(0,1,-1,0,36,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-se" transform="matrix(-1,0,0,-1,36,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-sw" transform="matrix(0,-1,1,0,0,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="EndEvent_16kg9fx_label"
+                                               transform="matrix(1,0,0,1,898,198)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1ahk7jg"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="80" y="174" width="133"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  86,180L207,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="86,180 207,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1ahk7jg_label"
+                                               transform="matrix(1,0,0,1,101.5,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_18ahat1"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="321" y="174" width="138"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  327,180L453,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="327,180 453,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_18ahat1_label"
+                                               transform="matrix(1,0,0,1,345,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1mo9gxb"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="567" y="174" width="126"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  573,180L687,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="573,180 687,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1mo9gxb_label"
+                                               transform="matrix(1,0,0,1,585,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-connection" data-element-id="SequenceFlow_1dgtrrq"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="801" y="174" width="130"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  807,180L925,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="807,180 925,180 " style="stroke-opacity: 0; stroke-width: 15;"
+                                                               fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="SequenceFlow_1dgtrrq_label"
+                                               transform="matrix(1,0,0,1,821,170)" style="display: none;">
+                                               <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+                                                               height="32"></rect>
+                                               <g class="djs-visual">
+                                                               <text style="font-family: Arial,sans-serif; font-size: 11px;"
+                                                                               class=" djs-label">
+                                                                               <tspan x="45" y="0"></tspan>
+                                                               </text>
+                                               </g>
+                                               <rect x="0" y="0" width="90" height="20"
+                                                               style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+                                                               class="djs-hit"></rect>
+                               </g>
+               </g>
+</svg>
\ No newline at end of file
diff --git a/src/test/resources/clds/templates/bpmn/tca-template.xml b/src/test/resources/clds/templates/bpmn/tca-template.xml
new file mode 100644 (file)
index 0000000..cc942ef
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
+               xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
+               xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
+               <bpmn:process id="Process_1" isExecutable="false">
+                               <bpmn:startEvent id="StartEvent_1">
+                                               <bpmn:outgoing>SequenceFlow_1ahk7jg</bpmn:outgoing>
+                               </bpmn:startEvent>
+                               <bpmn:vesCollector id="VesCollector_1g9cmz0">
+                                               <bpmn:incoming>SequenceFlow_1ahk7jg</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_18ahat1</bpmn:outgoing>
+                               </bpmn:vesCollector>
+                               <bpmn:tCA id="TCA_1d13unw">
+                                               <bpmn:incoming>SequenceFlow_18ahat1</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1mo9gxb</bpmn:outgoing>
+                               </bpmn:tCA>
+                               <bpmn:policy id="Policy_12lup3h">
+                                               <bpmn:incoming>SequenceFlow_1mo9gxb</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1dgtrrq</bpmn:outgoing>
+                               </bpmn:policy>
+                               <bpmn:endEvent id="EndEvent_16kg9fx">
+                                               <bpmn:incoming>SequenceFlow_1dgtrrq</bpmn:incoming>
+                               </bpmn:endEvent>
+                               <bpmn:sequenceFlow id="SequenceFlow_1ahk7jg"
+                                               sourceRef="StartEvent_1" targetRef="VesCollector_1g9cmz0" />
+                               <bpmn:sequenceFlow id="SequenceFlow_18ahat1"
+                                               sourceRef="VesCollector_1g9cmz0" targetRef="TCA_1d13unw" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1mo9gxb"
+                                               sourceRef="TCA_1d13unw" targetRef="Policy_12lup3h" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1dgtrrq"
+                                               sourceRef="Policy_12lup3h" targetRef="EndEvent_16kg9fx" />
+               </bpmn:process>
+               <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+                               <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
+                                               <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2"
+                                                               bpmnElement="StartEvent_1">
+                                                               <dc:Bounds x="50" y="162" width="36" height="36" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="VesCollector_1g9cmz0_di"
+                                                               bpmnElement="VesCollector_1g9cmz0">
+                                                               <dc:Bounds x="207" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="TCA_1d13unw_di"
+                                                               bpmnElement="TCA_1d13unw">
+                                                               <dc:Bounds x="453" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="Policy_12lup3h_di"
+                                                               bpmnElement="Policy_12lup3h">
+                                                               <dc:Bounds x="687" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="EndEvent_16kg9fx_di"
+                                                               bpmnElement="EndEvent_16kg9fx">
+                                                               <dc:Bounds x="925" y="162" width="36" height="36" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="898" y="198" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1ahk7jg_di"
+                                                               bpmnElement="SequenceFlow_1ahk7jg">
+                                                               <di:waypoint xsi:type="dc:Point" x="86" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="207" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="101.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_18ahat1_di"
+                                                               bpmnElement="SequenceFlow_18ahat1">
+                                                               <di:waypoint xsi:type="dc:Point" x="327" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="453" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="345" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1mo9gxb_di"
+                                                               bpmnElement="SequenceFlow_1mo9gxb">
+                                                               <di:waypoint xsi:type="dc:Point" x="573" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="687" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="585" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1dgtrrq_di"
+                                                               bpmnElement="SequenceFlow_1dgtrrq">
+                                                               <di:waypoint xsi:type="dc:Point" x="807" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="925" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="821" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                               </bpmndi:BPMNPlane>
+               </bpmndi:BPMNDiagram>
+
+</bpmn:definitions>
\ No newline at end of file
diff --git a/src/test/resources/example/dao/template-doc-content.json b/src/test/resources/example/dao/template-doc-content.json
new file mode 100644 (file)
index 0000000..3b7e2df
--- /dev/null
@@ -0,0 +1 @@
+{"global":[{"name":"service","value":["tosca_definitions_version: cloudify_dsl_1_3\r\nimports:\r\n- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\r\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/docker/2.2.0/node-type.yaml\r\n- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml\r\n- http://onap.org:8081/repository/solutioning01-mte2-raw/type_files/dmaap/dmaap_mr.yaml\r\ninputs:\r\n  location_id:\r\n    type: string\r\n  service_id:\r\n    type: string\r\n  policy_id:\r\n    type: string\r\nnode_templates:\r\n  policy_0:\r\n    type: dcae.nodes.policy\r\n    properties:\r\n      policy_id: \r\n        get_input: policy_id\r\n  cdap_host_host:\r\n    type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure\r\n    properties:\r\n      location_id:\r\n        get_input: location_id\r\n      scn_override: cdap_broker.solutioning-central.dcae.onap.org\r\n    interfaces:\r\n      cloudify.interfaces.lifecycle: {\r\n        }\r\n  tca_tca:\r\n    type: dcae.nodes.MicroService.cdap\r\n    properties:\r\n      app_config:\r\n        appDescription: DCAE Analytics Threshold Crossing Alert Application\r\n        appName: dcae-tca\r\n        tcaSubscriberOutputStreamName: TCASubscriberOutputStream\r\n        tcaVESAlertsTableName: TCAVESAlertsTable\r\n        tcaVESAlertsTableTTLSeconds: '1728000'\r\n        tcaVESMessageStatusTableName: TCAVESMessageStatusTable\r\n        tcaVESMessageStatusTableTTLSeconds: '86400'\r\n        thresholdCalculatorFlowletInstances: '2'\r\n      app_preferences:\r\n        publisherContentType: application/json\r\n        publisherHostName: mrlocal-mtnjftle01.onap.org\r\n        publisherHostPort: '3905'\r\n        publisherMaxBatchSize: '10'\r\n        publisherMaxRecoveryQueueSize: '100000'\r\n        publisherPollingInterval: '20000'\r\n        publisherProtocol: https\r\n        publisherTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESPub\r\n        publisherUserName: m00502@tca.af.dcae.onap.org\r\n        publisherUserPassword: Te5021abc\r\n        subscriberConsumerGroup: OpenDCAE-c12\r\n        subscriberConsumerId: c12\r\n        subscriberContentType: application/json\r\n        subscriberHostName: mrlocal-mtnjftle01.onap.org\r\n        subscriberHostPort: '3905'\r\n        subscriberMessageLimit: '-1'\r\n        subscriberPollingInterval: '20000'\r\n        subscriberProtocol: https\r\n        subscriberTimeoutMS: '-1'\r\n        subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub\r\n        subscriberUserName: m00502@tca.af.dcae.onap.org\r\n        subscriberUserPassword: Te5021abc\r\n        tca_policy: null\r\n      artifact_name: dcae-analytics-tca\r\n      artifact_version: 1.0.0\r\n      connections:\r\n        streams_publishes: [\r\n          ]\r\n        streams_subscribes: [\r\n          ]\r\n      jar_url: http://somejar\r\n      location_id:\r\n        get_input: location_id\r\n      namespace: cdap_tca_hi_lo\r\n      programs:\r\n      - program_id: TCAVESCollectorFlow\r\n        program_type: flows\r\n      - program_id: TCADMaaPMRSubscriberWorker\r\n        program_type: workers\r\n      - program_id: TCADMaaPMRPublisherWorker\r\n        program_type: workers\r\n      service_component_type: cdap_app_tca\r\n      service_id:\r\n        get_input: service_id\r\n      streamname: TCASubscriberOutputStream\r\n    relationships:\r\n    - target: topic0\r\n      type: dcae.relationships.subscribe_to_events\r\n    - target: topic1\r\n      type: dcae.relationships.publish_events\r\n    - target: cdap_host_host\r\n      type: dcae.relationships.component_contained_in\r\n    - target: policy_0\r\n      type: dcae.relationships.depends_on\r\n  topic0:\r\n    type: dcae.nodes.Topic\r\n    properties:\r\n      topic_name: ''\r\n  topic1:\r\n    type: dcae.nodes.Topic\r\n    properties:\r\n      topic_name: ''\r\n"]}]}
\ No newline at end of file
diff --git a/src/test/resources/example/sdc/blueprint-dcae/holmes.yaml b/src/test/resources/example/sdc/blueprint-dcae/holmes.yaml
new file mode 100644 (file)
index 0000000..f180a7d
--- /dev/null
@@ -0,0 +1,174 @@
+tosca_definitions_version: cloudify_dsl_1_3
+imports:
+- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml
+- https://nexus01.research.att.com:8443/repository/solutioning01-mte2-raw/type_files/docker/2.3.0+t.0.4/node-type.yaml
+- https://nexus01.research.att.com:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml
+- http://nexus01.research.att.com:8081/repository/solutioning01-mte2-raw/type_files/dmaap/1.2.0/dmaap.yaml
+inputs:
+  dcae_service_location:
+    type: string
+  docker_host_override:
+    type: string
+  topic0_aaf_password:
+    type: string
+  topic0_aaf_username:
+    type: string
+  topic0_client_role:
+    type: string
+  topic1_aaf_password:
+    type: string
+  topic1_aaf_username:
+    type: string
+  topic1_client_role:
+    type: string
+node_templates:
+  policy_0:
+    type: dcae.nodes.policy
+    properties:
+      policy_model: policy.nodes.holmes
+      policy_filter: "DCAE.Config_Holmes.*"
+  docker_host_host:
+    type: dcae.nodes.SelectedDockerHost
+    properties:
+      docker_host_override:
+        get_input: docker_host_override
+      location_id:
+        get_input: dcae_service_location
+  holmes-rule_homes-rule:
+    type: dcae.nodes.DockerContainerForComponentsUsingDmaap
+    properties:
+      application_config:
+        holmes.default.rule.volte.scenario1: 'package dcae.ves.test
+
+          import org.onap.some.related.packages;
+
+          rule"SameVNF_Relation_Rule"
+
+          salience 120
+
+          no-loop true
+
+          when
+
+          $root : VesAlarm(
+
+          $sourceId: sourceId, sourceId != null && !sourceId.equals(""),
+
+          specificProblem in ( "LSS_cpiPCSCFFailReg(121297)", "LSS_cpiSIPRetransmitInvite(120267)" ),
+
+          $eventId: eventId)
+
+          $child : VesAlarm( eventId != $eventId,
+
+          CorrelationUtil.getInstance().isTopologicallyRelated(sourceId, $sourceId),
+
+          specificProblem in ("LSS_externalLinkDown(4271)","LSS_failedAttachReqsRateExceeded(4272)"),
+
+          this after [-60s, 60s] $root)
+
+          then
+
+          DmaapService.publishResult(...);
+
+          end'
+        holmes.default.rule.volte.scenario2: 'package dcae.ves.test
+
+          import org.onap.some.related.packages;
+
+          rule"SameVNF_Relation_Rule_1"
+
+          salience 120
+
+          no-loop true
+
+          when
+
+          $root : VesAlarm(
+
+          $sourceId: sourceId, sourceId != null && !sourceId.equals(""),
+
+          specificProblem in ( "LSS_cpiPCSCFFailReg(121297)", "LSS_cpiSIPRetransmitInvite(120267)" ),
+
+          $eventId: eventId)
+
+          $child : VesAlarm( eventId != $eventId,
+
+          CorrelationUtil.getInstance().isTopologicallyRelated(sourceId, $sourceId),
+
+          specificProblem in ("LSS_externalLinkDown(4271)","LSS_failedAttachReqsRateExceeded(4272)"),
+
+          this after [-60s, 60s] $root)
+
+          then
+
+          DmaapService.publishResult(...);
+
+          end'
+        services_calls:
+        - msb_config:
+            concat:
+            - '{{'
+            - get_property:
+              - SELF
+              - msb_config
+              - node_name
+            - '}}'
+        streams_publishes: []
+        streams_subscribes:
+        - sec_measurement_unsecure:
+            aaf_password:
+              get_input: topic0_aaf_password
+            aaf_username:
+              get_input: topic0_aaf_username
+            dmaap_info: <<topic0>>
+            type: message_router
+        - sec_measurement:
+            aaf_password:
+              get_input: topic1_aaf_password
+            aaf_username:
+              get_input: topic1_aaf_username
+            dmaap_info: <<topic1>>
+            type: message_router
+      docker_config:
+        healthcheck:
+          endpoint: api/holmes-rule-mgmt/v1/healthcheck
+          interval: 15s
+          timeout: 1s
+          type: http
+        ports:
+        - 9101:9101
+      image: nexus3.onap.org:10001/onap/holmes/rule-manamgement:latest
+      location_id:
+        get_input: dcae_service_location
+      service_component_type: dcae-analytics-holmes-rule-manamgement
+      streams_publishes: []
+      streams_subscribes:
+      - client_role:
+          get_input: topic0_client_role
+        location:
+          get_input: dcae_service_location
+        name: topic0
+        type: message_router
+      - client_role:
+          get_input: topic1_client_role
+        location:
+          get_input: dcae_service_location
+        name: topic1
+        type: message_router
+    relationships:
+    - target: docker_host_host
+      type: dcae.relationships.component_contained_in
+    - target: topic0
+      type: dcae.relationships.subscribe_to_events
+    - target: topic1
+      type: dcae.relationships.subscribe_to_events
+    - target: policy_0
+      type: dcae.relationships.depends_on
+  topic0:
+    type: dcae.nodes.Topic
+    properties:
+      topic_name: ''
+  topic1:
+    type: dcae.nodes.Topic
+    properties:
+      topic_name: ''
diff --git a/src/test/resources/example/sdc/blueprint-dcae/not-recognized.yaml b/src/test/resources/example/sdc/blueprint-dcae/not-recognized.yaml
new file mode 100644 (file)
index 0000000..6522885
--- /dev/null
@@ -0,0 +1,130 @@
+tosca_definitions_version: cloudify_dsl_1_3
+imports:
+- http://dockercentral.it.att.com:8093/nexus/repository/rawcentral/com.att.dcae.controller/type_files/dockerplugin/2.4.0+t.0.8/node-type.yaml
+- http://dockercentral.it.att.com:8093/nexus/repository/rawcentral/com.att.dcae.controller/type_files/dmaap/1.2.0+t.0.9/dmaap.yaml
+- http://dockercentral.it.att.com:8093/nexus/repository/rawcentral/com.att.dcae.controller/type_files/relationship/1.0.0+t.0.1/relationship-types.yaml
+inputs:
+  commonEventHeader.domain:
+    type: string
+  commonEventHeader.version:
+    type: string
+  dcae_service_location:
+    type: string
+  docker_host_override:
+    type: string
+    default: ''
+  elementType:
+    type: string
+  feed_id:
+    type: string
+  mappingType:
+    type: string
+  measurementsForVfScalingFields.measurementsForVfScalingVersion:
+    type: string
+  phases.docker_map.phaseName:
+    type: string
+  topic1_aaf_password:
+    type: string
+  topic1_aaf_username:
+    type: string
+  topic1_client_role:
+    type: string
+node_templates:
+  DockerMap_n.1519416493392.3_DockerMap:
+    type: dcae.nodes.DockerContainerForComponentsUsingDmaap
+    properties:
+      application_config:
+        commonEventHeader.domain:
+          get_input: commonEventHeader.domain
+        commonEventHeader.version:
+          get_input: commonEventHeader.version
+        csvToVesJson: '{"processing":[{"phase":"pmossFoiPhase","filter":{"class":"Contains","string":"${file}","value":"NOKvMRF"},"processors":[{"class":"LogEvent","title":"PM-FOIEvent-Received","logName":"com.att.gfp.dcae.eventProcessor.input","logLevel":"DEBUG"},{"class":"RunPhase","phase":"vFoiNokRunPhase"}]},{"phase":"vFoiNokRunPhase","comments":"generic parsing","processors":[{"replace":",","field":"data","class":"ReplaceText","find":";"},{"replace":",","field":"file","class":"ReplaceText","find":"_"}]},{"phase":"vFoiNokRunPhase","filter":{"class":"Contains","string":"${data[1]}","value":"Begin date"},"processors":[{"class":"ExtractText","field":"event.commonEventHeader.startEpochMicrosec","value":"${data[1]}","regex":".*Begin date,([^,]*),.*"},{"class":"DateFormatter","value":"${event.commonEventHeader.startEpochMicrosec}","fromFormat":"MM/dd/yy HH:mm:ss a","fromTz":"GMT","toField":"event.commonEventHeader.startEpochMicrosec","toFormat":"#ms","toTz":"#ms"}]},{"phase":"vFoiNokRunPhase","filter":{"class":"Contains","string":"${data[2]}","value":"End date"},"processors":[{"class":"ExtractText","field":"event.commonEventHeader.lastEpochMicrosec","value":"${data[2]}","regex":".*End date,([^,]*),.*"},{"class":"DateFormatter","value":"${event.commonEventHeader.lastEpochMicrosec}","fromFormat":"MM/dd/yy HH:mm:ss a","fromTz":"GMT","toField":"event.commonEventHeader.lastEpochMicrosec","toFormat":"#ms","toTz":"#ms"},{"class":"DateFormatter","value":"${event.commonEventHeader.lastEpochMicrosec}","fromFormat":"#ms","fromTz":"#ms","toField":"event.commonEventHeader.internalHeaderFields.DATETIMEUTC","toFormat":"yyyyMMddHHmmss","toTz":"GMT"}]},{"phase":"vFoiNokRunPhase","processors":[{"class":"ExtractText","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[0].value","value":"${data[7]}","regex":".*CpuSys,+(\\d+,){3}.*"},{"class":"ReplaceText","replace":"","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[0].value","find":","},{"class":"ExtractText","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[1].value","value":"${data[5]}","regex":".*CpuUsage,+(\\d+,){3}.*"},{"class":"ReplaceText","replace":"","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[1].value","find":","},{"class":"ExtractText","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[2].value","value":"${data[7]}","regex":".*CpuSys,+(\\d+,){2}.*"},{"class":"ReplaceText","replace":"","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[2].value","find":","},{"class":"ExtractText","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[3].value","value":"${data[5]}","regex":".*CpuUsage,+(\\d+,){2}.*"},{"class":"ReplaceText","replace":"","field":"event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[3].value","find":","}]},{"phase":"vFoiNokRunPhase","processors":[{"class":"ExtractText","field":"event.commonEventHeader.eventName","value":"${file}","regex":"([^,]*),.*"},{"class":"ExtractText","field":"event.commonEventHeader.reportingEntityName","value":"${file}","regex":".*,([^,]*)\\..*"}]},{"phase":"vFoiNokRunPhase","comments":"generic parsing","processors":[{"class":"Set","updates":{"event.commonEventHeader.lastEpochMicrosec":"${event.commonEventHeader.lastEpochMicrosec}000","event.commonEventHeader.startEpochMicrosec":"${event.commonEventHeader.startEpochMicrosec}000","event.commonEventHeader.domain":"measurementsForVfScaling","event.commonEventHeader.eventName":"Mfvs_${event.commonEventHeader.eventName}","event.commonEventHeader.eventType":"csv2ves","event.commonEventHeader.priority":"Normal","event.commonEventHeader.sequence":0,"event.commonEventHeader.sourceName":"${event.commonEventHeader.reportingEntityName}","event.commonEventHeader.version":3.0,"event.commonEventHeader.eventId":"%{now.ms}","event.commonEventHeader.internalHeaderFields.dbTableSuffix":"","event.measurementsForVfScalingFields.measurementInterval":900,"event.measurementsForVfScalingFields.measurementsForVfScalingVersion":2.0,"event.measurementsForVfScalingFields.additionalMeasurements.name":"csv2ves","event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[0].name":"CpuSysMax","event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[1].name":"CpuUsageMax","event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[2].name":"CpuSysAverage","event.measurementsForVfScalingFields.additionalMeasurements.arrayOfFields[3].name":"CpuUsageAverage"}},{"class":"DateFormatter","value":"${event.commonEventHeader.eventId}","fromFormat":"#ms","fromTz":"#ms","toField":"event.commonEventHeader.eventId","toFormat":"yyyyMMddHHmmssSSS","toTz":"GMT"}]},{"phase":"vFoiNokRunPhase","processors":[{"class":"Clear","fields":["data","file"]},{"class":"LogText","logLevel":"INFO","logText":"Finished-PM-FOIEvent-parsing"},{"class":"LogEvent","title":"PM-FOIEvent-Received-Output"},{"class":"RunPhase","phase":"foiEventToDmaapPhase"}]}]}'
+        elementType:
+          get_input: elementType
+        isSelfServeComponent: 'True'
+        mappingType:
+          get_input: mappingType
+        measurementsForVfScalingFields.measurementsForVfScalingVersion:
+          get_input: measurementsForVfScalingFields.measurementsForVfScalingVersion
+        phases.docker_map.phaseName:
+          get_input: phases.docker_map.phaseName
+        services_calls: {}
+        streams_publishes:
+          DCAE-VES-PM-EVENT:
+            aaf_password:
+              get_input: topic1_aaf_password
+            aaf_username:
+              get_input: topic1_aaf_username
+            dmaap_info: <<topic1_n.1519416493404.5>>
+            type: message_router
+        streams_subscribes:
+          DCAE_PM_DATA_C_M:
+            dmaap_info: <<feed_n.1519416394214.2>>
+            type: data_router
+        useDtiConfig: 'False'
+      docker_config:
+        healthcheck:
+          interval: 300s
+          script: /opt/app/vec/bin/common/HealthCheck_DockerMap.sh
+          timeout: 15s
+          type: docker
+        volumes:
+        - container:
+            bind: /opt/app/dcae-certificate
+          host:
+            path: /opt/app/dcae-certificate
+        - container:
+            bind: /opt/app/dmd/log/AGENT
+          host:
+            path: /opt/logs/DCAE/dockermap/dmd/AGENT
+        - container:
+            bind: /opt/app/dmd/log/WATCHER
+          host:
+            path: /opt/logs/DCAE/dockermap/dmd/WATCHER
+        - container:
+            bind: /opt/app/vec/logs/DCAE
+          host:
+            path: /opt/logs/DCAE/dockermap/dockermap-logs
+        - container:
+            bind: /opt/app/vec/archive/data
+          host:
+            path: /opt/data/DCAE/dockermap/dockermap-archive
+      image: dockercentral.it.att.com:5100/com.att.dcae.controller/dcae-controller-dockermap:18.02-004
+      location_id:
+        get_input: dcae_service_location
+      service_component_type: dcae.collectors.docker.map.pm
+      streams_publishes:
+      - client_role:
+          get_input: topic1_client_role
+        location:
+          get_input: dcae_service_location
+        name: topic1_n.1519416493404.5
+        type: message_router
+      streams_subscribes:
+      - location:
+          get_input: dcae_service_location
+        name: feed_n.1519416394214.2
+        type: data_router
+    relationships:
+    - target: docker_host_host
+      type: dcae.relationships.component_contained_in
+    - target: feed_n.1519416394214.2
+      type: dcae.relationships.subscribe_to_files
+    - target: topic1_n.1519416493404.5
+      type: dcae.relationships.publish_events
+  docker_host_host:
+    type: dcae.nodes.SelectedDockerHost
+    properties:
+      docker_host_override:
+        get_input: docker_host_override
+      location_id:
+        get_input: dcae_service_location
+  feed_n.1519416394214.2:
+    type: dcae.nodes.ExistingFeed
+    properties:
+      feed_id:
+        get_input: feed_id
+  topic1_n.1519416493404.5:
+    type: dcae.nodes.Topic
+    properties:
+      topic_name: DCAE-VES-PM-EVENT-v1
diff --git a/src/test/resources/example/sdc/blueprint-dcae/tca.yaml b/src/test/resources/example/sdc/blueprint-dcae/tca.yaml
new file mode 100644 (file)
index 0000000..1a756ee
--- /dev/null
@@ -0,0 +1,104 @@
+tosca_definitions_version: cloudify_dsl_1_3
+imports:
+- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml
+- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/docker/2.2.0/node-type.yaml
+- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml
+- http://onap.org:8081/repository/solutioning01-mte2-raw/type_files/dmaap/dmaap_mr.yaml
+inputs:
+  location_id:
+    type: string
+  service_id:
+    type: string
+  policy_id:
+    type: string
+node_templates:
+  policy_0:
+    type: dcae.nodes.policy
+    properties:
+      policy_id: 
+        get_input: policy_id
+  cdap_host_host:
+    type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
+    properties:
+      location_id:
+        get_input: location_id
+      scn_override: cdap_broker.solutioning-central.dcae.onap.org
+    interfaces:
+      cloudify.interfaces.lifecycle: {
+        }
+  tca_tca:
+    type: dcae.nodes.MicroService.cdap
+    properties:
+      app_config:
+        appDescription: DCAE Analytics Threshold Crossing Alert Application
+        appName: dcae-tca
+        tcaSubscriberOutputStreamName: TCASubscriberOutputStream
+        tcaVESAlertsTableName: TCAVESAlertsTable
+        tcaVESAlertsTableTTLSeconds: '1728000'
+        tcaVESMessageStatusTableName: TCAVESMessageStatusTable
+        tcaVESMessageStatusTableTTLSeconds: '86400'
+        thresholdCalculatorFlowletInstances: '2'
+      app_preferences:
+        publisherContentType: application/json
+        publisherHostName: mrlocal-mtnjftle01.onap.org
+        publisherHostPort: '3905'
+        publisherMaxBatchSize: '10'
+        publisherMaxRecoveryQueueSize: '100000'
+        publisherPollingInterval: '20000'
+        publisherProtocol: https
+        publisherTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESPub
+        publisherUserName: m00502@tca.af.dcae.onap.org
+        publisherUserPassword: Te5021abc
+        subscriberConsumerGroup: OpenDCAE-c12
+        subscriberConsumerId: c12
+        subscriberContentType: application/json
+        subscriberHostName: mrlocal-mtnjftle01.onap.org
+        subscriberHostPort: '3905'
+        subscriberMessageLimit: '-1'
+        subscriberPollingInterval: '20000'
+        subscriberProtocol: https
+        subscriberTimeoutMS: '-1'
+        subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub
+        subscriberUserName: m00502@tca.af.dcae.onap.org
+        subscriberUserPassword: Te5021abc
+        tca_policy: null
+      artifact_name: dcae-analytics-tca
+      artifact_version: 1.0.0
+      connections:
+        streams_publishes: [
+          ]
+        streams_subscribes: [
+          ]
+      jar_url: http://somejar
+      location_id:
+        get_input: location_id
+      namespace: cdap_tca_hi_lo
+      programs:
+      - program_id: TCAVESCollectorFlow
+        program_type: flows
+      - program_id: TCADMaaPMRSubscriberWorker
+        program_type: workers
+      - program_id: TCADMaaPMRPublisherWorker
+        program_type: workers
+      service_component_type: cdap_app_tca
+      service_id:
+        get_input: service_id
+      streamname: TCASubscriberOutputStream
+    relationships:
+    - target: topic0
+      type: dcae.relationships.subscribe_to_events
+    - target: topic1
+      type: dcae.relationships.publish_events
+    - target: cdap_host_host
+      type: dcae.relationships.component_contained_in
+    - target: policy_0
+      type: dcae.relationships.depends_on
+  topic0:
+    type: dcae.nodes.Topic
+    properties:
+      topic_name: ''
+  topic1:
+    type: dcae.nodes.Topic
+    properties:
+      topic_name: ''
+      
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/pdp/api/getConfig/.file b/src/test/resources/http-cache/example/pdp/api/getConfig/.file
new file mode 100644 (file)
index 0000000..fb2ad04
--- /dev/null
@@ -0,0 +1,2 @@
+[{"policyConfigMessage":"Config Retrieved! ","policyConfigStatus":"CONFIG_RETRIEVED","type":"JSON","config":"{\"service\":\"tca_policy\",\"location\":\"SampleServiceLocation\",\"uuid\":\"test\",\"policyName\":\"MicroServicevCPE\",\"description\":\"MicroService vCPE Policy\",\"configName\":\"SampleConfigName\",\"templateVersion\":\"OpenSource.version.1\",\"version\":\"1.1.0\",\"priority\":\"1\",\"policyScope\":\"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\",\"riskType\":\"SampleRiskType\",\"riskLevel\":\"1\",\"guard\":\"False\",\"content\":{\"tca_policy\":{\"domain\":\"measurementsForVfScaling\",\"metricsPerEventName\":[{\"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\"}]}]}}}","policyName":"com.Config_MS_MicroServicevCPE.1.xml","policyVersion":"1","matchingConditions":{"ONAPName":"DCAE","ConfigName":"SampleConfigName","service":"tca_policy","uuid":"test","Location":"SampleServiceLocation"},"responseAttributes":{},"property":null},
+{"policyConfigMessage":"Config Retrieved! ","policyConfigStatus":"CONFIG_RETRIEVED","type":"JSON","config":"{\"service\":\"tca_policy\",\"location\":\"SampleServiceLocation\",\"uuid\":\"test\",\"policyName\":\"MicroServicevCPE\",\"description\":\"MicroService vCPE Policy\",\"configName\":\"SampleConfigName\",\"templateVersion\":\"OpenSource.version.1\",\"version\":\"1.1.0\",\"priority\":\"1\",\"policyScope\":\"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\",\"riskType\":\"SampleRiskType\",\"riskLevel\":\"1\",\"guard\":\"False\",\"content\":{\"tca_policy\":{\"domain\":\"measurementsForVfScaling\",\"metricsPerEventName\":[{\"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\"}]}]}}}","policyName":"ClHolmes1.Config_ClosedLoop_f142fc95_2601_11e8_89ce_0242ac130002_null","policyVersion":"1","matchingConditions":{"ONAPName":"DCAE","ConfigName":"SampleConfigName","service":"tca_policy","uuid":"test","Location":"SampleServiceLocation"},"responseAttributes":{},"property":null}]
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/pdp/api/getConfig/.header b/src/test/resources/http-cache/example/pdp/api/getConfig/.header
new file mode 100644 (file)
index 0000000..9958716
--- /dev/null
@@ -0,0 +1 @@
+{"Transfer-Encoding": "chunked", "Date": "Mon, 12 Mar 2018 15:03:26 GMT", "Content-Type": "application/json;charset=UTF-8", "Server": "Apache-Coyote/1.1"}
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/pdp/api/pushPolicy/.file b/src/test/resources/http-cache/example/pdp/api/pushPolicy/.file
new file mode 100644 (file)
index 0000000..0637a08
--- /dev/null
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/pdp/api/updatePolicy/.file b/src/test/resources/http-cache/example/pdp/api/updatePolicy/.file
new file mode 100644 (file)
index 0000000..0637a08
--- /dev/null
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/pdp/api/updatePolicy/.header b/src/test/resources/http-cache/example/pdp/api/updatePolicy/.header
new file mode 100644 (file)
index 0000000..6a280d9
--- /dev/null
@@ -0,0 +1 @@
+{"Transfer-Encoding": "chunked", "Set-Cookie": "JSESSIONID=158qxkdtdobkd1umr3ikkgrmlx;Path=/", "Expires": "Thu, 01 Jan 1970 00:00:00 GMT", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"}
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=VFC/.header b/src/test/resources/http-cache/example/sdc/v1/catalog/resources&#63;resourceType=VFC/.header
new file mode 100644 (file)
index 0000000..6a280d9
--- /dev/null
@@ -0,0 +1 @@
+{"Transfer-Encoding": "chunked", "Set-Cookie": "JSESSIONID=158qxkdtdobkd1umr3ikkgrmlx;Path=/", "Expires": "Thu, 01 Jan 1970 00:00:00 GMT", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"}
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts/.file b/src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts/.file
new file mode 100644 (file)
index 0000000..29d8ab7
--- /dev/null
@@ -0,0 +1 @@
+{"artifactName":"ClosedLoop-2e3d2132-26d4-11e8-826d-0242ac130002.yml","artifactType":"DCAE_INVENTORY_BLUEPRINT","artifactURL":"","artifactDescription":"Description of the Artifact","artifactChecksum":"ZjJlMjVmMWE2M2M1OTM2MDZlODlmNTVmZmYzNjViYzM=","artifactUUID":"13fb13f9-f5d7-4ade-b934-d0da78754a51","artifactVersion":"1"}
\ No newline at end of file
diff --git a/src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts/.header b/src/test/resources/http-cache/example/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts/.header
new file mode 100644 (file)
index 0000000..125a579
--- /dev/null
@@ -0,0 +1 @@
+{"Content-Length": "323", "Content-Type": "application/json"}
\ No newline at end of file
diff --git a/src/test/resources/http-cache/sdc_proxy.py b/src/test/resources/http-cache/sdc_proxy.py
deleted file mode 100755 (executable)
index 45dac41..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env python2
-###
-# ============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============================================
-# ===================================================================
-# ECOMP is a trademark and service mark of AT&T Intellectual Property.
-###
-
-import json
-import requests
-import os
-import sys
-import SimpleHTTPServer
-import SocketServer
-import argparse
-import tempfile
-import signal
-
-parser = argparse.ArgumentParser(description="SDC Cache & Replay")
-parser.add_argument("--username", "-u", type=str, help="Set the username for contacting SDC")
-parser.add_argument("--password", "-p", type=str, help="Set the password for contacting SDC")
-parser.add_argument("--root",     "-r", default=tempfile.mkdtemp, type=str, help="Root folder for the proxy cache")
-parser.add_argument("--proxy"         , type=str, help="Url of the  Act as a proxy. If not set, this script only uses the cache and will return a 404 if files aren't found")
-parser.add_argument("--port",     "-P", type=int, default="8081", help="Port on which the proxy should listen to")
-parser.add_argument("--verbose",  "-v", type=bool, help="Print more information in case of error")
-options = parser.parse_args()
-
-
-PORT = options.port
-SDC_HOST = options.proxy
-SDC_AUTH = (options.username, options.password)
-SDC_HEADERS = {'X-ECOMP-InstanceID':'CLAMP'}
-CACHE_ROOT = options.root
-
-def signal_handler(signal_sent, frame):
-    global httpd
-    if signal_sent == signal.SIGINT:
-        print('Got Ctrl-C (SIGINT)')
-        httpd.socket.close()
-        httpd.shutdown()
-        httpd.server_close()
-
-class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
-
-    def print_headers(self):
-        for header,value in self.headers.items():
-            print("%s : %s" % (header, value))
-
-    def check_credentials(self):
-        pass
-
-    def _send_content(self, header_file, content_file):
-        self.send_response(200)
-        with open(header_file, 'rb') as f:
-            headers = json.load(f)
-            for key,value in headers.items():
-                if key in ('Transfer-Encoding',):
-                    continue
-                self.send_header(key, value)
-            self.end_headers()
-        with open(content_file,'rb') as f:
-            fc = f.read()
-            self.wfile.write(fc)
-
-    def _write_cache(self,cached_file, header_file, content_file, response):
-        os.makedirs(cached_file, True)
-        with open(content_file, 'w') as f:
-            f.write(response.raw.read())
-        with open(header_file, 'w') as f:
-            json.dump(dict(response.raw.headers), f)
-    # Entry point of the code
-    def do_GET(self):
-
-        self.print_headers()
-        self.check_credentials()
-
-        cached_file = '%s/%s' % (CACHE_ROOT, self.path,)
-        print("Cached file name before escaping : %s" % cached_file)
-        cached_file = cached_file.replace('<','&#60;').replace('>','&#62;').replace('?','&#63;').replace('*','&#42;').replace('\\','&#42;').replace(':','&#58;').replace('|','&#124;')
-        print("Cached file name after escaping (used for cache storage) : %s" % cached_file)
-        cached_file_content = "%s/.file" % (cached_file,)
-        cached_file_header = "%s/.header" % (cached_file,)
-
-        _file_available = os.path.exists(cached_file_content)
-        if not _file_available and not SDC_HOST:
-            self.send_response(404)
-            return "404 Not found"
-
-        if not _file_available:
-            print("SDC Request for data currently not present in cache: %s" % (cached_file,))
-            url = '%s%s' % (SDC_HOST, self.path)
-            response = requests.get(url, auth=SDC_AUTH, headers=SDC_HEADERS, stream=True)
-
-            if response.status_code == 200:
-                self._write_cache(cached_file, cached_file_header, cached_file_content, response)
-            else:
-                print('Error when requesting file :')
-                print('Requested url : %s' % (url,))
-                print('Status code : %s' % (response.status_code,))
-                print('Content : %s' % (response.content,))
-                self.send_response(response.status_code)
-                return response.content
-
-        self._send_content(cached_file_header, cached_file_content)
-
-# Main code that start the HTTP server
-httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)
-httpd.allow_reuse_address = True
-print "Listening on port "+ str(PORT) + " and caching in " + CACHE_ROOT + "(Press Ctrl+C to stop HTTPD Caching script)"
-signal.signal(signal.SIGINT, signal_handler)
-httpd.serve_forever()
\ No newline at end of file
index 36829dd..fe9e991 100755 (executable)
@@ -27,11 +27,11 @@ if [ $# -eq 1 ]
                echo 'input parameter is set (proxy http)';
                export http_proxy=$1
                export https_proxy=$1
-       else 
+       else
                echo 'input parameter is not set (proxy http)';
 fi
 
 echo 'Installing requests packages for Python'
 pip install requests
 echo 'Executing the Http proxy in Cache mode only'
-python sdc_proxy.py --port 8080 --root /usr/src/http-cache-app/data-cache
+python third_party_proxy.py --port 8080 --root /usr/src/http-cache-app/data-cache
diff --git a/src/test/resources/http-cache/third_party_proxy.py b/src/test/resources/http-cache/third_party_proxy.py
new file mode 100755 (executable)
index 0000000..72ea495
--- /dev/null
@@ -0,0 +1,251 @@
+#!/usr/bin/env python2
+###
+# ============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============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+###
+
+import json
+import requests
+import os
+import sys
+import SimpleHTTPServer
+import SocketServer
+import argparse
+import tempfile
+import signal
+import uuid
+import shutil
+
+parser = argparse.ArgumentParser(description="3rd party Cache & Replay")
+parser.add_argument("--username", "-u", type=str, help="Set the username for contacting 3rd party - only used for GET")
+parser.add_argument("--password", "-p", type=str, help="Set the password for contacting 3rd party - only used for GET")
+parser.add_argument("--root",     "-r", default=tempfile.mkdtemp, type=str, help="Root folder for the proxy cache")
+parser.add_argument("--proxy"         , type=str, help="Url of the  Act as a proxy. If not set, this script only uses the cache and will return a 404 if files aren't found")
+parser.add_argument("--port",     "-P", type=int, default="8081", help="Port on which the proxy should listen to")
+parser.add_argument("--verbose",  "-v", type=bool, help="Print more information in case of error")
+options = parser.parse_args()
+
+
+PORT = options.port
+HOST = options.proxy
+AUTH = (options.username, options.password)
+HEADERS = {'X-ECOMP-InstanceID':'CLAMP'}
+CACHE_ROOT = options.root
+
+def signal_handler(signal_sent, frame):
+    global httpd
+    if signal_sent == signal.SIGINT:
+        print('Got Ctrl-C (SIGINT)')
+        httpd.socket.close()
+        httpd.shutdown()
+        httpd.server_close()
+
+class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
+
+    def print_headers(self):
+        for header,value in self.headers.items():
+            print("header: %s : %s" % (header, value))
+
+    def check_credentials(self):
+        pass
+
+    def _send_content(self, header_file, content_file):
+        self.send_response(200)
+        with open(header_file, 'rb') as f:
+            headers = json.load(f)
+            for key,value in headers.items():
+                if key in ('Transfer-Encoding',):
+                    continue
+                self.send_header(key, value)
+            self.end_headers()
+        with open(content_file,'rb') as f:
+            fc = f.read()
+            self.wfile.write(fc)
+
+    def _write_cache(self,cached_file, header_file, content_file, response):
+        os.makedirs(cached_file, True)
+        with open(content_file, 'w') as f:
+            f.write(response.raw.read())
+        with open(header_file, 'w') as f:
+            json.dump(dict(response.raw.headers), f)
+    # Entry point of the code
+    def do_GET(self):
+        print("\n\n\nGot a GET request for %s " % self.path)
+
+        self.print_headers()
+        self.check_credentials()
+
+        cached_file = '%s/%s' % (CACHE_ROOT, self.path,)
+        print("Cached file name before escaping : %s" % cached_file)
+        cached_file = cached_file.replace('<','&#60;').replace('>','&#62;').replace('?','&#63;').replace('*','&#42;').replace('\\','&#42;').replace(':','&#58;').replace('|','&#124;')
+        print("Cached file name after escaping (used for cache storage) : %s" % cached_file)
+        cached_file_content = "%s/.file" % (cached_file,)
+        cached_file_header = "%s/.header" % (cached_file,)
+
+        _file_available = os.path.exists(cached_file_content)
+
+        if not _file_available:
+            print("Request for data currently not present in cache: %s" % (cached_file,))
+
+            if self.path.startswith("/dcae-service-types?asdcResourceId="):
+                print "self.path start with /dcae-service-types?asdcResourceId=, generating response json..."
+                uuidGenerated = str(uuid.uuid4())
+                typeId = "typeId-" + uuidGenerated
+                typeName = "typeName-" + uuidGenerated
+                print "typeId generated: " + typeName + " and typeName: "+ typeId
+                jsonGenerated = "{\"totalCount\":1, \"items\":[{\"typeId\":\"" + typeId + "\", \"typeName\":\"" + typeName +"\"}]}"
+                print "jsonGenerated: " + jsonGenerated
+
+                os.makedirs(cached_file, True)
+                with open(cached_file_header, 'w') as f:
+                    f.write("{\"Content-Length\": \"144\", \"Content-Type\": \"application/json\"}")
+                with open(cached_file_content, 'w') as f:
+                    f.write(jsonGenerated)
+            else:
+                if not HOST:
+                    self.send_response(404)
+                    return "404 Not found"
+
+                url = '%s%s' % (HOST, self.path)
+                response = requests.get(url, auth=AUTH, headers=HEADERS, stream=True)
+
+                if response.status_code == 200:
+                    self._write_cache(cached_file, cached_file_header, cached_file_content, response)
+                else:
+                    print('Error when requesting file :')
+                    print('Requested url : %s' % (url,))
+                    print('Status code : %s' % (response.status_code,))
+                    print('Content : %s' % (response.content,))
+                    self.send_response(response.status_code)
+                    return response.content
+        else:
+            print("Request for data currently present in cache: %s" % (cached_file,))
+
+        self._send_content(cached_file_header, cached_file_content)
+
+        if self.path.startswith("/dcae-service-types?asdcResourceId="):
+            print "DCAE case deleting folder created " + cached_file
+            shutil.rmtree(cached_file, ignore_errors=False, onerror=None)
+        else:
+            print "NOT in DCAE case deleting folder created " + cached_file
+
+    def do_POST(self):
+        print("\n\n\nGot a POST for %s" % self.path)
+        self.check_credentials()
+        self.data_string = self.rfile.read(int(self.headers['Content-Length']))
+        print("data-string:\n %s" % self.data_string)
+        print("self.headers:\n %s" % self.headers)
+
+        cached_file = '%s/%s' % (CACHE_ROOT, self.path,)
+        print("Cached file name before escaping : %s" % cached_file)
+        cached_file = cached_file.replace('<','&#60;').replace('>','&#62;').replace('?','&#63;').replace('*','&#42;').replace('\\','&#42;').replace(':','&#58;').replace('|','&#124;')
+        print("Cached file name after escaping (used for cache storage) : %s" % cached_file)
+        cached_file_content = "%s/.file" % (cached_file,)
+        cached_file_header = "%s/.header" % (cached_file,)
+
+        _file_available = os.path.exists(cached_file_content)
+
+        if not _file_available:
+            if self.path.startswith("/sdc/v1/catalog/services/"):
+                print "self.path start with /sdc/v1/catalog/services/, generating response json..."
+                jsondata = json.loads(self.data_string)
+                jsonGenerated = "{\"artifactName\":\"" + jsondata['artifactName'] + "\",\"artifactType\":\"" + jsondata['artifactType'] + "\",\"artifactURL\":\"" + self.path + "\",\"artifactDescription\":\"" + jsondata['description'] + "\",\"artifactChecksum\":\"ZjJlMjVmMWE2M2M1OTM2MDZlODlmNTVmZmYzNjViYzM=\",\"artifactUUID\":\"" + str(uuid.uuid4()) + "\",\"artifactVersion\":\"1\"}"
+                print "jsonGenerated: " + jsonGenerated
+
+                os.makedirs(cached_file, True)
+                with open(cached_file_header, 'w') as f:
+                    f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
+                with open(cached_file_content, 'w') as f:
+                    f.write(jsonGenerated)
+            else:
+                if not HOST:
+                    self.send_response(404)
+                    return "404 Not found"
+
+                print("Request for data currently not present in cache: %s" % (cached_file,))
+
+                url = '%s%s' % (HOST, self.path)
+                print("url: %s" % (url,))
+                response = requests.post(url, data=self.data_string, headers=self.headers, stream=True)
+
+                if response.status_code == 200:
+                    self._write_cache(cached_file, cached_file_header, cached_file_content, response)
+                else:
+                    print('Error when requesting file :')
+                    print('Requested url : %s' % (url,))
+                    print('Status code : %s' % (response.status_code,))
+                    print('Content : %s' % (response.content,))
+                    self.send_response(response.status_code)
+                    return response.content
+        else:
+            print("Request for data present in cache: %s" % (cached_file,))
+
+        self._send_content(cached_file_header, cached_file_content)
+
+    def do_PUT(self):
+        print("\n\n\nGot a PUT for %s " % self.path)
+        self.check_credentials()
+        self.data_string = self.rfile.read(int(self.headers['Content-Length']))
+        print("data-string:\n %s" % self.data_string)
+        print("self.headers:\n %s" % self.headers)
+
+        cached_file = '%s/%s' % (CACHE_ROOT, self.path,)
+        print("Cached file name before escaping : %s" % cached_file)
+        cached_file = cached_file.replace('<','&#60;').replace('>','&#62;').replace('?','&#63;').replace('*','&#42;').replace('\\','&#42;').replace(':','&#58;').replace('|','&#124;')
+        print("Cached file name after escaping (used for cache storage) : %s" % cached_file)
+        cached_file_content = "%s/.file" % (cached_file,)
+        cached_file_header = "%s/.header" % (cached_file,)
+
+        _file_available = os.path.exists(cached_file_content)
+        if not _file_available and not HOST:
+            print("No file corresponding in cache and no HOST specified: %s" % HOST)
+            self.send_response(404)
+            return "404 Not found"
+
+        if not _file_available:
+            print("Request for data currently not present in cache: %s" % (cached_file,))
+
+            url = '%s%s' % (HOST, self.path)
+            print("url: %s" % (url,))
+            response = requests.put(url, data=self.data_string, headers=self.headers, stream=True)
+
+            if response.status_code == 200:
+                self._write_cache(cached_file, cached_file_header, cached_file_content, response)
+            else:
+                print('Error when requesting file :')
+                print('Requested url : %s' % (url,))
+                print('Status code : %s' % (response.status_code,))
+                print('Content : %s' % (response.content,))
+                self.send_response(response.status_code)
+                return response.content
+        else:
+            print("Request for data present in cache: %s" % (cached_file,))
+
+        self._send_content(cached_file_header, cached_file_content)
+
+
+
+# Main code that start the HTTP server
+httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)
+httpd.allow_reuse_address = True
+print "Listening on port "+ str(PORT) + " and caching in " + CACHE_ROOT + "(Press Ctrl+C to stop HTTPD Caching script)"
+signal.signal(signal.SIGINT, signal_handler)
+httpd.serve_forever()
\ No newline at end of file