aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/docker/kibana/Dockerfile.kibana58
-rw-r--r--src/main/docker/kibana/README.md0
-rwxr-xr-xsrc/main/docker/kibana/backup.py89
-rwxr-xr-xsrc/main/docker/kibana/restore.py115
-rw-r--r--src/main/docker/kibana/saved-objects/default/config/config-6.1.3.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/dashboard/dashboard-AWI-9KyytmDBG_mksMZL.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/index-pattern/index-pattern-AWIk7j2UDjJ4k3sPXRaY.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/search/search-AWIk8yDIDjJ4k3sPXRbu.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/search/search-AWIk9P-qDjJ4k3sPXRcQ.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/search/search-AWIlAjTaDjJ4k3sPXRe1.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/search/search-AWJsTEvYr1AwiIiFoV6S.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI91Rvl8kHy-lwNJZrN.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI922pp8kHy-lwNJZrP.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI967sW8kHy-lwNJZrR.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk-5O-DjJ4k3sPXRd1.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk_VLEDjJ4k3sPXReS.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIlBLT7DjJ4k3sPXRe7.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoFDTyr1AwiIiFoV5R.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoJdIjr1AwiIiFoV5T.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoMx0_r1AwiIiFoV5V.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJsT-HUr1AwiIiFoV6T.json1
-rw-r--r--src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJxqD67B2zw2CQxMIeq.json1
-rwxr-xr-xsrc/main/docker/kibana/startup.sh81
-rw-r--r--src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java40
-rw-r--r--src/main/java/org/onap/clamp/clds/client/DcaeHttpConnectionManager.java11
-rw-r--r--src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java26
-rw-r--r--src/main/java/org/onap/clamp/clds/exception/CldsDelegateException.java59
-rw-r--r--src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java153
-rw-r--r--src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java4
-rw-r--r--src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java16
-rw-r--r--src/test/java/org/onap/clamp/clds/it/HttpsItCase.java3
-rw-r--r--src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java8
32 files changed, 567 insertions, 114 deletions
diff --git a/src/main/docker/kibana/Dockerfile.kibana b/src/main/docker/kibana/Dockerfile.kibana
new file mode 100644
index 000000000..993edd4a2
--- /dev/null
+++ b/src/main/docker/kibana/Dockerfile.kibana
@@ -0,0 +1,58 @@
+###
+# ============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============================================
+# ===================================================================
+#
+###
+
+FROM docker.elastic.co/kibana/kibana-oss:6.1.3
+
+MAINTAINER "The Onap Team"
+LABEL Description="Kibana image with saved objects loading"
+USER root
+RUN yum install -y python-requests && yum clean all
+
+# You can share volume on this folder to restore
+# a default kibana configuration. Each subfolder will
+# be considered as a saved-object folder generated by,
+# the backup.py script bundled with the image.
+# Structure example :
+# saved-objects/
+# └── default
+# ├── config
+# │   └── config-6.1.3.json
+# ├── dashboard
+# │   └── dashboard-e6a82230-c190-11e8-a550-27f2e3138fee.json
+# ├── index-pattern
+# │   └── index-pattern-3ecb1c70-c190-11e8-a550-27f2e3138fee.json
+# ├── search
+# │   └── search-abdd0440-c190-11e8-a550-27f2e3138fee.json
+# └── visualization
+# ├── visualization-cb896270-c190-11e8-a550-27f2e3138fee.json
+# └── visualization-d837b120-c190-11e8-a550-27f2e3138fee.json
+
+RUN mkdir /saved-objects/
+
+USER kibana
+
+ADD saved-objects /saved-objects
+ADD startup.sh /usr/local/bin/startup.sh
+ADD restore.py /usr/local/bin/restore.py
+ADD backup.py /usr/local/bin/backup.py
+CMD /usr/local/bin/startup.sh
diff --git a/src/main/docker/kibana/README.md b/src/main/docker/kibana/README.md
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/src/main/docker/kibana/README.md
diff --git a/src/main/docker/kibana/backup.py b/src/main/docker/kibana/backup.py
new file mode 100755
index 000000000..4127eb23c
--- /dev/null
+++ b/src/main/docker/kibana/backup.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+###
+# ============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============================================
+# ===================================================================
+#
+###
+
+import json
+import logging
+import os
+import sys
+
+import requests
+
+PER_PAGE = 1000
+
+def parse_args(args):
+ """ Parse arguments given to this script"""
+ import argparse
+ parser = argparse.ArgumentParser(
+ description=('Description of the script'))
+ parser.add_argument('-v', '--verbose', dest='log_level', action='store_const',
+ const=logging.DEBUG, default=logging.INFO,
+ help='Use verbose logging')
+ parser.add_argument('-C', '--configuration_path',
+ default='./default',
+ help='Path of the configuration to be backed up.')
+ parser.add_argument('-f', '--force', action='store_const',
+ const=True, default=False,
+ help=('If the save folder already exists, overwrite files'
+ ' matching a configuration item that should be written.'
+ ' Files already in the folder that do not match are'
+ ' left as-is.'))
+ parser.add_argument('-H', '--kibana-host', default='http://localhost:5601',
+ help='Kibana endpoint.')
+
+ return parser.parse_args(args)
+
+def get_logger(args):
+ """Creates the logger based on the provided arguments"""
+ logging.basicConfig()
+ logger = logging.getLogger(__name__)
+ logger.setLevel(args.log_level)
+ return logger
+
+def main():
+ """ This script dumps the kibana configuration from Kibana"""
+ args = parse_args(sys.argv[1:])
+
+ base_config_path = args.configuration_path
+
+ # get list of all objects available
+ url = "%s/api/saved_objects/" % (args.kibana_host.rstrip("/"),)
+ saved_objects_req = requests.get(url,
+ params={'per_page': PER_PAGE})
+
+ saved_objects = saved_objects_req.json()['saved_objects']
+
+ for obj in saved_objects:
+
+ obj_folder = os.path.sep.join((base_config_path, obj['type']))
+
+ if not os.path.exists(obj_folder):
+ os.makedirs(obj_folder)
+
+ filename = "%s/%s-%s.json" % (obj_folder, obj['type'], obj['id'])
+ with open(filename, 'w') as file:
+ json.dump(obj, fp=file)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/main/docker/kibana/restore.py b/src/main/docker/kibana/restore.py
new file mode 100755
index 000000000..70f430c57
--- /dev/null
+++ b/src/main/docker/kibana/restore.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+###
+# ============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============================================
+# ===================================================================
+#
+###
+import json
+import logging
+import os
+import sys
+
+import requests
+
+if sys.version_info < (3,):
+ # for HTTPStatus.OK only
+ import httplib as HTTPStatus
+else:
+ from http import HTTPStatus
+
+
+
+OBJECT_TYPES = ['index-pattern', 'config', 'search', 'visualization', 'dashboard']
+
+def parse_args(args):
+ """ Parse arguments given to this script"""
+ import argparse
+ parser = argparse.ArgumentParser(
+ description=('Restores the kibana configuration.'))
+ parser.add_argument('-v', '--verbose', dest='log_level', action='store_const',
+ const=logging.DEBUG, default=logging.INFO,
+ help='Use verbose logging')
+ parser.add_argument('-C', '--configuration_path',
+ default='./default',
+ help=('Path of the configuration to be restored.'
+ 'Should contain at least one folder named %s or %s' %
+ (','.join(OBJECT_TYPES[:-1]), OBJECT_TYPES[-1])
+ )
+ )
+ parser.add_argument('-H', '--kibana-host', default='http://localhost:5601',
+ help='Kibana endpoint.')
+ parser.add_argument('-f', '--force', action='store_const',
+ const=True, default=False,
+ help='Overwrite configuration if needed.')
+
+ return parser.parse_args(args)
+
+def get_logger(args):
+ """Creates the logger based on the provided arguments"""
+ logging.basicConfig()
+ logger = logging.getLogger(__name__)
+ logger.setLevel(args.log_level)
+ return logger
+
+def main():
+ ''' Main script function'''
+ args = parse_args(sys.argv[1:])
+ logger = get_logger(args)
+ base_config_path = args.configuration_path
+
+ # order to ensure dependency order is ok
+ for obj_type in OBJECT_TYPES:
+ obj_dir = os.path.sep.join((base_config_path, obj_type))
+
+ if not os.path.exists(obj_dir):
+ logger.info('No %s to restore, skipping.', obj_type)
+ continue
+
+ for obj_filename in os.listdir(obj_dir):
+ with open(os.path.sep.join((obj_dir, obj_filename))) as obj_file:
+ payload = obj_file.read()
+
+ obj = json.loads(payload)
+
+ obj_id = obj['id']
+ for key in ('id', 'version', 'type', 'updated_at'):
+ try:
+ del obj[key]
+ except KeyError:
+ logger.info("Could not find key %s in %s[%s]", key, obj_type, obj_id)
+
+ logger.info('Restoring %s id:%s (overwrite:%s)', obj_type, obj_id, args.force)
+ url = "%s/api/saved_objects/%s/%s" % (args.kibana_host.rstrip("/"), obj_type, obj_id)
+ params = {'overwrite': True} if args.force else {}
+ post_object_req = requests.post(url,
+ headers={'content-type': 'application/json',
+ 'kbn-xsrf': 'True'},
+ params=params,
+ data=json.dumps(obj))
+ if post_object_req.status_code == HTTPStatus.OK:
+ logger.info('%s id:%s restored.', obj_type, obj_id)
+ else:
+ logger.warning(('Something bad happend while restoring %s id:%s. '
+ ' Received status code: %s'),
+ obj_type, obj_id, post_object_req.status_code)
+ logger.warning('Body: %s', post_object_req.content)
+
+if __name__ == "__main__":
+ main()
diff --git a/src/main/docker/kibana/saved-objects/default/config/config-6.1.3.json b/src/main/docker/kibana/saved-objects/default/config/config-6.1.3.json
new file mode 100644
index 000000000..e51ec1db2
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/config/config-6.1.3.json
@@ -0,0 +1 @@
+{"attributes": {"buildNum": 15610, "defaultIndex": "AWIk7j2UDjJ4k3sPXRaY"}, "version": 8, "type": "config", "id": "6.1.3"}
diff --git a/src/main/docker/kibana/saved-objects/default/dashboard/dashboard-AWI-9KyytmDBG_mksMZL.json b/src/main/docker/kibana/saved-objects/default/dashboard/dashboard-AWI-9KyytmDBG_mksMZL.json
new file mode 100644
index 000000000..38c0a4dd9
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/dashboard/dashboard-AWI-9KyytmDBG_mksMZL.json
@@ -0,0 +1 @@
+{"attributes": {"timeRestore": false, "description": "", "title": "CLAMP Dashboard", "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}}}},\"P-6\":{\"vis\":{\"legendOpen\":true}},\"P-8\":{\"vis\":{\"defaultColors\":{\"0 - 4\":\"rgb(0,104,55)\",\"4 - 6\":\"rgb(255,255,190)\",\"7 - 10\":\"rgb(165,0,38)\"},\"legendOpen\":false}},\"P-9\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}}", "panelsJSON": "[{\"col\":5,\"id\":\"AWIk_VLEDjJ4k3sPXReS\",\"panelIndex\":1,\"row\":1,\"size_x\":4,\"size_y\":3,\"type\":\"visualization\"},{\"col\":9,\"id\":\"AWIlBLT7DjJ4k3sPXRe7\",\"panelIndex\":2,\"row\":1,\"size_x\":4,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"id\":\"AWI967sW8kHy-lwNJZrR\",\"panelIndex\":3,\"row\":7,\"size_x\":5,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"id\":\"AWI91Rvl8kHy-lwNJZrN\",\"panelIndex\":4,\"row\":4,\"size_x\":5,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"id\":\"AWJoFDTyr1AwiIiFoV5R\",\"panelIndex\":5,\"row\":1,\"size_x\":4,\"size_y\":3,\"type\":\"visualization\"},{\"col\":9,\"id\":\"AWJoJdIjr1AwiIiFoV5T\",\"panelIndex\":6,\"row\":7,\"size_x\":4,\"size_y\":3,\"type\":\"visualization\"},{\"col\":9,\"id\":\"AWJoMx0_r1AwiIiFoV5V\",\"panelIndex\":7,\"row\":4,\"size_x\":4,\"size_y\":3,\"type\":\"visualization\"},{\"col\":6,\"id\":\"AWJsT-HUr1AwiIiFoV6T\",\"panelIndex\":8,\"row\":4,\"size_x\":3,\"size_y\":6,\"type\":\"visualization\"},{\"size_x\":6,\"size_y\":3,\"panelIndex\":9,\"type\":\"visualization\",\"id\":\"AWJxqD67B2zw2CQxMIeq\",\"col\":1,\"row\":10}]", "optionsJSON": "{\"darkTheme\":false}", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[{\"query\":{\"match_all\":{}}}],\"highlightAll\":true,\"version\":true}"}}, "version": 3, "type": "dashboard", "id": "AWI-9KyytmDBG_mksMZL"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/index-pattern/index-pattern-AWIk7j2UDjJ4k3sPXRaY.json b/src/main/docker/kibana/saved-objects/default/index-pattern/index-pattern-AWIk7j2UDjJ4k3sPXRaY.json
new file mode 100644
index 000000000..e2d5da6d4
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/index-pattern/index-pattern-AWIk7j2UDjJ4k3sPXRaY.json
@@ -0,0 +1 @@
+{"attributes": {"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\":false,\"readFromDocValues\":false},{\"name\":\"@version.keyword\",\"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.city\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.complex.city.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.complex.state\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.complex.state.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-id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.generic-vnf.vnf-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.generic-vnf.vnf-type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.generic-vnf.vnf-type.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.interface-name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.l-interface.interface-name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"AAI.vserver.l-interface.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.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.l-interface.network-name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"AAI.vserver.l-interface.network-name.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\":\"_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\":\"action\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"action.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"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\":\"eNodeB.cell_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eNodeB.cell_id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eNodeB.common_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eNodeB.common_id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eNodeB.datetime\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eNodeB.datetime.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eNodeB.ems_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eNodeB.ems_id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eNodeB.oam_ip\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eNodeB.oam_ip.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eNodeB.software_version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eNodeB.software_version.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eNodeB.vendor\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eNodeB.vendor.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"eventDetails\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"eventDetails.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\":\"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\":\"host\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"host.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"message\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"message.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\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"path\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"path.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\":\"resourceInstance.resourceInstanceName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"resourceInstance.resourceInstanceName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"resourceInstance.resourceName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"resourceInstance.resourceName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"serviceInstance.serviceInstanceName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"serviceInstance.serviceInstanceName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"serviceInstance.serviceName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"serviceInstance.serviceName.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"status.code\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"status.code.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"status.description\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"status.description.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"subRequestID\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"subRequestID.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\":\"type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"type.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.containsKey('closedLoopEventStatus') && 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}]", "notExpandable": true, "fieldFormatMap": "{\"eventDuration\":{\"id\":\"duration\",\"params\":{\"inputFormat\":\"milliseconds\"}}}", "timeFieldName": "closedLoopAlarmStart", "title": "events-*"}, "version": 4, "type": "index-pattern", "id": "AWIk7j2UDjJ4k3sPXRaY"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/search/search-AWIk8yDIDjJ4k3sPXRbu.json b/src/main/docker/kibana/saved-objects/default/search/search-AWIk8yDIDjJ4k3sPXRbu.json
new file mode 100644
index 000000000..6dfd1e4f3
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/search/search-AWIk8yDIDjJ4k3sPXRbu.json
@@ -0,0 +1 @@
+{"attributes": {"sort": ["closedLoopAlarmStart", "desc"], "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\"}}]}"}, "description": "", "columns": ["closedLoopAlarmStart", "closedLoopAlarmEnd", "closedLoopControlName", "closedLoopEventStatus", "notification"], "title": "ONSET"}, "version": 3, "type": "search", "id": "AWIk8yDIDjJ4k3sPXRbu"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/search/search-AWIk9P-qDjJ4k3sPXRcQ.json b/src/main/docker/kibana/saved-objects/default/search/search-AWIk9P-qDjJ4k3sPXRcQ.json
new file mode 100644
index 000000000..1c7a1d013
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/search/search-AWIk9P-qDjJ4k3sPXRcQ.json
@@ -0,0 +1 @@
+{"attributes": {"sort": ["closedLoopAlarmStart", "desc"], "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\"}}]}"}, "description": "", "columns": ["closedLoopAlarmStart", "closedLoopAlarmEnd", "closedLoopControlName", "closedLoopEventStatus", "notification"], "title": "ABATED"}, "version": 3, "type": "search", "id": "AWIk9P-qDjJ4k3sPXRcQ"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/search/search-AWIlAjTaDjJ4k3sPXRe1.json b/src/main/docker/kibana/saved-objects/default/search/search-AWIlAjTaDjJ4k3sPXRe1.json
new file mode 100644
index 000000000..17329e4ea
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/search/search-AWIlAjTaDjJ4k3sPXRe1.json
@@ -0,0 +1 @@
+{"attributes": {"sort": ["closedLoopAlarmStart", "desc"], "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\"}}}}]}"}, "description": "", "columns": ["closedLoopAlarmStart", "closedLoopAlarmEnd", "closedLoopControlName", "closedLoopEventStatus", "notification"], "title": "FAILURE NOTIFICATION"}, "version": 3, "type": "search", "id": "AWIlAjTaDjJ4k3sPXRe1"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/search/search-AWJsTEvYr1AwiIiFoV6S.json b/src/main/docker/kibana/saved-objects/default/search/search-AWJsTEvYr1AwiIiFoV6S.json
new file mode 100644
index 000000000..d99e28fa2
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/search/search-AWJsTEvYr1AwiIiFoV6S.json
@@ -0,0 +1 @@
+{"attributes": {"sort": ["closedLoopAlarmStart", "desc"], "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"highlightAll\":true,\"version\":true,\"query\":{\"match_all\":{}},\"filter\":[{\"meta\":{\"negate\":false,\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"type\":\"phrase\",\"key\":\"notification\",\"value\":\"FINAL: FAILURE\",\"disabled\":false,\"alias\":null},\"query\":{\"match\":{\"notification\":{\"query\":\"FINAL: FAILURE\",\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}}]}"}, "description": "", "columns": ["notification"], "title": "FINAL: FAILURE"}, "version": 3, "type": "search", "id": "AWJsTEvYr1AwiIiFoV6S"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI91Rvl8kHy-lwNJZrN.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI91Rvl8kHy-lwNJZrN.json
new file mode 100644
index 000000000..0304a9a21
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI91Rvl8kHy-lwNJZrN.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"CL efficiency - CL reponse time\",\"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\":{}}", "description": "", "title": "CL efficiency - CL reponse time", "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "savedSearchId": "AWIk9P-qDjJ4k3sPXRcQ", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWI91Rvl8kHy-lwNJZrN"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI922pp8kHy-lwNJZrP.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI922pp8kHy-lwNJZrP.json
new file mode 100644
index 000000000..356933328
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI922pp8kHy-lwNJZrP.json
@@ -0,0 +1 @@
+{"attributes": {"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\":{}}", "description": "", "title": "CLEventDurationTables", "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "savedSearchId": "AWIk9P-qDjJ4k3sPXRcQ", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWI922pp8kHy-lwNJZrP"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI967sW8kHy-lwNJZrR.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI967sW8kHy-lwNJZrR.json
new file mode 100644
index 000000000..056a1516b
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWI967sW8kHy-lwNJZrR.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"CL Total Activity\",\"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\":{}}", "description": "", "title": "CL Total Activity", "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "savedSearchId": "AWIk9P-qDjJ4k3sPXRcQ", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWI967sW8kHy-lwNJZrR"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk-5O-DjJ4k3sPXRd1.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk-5O-DjJ4k3sPXRd1.json
new file mode 100644
index 000000000..497fac5b5
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk-5O-DjJ4k3sPXRd1.json
@@ -0,0 +1 @@
+{"attributes": {"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\":{}}", "description": "", "title": "ClosedLoopActivationsTable", "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "savedSearchId": "AWIk8yDIDjJ4k3sPXRbu", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWIk-5O-DjJ4k3sPXRd1"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk_VLEDjJ4k3sPXReS.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk_VLEDjJ4k3sPXReS.json
new file mode 100644
index 000000000..5980b9de8
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIk_VLEDjJ4k3sPXReS.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"Top 5 closed loop success action\",\"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\":{}}", "description": "", "title": "Top 5 closed loop success action", "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "savedSearchId": "AWIk9P-qDjJ4k3sPXRcQ", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWIk_VLEDjJ4k3sPXReS"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIlBLT7DjJ4k3sPXRe7.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIlBLT7DjJ4k3sPXRe7.json
new file mode 100644
index 000000000..72c903ec2
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWIlBLT7DjJ4k3sPXRe7.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"Closed loop failed action : needs attention\",\"type\":\"table\",\"params\":{\"perPage\":5,\"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\":{}}", "description": "", "title": "Closed loop failed action : needs attention", "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "savedSearchId": "AWIlAjTaDjJ4k3sPXRe1", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWIlBLT7DjJ4k3sPXRe7"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoFDTyr1AwiIiFoV5R.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoFDTyr1AwiIiFoV5R.json
new file mode 100644
index 000000000..7ae347163
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoFDTyr1AwiIiFoV5R.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"Hottest closed loops\",\"type\":\"pie\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"type\":\"pie\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}", "description": "", "title": "Hottest closed loops", "uiStateJSON": "{\"vis\":{\"legendOpen\":true}}", "savedSearchId": "AWIk8yDIDjJ4k3sPXRbu", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWJoFDTyr1AwiIiFoV5R"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoJdIjr1AwiIiFoV5T.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoJdIjr1AwiIiFoV5T.json
new file mode 100644
index 000000000..3f0f10179
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoJdIjr1AwiIiFoV5T.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"CL Onset/Abated Variance\",\"type\":\"histogram\",\"params\":{\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":200},\"title\":{\"text\":\"Closed Loop\"}}],\"valueAxes\":[{\"id\":\"ValueAxis-3\",\"name\":\"BottomAxis-1\",\"type\":\"value\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":75,\"filter\":true,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"normal\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-3\",\"drawLinesBetweenPoints\":true,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"type\":\"horizontal_bar\",\"radiusRatio\":\"13\",\"orderBucketsBySum\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"_term\",\"customLabel\":\"Closed Loop\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"closedLoopEventStatus.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"_term\"}}],\"listeners\":{}}", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"query\":{\"match_all\":{}},\"filter\":[]}"}, "uiStateJSON": "{}", "description": "", "title": "CL Onset/Abated Variance"}, "version": 3, "type": "visualization", "id": "AWJoJdIjr1AwiIiFoV5T"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoMx0_r1AwiIiFoV5V.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoMx0_r1AwiIiFoV5V.json
new file mode 100644
index 000000000..bfdcaf220
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJoMx0_r1AwiIiFoV5V.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"CL Efficiency - Total Activity\",\"type\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"closedLoopAlarmStart per 10 seconds\"},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Sum of eventDuration\"},\"drawLinesBetweenPoints\":true,\"interpolate\":\"cardinal\",\"lineWidth\":2,\"mode\":\"normal\",\"show\":\"true\",\"showCircles\":true,\"type\":\"line\",\"valueAxis\":\"ValueAxis-1\"}],\"times\":[],\"type\":\"line\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"defaultYExtents\":true,\"mode\":\"normal\",\"setYExtents\":false,\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Sum of eventDuration\"},\"type\":\"value\"}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"eventDuration\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"closedLoopControlName.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"_term\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"closedLoopAlarmStart\",\"interval\":\"auto\",\"customInterval\":\"2h\",\"min_doc_count\":0,\"extended_bounds\":{}}}],\"listeners\":{}}", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"query\":{\"match_all\":{}},\"filter\":[{\"meta\":{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"negate\":false,\"disabled\":false,\"alias\":null,\"type\":\"exists\",\"key\":\"closedLoopAlarmEnd\",\"value\":\"exists\"},\"exists\":{\"field\":\"closedLoopAlarmEnd\"},\"$state\":{\"store\":\"appState\"}}]}"}, "uiStateJSON": "{}", "description": "", "title": "CL Efficiency - Total Activity"}, "version": 3, "type": "visualization", "id": "AWJoMx0_r1AwiIiFoV5V"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJsT-HUr1AwiIiFoV6T.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJsT-HUr1AwiIiFoV6T.json
new file mode 100644
index 000000000..0bb3a0a03
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJsT-HUr1AwiIiFoV6T.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"CL Efficiency - Failed actions\",\"type\":\"gauge\",\"params\":{\"addLegend\":true,\"addTooltip\":true,\"gauge\":{\"backStyle\":\"Full\",\"colorSchema\":\"Green to Red\",\"colorsRange\":[{\"from\":0,\"to\":4},{\"from\":4,\"to\":6},{\"from\":7,\"to\":10}],\"extendRange\":false,\"gaugeColorMode\":\"Labels\",\"gaugeStyle\":\"Full\",\"gaugeType\":\"Arc\",\"invertColors\":false,\"labels\":{\"color\":\"black\",\"show\":true},\"orientation\":\"vertical\",\"percentageMode\":false,\"scale\":{\"color\":\"#333\",\"labels\":false,\"show\":true},\"style\":{\"bgColor\":false,\"bgFill\":\"#eee\",\"bgMask\":false,\"bgWidth\":0.9,\"fontSize\":60,\"labelColor\":true,\"mask\":false,\"maskBars\":50,\"subText\":\"\",\"width\":0.9},\"type\":\"meter\",\"verticalSplit\":true},\"isDisplayWarning\":true,\"type\":\"gauge\"},\"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\":{}}", "description": "", "title": "CL Efficiency - Failed actions", "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 4\":\"rgb(0,104,55)\",\"4 - 6\":\"rgb(255,255,190)\",\"7 - 10\":\"rgb(165,0,38)\"}}}", "savedSearchId": "AWJsTEvYr1AwiIiFoV6S", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"filter\":[]}"}}, "version": 3, "type": "visualization", "id": "AWJsT-HUr1AwiIiFoV6T"} \ No newline at end of file
diff --git a/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJxqD67B2zw2CQxMIeq.json b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJxqD67B2zw2CQxMIeq.json
new file mode 100644
index 000000000..6bd2cda9d
--- /dev/null
+++ b/src/main/docker/kibana/saved-objects/default/visualization/visualization-AWJxqD67B2zw2CQxMIeq.json
@@ -0,0 +1 @@
+{"attributes": {"visState": "{\"title\":\"Top Error Messages\",\"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\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"history.actor.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Actor\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"history.message.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Message\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"history.operation.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Operation\"}}],\"listeners\":{}}", "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"index\":\"AWIk7j2UDjJ4k3sPXRaY\",\"query\":{\"match_all\":{}},\"filter\":[]}"}, "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "description": "", "title": "Top Error Messages"}, "version": 3, "type": "visualization", "id": "AWJxqD67B2zw2CQxMIeq"} \ No newline at end of file
diff --git a/src/main/docker/kibana/startup.sh b/src/main/docker/kibana/startup.sh
new file mode 100755
index 000000000..bbd9d45d9
--- /dev/null
+++ b/src/main/docker/kibana/startup.sh
@@ -0,0 +1,81 @@
+#!/bin/bash -x
+###
+# ============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============================================
+# ===================================================================
+#
+###
+KIBANA_CONF_FILE="/usr/share/kibana/config/kibana.yml"
+SAVED_OBJECTS_ROOT="/saved-objects/"
+RESTORE_CMD="/usr/local/bin/restore.py -H http://127.0.0.1:5601/ -f"
+BACKUP_BIN="/usr/local/bin/backup.py"
+KIBANA_START_CMD="/usr/local/bin/kibana-docker"
+LOG_FILE="/tmp/load.kibana.log"
+KIBANA_LOAD_CMD="/usr/local/bin/kibana-docker -H 127.0.0.1 -l $LOG_FILE"
+TIMEOUT=60
+WAIT_TIME=2
+
+if [ -n "$(ls -A ${SAVED_OBJECTS_PATH})" ];
+then
+ echo "---- Saved objects found, restoring files."
+
+ $KIBANA_LOAD_CMD &
+ KIB_PID=$!
+
+ # Wait for log file to be avaiable
+ LOG_TIMEOUT=60
+ while [ ! -f $LOG_FILE ] && [ "$LOG_TIMEOUT" -gt "0" ];
+ do
+ echo "Waiting for $LOG_FILE to be available..."
+ sleep $WAIT_TIME
+ let LOG_TIMEOUT=$LOG_TIMEOUT-$WAIT_TIME
+ done
+
+ tail -f $LOG_FILE &
+ LOG_PID=$!
+
+ # Wait for kibana to be listening
+ while [ -z "$(grep "Server running at" $LOG_FILE)" ] && [ "$TIMEOUT" -gt "0" ];
+ do
+ echo "Waiting for kibana to start..."
+ sleep $WAIT_TIME
+ let TIMEOUT=$TIMEOUT-$WAIT_TIME
+ done
+ sleep 1
+
+ # restore files
+ for saved_objects_path in $SAVED_OBJECTS_ROOT/*
+ do
+ echo "Restoring content of $saved_objects_path"
+ $RESTORE_CMD -C $saved_objects_path
+ sleep 1
+ done
+
+ # cleanup
+ kill $KIB_PID
+ kill $LOG_PID
+else
+ echo "---- No saved object found"
+ ls -A ${SAVED_OBJECTS_PATH}
+fi
+
+echo "---- Starting kibana"
+
+$KIBANA_START_CMD
+
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
index 0aca8fb1d..16c18ae0e 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
@@ -49,8 +49,8 @@ public class DcaeDispatcherServices {
protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeDispatcherServices.class);
protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
- @Autowired
- private ClampProperties refProp;
+ private final ClampProperties refProp;
+ private final DcaeHttpConnectionManager dcaeHttpConnectionManager;
private static final String STATUS_URL_LOG = "Status URL extracted: ";
private static final String DCAE_URL_PREFIX = "/dcae-deployments/";
private static final String DCAE_URL_PROPERTY_NAME = "dcae.dispatcher.url";
@@ -58,33 +58,13 @@ public class DcaeDispatcherServices {
private static final String DCAE_LINK_FIELD = "links";
private static final String DCAE_STATUS_FIELD = "status";
- /**
- * Delete the deployment on DCAE.
- *
- * @param deploymentId
- * The deployment ID
- * @return Return the URL Status
- */
- public String deleteDeployment(String deploymentId) {
- Date startTime = new Date();
- LoggingUtils.setTargetContext("DCAE", "deleteDeployment");
- try {
- String url = refProp.getStringValue(DCAE_URL_PROPERTY_NAME) + DCAE_URL_PREFIX + deploymentId;
- String statusUrl = getDcaeResponse(url, "DELETE", null, null, DCAE_LINK_FIELD, DCAE_STATUS_FIELD);
- logger.info(STATUS_URL_LOG + statusUrl);
- LoggingUtils.setResponseContext("0", "Delete deployments success", this.getClass().getName());
- return statusUrl;
- } catch (Exception e) {
- LoggingUtils.setResponseContext("900", "Delete deployments failed", this.getClass().getName());
- LoggingUtils.setErrorContext("900", "Delete deployments error");
- logger.error("Exception occurred during Delete Deployment Operation with DCAE", e);
- throw new DcaeDeploymentException("Exception occurred during Delete Deployment Operation with DCAE", e);
- } finally {
- LoggingUtils.setTimeContext(startTime, new Date());
- metricsLogger.info("deleteDeployment complete");
- }
+ @Autowired
+ public DcaeDispatcherServices(ClampProperties refProp, DcaeHttpConnectionManager dcaeHttpConnectionManager) {
+ this.refProp = refProp;
+ this.dcaeHttpConnectionManager = dcaeHttpConnectionManager;
}
+
public String getOperationStatusWithRetry(String operationStatusUrl) throws InterruptedException {
String operationStatus = "";
for (int i = 0; i < Integer.valueOf(refProp.getStringValue("dcae.dispatcher.retry.limit")); i++) {
@@ -114,7 +94,7 @@ public class DcaeDispatcherServices {
Date startTime = new Date();
LoggingUtils.setTargetContext("DCAE", "getOperationStatus");
try {
- String responseStr = DcaeHttpConnectionManager.doDcaeHttpQuery(statusUrl, "GET", null, null);
+ String responseStr = dcaeHttpConnectionManager.doDcaeHttpQuery(statusUrl, "GET", null, null);
JSONObject jsonObj = parseResponse(responseStr);
String operationType = (String) jsonObj.get("operationType");
String status = (String) jsonObj.get(DCAE_STATUS_FIELD);
@@ -140,7 +120,7 @@ public class DcaeDispatcherServices {
LoggingUtils.setTargetContext("DCAE", "getDeployments");
try {
String url = refProp.getStringValue(DCAE_URL_PROPERTY_NAME) + DCAE_URL_PREFIX;
- DcaeHttpConnectionManager.doDcaeHttpQuery(url, "GET", null, null);
+ dcaeHttpConnectionManager.doDcaeHttpQuery(url, "GET", null, null);
LoggingUtils.setResponseContext("0", "Get deployments success", this.getClass().getName());
} catch (Exception e) {
LoggingUtils.setResponseContext("900", "Get deployments failed", this.getClass().getName());
@@ -228,7 +208,7 @@ public class DcaeDispatcherServices {
String nodeAttr) throws IOException, ParseException {
Date startTime = new Date();
try {
- String responseStr = DcaeHttpConnectionManager.doDcaeHttpQuery(url, requestMethod, payload, contentType);
+ String responseStr = dcaeHttpConnectionManager.doDcaeHttpQuery(url, requestMethod, payload, contentType);
JSONObject jsonObj = parseResponse(responseStr);
JSONObject linksObj = (JSONObject) jsonObj.get(node);
String statusUrl = (String) linksObj.get(nodeAttr);
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeHttpConnectionManager.java b/src/main/java/org/onap/clamp/clds/client/DcaeHttpConnectionManager.java
index bebb6703d..059cc2b20 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeHttpConnectionManager.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeHttpConnectionManager.java
@@ -17,6 +17,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END============================================
+ * Modifications copyright (c) 2018 Nokia
* ===================================================================
*
*/
@@ -38,22 +39,22 @@ import javax.ws.rs.BadRequestException;
import org.apache.commons.io.IOUtils;
import org.onap.clamp.clds.util.LoggingUtils;
+import org.springframework.stereotype.Component;
/**
*
* This class manages the HTTP and HTTPS connections to DCAE.
*
*/
+@Component
public class DcaeHttpConnectionManager {
protected static final EELFLogger logger = EELFManager.getInstance()
.getLogger(DcaeHttpConnectionManager.class);
protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
private static final String DCAE_REQUEST_FAILED_LOG = "Request Failed - response payload=";
- private DcaeHttpConnectionManager() {
- }
- private static String doHttpsQuery(URL url, String requestMethod, String payload, String contentType)
+ private String doHttpsQuery(URL url, String requestMethod, String payload, String contentType)
throws IOException {
logger.info("Using HTTPS URL to contact DCAE:" + url.toString());
HttpsURLConnection secureConnection = (HttpsURLConnection) url.openConnection();
@@ -86,7 +87,7 @@ public class DcaeHttpConnectionManager {
}
}
- private static String doHttpQuery(URL url, String requestMethod, String payload, String contentType)
+ private String doHttpQuery(URL url, String requestMethod, String payload, String contentType)
throws IOException {
LoggingUtils utils = new LoggingUtils (logger);
logger.info("Using HTTP URL to contact DCAE:" + url);
@@ -138,7 +139,7 @@ public class DcaeHttpConnectionManager {
* @throws IOException
* In case of issue with the streams
*/
- public static String doDcaeHttpQuery(String url, String requestMethod, String payload, String contentType)
+ public String doDcaeHttpQuery(String url, String requestMethod, String payload, String contentType)
throws IOException {
URL urlObj = new URL(url);
if (url.contains("https://")) { // Support for HTTPS
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
index 5f2159681..b63bb646d 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
@@ -17,6 +17,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END============================================
+ * Modifications copyright (c) 2018 Nokia
* ===================================================================
*
*/
@@ -60,15 +61,22 @@ public class DcaeInventoryServices {
protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeInventoryServices.class);
protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
- public static final String DCAE_INVENTORY_URL = "dcae.inventory.url";
- public static final String DCAE_INVENTORY_RETRY_INTERVAL = "dcae.intentory.retry.interval";
- public static final String DCAE_INVENTORY_RETRY_LIMIT = "dcae.intentory.retry.limit";
+ private static final String DCAE_INVENTORY_URL = "dcae.inventory.url";
+ private static final String DCAE_INVENTORY_RETRY_INTERVAL = "dcae.intentory.retry.interval";
+ private static final String DCAE_INVENTORY_RETRY_LIMIT = "dcae.intentory.retry.limit";
public static final String DCAE_TYPE_NAME = "typeName";
public static final String DCAE_TYPE_ID = "typeId";
+ private final ClampProperties refProp;
+ private final CldsDao cldsDao;
+ private final DcaeHttpConnectionManager dcaeHttpConnectionManager;
+
@Autowired
- private ClampProperties refProp;
- @Autowired
- private CldsDao cldsDao;
+ public DcaeInventoryServices(ClampProperties refProp, CldsDao cldsDao, DcaeHttpConnectionManager dcaeHttpConnectionManager) {
+ this.refProp = refProp;
+ this.cldsDao = cldsDao;
+ this.dcaeHttpConnectionManager = dcaeHttpConnectionManager;
+ }
+
/**
* Set the event inventory.
@@ -203,7 +211,7 @@ public class DcaeInventoryServices {
}
for (int i = 0; i < retryLimit; i++) {
metricsLogger.info("Attempt n°" + i + " to contact DCAE inventory");
- String response = DcaeHttpConnectionManager.doDcaeHttpQuery(fullUrl, "GET", null, null);
+ String response = dcaeHttpConnectionManager.doDcaeHttpQuery(fullUrl, "GET", null, null);
int totalCount = getTotalCountFromDcaeInventoryResponse(response);
metricsLogger.info("getDcaeInformation complete: totalCount returned=" + totalCount);
if (totalCount > 0) {
@@ -254,7 +262,7 @@ public class DcaeInventoryServices {
String apiBodyString = dcaeServiceTypeRequest.toString();
logger.info("Dcae api Body String - " + apiBodyString);
String url = refProp.getStringValue(DCAE_INVENTORY_URL) + "/dcae-service-types";
- String responseStr = DcaeHttpConnectionManager.doDcaeHttpQuery(url, "POST", apiBodyString,
+ String responseStr = dcaeHttpConnectionManager.doDcaeHttpQuery(url, "POST", apiBodyString,
"application/json");
// If the DCAEServiceTypeRequest is created successfully it will
// return a json object responce containing a node for newly created
@@ -305,7 +313,7 @@ public class DcaeInventoryServices {
if (inventoryResponse != null && inventoryResponse.getTypeId() != null) {
String fullUrl = refProp.getStringValue(DCAE_INVENTORY_URL) + "/dcae-service-types/"
+ inventoryResponse.getTypeId();
- DcaeHttpConnectionManager.doDcaeHttpQuery(fullUrl, "DELETE", null, null);
+ dcaeHttpConnectionManager.doDcaeHttpQuery(fullUrl, "DELETE", null, null);
}
result = true;
} catch (IOException | ParseException e) {
diff --git a/src/main/java/org/onap/clamp/clds/exception/CldsDelegateException.java b/src/main/java/org/onap/clamp/clds/exception/CldsDelegateException.java
deleted file mode 100644
index 22b7e3fdb..000000000
--- a/src/main/java/org/onap/clamp/clds/exception/CldsDelegateException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-
-package org.onap.clamp.clds.exception;
-
-/**
- * New exception to CldsDelegate errors.
- */
-public class CldsDelegateException extends RuntimeException {
-
- /**
- *
- */
- private static final long serialVersionUID = -2705212640916671093L;
-
- /**
- * This constructor can be used to create a new CldsDelegateException.
- *
- * @param message
- * A string message detailing the problem
- * @param e
- * The exception sent by the code
- */
- public CldsDelegateException(String message, Throwable e) {
- super(message, e);
- }
-
- /**
- * This constructor can be used to create a new CldsDelegateException. Use
- * this constructor only if you are creating a new exception stack, not if
- * an exception was already raised by another code.
- *
- * @param message
- * A string message detailing the problem
- */
- public CldsDelegateException(String message) {
- super(message);
- }
-}
diff --git a/src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java b/src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java
new file mode 100644
index 000000000..c828f78a9
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java
@@ -0,0 +1,153 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 Nokia Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.client;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableMap;
+import java.io.IOException;
+import org.assertj.core.api.Assertions;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.clamp.clds.config.ClampProperties;
+
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class DcaeDispatcherServicesTest {
+
+ private static final String DEPLOYMENT_STATUS_URL = "http://portal.api.simpledemo.onap.org:30297/dcae-deployments/"
+ + "closedLoop_c9c8b281-6fbd-4702-ba13-affa90411152_deploymentId/"
+ + "operation/a97b46f6-d77c-42a1-9449-d5ae71e8f688";
+ private static final String DCAE_URL = "dcae_url";
+ private static final String DEPLOY_RESPONSE_STRING = "{\"links\":"
+ + "{\"status\":\"http://deployment-handler.onap:8443/dcae-deployments/"
+ + "closedLoop_152367c8-b172-47b3-9e58-c53add75d869_deploymentId/"
+ + "operation/366eb098-7977-4966-ae82-abd2087edb10\"}}";
+
+ @Mock
+ private ClampProperties clampProperties;
+
+ @Mock
+ DcaeHttpConnectionManager dcaeHttpConnectionManager;
+
+ @InjectMocks
+ DcaeDispatcherServices dcaeDispatcherServices;
+
+ private final String STATUS_RESPONSE_PROCESSING = "{\"operationType\": \"deploy\",\"status\": \"processing\"}";
+ private final String STATUS_RESPONSE_ACTIVE = "{\"operationType\": \"deploy\",\"status\": \"succeeded\"}";
+
+ @Before
+ public void setUp() {
+ ImmutableMap.<String, String>builder()
+ .put("dcae.dispatcher.retry.limit", "3")
+ .put("dcae.dispatcher.retry.interval", "0")
+ .put("dcae.dispatcher.url", DCAE_URL)
+ .build()
+ .forEach((property, value) -> {
+ Mockito.when(clampProperties.getStringValue(Matchers.matches(property), Matchers.any()))
+ .thenReturn(value);
+ Mockito.when(clampProperties.getStringValue(Matchers.matches(property))).thenReturn(value);
+ });
+ }
+
+ @Test
+ public void shouldReturnDcaeOperationSataus() throws IOException {
+ //given
+ Mockito.when(dcaeHttpConnectionManager.doDcaeHttpQuery(DEPLOYMENT_STATUS_URL, "GET", null, null))
+ .thenReturn(STATUS_RESPONSE_PROCESSING);
+ //when
+ String operationStatus = dcaeDispatcherServices.getOperationStatus(DEPLOYMENT_STATUS_URL);
+
+ //then
+ Assertions.assertThat(operationStatus).isEqualTo("processing");
+ }
+
+ @Test
+ public void shouldTryMultipleTimesWhenProcessing() throws IOException, InterruptedException {
+ //given
+ Mockito.when(dcaeHttpConnectionManager.doDcaeHttpQuery(DEPLOYMENT_STATUS_URL, "GET",
+ null, null))
+ .thenReturn(STATUS_RESPONSE_PROCESSING, STATUS_RESPONSE_PROCESSING, STATUS_RESPONSE_ACTIVE);
+ //when
+ String operationStatus = dcaeDispatcherServices.getOperationStatusWithRetry(DEPLOYMENT_STATUS_URL);
+
+ //then
+ Assertions.assertThat(operationStatus).isEqualTo("succeeded");
+ Mockito.verify(dcaeHttpConnectionManager, Mockito.times(3))
+ .doDcaeHttpQuery(DEPLOYMENT_STATUS_URL, "GET", null, null);
+
+ }
+
+ @Test
+ public void shouldTryOnlyAsManyTimesAsConfigured() throws IOException, InterruptedException {
+ //given
+ Mockito.when(dcaeHttpConnectionManager
+ .doDcaeHttpQuery(DEPLOYMENT_STATUS_URL, "GET", null, null))
+ .thenReturn(STATUS_RESPONSE_PROCESSING, STATUS_RESPONSE_PROCESSING, STATUS_RESPONSE_PROCESSING,
+ STATUS_RESPONSE_PROCESSING, STATUS_RESPONSE_PROCESSING);
+ //when
+ String operationStatus = dcaeDispatcherServices.getOperationStatusWithRetry(DEPLOYMENT_STATUS_URL);
+
+ //then
+ Assertions.assertThat(operationStatus).isEqualTo("processing");
+ Mockito.verify(dcaeHttpConnectionManager, Mockito.times(3))
+ .doDcaeHttpQuery(DEPLOYMENT_STATUS_URL, "GET", null, null);
+
+ }
+
+ @Test
+ public void shouldTriggerDeploymentCreation() throws IOException {
+ //given
+ String deploymentID = "closedLoop_152367c8-b172-47b3-9e58-c53add75d869_deploymentId";
+ String serviceTypeId = "e2ba40f7-bf42-41e7-acd7-48fd07586d90";
+ Mockito.when(clampProperties.getJsonTemplate("dcae.deployment.template"))
+ .thenReturn(new ObjectMapper().readTree("{}"));
+
+ Mockito.when(dcaeHttpConnectionManager
+ .doDcaeHttpQuery(DCAE_URL
+ + "/dcae-deployments/closedLoop_152367c8-b172-47b3-9e58-c53add75d869_deploymentId",
+ "PUT",
+ "{\"serviceTypeId\":\"e2ba40f7-bf42-41e7-acd7-48fd07586d90\",\"inputs\":{}}",
+ "application/json"))
+ .thenReturn(DEPLOY_RESPONSE_STRING);
+ JsonNode blueprintInputJson = new ObjectMapper().readTree("{}");
+
+ //when
+ String operationStatus = dcaeDispatcherServices
+ .createNewDeployment(deploymentID, serviceTypeId, blueprintInputJson);
+
+ //then
+ Assertions.assertThat(operationStatus).isEqualTo("http://deployment-handler.onap:8443/"
+ + "dcae-deployments/closedLoop_152367c8-b172-47b3-9e58-c53add75d869_deploymentId/"
+ + "operation/366eb098-7977-4966-ae82-abd2087edb10");
+
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
index 7a37a9dc2..baf4673c1 100644
--- a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
@@ -38,7 +38,6 @@ import java.security.GeneralSecurityException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
-
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.NotFoundException;
import javax.xml.transform.TransformerException;
@@ -69,9 +68,10 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
diff --git a/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java b/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java
index 264853cd4..12e8dd90d 100644
--- a/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java
@@ -17,6 +17,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END============================================
+ * Modifications copyright (c) 2018 Nokia
* ===================================================================
*
*/
@@ -45,6 +46,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.onap.clamp.clds.client.DcaeHttpConnectionManager;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
@@ -63,6 +65,10 @@ public class DcaeHttpConnectionManagerItCase {
private String httpsPort;
@Value("${server.http-to-https-redirection.port}")
private String httpPort;
+
+ @Autowired
+ DcaeHttpConnectionManager dcaeHttpConnectionManager;
+
private static TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@@ -103,7 +109,7 @@ public class DcaeHttpConnectionManagerItCase {
@Test
public void testHttpGet() throws Exception {
- String response = DcaeHttpConnectionManager
+ String response = dcaeHttpConnectionManager
.doDcaeHttpQuery("http://localhost:" + this.httpPort + "/designer/index.html", "GET", null, null);
assertNotNull(response);
// Should be a redirection so 302, so empty
@@ -112,7 +118,7 @@ public class DcaeHttpConnectionManagerItCase {
@Test
public void testHttpsGet() throws Exception {
- String response = DcaeHttpConnectionManager
+ String response = dcaeHttpConnectionManager
.doDcaeHttpQuery("https://localhost:" + this.httpsPort + "/designer/index.html", "GET", null, null);
assertNotNull(response);
// Should contain something
@@ -121,21 +127,21 @@ public class DcaeHttpConnectionManagerItCase {
@Test(expected = BadRequestException.class)
public void testHttpsGet404() throws IOException {
- DcaeHttpConnectionManager.doDcaeHttpQuery("https://localhost:" + this.httpsPort + "/designer/index1.html",
+ dcaeHttpConnectionManager.doDcaeHttpQuery("https://localhost:" + this.httpsPort + "/designer/index1.html",
"GET", null, null);
fail("Should have raised an BadRequestException");
}
@Test(expected = BadRequestException.class)
public void testHttpsPost404() throws IOException {
- DcaeHttpConnectionManager.doDcaeHttpQuery("https://localhost:" + this.httpsPort + "/designer/index1.html",
+ dcaeHttpConnectionManager.doDcaeHttpQuery("https://localhost:" + this.httpsPort + "/designer/index1.html",
"POST", "", "application/json");
fail("Should have raised an BadRequestException");
}
@Test(expected = BadRequestException.class)
public void testHttpException() throws IOException {
- DcaeHttpConnectionManager.doDcaeHttpQuery("http://localhost:" + this.httpsPort + "/designer/index.html", "GET",
+ dcaeHttpConnectionManager.doDcaeHttpQuery("http://localhost:" + this.httpsPort + "/designer/index.html", "GET",
null, null);
fail("Should have raised an BadRequestException");
}
diff --git a/src/test/java/org/onap/clamp/clds/it/HttpsItCase.java b/src/test/java/org/onap/clamp/clds/it/HttpsItCase.java
index 0da267ded..81b6b835b 100644
--- a/src/test/java/org/onap/clamp/clds/it/HttpsItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/HttpsItCase.java
@@ -133,7 +133,8 @@ public class HttpsItCase {
.getForEntity("https://localhost:" + this.httpsPort + "/restservices/clds/v1/api-doc", String.class);
assertThat(httpsEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(httpsEntity.getBody()).contains("swagger");
- FileUtils.writeStringToFile(new File("docs/swagger/swagger.json"), httpsEntity.getBody(),Charset.defaultCharset());
+ FileUtils.writeStringToFile(
+ new File("docs/swagger/swagger.json"), httpsEntity.getBody(), Charset.defaultCharset());
}
/**
diff --git a/src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java b/src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java
index 36cbc590c..f05b33e10 100644
--- a/src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java
@@ -89,9 +89,11 @@ public class SdcReqItCase {
@Test
public void formatSdcReqTest() throws JSONException {
- String jsonResult = sdcReq.formatSdcReq("payload", "artifactName", "artifactLabel", "artifactType");
+ String jsonResult = sdcReq.formatSdcReq("payload", "artifactName",
+ "artifactLabel", "artifactType");
JSONAssert.assertEquals(
- "{\"payloadData\" : \"cGF5bG9hZA==\",\"artifactLabel\" : \"artifactLabel\",\"artifactName\" :\"artifactName\",\"artifactType\" : \"artifactType\","
+ "{\"payloadData\" : \"cGF5bG9hZA==\",\"artifactLabel\" : \"artifactLabel\"," +
+ "\"artifactName\" :\"artifactName\",\"artifactType\" : \"artifactType\","
+ "\"artifactGroupType\" : \"DEPLOYMENT\",\"description\" : \"from CLAMP Cockpit\"}",
jsonResult, true);
}
@@ -102,6 +104,6 @@ public class SdcReqItCase {
assertNotNull(listUrls);
assertTrue(listUrls.size() == 1);
assertTrue(listUrls.get(0).contains(
- "/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts"));
+ "/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts"));
}
}