summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors00370346 <swarup.nayak1@huawei.com>2019-03-14 15:06:40 +0530
committers00370346 <swarup.nayak1@huawei.com>2019-03-18 15:25:23 +0530
commitbe11dee889f5a740d584458b62804e5fd4296e53 (patch)
tree2cc5e14c29df1a40f8e7bbe3bb08fffa38e023b8
parentd76c2d0f61bfb4373b13fcdb6fc3317467dd19b4 (diff)
Issue-ID: DCAEGEN2-1055 Generic RestConfCollector
Change-Id: I1800affa2b34cbb7487c0d8411e078adec5a0c48 Signed-off-by: s00370346 <swarup.nayak1@huawei.com>
-rw-r--r--dpo/blueprints/k8s-rcc-inputs.yaml22
-rwxr-xr-xdpo/blueprints/k8s-rcc-policy.yaml-template118
-rwxr-xr-xdpo/data-formats/dcaeRCCOutput.json35
-rw-r--r--dpo/data-formats/dmaap.json10
-rw-r--r--dpo/spec/rcc_spec.json200
-rwxr-xr-xetc/DmaapConfig.json6
-rwxr-xr-xetc/access-token.json5
-rwxr-xr-xetc/collector.properties100
-rwxr-xr-xetc/establish-subscription-input-template.json5
-rwxr-xr-xetc/keystorebin0 -> 2196 bytes
-rwxr-xr-xetc/log4j.xml23
-rwxr-xr-xetc/ont_registartion_subscription_template.json19
-rwxr-xr-xetc/ont_registartion_unsubscription_template.json5
-rwxr-xr-xetc/passwordfile2
-rwxr-xr-xetc/rcc_passwordfile1
-rwxr-xr-xetc/sdnc.p12bin0 -> 1713 bytes
-rwxr-xr-xetc/trustpasswordfile1
-rwxr-xr-xetc/truststorebin0 -> 1453 bytes
-rw-r--r--[-rwxr-xr-x]pom.xml348
-rwxr-xr-xsrc/assembly/dep.xml39
-rw-r--r--src/main/java/org/onap/dcae/ApplicationException.java44
-rw-r--r--src/main/java/org/onap/dcae/ApplicationSettings.java208
-rw-r--r--src/main/java/org/onap/dcae/CLIUtils.java55
-rw-r--r--src/main/java/org/onap/dcae/RestConfCollector.java189
-rwxr-xr-xsrc/main/java/org/onap/dcae/collectors/restconf/common/DataChangeEventListener.java51
-rwxr-xr-xsrc/main/java/org/onap/dcae/collectors/restconf/common/EventProcessor.java88
-rwxr-xr-xsrc/main/java/org/onap/dcae/collectors/restconf/common/RestConfCollector.java72
-rwxr-xr-xsrc/main/java/org/onap/dcae/collectors/restconf/common/RestConfProc.java336
-rwxr-xr-xsrc/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicy.java58
-rw-r--r--src/main/java/org/onap/dcae/common/AdditionalHeaderWebTarget.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/AdditionalHeaderWebTarget.java)6
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/AnyNode.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/AnyNode.java)65
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/AuthType.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/AuthType.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/Constants.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/Constants.java)26
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/DataChangeEventListener.java86
-rw-r--r--src/main/java/org/onap/dcae/common/EventConnectionState.java43
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/EventData.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/RetryException.java)27
-rw-r--r--src/main/java/org/onap/dcae/common/EventProcessor.java103
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/Format.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/Format.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/HttpMethod.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/HttpMethod.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/HttpResponse.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/HttpResponse.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/JsonParser.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/JsonParser.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/Parameters.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/Parameters.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/RestConfContext.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/RestConfContext.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/RestapiCallNode.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNode.java)99
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/RestapiCallNodeUtil.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNodeUtil.java)86
-rw-r--r--src/main/java/org/onap/dcae/common/SSLContextCreator.java83
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/XmlJsonUtil.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/XmlJsonUtil.java)4
-rwxr-xr-xsrc/main/java/org/onap/dcae/common/XmlParser.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/XmlParser.java)4
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/publishing/DMaaPConfigurationParser.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParser.java)36
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/publishing/DMaaPEventPublisher.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisher.java)36
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/publishing/DMaaPPublishersBuilder.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersBuilder.java)13
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/publishing/DMaaPPublishersCache.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCache.java)37
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/publishing/EventPublisher.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/EventPublisher.java)12
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/publishing/PublisherConfig.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/PublisherConfig.java)13
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/common/publishing/VavrUtils.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/VavrUtils.java)28
-rw-r--r--src/main/java/org/onap/dcae/controller/AccessController.java243
-rw-r--r--src/main/java/org/onap/dcae/controller/ConfigFilesFacade.java131
-rw-r--r--src/main/java/org/onap/dcae/controller/ConfigLoader.java147
-rw-r--r--src/main/java/org/onap/dcae/controller/ConfigParsing.java59
-rw-r--r--src/main/java/org/onap/dcae/controller/ConfigSource.java90
-rw-r--r--src/main/java/org/onap/dcae/controller/ControllerConfigInfo.java88
-rw-r--r--src/main/java/org/onap/dcae/controller/Conversions.java54
-rw-r--r--src/main/java/org/onap/dcae/controller/EnvPropertiesReader.java95
-rw-r--r--src/main/java/org/onap/dcae/controller/EnvProps.java74
-rw-r--r--src/main/java/org/onap/dcae/controller/PersistentEventConnection.java207
-rw-r--r--src/main/java/org/onap/dcae/restapi/ApiAuthInterceptor.java77
-rw-r--r--src/main/java/org/onap/dcae/restapi/ApiConfiguration.java48
-rw-r--r--src/main/java/org/onap/dcae/restapi/ApiException.java66
-rw-r--r--[-rwxr-xr-x]src/main/java/org/onap/dcae/restapi/RccRestController.java (renamed from src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStore.java)44
-rw-r--r--src/main/java/org/onap/dcae/restapi/ServletConfig.java108
-rw-r--r--src/main/java/org/onap/dcae/restapi/SwaggerConfig.java44
-rw-r--r--src/main/java/org/onap/dcae/restapi/WebMvcConfig.java57
-rw-r--r--src/main/resources/banner.txt7
-rwxr-xr-xsrc/main/scripts/docker_entry.sh19
-rwxr-xr-xsrc/main/scripts/restConfCollector.sh21
-rw-r--r--src/test/java/org/onap/dcae/AccessControllerTest.java114
-rw-r--r--[-rwxr-xr-x]src/test/java/org/onap/dcae/AnyNodeTest.java (renamed from src/test/java/org/onap/dcae/collectors/restconf/restconftest/AnyNodeTest.java)36
-rw-r--r--src/test/java/org/onap/dcae/ApplicationSettingsTest.java337
-rw-r--r--src/test/java/org/onap/dcae/CLIUtilsTest.java58
-rw-r--r--src/test/java/org/onap/dcae/TLSTest.java94
-rw-r--r--src/test/java/org/onap/dcae/TLSTestBase.java154
-rw-r--r--src/test/java/org/onap/dcae/TestingUtilities.java141
-rw-r--r--src/test/java/org/onap/dcae/WiremockBasedTest.java68
-rw-r--r--src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStoreTest.java63
-rw-r--r--src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyTest.java57
-rwxr-xr-xsrc/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParserTest.java111
-rwxr-xr-xsrc/test/java/org/onap/dcae/collectors/restconf/restconftest/RestConfProcTest.java79
-rwxr-xr-xsrc/test/java/org/onap/dcae/collectors/restconf/restconftest/SseResource.java69
-rwxr-xr-xsrc/test/java/org/onap/dcae/collectors/restconf/restconftest/TestRestConfCollector.java66
-rw-r--r--src/test/java/org/onap/dcae/common/ApiExceptionTest.java54
-rw-r--r--src/test/java/org/onap/dcae/common/AuthTypeTest.java (renamed from src/test/java/org/onap/dcae/collectors/restconf/common/AuthTypeTest.java)8
-rw-r--r--src/test/java/org/onap/dcae/common/DataChangeEventListnerTest.java69
-rw-r--r--src/test/java/org/onap/dcae/common/EventConnectionStateTest.java40
-rw-r--r--src/test/java/org/onap/dcae/common/EventProcessorTest.java104
-rw-r--r--src/test/java/org/onap/dcae/common/FormatTest.java (renamed from src/test/java/org/onap/dcae/collectors/restconf/common/FormatTest.java)8
-rw-r--r--src/test/java/org/onap/dcae/common/RestConfContextTest.java (renamed from src/test/java/org/onap/dcae/collectors/restconf/common/RestConfContextTest.java)8
-rw-r--r--src/test/java/org/onap/dcae/common/XmlJsonUtilTest.java81
-rw-r--r--src/test/java/org/onap/dcae/common/XmlParserTest.java46
-rw-r--r--[-rwxr-xr-x]src/test/java/org/onap/dcae/common/publishing/DMaaPEventPublisherTest.java (renamed from src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisherTest.java)27
-rw-r--r--[-rwxr-xr-x]src/test/java/org/onap/dcae/common/publishing/DMaaPPublishersCacheTest.java (renamed from src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCacheTest.java)64
-rw-r--r--src/test/java/org/onap/dcae/common/publishing/JsonParserTest.java (renamed from src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/JsonParserTest.java)12
-rw-r--r--src/test/java/org/onap/dcae/controller/ConfigCBSSourceTest.java151
-rw-r--r--src/test/java/org/onap/dcae/controller/ConfigFilesFacadeTest.java140
-rw-r--r--src/test/java/org/onap/dcae/controller/ConfigLoaderIntegrationE2ETest.java98
-rw-r--r--src/test/java/org/onap/dcae/controller/ConfigParsingTest.java79
-rw-r--r--src/test/java/org/onap/dcae/controller/EnvPropertiesReaderTest.java69
-rw-r--r--src/test/java/org/onap/dcae/controller/EnvPropsTest.java41
-rw-r--r--src/test/java/org/onap/dcae/restapi/ApiAuthInterceptionTest.java177
-rwxr-xr-xsrc/test/resources/RestConfEvent.json26
-rwxr-xr-xsrc/test/resources/controller-config_dmaap_ip.json238
-rwxr-xr-xsrc/test/resources/controller-config_singleline_ip.json128
-rwxr-xr-xsrc/test/resources/keystorebin0 -> 3717 bytes
-rwxr-xr-xsrc/test/resources/passwordfile1
-rwxr-xr-xsrc/test/resources/rcc_passwordfile1
-rwxr-xr-xsrc/test/resources/sdnc.p12bin0 -> 1713 bytes
-rwxr-xr-xsrc/test/resources/testDmaapConfig_ip.json12
-rwxr-xr-xsrc/test/resources/testFullDmaapConfig_gen2.json24
-rwxr-xr-xsrc/test/resources/testParseDMaaPCredentialsGen2.json6
-rwxr-xr-xsrc/test/resources/testParseDMaaPCredentialsGen2Temp.json9
-rwxr-xr-xsrc/test/resources/testParseDMaaPCredentialsLegacy.json6
-rwxr-xr-xsrc/test/resources/testParseDMaaPGen2.json4
-rwxr-xr-xsrc/test/resources/testParseDMaaPLegacy.json6
-rwxr-xr-xsrc/test/resources/test_anynode_class.json9
-rwxr-xr-xsrc/test/resources/testcollector.properties10
-rwxr-xr-xsrc/test/resources/trustpasswordfile1
-rwxr-xr-xsrc/test/resources/truststorebin0 -> 5145 bytes
-rw-r--r--version.properties2
127 files changed, 6210 insertions, 1550 deletions
diff --git a/dpo/blueprints/k8s-rcc-inputs.yaml b/dpo/blueprints/k8s-rcc-inputs.yaml
new file mode 100644
index 0000000..8f61f05
--- /dev/null
+++ b/dpo/blueprints/k8s-rcc-inputs.yaml
@@ -0,0 +1,22 @@
+#============LICENSE_START========================================================
+#=================================================================================
+# Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved.
+# Modifications Copyright © 2018 Amdocs, Bell Canada
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+
+tag_version: nexus.onap.org:10001/org.onap.dcaegen2.collectors.restconfcollector:1.1.0
+
+external_port: 30416
+
diff --git a/dpo/blueprints/k8s-rcc-policy.yaml-template b/dpo/blueprints/k8s-rcc-policy.yaml-template
new file mode 100755
index 0000000..d6673ac
--- /dev/null
+++ b/dpo/blueprints/k8s-rcc-policy.yaml-template
@@ -0,0 +1,118 @@
+#
+# ============LICENSE_START====================================================
+# =============================================================================
+# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2019 Huawei. All rights reserved.
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END======================================================
+
+tosca_definitions_version: cloudify_dsl_1_3
+
+description: >
+ This blueprint deploys/manages the RestConf Collector module as a Docker container
+
+imports:
+ - http://www.getcloudify.org/spec/cloudify/3.4/types.yaml
+ - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/k8splugin/1.4.5/k8splugin_types.yaml
+inputs:
+ dmaap_host:
+ type: string
+ default: message-router.onap.svc.cluster.local
+ dmaap_port:
+ type: string
+ default: "3904"
+ tag_version:
+ type: string
+ default: "nexus3.onap.org:10001/org.onap.dcaegen2.collectors.restconfcollector:1.0.1"
+ consul_host:
+ type: string
+ default: consul-server.onap.svc.cluster.local
+ consul_port:
+ type: string
+ default: "8500"
+ cbs_host:
+ type: string
+ default: "config-binding-service.dcae.svc.cluster.local"
+ cbs_port:
+ type: string
+ default: "10000"
+ external_port:
+ type: string
+ description: Kubernetes node port on which collector is exposed
+ default: "30416"
+ notification_publish_url:
+ type: string
+ default: "http://message-router.onap.svc.cluster.local:3904/events/unauthenticated.DCAE_RCC_OUTPUT"
+
+node_templates:
+ rcc_k8s:
+ type: dcae.nodes.ContainerizedPlatformComponent
+ properties:
+ name: 'dcaegen2-collectors-rcc'
+ docker_config:
+ healthcheck:
+ endpoint: /healthcheck
+ interval: 15s
+ timeout: 1s
+ type: http
+ image:
+ get_input: tag_version
+ log_info:
+ log_directory: "/opt/app/RCCollector/logs"
+ application_config:
+ collector.rcc.appDescription: DCAE RestConf Collector Application
+ collector.rcc.appName: "dcae-rcc"
+ collector.rcc.dmaap.streamid: "notification=device-registration"
+ collector.rcc.inputQueue.maxPending: "8096"
+ tomcat.maxthreads: "200"
+ collector.rcc.service.port: "8686"
+ collector.rcc.service.secure.port: "8687"
+ collector.rcc.keystore.file.location: "/opt/app/restconfcollector/etc/keystore"
+ collector.rcc.keystore.passwordfile: "/opt/app/restconfcollector/etc/rcc_password"
+ collector.rcc.keystore.alias: "dynamically generated"
+ collector.rcc.truststore.file.location: "/opt/app/restconfcollector/etc/truststore.onap.client.jks"
+ collector.rcc.truststore.passwordfile: "/opt/app/restconfcollector/etc/trustpasswordfile"
+ collector.keystore.file.location: "/opt/app/restconfcollector/etc/sdnc.p12"
+ collector.keystore.passwordfile: "/opt/app/restconfcollector/etc/passwordfile"
+ collector.header.authflag: "0"
+ collector.header.authlist: "sample1,c2FtcGxlMQ=="
+ collector.rcc.service.secure.clientauth: "0"
+ streams_publishes:
+ notification:
+ dmaap_info:
+ topic_url:
+ get_input: notification_publish_url
+ type: message_router
+ rcc_policy: '[{"controller_name":"AccessM&C","controller_restapiUrl":"192.167.1.3:8080","controller_restapiUser":"access","controller_restapiPassword":"Huawei@123","controller_accessTokenUrl":"/rest/plat/smapp/v1/oauth/token","controller_accessTokenFile":"./etc/access-token.json","controller_accessTokenMethod":"put","controller_subsMethod":"post","controller_subscriptionUrl":"/restconf/v1/operations/huawei-nce-notification-action:establish-subscription","event_details":[{"event_name":"ONT_registration","event_description":"ONTregistartionevent","event_sseventUrlEmbed":"true","event_sseventsField":"output.url","event_sseventsUrl":"null","event_subscriptionTemplate":"./etc/ont_registartion_subscription_template.json","event_unSubscriptionTemplate":"./etc/ont_registartion_unsubscription_template.json","event_ruleId":"12345678"}]}]'
+ interfaces:
+ cloudify.interfaces.lifecycle:
+ start:
+ inputs:
+ envs:
+ DMAAPHOST:
+ { get_input: dmaap_host }
+ DMAAPPORT:
+ { get_input: dmaap_port }
+ DMAAPPUBTOPIC: "unauthenticated.DCAE_RCC_OUTPUT"
+ CONSUL_HOST:
+ { get_input: consul_host }
+ CONSUL_PORT:
+ { get_input: consul_port }
+ CBS_HOST:
+ { get_input: cbs_host }
+ CBS_PORT:
+ { get_input: cbs_port }
+ CONFIG_BINDING_SERVICE: "config_binding_service"
+ ports:
+ - concat: ["8080:", { get_input: external_port }]
diff --git a/dpo/data-formats/dcaeRCCOutput.json b/dpo/data-formats/dcaeRCCOutput.json
new file mode 100755
index 0000000..72fb6eb
--- /dev/null
+++ b/dpo/data-formats/dcaeRCCOutput.json
@@ -0,0 +1,35 @@
+{
+ "self": {
+ "name": "DCAE_RCC_OUTPUT",
+ "version": "1.0.0",
+ "description": "teri format of the output CL event from DCAE to Policy"
+ },
+ "dataformatversion": "1.0.0",
+ "jsonschema": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "RCC event Publish",
+ "type": "object",
+ "definitions": {
+ "ruleid": {
+ "description": "Rule id",
+ "type": "string"
+ },
+ "notification": {
+ "description": "Notification message",
+ "type": "object"
+ }
+ },
+ "properties": {
+ "rule-id": {
+ "description": "Rule id to be used by VES mapper",
+ "type": "string",
+ "$ref": "#/definitions/ruleid"
+ },
+ "notification": {
+ "description": "Notification event",
+ "type": "object",
+ "$ref": "#/definitions/notification"
+ }
+ }
+ }
+}
diff --git a/dpo/data-formats/dmaap.json b/dpo/data-formats/dmaap.json
new file mode 100644
index 0000000..11c08d3
--- /dev/null
+++ b/dpo/data-formats/dmaap.json
@@ -0,0 +1,10 @@
+{
+ "rcc_handle_out": {
+ "aaf_username": "USER",
+ "aaf_password": "PASSWORD",
+ "type": "message_router",
+ "dmaap_info": {
+ "topic_url": "https://HOSTNAME:3905/events/unauthenticated.DCAE_RCC_OUTPUT"
+ }
+ }
+} \ No newline at end of file
diff --git a/dpo/spec/rcc_spec.json b/dpo/spec/rcc_spec.json
new file mode 100644
index 0000000..2cae9ff
--- /dev/null
+++ b/dpo/spec/rcc_spec.json
@@ -0,0 +1,200 @@
+{
+ "self": {
+ "version": "1.0.0",
+ "name": "dcae-restconfcollector",
+ "description": "Collector for subscribing events/notification from external controller in rest format and publishing those events to Ves collector",
+ "component_type": "docker"
+ },
+ "streams": {
+ "subscribes": [],
+ "publishes": [{
+ "config_key": "rcc_handle_out",
+ "format": "DCAE_RCC_OUTPUT",
+ "version": "1.0.0",
+ "type": "message router"
+ }]
+ },
+ "services": {
+ "calls": [],
+ "provides": []
+ },
+ "parameters": [
+ {
+ "name": "collector.rcc.appName",
+ "description": "DCAE RestConf Collector Application",
+ "value": "dcae-rcc",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.appDescription",
+ "description": "DCAE RestConf Collector Application",
+ "value": "DCAE RestConf Collector Application",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.dmaap.streamid",
+ "description": "Stream id",
+ "value": "notification=device-registration",
+ "sourced_at_deployment": true,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.inputQueue.maxPending",
+ "description": "Number of max queue outstanding",
+ "value": "8096",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.service.port",
+ "value": "-1",
+ "description": "standard http port collector will open for listening; this will be disabled when collector.header.authflag is set to 1",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.service.secure.port",
+ "value": "-1",
+ "description": "standard https port collector will open for listening; this will be enabled when collector.header.authflag is set to 1",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.header.authflag",
+ "value": "-1",
+ "description": "Should be set to 1 when open secure port",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.header.authlist",
+ "value": "sample1,$2a$10$pgjaxDzSuc6XVFEeqvxQ5u90DKJnM/u7TJTcinAlFJVaavXMWf/Zi",
+ "description": "List of id and base 64 encoded password.Password value should be base64 encoded in config here",
+ "policy_editable": false,
+ "sourced_at_deployment": true,
+ "designer_editable": true
+ },
+ {
+ "name": "collector.rcc.keystore.file.location",
+ "value": "/opt/app/RCCollector/dcae-certificate/keystore.jks",
+ "description": "fs location of keystore file in vm",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.keystore.passwordfile",
+ "value": "/opt/app/RCCollector/dcae-certificate/.password",
+ "description": "location of keystore password file in vm",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.keystore.alias",
+ "value": "dynamically generated",
+ "description": "alias to access the keystore; collector will identify this based on keystore and password file",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.truststore.file.location",
+ "value": "/opt/app/RCCollector/dcae-certificate/truststore.jks",
+ "description": "fs location of truststore file in vm",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.rcc.truststore.passwordfile",
+ "value": "/opt/app/RCCollector/dcae-certificate/.trustpassword",
+ "description": "location of truststore password file in vm",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "tomcat.maxthreads",
+ "description": "Max threads",
+ "value": "200",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "rcc_policy",
+ "description": "RCC Policy JSON",
+ "value":"[{\"controller_name\":\"AccessM&C\",\"controller_restapiUrl\":\"192.167.1.3:8080\",\"controller_restapiUser\":\"access\",\"controller_restapiPassword\":\"Huawei@123\",\"controller_accessTokenUrl\":\"/rest/plat/smapp/v1/oauth/token\",\"controller_accessTokenFile\":\"./etc/access-token.json\",\"controller_accessTokenMethod\":\"put\",\"controller_subsMethod\":\"post\",\"controller_subscriptionUrl\":\"/restconf/v1/operations/huawei-nce-notification-action:establish-subscription\",\"event_details\":[{\"event_name\":\"ONT_registration\",\"event_description\":\"ONTregistartionevent\",\"event_sseventUrlEmbed\":\"true\",\"event_sseventsField\":\"output.url\",\"event_sseventsUrl\":\"null\",\"event_subscriptionTemplate\":\"./etc/ont_registartion_subscription_template.json\",\"event_unSubscriptionTemplate\":\"./etc/ont_registartion_unsubscription_template.json\",\"event_ruleId\":\"12345678\"}]}]",
+ "sourced_at_deployment": false,
+ "policy_editable": true,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.keystore.file.location",
+ "value": "/opt/app/restconfcolletcor/etc/keystore",
+ "description": "fs location of keystore file in vm",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ },
+ {
+ "name": "collector.keystore.passwordfile",
+ "value": "/opt/app/restconfcolletcor/etc/rcc_passwordfile",
+ "description": "location of keystore password file in vm",
+ "sourced_at_deployment": false,
+ "policy_editable": false,
+ "designer_editable": false
+ }
+ ],
+
+ "auxilary": {
+ "healthcheck": {
+ "type": "https",
+ "interval": "15s",
+ "timeout": "1s",
+ "endpoint": "/healthcheck"
+ },
+ "volumes": [
+ {
+ "container": {
+ "bind": "/opt/app/dcae-certificate"
+ },
+ "host": {
+ "path": "/opt/app/restconfcollector/dcae-certificate"
+ }
+ },
+ {
+ "container": {
+ "bind": "/opt/app/restconfcollector/logs"
+ },
+ "host": {
+ "path": "/opt/logs/DCAE/restconfcollector/logs"
+ }
+ },
+ {
+ "container": {
+ "bind": "/opt/app/restconfcollector/etc"
+ },
+ "host": {
+ "path": "/opt/logs/restconfcollector/etc"
+ }
+ }
+ ]
+ },
+ "artifacts": [
+ {
+ "type": "docker image",
+ "uri": "nexus3.onap.org:10001/onap/org.onap.dcaegen2.collectors.restconfcollector"
+ }
+ ]
+}
diff --git a/etc/DmaapConfig.json b/etc/DmaapConfig.json
index 5176cea..6aac252 100755
--- a/etc/DmaapConfig.json
+++ b/etc/DmaapConfig.json
@@ -1,12 +1,12 @@
{
"channels": [
{
- "name": "route_failure",
- "cambria.topic": "unauthenticated.DCAE_RESTCONF_COL_OUTPUT",
+ "name": "device-registration",
+ "cambria.topic": "unauthenticated.DCAE_RCC_OUTPUT",
"class": "HpCambriaOutputStream",
"stripHpId": "true",
"type": "out",
- "cambria.hosts": "onap-message-router"
+ "cambria.hosts": "119.3.84.152:30227"
}
]
}
diff --git a/etc/access-token.json b/etc/access-token.json
index 6fc9fbb..caae620 100755
--- a/etc/access-token.json
+++ b/etc/access-token.json
@@ -1,4 +1,5 @@
{
- "userName" : "test123",
- "password" : "Changeme_123"
+ "grantType" : "password",
+ "userName" : "tokenUser",
+ "value" : "Test_12345"
}
diff --git a/etc/collector.properties b/etc/collector.properties
index 6907e88..96cc845 100755
--- a/etc/collector.properties
+++ b/etc/collector.properties
@@ -1,28 +1,90 @@
+#
+# ============LICENSE_START====================================================
+# =============================================================================
+# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2019 Huawei. All rights reserved.
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END======================================================
###############################################################################
##
-## Collector config
+## Collector Server config
##
## - Default values are shown as commented settings.
##
###############################################################################
-## Processing
-collector.dmaapfile=./etc/DmaapConfig.json
+# list all restconf collector parameters
+
+collector.rcc.appName = "RCCollector"
+collector.rcc.appDescription = "DCAE RestConf Collector Application"
+
###############################################################################
##
-## Tomcat control
+## HTTP(S) service
##
-#tomcat.maxthreads=(tomcat default, which is usually 200)
-# list all restconf collector parameters
-templateFileName=./etc/establish-subscription-input-template.json
-restapiUrl=10.0.4.1:8080;10.0.4.2:8080
-httpMethod=post
-responsePrefix=restapi-result
-skipSending=false
-sseConnectURL=http://10.0.4.1:8080/RestConfServer/rest/ssevents; http://10.0.4.2:8080/RestConfServer/rest/ssevents
-format=json
-restapiUser=access
-restapiPassword=Huawei@123
-trustStoreFileName=./etc/truststore1.openecomp.client.jks;./etc/truststore2.openecomp.client.jks
-trustStorePassword=adminadmin
-keyStoreFileName=./etc/sotn1.p12;./etc/ctrl2.p12
-keyStorePassword=adminadmin
+## Normally:
+##
+## - 8686 is http service
+## - https is disabled by default (-1)
+##
+## - At this time, the server always binds to 0.0.0.0
+##
+## The default port when collector.header.authflag is disabled (0)
+collector.rcc.service.port=8686
+
+## The secure port is required if collector.header.authflag is set to 1 (true)
+## Authentication is only supported via secure port
+## When enabled - require valid keystore defined
+collector.rcc.service.secure.port=8687
+
+
+## The keystore must be setup per installation when secure port is configured
+collector.rcc.keystore.file.location=etc/sdnc.p12
+collector.rcc.keystore.passwordfile=etc/passwordfile
+
+## The truststore must be setup per installation when mutual tls support is configured
+collector.rcc.truststore.file.location=etc/truststore.onap.client.jks
+collector.rcc.truststore.passwordfile=etc/trustpasswordfile
+
+###############################################################################
+## Processing
+##
+## If there's a problem that prevents the collector from processing alarms,
+## it's normally better to apply back pressure to the caller than to try to
+## buffer beyond a reasonable size limit. With a limit, the server won't crash
+## due to being out of memory, and the caller will get a 5xx reply saying the
+## server is in trouble.
+collector.rcc.inputQueue.maxPending=8096
+
+
+## List all streamid per domain to be supported. The streamid should match to channel name on dmaapfile
+collector.rcc.dmaap.streamid=notification=device-registration
+collector.dmaapfile=./etc/DmaapConfig.json
+rcc_policy = [{\"controller_name\":\"AccessM&C\",\"controller_restapiUrl\":\"10.118.191.43:26335\",\"controller_restapiUser\":\"access\",\"controller_restapiPassword\":\"Huawei@123\",\"controller_accessTokenUrl\":\"/rest/plat/smapp/v1/oauth/token\",\"controller_accessTokenFile\":\"./etc/access-token.json\",\"controller_accessTokenMethod\":\"put\",\"controller_subsMethod\":\"post\",\"controller_subscriptionUrl\":\"/restconf/v1/operations/huawei-nce-notification-action:establish-subscription\",\"event_details\":[{\"event_name\":\"ONT_registration\",\"event_description\":\"ONTregistartionevent\",\"event_sseventUrlEmbed\":\"true\",\"event_sseventsField\":\"output.url\",\"event_sseventsUrl\":\"null\",\"event_subscriptionTemplate\":\"./etc/ont_registartion_subscription_template.json\",\"event_unSubscriptionTemplate\":\"./etc/ont_registartion_unsubscription_template.json\",\"event_ruleId\":\"777777777\"}]}]
+
+# Describes at what frequency (measured in minutes) should application try to fetch config from CBS
+
+
+## authflag control authentication by the collector
+## If enabled (1) - then authlist has to be defined
+## When authflag is enabled, only secure port will be supported
+## To disable enter 0
+collector.header.authflag=0
+
+## Combination of userid,hashPassword encoded pwd list to be supported
+## userid and pwd comma separated; pipe delimitation between each pair
+collector.header.authlist=sample1,$2a$10$0buh.2WeYwN868YMwnNNEuNEAMNYVU9.FSMJGyIKV3dGET/7oGOi6
+collector.keystore.file.location=etc/keystore
+collector.keystore.passwordfile=etc/rcc_passwordfile
+collector.rcc.keystore.alias=tomcat
+collector.rcc.service.secure.clientauth=0
diff --git a/etc/establish-subscription-input-template.json b/etc/establish-subscription-input-template.json
deleted file mode 100755
index 5273683..0000000
--- a/etc/establish-subscription-input-template.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "ietf-subscribed-notifications:input": {
- "encoding": "encode-json"
- }
-}
diff --git a/etc/keystore b/etc/keystore
new file mode 100755
index 0000000..26a16f7
--- /dev/null
+++ b/etc/keystore
Binary files differ
diff --git a/etc/log4j.xml b/etc/log4j.xml
index 3e3b132..43bd6ac 100755
--- a/etc/log4j.xml
+++ b/etc/log4j.xml
@@ -1,11 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- ~ Copyright (c) 2018. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
- ~ Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
- ~ Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
- ~ Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
- ~ Vestibulum commodo. Ut rhoncus gravida arcu.
- -->
+================================================================================
+Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+Copyright (c) 2019 Huawei. All rights reserved.
+================================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+============LICENSE_END=========================================================
+-->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
diff --git a/etc/ont_registartion_subscription_template.json b/etc/ont_registartion_subscription_template.json
new file mode 100755
index 0000000..eae6325
--- /dev/null
+++ b/etc/ont_registartion_subscription_template.json
@@ -0,0 +1,19 @@
+{
+ "input": {
+ "encoding": "encode-json",
+ "protocol": "sse",
+ "subscription" : [
+ {
+ "topic" : "resources",
+ "object-type-infos" : [
+ {
+ "object-type" : "onu",
+ "version" : "v1"
+ }
+ ],
+ "operation" : ["create"]
+ }
+ ]
+ }
+}
+
diff --git a/etc/ont_registartion_unsubscription_template.json b/etc/ont_registartion_unsubscription_template.json
new file mode 100755
index 0000000..07d767a
--- /dev/null
+++ b/etc/ont_registartion_unsubscription_template.json
@@ -0,0 +1,5 @@
+{
+ "input": {
+ "identifier" : ""
+ }
+}
diff --git a/etc/passwordfile b/etc/passwordfile
index 702a4cb..d4631a9 100755
--- a/etc/passwordfile
+++ b/etc/passwordfile
@@ -1 +1 @@
-collector
+adminadmin
diff --git a/etc/rcc_passwordfile b/etc/rcc_passwordfile
new file mode 100755
index 0000000..25acfbf
--- /dev/null
+++ b/etc/rcc_passwordfile
@@ -0,0 +1 @@
+collector \ No newline at end of file
diff --git a/etc/sdnc.p12 b/etc/sdnc.p12
new file mode 100755
index 0000000..15c8893
--- /dev/null
+++ b/etc/sdnc.p12
Binary files differ
diff --git a/etc/trustpasswordfile b/etc/trustpasswordfile
new file mode 100755
index 0000000..3fe4600
--- /dev/null
+++ b/etc/trustpasswordfile
@@ -0,0 +1 @@
+adminadmin \ No newline at end of file
diff --git a/etc/truststore b/etc/truststore
new file mode 100755
index 0000000..1fbf7ef
--- /dev/null
+++ b/etc/truststore
Binary files differ
diff --git a/pom.xml b/pom.xml
index 9a78d0f..e8bcd90 100755..100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,39 +1,67 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
+<?xml version="1.0"?>
+<!--
+================================================================================
+Copyright (c) 2019 Huawei. All rights reserved.
+================================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+============LICENSE_END=========================================================
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onap.oparent</groupId>
<artifactId>oparent</artifactId>
- <version>1.1.0</version>
+ <version>1.2.0</version>
<relativePath/>
</parent>
-
<groupId>org.onap.dcaegen2.collectors.restconf</groupId>
<artifactId>restconfcollector</artifactId>
- <version>1.0.0-SNAPSHOT</version>
-
+ <version>1.1.0-SNAPSHOT</version>
<name>dcaegen2-collectors-restconf</name>
<description>RestConfCollector</description>
-
<properties>
<!-- PROJECT SETTINGS -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>8</java.version>
- <docker.image.name>restconfcollector</docker.image.name>
-
+ <docker.image.name>onap/org.onap.dcaegen2.collectors.restconfcollector</docker.image.name>
+ <!-- TEST SETTINGS -->
+ <surefire.redirectTestOutputToFile>true</surefire.redirectTestOutputToFile>
<!-- PLUGIN SETTINGS -->
<dependency.locations.enabled>false</dependency.locations.enabled>
-
+ <!-- NEXUS RELATED SETTINGS -->
+ <nexusproxy>https://nexus.onap.org</nexusproxy>
+ <snapshots.path>content/repositories/snapshots/</snapshots.path>
+ <releases.path>content/repositories/releases/</releases.path>
+ <site.path>content/sites/site/org/onap/dcaegen2/collectors/restconf/${project.artifactId}/${project.version}</site.path>
+ <maven.build.timestamp.format>yyyyMMdd'T'HHmmss</maven.build.timestamp.format>
</properties>
-
<build>
<pluginManagement>
<plugins>
<plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <version>2.0.2.RELEASE</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>repackage</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
@@ -58,13 +86,17 @@
<version>2.9</version>
</plugin>
<plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>3.0.0-M1</version>
+ </plugin>
+ <plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.1</version>
</plugin>
</plugins>
</pluginManagement>
-
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
@@ -75,7 +107,6 @@
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
-
<plugin>
<artifactId>maven-source-plugin</artifactId>
<configuration>
@@ -91,7 +122,6 @@
</execution>
</executions>
</plugin>
-
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
@@ -105,7 +135,6 @@
</archive>
</configuration>
</plugin>
-
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
@@ -126,7 +155,6 @@
</execution>
</executions>
</plugin>
-
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
@@ -151,9 +179,101 @@
</execution>
</executions>
</plugin>
+ <plugin>
+ <groupId>com.spotify</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <configuration>
+ <serverId>${onap.nexus.dockerregistry.daily}</serverId>
+ <imageName>${docker.image.name}</imageName>
+ <imageTags>
+ <tag>latest</tag>
+ </imageTags>
+ <baseImage>openjdk:8-jre-slim</baseImage>
+ <env>
+ <HOSTALIASES>/etc/host.aliases</HOSTALIASES>
+ </env>
+ <workdir>/opt/app/restconfcollector</workdir>
+ <resources>
+ <resource>
+ <targetPath>.</targetPath>
+ <directory>${project.build.directory}/${project.artifactId}-${project.version}</directory>
+ </resource>
+ </resources>
+ <runs>
+ <run>chmod +x /opt/app/restconfcollector/bin/*.sh</run> <!-- Maven is loosing file permissions during artifacts copy -->
+ </runs>
+ <cmd>/opt/app/restconfcollector/bin/docker_entry.sh</cmd>
+ <exposes>
+ <expose>8686</expose>
+ <expose>8687</expose>
+ </exposes>
+ </configuration>
+ <executions>
+ <execution>
+ <id>build-image</id>
+ <phase>package</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>tag-and-push-image-latest</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>tag</goal>
+ </goals>
+ <configuration>
+ <image>${docker.image.name}:latest</image>
+ <newName>${onap.nexus.dockerregistry.daily}/${docker.image.name}:latest</newName>
+ <pushImage>true</pushImage>
+ </configuration>
+ </execution>
+ <execution>
+ <id>tag-and-push-image-with-version</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>tag</goal>
+ </goals>
+ <configuration>
+ <image>${docker.image.name}:latest</image>
+ <newName>${onap.nexus.dockerregistry.daily}/${docker.image.name}:${project.version}</newName>
+ <pushImage>false</pushImage>
+ </configuration>
+ </execution>
+ <execution>
+ <id>tag-and-push-image-with-version-and-date</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>tag</goal>
+ </goals>
+ <configuration>
+ <image>${docker.image.name}:latest</image>
+ <newName>${onap.nexus.dockerregistry.daily}/${docker.image.name}:${project.version}-${maven.build.timestamp}Z</newName>
+ <pushImage>false</pushImage>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
-
+ <profiles>
+ <profile>
+ <id>with-system-proxy</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.spotify</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <configuration>
+ <buildArgs>
+ <http_proxy>${env.http_proxy}</http_proxy>
+ </buildArgs>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
<reporting>
<plugins>
<plugin>
@@ -167,7 +287,6 @@
</reportSet>
</reportSets>
</plugin>
-
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
@@ -184,9 +303,19 @@
</plugin>
</plugins>
</reporting>
-
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <!-- Import dependency management from Spring Boot -->
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>2.1.0.RELEASE</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
<dependencies>
-
<!-- JSON RELATED -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
@@ -206,45 +335,26 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
- <version>2.3.1</version>
+ <version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
-
<!-- REST API RELATED -->
<dependency>
<groupId>com.att.nsa</groupId>
- <artifactId>nsaServerLibrary</artifactId>
- <version>1.0.10</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.8.11</version>
+ <artifactId>cambriaClient</artifactId>
+ <version>0.0.1</version>
</dependency>
-
- <!-- LOGGING RELATED -->
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.21</version>
+ <groupId>com.mashape.unirest</groupId>
+ <artifactId>unirest-java</artifactId>
+ <version>1.4.9</version>
</dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>apache-log4j-extras</artifactId>
- <version>1.2.17</version>
- </dependency>
-
<!-- MISCELLANEOUS -->
<dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>18.0</version>
- </dependency>
- <dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
@@ -255,33 +365,45 @@
<version>1.10</version>
</dependency>
<dependency>
- <groupId>javax.mail</groupId>
- <artifactId>mail</artifactId>
- <version>1.4.7</version>
- </dependency>
- <dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.9.2</version>
</dependency>
- <!-- TESTING -->
<dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>2.18.0</version>
- <scope>test</scope>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-security</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-logging</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.7</version>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
- <groupId>org.codehaus.jettison</groupId>
- <artifactId>jettison</artifactId>
- <version>1.3.7</version>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-config</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-log4j</artifactId>
+ <version>1.3.8.RELEASE</version>
</dependency>
<dependency>
+ <groupId>io.springfox</groupId>
+ <artifactId>springfox-swagger2</artifactId>
+ <version>2.8.0</version>
+ </dependency>
+ <dependency>
+ <groupId>io.springfox</groupId>
+ <artifactId>springfox-swagger-ui</artifactId>
+ <version>2.8.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.27</version>
@@ -310,11 +432,57 @@
<groupId>com.sun.jersey.contribs.jersey-oauth</groupId>
<artifactId>oauth-signature</artifactId>
<version>1.19.1</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>jsr311-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.security</groupId>
+ <artifactId>oauth1-client</artifactId>
+ <version>2.27</version>
</dependency>
<dependency>
- <groupId>org.hamcrest</groupId>
- <artifactId>hamcrest-library</artifactId>
- <version>1.3</version>
+ <groupId>org.glassfish.jersey.security</groupId>
+ <artifactId>oauth1-signature</artifactId>
+ <version>2.27</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.7</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.jettison</groupId>
+ <artifactId>jettison</artifactId>
+ <version>1.3.7</version>
+ </dependency>
+ <!-- TESTING -->
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-api</artifactId>
+ <version>5.3.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-engine</artifactId>
+ <version>5.3.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.vintage</groupId>
+ <artifactId>junit-vintage-engine</artifactId>
+ <version>5.3.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-junit-jupiter</artifactId>
+ <version>2.23.0</version>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
@@ -323,14 +491,33 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.glassfish.jersey.security</groupId>
- <artifactId>oauth1-client</artifactId>
- <version>2.27</version>
+ <groupId>com.google.jimfs</groupId>
+ <artifactId>jimfs</artifactId>
+ <version>1.1</version>
+ <scope>test</scope>
</dependency>
<dependency>
- <groupId>org.glassfish.jersey.security</groupId>
- <artifactId>oauth1-signature</artifactId>
- <version>2.27</version>
+ <groupId>com.github.tomakehurst</groupId>
+ <artifactId>wiremock-standalone</artifactId>
+ <version>2.17.0</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-test</artifactId>
+ <version>5.1.1.RELEASE</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <version>2.1.0.RELEASE</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.dcaegen2.services.sdk.security.crypt</groupId>
+ <artifactId>crypt-password</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<repositories>
@@ -339,4 +526,17 @@
<url>https://oss.sonatype.org/content/repositories</url>
</repository>
</repositories>
-</project> \ No newline at end of file
+ <pluginRepositories>
+ <!-- Black Duck plugin dependencies -->
+ <pluginRepository>
+ <id>JCenter</id>
+ <name>JCenter Repository</name>
+ <url>http://jcenter.bintray.com</url>
+ </pluginRepository>
+ <pluginRepository>
+ <id>Restlet</id>
+ <name>Restlet Repository</name>
+ <url>http://maven.restlet.com</url>
+ </pluginRepository>
+ </pluginRepositories>
+</project>
diff --git a/src/assembly/dep.xml b/src/assembly/dep.xml
index 472d966..484c924 100755
--- a/src/assembly/dep.xml
+++ b/src/assembly/dep.xml
@@ -1,3 +1,23 @@
+<!--
+================================================================================
+Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved.
+Copyright (c) 2018 Nokia. All rights reserved.
+Copyright (c) 2019 Huawei. All rights reserved.
+================================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+============LICENSE_END=========================================================
+-->
+
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
@@ -13,15 +33,17 @@
<directory>src/main/scripts</directory>
<outputDirectory>bin</outputDirectory>
<includes>
- <include>**/*.*</include>
+ <include>**/*.sh</include>
</includes>
<fileMode>0755</fileMode>
<lineEnding>unix</lineEnding>
</fileSet>
+
<fileSet>
<directory>etc</directory>
<outputDirectory>etc</outputDirectory>
</fileSet>
+
<fileSet>
<directory>src/main/resources</directory>
<includes>
@@ -30,6 +52,21 @@
<outputDirectory>etc</outputDirectory>
</fileSet>
+ <fileSet>
+ <directory>dpo/data-formats</directory>
+ <includes>
+ <include>**/*.json</include>
+ </includes>
+ <outputDirectory>specs</outputDirectory>
+ </fileSet>
+
+ <fileSet>
+ <directory>dpo/spec</directory>
+ <includes>
+ <include>**/*.json</include>
+ </includes>
+ <outputDirectory>specs</outputDirectory>
+ </fileSet>
</fileSets>
<dependencySets>
diff --git a/src/main/java/org/onap/dcae/ApplicationException.java b/src/main/java/org/onap/dcae/ApplicationException.java
new file mode 100644
index 0000000..60624da
--- /dev/null
+++ b/src/main/java/org/onap/dcae/ApplicationException.java
@@ -0,0 +1,44 @@
+/*
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import org.apache.commons.configuration.ConfigurationException;
+
+public class ApplicationException extends RuntimeException {
+
+ public ApplicationException(ConfigurationException ex) {
+ super(ex);
+ }
+
+ public ApplicationException(String message, Exception ex) {
+ super(message, ex);
+ }
+
+ public ApplicationException(Exception ex) {
+ super(ex);
+ }
+
+ public ApplicationException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/org/onap/dcae/ApplicationSettings.java b/src/main/java/org/onap/dcae/ApplicationSettings.java
new file mode 100644
index 0000000..c7e42c5
--- /dev/null
+++ b/src/main/java/org/onap/dcae/ApplicationSettings.java
@@ -0,0 +1,208 @@
+/*
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import com.google.common.annotations.VisibleForTesting;
+import io.vavr.Function1;
+import io.vavr.collection.HashMap;
+import io.vavr.collection.List;
+import io.vavr.collection.Map;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.Nullable;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Iterator;
+
+/**
+ * Abstraction over application configuration.
+ * Its job is to provide easily discoverable (by method names lookup) and type safe access to configuration properties.
+ */
+public class ApplicationSettings {
+
+ private static final Logger log = LoggerFactory.getLogger(ApplicationSettings.class);
+
+ private final String appInvocationDir;
+ private final String configurationFileLocation;
+ private final PropertiesConfiguration properties = new PropertiesConfiguration();
+
+
+ public ApplicationSettings(String[] args, Function1<String[], Map<String, String>> argsParser) {
+ this(args, argsParser, System.getProperty("user.dir"));
+ }
+
+ public ApplicationSettings(String[] args, Function1<String[], Map<String, String>> argsParser, String appInvocationDir) {
+ log.info("New ApplicationSettings........");
+ this.appInvocationDir = appInvocationDir;
+ properties.setDelimiterParsingDisabled(true);
+ Map<String, String> parsedArgs = argsParser.apply(args);
+ configurationFileLocation = findOutConfigurationFileLocation(parsedArgs);
+ loadPropertiesFromFile();
+ parsedArgs.filterKeys(k -> !"c".equals(k)).forEach(this::addOrUpdate);
+ }
+
+
+ public void reloadProperties() {
+ try {
+ log.info("Reloading Properties ....");
+ properties.load(configurationFileLocation);
+ properties.refresh();
+ } catch (ConfigurationException ex) {
+ log.error("Cannot load properties cause:", ex);
+ throw new ApplicationException(ex);
+ }
+ }
+
+ public void loadPropertiesFromFile() {
+ try {
+ properties.load(configurationFileLocation);
+ Iterator<String> itr = properties.getKeys();
+ while (itr.hasNext()) {
+ String key = itr.next();
+ log.info(" Key " + key + " value" + properties.getString(key));
+ }
+ } catch (ConfigurationException ex) {
+ log.error("Cannot load properties cause:", ex);
+ throw new ApplicationException(ex);
+ }
+ }
+
+
+ public boolean authorizationEnabled() {
+ return properties.getInt("collector.header.authflag", 0) > 0;
+ }
+
+ private String findOutConfigurationFileLocation(Map<String, String> parsedArgs) {
+ return prependWithUserDirOnRelative(parsedArgs.get("c").getOrElse("etc/collector.properties"));
+ }
+
+ public Path configurationFileLocation() {
+ return Paths.get(configurationFileLocation);
+ }
+
+ public int maximumAllowedQueuedEvents() {
+ return properties.getInt("collector.rcc.inputQueue.maxPending", 1024 * 4);
+ }
+
+ public int httpPort() {
+ return properties.getInt("collector.rcc.service.port", 8686);
+ }
+
+ public int httpsPort() {
+ return properties.getInt("collector.rcc.service.secure.port", 8687);
+ }
+
+
+ public boolean httpsEnabled() {
+ return httpsPort() > 0;
+ }
+
+ public String rcc_keystorePasswordFileLocation() {
+ return prependWithUserDirOnRelative(properties.getString("collector.keystore.passwordfile", "etc/rcc_passwordfile"));
+ }
+
+ public String rcc_keystoreFileLocation() {
+ return prependWithUserDirOnRelative(properties.getString("collector.keystore.file.location", "etc/keystore"));
+ }
+
+ public String keystorePasswordFileLocation() {
+ return prependWithUserDirOnRelative(properties.getString("collector.rcc.keystore.passwordfile", "etc/passwordfile"));
+ }
+
+ public String keystoreFileLocation() {
+ return prependWithUserDirOnRelative(properties.getString("collector.rcc.keystore.file.location", "etc/sdnc.p12"));
+ }
+
+ public boolean clientTlsAuthenticationEnabled() {
+ return httpsEnabled() && properties.getInt("collector.rcc.service.secure.clientauth", 0) > 0;
+ }
+
+ public Map<String, String> validAuthorizationCredentials() {
+ return prepareUsersMap(properties.getString("collector.header.authlist", null));
+ }
+
+ private Map<String, String> prepareUsersMap(@Nullable String allowedUsers) {
+ return allowedUsers == null ? HashMap.empty()
+ : List.of(allowedUsers.split("\\|"))
+ .map(t -> t.split(","))
+ .toMap(t -> t[0].trim(), t -> t[1].trim());
+ }
+
+ public String keystoreAlias() {
+ return properties.getString("collector.rcc.keystore.alias", "tomcat");
+ }
+
+ public String truststorePasswordFileLocation() {
+ return prependWithUserDirOnRelative(properties.getString("collector.rcc.truststore.passwordfile", "etc/trustpasswordfile"));
+ }
+
+ public String truststoreFileLocation() {
+ return prependWithUserDirOnRelative(properties.getString("collector.rcc.truststore.file.location", "etc/truststore.onap.client.jks"));
+ }
+
+ public String rcc_policy() {
+ return properties.getString("rcc_policy", "");
+ }
+
+ public String dMaaPConfigurationFileLocation() {
+ return prependWithUserDirOnRelative(properties.getString("collector.dmaapfile", "etc/DmaapConfig.json"));
+ }
+
+ public String dMaaPStreamsMapping() {
+ return properties.getString("collector.rcc.dmaap.streamid", null);
+ }
+
+ private void updateProperty(String key, String value) {
+ if (properties.containsKey(key)) {
+ properties.setProperty(key, value);
+ log.info("Retrives property: " + key + "Value " + value);
+ } else {
+ properties.addProperty(key, value);
+ }
+ }
+
+ public void addOrUpdate(String key, String value) {
+ if (properties.containsKey(key)) {
+ properties.setProperty(key, value);
+ } else {
+ properties.addProperty(key, value);
+ }
+ }
+
+
+ private String prependWithUserDirOnRelative(String filePath) {
+ if (!Paths.get(filePath).isAbsolute()) {
+ filePath = Paths.get(appInvocationDir, filePath).toString();
+ }
+ return filePath;
+ }
+
+ @VisibleForTesting
+ String getStringDirectly(String key) {
+ return properties.getString(key);
+ }
+}
+
diff --git a/src/main/java/org/onap/dcae/CLIUtils.java b/src/main/java/org/onap/dcae/CLIUtils.java
new file mode 100644
index 0000000..eeab465
--- /dev/null
+++ b/src/main/java/org/onap/dcae/CLIUtils.java
@@ -0,0 +1,55 @@
+/*
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import io.vavr.collection.Map;
+
+import java.util.HashMap;
+
+public class CLIUtils {
+
+ public static Map<String, String> processCmdLine(String[] args) {
+ final java.util.Map<String, String> map = new HashMap<>();
+
+ String argumentName = null;
+
+ for (String arg : args) {
+ if (isArgumentName(arg)) {
+ argumentName = resolveArgumentName(arg);
+ map.put(argumentName, "");
+ } else {
+ map.put(argumentName, arg);
+ }
+ }
+
+ return io.vavr.collection.HashMap.ofAll(map);
+ }
+
+ private static String resolveArgumentName(String arg) {
+ return arg.substring(1);
+ }
+
+ private static boolean isArgumentName(String arg) {
+ return arg.startsWith("-");
+ }
+}
diff --git a/src/main/java/org/onap/dcae/RestConfCollector.java b/src/main/java/org/onap/dcae/RestConfCollector.java
new file mode 100644
index 0000000..1812d23
--- /dev/null
+++ b/src/main/java/org/onap/dcae/RestConfCollector.java
@@ -0,0 +1,189 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import io.vavr.collection.Map;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.onap.dcae.common.EventData;
+import org.onap.dcae.common.EventProcessor;
+import org.onap.dcae.common.publishing.DMaaPConfigurationParser;
+import org.onap.dcae.common.publishing.EventPublisher;
+import org.onap.dcae.common.publishing.PublisherConfig;
+import org.onap.dcae.controller.AccessController;
+import org.onap.dcae.controller.ConfigLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Lazy;
+
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.concurrent.*;
+
+@SpringBootApplication(exclude = {GsonAutoConfiguration.class, SecurityAutoConfiguration.class})
+public class RestConfCollector {
+ private static final Logger oplog = LoggerFactory.getLogger("org.onap.dcae.common.output");
+ private static final int MAX_THREADS = 20;
+ private static Logger log = LoggerFactory.getLogger(RestConfCollector.class);
+ public static LinkedBlockingQueue<EventData> fProcessingInputQueue;
+ private static ApplicationSettings properties;
+ private static ConfigurableApplicationContext context;
+ private static ConfigLoader configLoader;
+ private static SpringApplication app;
+ private static ScheduledFuture<?> scheduleFeatures;
+ private static ExecutorService executor;
+ private static ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
+ private static EventPublisher eventPublisher;
+ private static EventProcessor eventProcessor;
+
+ /* List of Controllers */
+ private static java.util.Map<String, AccessController> controllerStore = new ConcurrentHashMap<>();
+
+
+ public static void main(String[] args) {
+ oplog.info("RestconfController starting");
+ app = new SpringApplication(RestConfCollector.class);
+ properties = new ApplicationSettings(args, CLIUtils::processCmdLine);
+ scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
+ init();
+ app.setAddCommandLineProperties(true);
+ context = app.run();
+ configLoader.updateConfig();
+ controllerConfig(properties);
+ oplog.info("RestConfController running .....");
+ }
+
+
+ public static void restartApplication() {
+ Thread thread = new Thread(() -> {
+ controllerConfigCleanup();
+ context.close();
+ properties.reloadProperties();
+ scheduleFeatures.cancel(true);
+ init();
+ controllerConfig(properties);
+ context = SpringApplication.run(RestConfCollector.class);
+ });
+ thread.setDaemon(false);
+ thread.start();
+ }
+
+
+ private static void init() {
+ fProcessingInputQueue = new LinkedBlockingQueue<>(properties.maximumAllowedQueuedEvents());
+ createConfigLoader();
+ createSchedulePoolExecutor();
+ createExecutors();
+ }
+
+ private static Map<String, PublisherConfig> getDmapConfig() {
+ return DMaaPConfigurationParser.
+ parseToDomainMapping(Paths.get(properties.dMaaPConfigurationFileLocation())).get();
+ }
+
+ @Bean
+ @Lazy
+ public ApplicationSettings applicationSettings() {
+ return properties;
+ }
+
+ @Bean
+ public LinkedBlockingQueue<EventData> inputQueue() {
+ return fProcessingInputQueue;
+ }
+
+ public static java.util.Map<String, String[]> parseStreamIdToStreamHashMapping(String streamId) {
+
+ java.util.Map<String, String[]> streamidHash = new HashMap<>();
+ String[] list = streamId.split("\\|");
+ for (String aList : list) {
+ String domain = aList.split("=")[0];
+ String[] streamIdList = aList.substring(aList.indexOf('=') + 1).split(",");
+ streamidHash.put(domain, streamIdList);
+ oplog.info("adding domain " + domain + " count" + streamIdList.length);
+ }
+ return streamidHash;
+ }
+
+ private static void controllerConfig(ApplicationSettings properties) {
+ oplog.info("Policy received " + properties.rcc_policy());
+ if (!properties.rcc_policy().equals("")) {
+ JSONArray contollers = new JSONArray(properties.rcc_policy());
+ for (int i = 0; i < contollers.length(); i++) {
+ JSONObject controller = contollers.getJSONObject(i);
+ oplog.info(" object " + controller.toString());
+ AccessController acClr = new AccessController(controller,
+ properties);
+ controllerStore.put(controller.get("controller_name").toString(), acClr);
+ oplog.info("Activating controller " + acClr.getCfgInfo().getController_name());
+ acClr.activate();
+ }
+ }
+ }
+
+ private static void controllerConfigCleanup() {
+ controllerStore.clear();
+ }
+
+ public static void handleEvents(EventData ev) throws Exception {
+ if (!fProcessingInputQueue.offer(ev)) {
+ throw new Exception();
+ }
+ log.info("RestConfCollector.handleEvents:EVENTS has been published successfully!");
+ }
+
+ private static void createConfigLoader() {
+ log.info("dMaaPConfigurationFileLocation " + properties.dMaaPConfigurationFileLocation() + " " + properties.configurationFileLocation());
+
+ configLoader = ConfigLoader.create(getEventPublisher()::reconfigure,
+ Paths.get(properties.dMaaPConfigurationFileLocation()),
+ properties.configurationFileLocation());
+ }
+
+ private static EventPublisher getEventPublisher() {
+ return EventPublisher.createPublisher(oplog, getDmapConfig());
+ }
+
+ private static void createSchedulePoolExecutor() {
+ scheduleFeatures = scheduledThreadPoolExecutor.scheduleAtFixedRate(configLoader::updateConfig,
+ 10,
+ 10,
+ TimeUnit.MINUTES);
+ }
+
+ private static void createExecutors() {
+ eventPublisher = EventPublisher.createPublisher(oplog, getDmapConfig());
+ eventProcessor = new EventProcessor(eventPublisher,
+ parseStreamIdToStreamHashMapping(properties.dMaaPStreamsMapping()));
+
+ executor = Executors.newFixedThreadPool(MAX_THREADS);
+ for (int i = 0; i < MAX_THREADS; ++i) {
+ executor.execute(eventProcessor);
+ }
+ }
+}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/DataChangeEventListener.java b/src/main/java/org/onap/dcae/collectors/restconf/common/DataChangeEventListener.java
deleted file mode 100755
index 98bb74a..0000000
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/DataChangeEventListener.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.common;
-
-import org.glassfish.jersey.media.sse.EventListener;
-import org.glassfish.jersey.media.sse.InboundEvent;
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DataChangeEventListener implements EventListener {
- private static final Logger log = LoggerFactory.getLogger(DataChangeEventListener.class);
- private RestConfContext ctx;
-
- public DataChangeEventListener(RestConfContext ctx) {
- this.ctx = ctx;
- }
-
- @Override
- public void onEvent(InboundEvent event) {
- JSONArray jsonArrayMod;
- log.info("On SSE Event is received");
- String s = event.readData();
- JSONObject jsonObj = new JSONObject(s);
- jsonArrayMod = new JSONArray().put(jsonObj);
- try {
- RestConfProc.handleEvents(jsonArrayMod);
- } catch (Exception e) {
- log.error("Error in DataChangeEventListener ", e.getMessage());
- }
- }
-}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/EventProcessor.java b/src/main/java/org/onap/dcae/collectors/restconf/common/EventProcessor.java
deleted file mode 100755
index 763cece..0000000
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/EventProcessor.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.common;
-
-
-import org.json.JSONObject;
-import org.onap.dcae.collectors.restconf.common.event.publishing.EventPublisher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-public class EventProcessor implements Runnable {
- private static final Logger log = LoggerFactory.getLogger(EventProcessor.class);
-
- static Map<String, String[]> streamidHash = new HashMap<>();
- public JSONObject event;
- private EventPublisher eventPublisher;
-
- public EventProcessor(EventPublisher eventPublisher) {
- this.eventPublisher = eventPublisher;
- streamidHash = parseStreamIdToStreamHashMapping(new RestConfProc().streamID);
- }
-
- private Map<String, String[]> parseStreamIdToStreamHashMapping(String streamId) {
- Map<String, String[]> streamidHash = new HashMap<>();
- String[] list = streamId.split("\\|");
- for (String aList : list) {
- String domain = aList.split("=")[0];
- String[] streamIdList = aList.substring(aList.indexOf('=') + 1).split(",");
- streamidHash.put(domain, streamIdList);
- }
- return streamidHash;
- }
-
- @Override
- public void run() {
- try {
-
- while (true) {
- event = RestConfProc.fProcessingInputQueue.take();
- // As long as the producer is running we remove elements from
- // the queue.
- log.info("QueueSize:" + RestConfProc.fProcessingInputQueue.size() + "\tEventProcessor\tRemoving element: " +
- event);
- String[] streamIdList = streamidHash.get("route");
- log.debug("streamIdList:" + Arrays.toString(streamIdList));
-
- if (streamIdList.length == 0) {
- log.error("No StreamID defined for publish - Message dropped" + event);
- } else {
- sendEventsToStreams(streamIdList);
- }
- log.debug("Event published" + event);
- }
- } catch (Exception e) {
- log.error("EventProcessor InterruptedException" + e.getMessage());
- Thread.currentThread().interrupt();
- }
- }
-
- private void sendEventsToStreams(String[] streamIdList) {
- for (String aStreamIdList : streamIdList) {
- log.info("Invoking publisher for streamId:" + aStreamIdList);
- eventPublisher.sendEvent(event, aStreamIdList);
- }
- }
-}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfCollector.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfCollector.java
deleted file mode 100755
index 508cf66..0000000
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfCollector.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.common;
-
-import com.att.nsa.cmdLine.NsaCommandLineUtil;
-import com.att.nsa.drumlin.service.framework.DrumlinServlet;
-import com.att.nsa.drumlin.till.nv.impl.nvPropertiesFile;
-import com.att.nsa.drumlin.till.nv.impl.nvReadableStack;
-import com.att.nsa.drumlin.till.nv.impl.nvReadableTable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.URL;
-import java.util.Map;
-
-public class RestConfCollector {
-
- public static final Logger eplog = LoggerFactory.getLogger("org.onap.restconf.common.error");
-
- public static void main(String[] args) {
- try {
- final Map<String, String> argMap = NsaCommandLineUtil.processCmdLine(args, true);
- final String config = NsaCommandLineUtil.getSetting(argMap, Constants.KCONFIG, "collector.properties");
- final URL settingStream = DrumlinServlet.findStream(config, RestConfCollector.class);
-
- final nvReadableStack settings = new nvReadableStack();
- settings.push(new nvPropertiesFile(settingStream));
- settings.push(new nvReadableTable(argMap));
-
- RestConfProc restConfProc = new RestConfProc(settings);
- Map<String, String> paraMap = restConfProc.getParaMap();
- String restApiURL = paraMap.get(Constants.KSETTING_REST_API_URL);
- String sseEventsURL = paraMap.get(Constants.KSETTING_SSE_CONNECT_URL);
- String trustStoreFileName = paraMap.get(Constants.KSETTING_TRUST_STORE_FILENAME);
- String keyStoreFileName = paraMap.get(Constants.KSETTING_KEY_STORE_FILENAME);
- String[] listRestApiURL = restApiURL.split(";");
- String[] listSseEventsURL = sseEventsURL.split(";");
- String[] listTrustStoreFileName = trustStoreFileName.split(";");
- String[] listKeyStoreFileName = keyStoreFileName.split(";");
- for (int i = 0; i < listRestApiURL.length; i++) {
- paraMap.put(Constants.KSETTING_REST_API_URL, "https://" + listRestApiURL[i] +
- "/restconf/operations/ietf-subscribed-notifications:establish-subscription");
- paraMap.put(Constants.KSETTING_SSE_CONNECT_URL, listSseEventsURL[i]);
- paraMap.put(Constants.KSETTING_TRUST_STORE_FILENAME, listTrustStoreFileName[i]);
- paraMap.put(Constants.KSETTING_KEY_STORE_FILENAME, listKeyStoreFileName[i]);
- restConfProc.establishSubscription(paraMap, restConfProc.getCtx(), listRestApiURL[i]);
- }
-
- } catch (Exception e) {
- RestConfCollector.eplog.error("Fatal error during application startup", e);
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfProc.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfProc.java
deleted file mode 100755
index cfebe3b..0000000
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfProc.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.common;
-
-import com.att.nsa.drumlin.till.nv.rrNvReadable;
-import org.glassfish.jersey.media.sse.EventSource;
-import org.glassfish.jersey.media.sse.SseFeature;
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.onap.dcae.collectors.restconf.common.event.publishing.DMaaPConfigurationParser;
-import org.onap.dcae.collectors.restconf.common.event.publishing.EventPublisher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.HttpHeaders;
-import java.nio.file.Paths;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.Base64;
-
-import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.getParameters;
-import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.addAuthType;
-
-public class RestConfProc {
-
- private static final Logger log = LoggerFactory.getLogger(RestConfProc.class);
-
- public static String format;
-
- private static RestConfContext ctx = new RestConfContext();
-
- private static final Logger oplog = LoggerFactory.getLogger("org.onap.restconf.common.output");
-
- private Map<String, PersistentConnection> runnableInfo = new ConcurrentHashMap<>();
-
- private final Map<String, String> paraMap = new HashMap<>();
- private static String cambriaConfigFile;
-
- public static LinkedBlockingQueue<JSONObject> fProcessingInputQueue;
-
- public static String streamID;
- private ExecutorService executor = Executors.newCachedThreadPool();
-
- public RestConfProc() {
- }
-
- private void parseInputParameters(rrNvReadable settings) {
- String tempFileName;
- String restApiUrl;
- String httpMetthod;
- String respPrefix;
- String skipSending;
- String sseConnectUrl;
- String restapiUser;
- String restapiPassword;
- String trustStoreFileName;
- String trustStorePassword;
- String keyStoreFileName;
- String keyStorePassword;
- String[] currentConfigFile;
-
- currentConfigFile = settings.getStrings(Constants.KSETTING_DMAAPCONFIGS, Constants.KDEFAULT_DMAAPCONFIGS);
- cambriaConfigFile = currentConfigFile[0];
-
- tempFileName = settings.getString(Constants.KDEFAULT_TEMP_FILENAME, null);
- restApiUrl = settings.getString(Constants.KSETTING_REST_API_URL, null);
- httpMetthod = settings.getString(Constants.KSETTING_HTTP_METHOD, null);
- respPrefix = settings.getString(Constants.KSETTING_RESP_PREFIX, null);
- skipSending = settings.getString(Constants.KSETTING_SKIP_SENDING, null);
- sseConnectUrl = settings.getString(Constants.KSETTING_SSE_CONNECT_URL, null);
- restapiUser = settings.getString(Constants.KSETTING_UNAME, null);
- restapiPassword = settings.getString(Constants.KSETTING_PASSWORD, null);
- trustStoreFileName = settings.getString(Constants.KSETTING_TRUST_STORE_FILENAME, null);
- trustStorePassword = settings.getString(Constants.KSETTING_TRUST_STORE_PASSWORD, null);
- keyStoreFileName = settings.getString(Constants.KSETTING_KEY_STORE_FILENAME, null);
- keyStorePassword = settings.getString(Constants.KSETTING_KEY_STORE_PASSWORD, null);
- format = settings.getString(Constants.KSETTING_FORMAT, null);
- streamID = "route=route_failure";
-
- paraMap.put(Constants.KDEFAULT_TEMP_FILENAME, tempFileName);
- paraMap.put(Constants.KSETTING_REST_API_URL, restApiUrl);
- paraMap.put(Constants.KSETTING_HTTP_METHOD, httpMetthod);
- paraMap.put(Constants.KSETTING_RESP_PREFIX, respPrefix);
- paraMap.put(Constants.KSETTING_SKIP_SENDING, skipSending);
- paraMap.put(Constants.KSETTING_SSE_CONNECT_URL, sseConnectUrl);
- paraMap.put(Constants.KSETTING_FORMAT, format);
- paraMap.put(Constants.KSETTING_UNAME, restapiUser);
- paraMap.put(Constants.KSETTING_PASSWORD, restapiPassword);
- paraMap.put(Constants.KSETTING_TRUST_STORE_FILENAME, trustStoreFileName);
- paraMap.put(Constants.KSETTING_TRUST_STORE_PASSWORD, trustStorePassword);
- paraMap.put(Constants.KSETTING_KEY_STORE_FILENAME, keyStoreFileName);
- paraMap.put(Constants.KSETTING_KEY_STORE_PASSWORD, keyStorePassword);
-
- ctx.setAttribute("prop.encoding-json", "encoding-json");
- ctx.setAttribute("restapi-result.response-code", "200");
- ctx.setAttribute("restapi-result.ietf-subscribed-notifications:output.identifier", "100");
- }
-
- public RestConfProc(rrNvReadable settings) {
-
- parseInputParameters(settings);
-
- fProcessingInputQueue = new LinkedBlockingQueue<>(Constants.KDEFAULT_MAXQUEUEDEVENTS);
-
- EventProcessor ep = new EventProcessor(EventPublisher.createPublisher(oplog,
- DMaaPConfigurationParser
- .parseToDomainMapping(Paths.get(cambriaConfigFile))
- .get()));
- ExecutorService executor = Executors.newFixedThreadPool(20);
- for (int i = 0; i < 20; ++i) {
- executor.execute(ep);
- }
- }
-
- /**
- * To establish a subscription with controller by sending HTTP request
- *
- * @param paramMap holds the input configuration
- * @param ctx restconf context
- * @param url url to send subscription request
- * @throws Exception exception
- */
- public void establishSubscription(Map<String, String> paramMap,
- RestConfContext ctx,
- String url) throws Exception {
-
- RestapiCallNode restApiCallNode = new RestapiCallNode();
-
- Map<String, String> params = new HashMap<>();
- params.put("restapiUrl", "https://" + url + "/controller/v2/tokens");
- params.put("httpMethod", "post");
- params.put("templateFileName", "./etc/access-token.json");
- params.put("skipSending", "false");
- params.put("format", "json");
- params.put("restapiUser", "test123");
- params.put("restapiPassword", "Changeme_123");
- params.put(Constants.KSETTING_TRUST_STORE_FILENAME,
- paramMap.get(Constants.KSETTING_TRUST_STORE_FILENAME));
- params.put(Constants.KSETTING_TRUST_STORE_PASSWORD, "adminadmin");
- params.put(Constants.KSETTING_KEY_STORE_FILENAME,
- paramMap.get(Constants.KSETTING_KEY_STORE_FILENAME));
- params.put(Constants.KSETTING_KEY_STORE_PASSWORD, "adminadmin");
-
- String httpResponse = null;
- try {
- restApiCallNode.sendRequest(params, ctx, null);
- httpResponse = ctx.getAttribute("httpResponse");
- JSONObject jsonObj = new JSONObject(httpResponse);
- JSONObject data = jsonObj.getJSONObject("data");
- String tokenId = data.get("token_id").toString();
- paramMap.put("customHttpHeaders", "X-ACCESS-TOKEN=" + tokenId);
- paramMap.put("TokenId", tokenId);
- } catch (Exception e) {
- log.info("Access token is not supported" + e.getMessage());
- log.info("http response" + httpResponse);
- }
-
- restApiCallNode.sendRequest(paramMap, ctx, null);
-
- establishPersistentConnection(paramMap, ctx);
- }
-
- /**
- * To establish persistent connection after receiving successful subscription response from controller
- *
- * @param paramMap holds the input configuration
- * @param ctx restconf context
- */
- public void establishPersistentConnection(Map<String, String> paramMap, RestConfContext ctx) {
-
- // check whether response is ok
- if (ctx.getAttribute(Constants.RESPONSE_CODE).equals(Constants.RESPONSE_CODE_200)) {
-
- String id = ctx.getAttribute(Constants.OUTPUT_IDENTIFIER);
-
- String url = paramMap.get(Constants.KSETTING_SSE_CONNECT_URL);
-
- PersistentConnection connection = new PersistentConnection(url, ctx, paramMap);
- runnableInfo.put(id, connection);
- executor.execute(connection);
- } else {
- // error response is already updated in ctx
- log.info("Failed to subscribe");
- }
- }
-
- /**
- * Get input parameter map
- *
- * @return input parameters map
- */
- public Map<String, String> getParaMap() {
- return paraMap;
- }
-
-
- /**
- * Get restConf context which has information about message encoding type
- *
- * @return restconf context
- */
- public RestConfContext getCtx() {
- return ctx;
- }
-
- public class PersistentConnection implements Runnable {
- private String url;
- private RestConfContext ctx;
- private Map<String, String> paramMap;
- private volatile boolean running = true;
-
- public PersistentConnection(String url, RestConfContext ctx, Map<String, String> paramMap) {
- this.url = url;
- this.ctx = ctx;
- this.paramMap = paramMap;
- }
-
- @Override
- public void run() {
- Parameters p = null;
- try {
- p = getParameters(paramMap);
- } catch (Exception e) {
- log.error("Exception occured!", e);
- Thread.currentThread().interrupt();
- }
-
- Client client = ignoreSslClient().register(SseFeature.class);
- WebTarget target = addAuthType(client, p).target(url);
- String token = paramMap.get("TokenId");
- String headerName = "X-ACCESS-TOKEN";
- if (token == null) {
- headerName = HttpHeaders.AUTHORIZATION;
- if(null!=p) {
- token = getAuthorizationToken(p.restapiUser, p.restapiPassword);
- }
- }
- AdditionalHeaderWebTarget newTarget = new AdditionalHeaderWebTarget(target, token, headerName);
- EventSource eventSource = EventSource.target(newTarget).build();
- eventSource.register(new DataChangeEventListener(ctx));
- eventSource.open();
- log.debug("Connected to SSE source");
- while (running) {
- try {
- log.debug("SSE state " + eventSource.isOpen());
- Thread.sleep(5000);
- } catch (InterruptedException ie) {
- log.debug("Exception: " + ie.getMessage());
- Thread.currentThread().interrupt();
- }
- }
- eventSource.close();
- log.info("Closed connection to SSE source");
- }
- }
-
- private String getAuthorizationToken(String userName, String password) {
- return "Basic " + Base64.getEncoder().encodeToString((
- userName + ":" + password).getBytes());
- }
-
- /**
- * To process the array of events which are received from controller
- *
- * @param a JSONArray
- * @throws Exception exception
- */
- public static void handleEvents(JSONArray a) throws Exception {
- for (int i = 0; i < a.length(); i++) {
- if (!fProcessingInputQueue.offer(a.getJSONObject(i))) {
- throw new Exception();
- }
- }
- log.debug("RestConfCollector.handleEvents:EVENTS has been published successfully!");
- }
-
- private Client ignoreSslClient() {
- SSLContext sslcontext = null;
-
- try {
- sslcontext = SSLContext.getInstance("TLS");
- sslcontext.init(null, new TrustManager[]{new X509TrustManager() {
- @Override
- public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
- }
-
- @Override
- public X509Certificate[] getAcceptedIssuers() {
- return new X509Certificate[0];
- }
- } }, new java.security.SecureRandom());
- } catch (NoSuchAlgorithmException | KeyManagementException e) {
- throw new IllegalStateException(e);
- }
-
- return ClientBuilder.newBuilder().sslContext(sslcontext).hostnameVerifier((s1, s2) -> true).build();
- }
-}
-
-
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicy.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicy.java
deleted file mode 100755
index 6c62394..0000000
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicy.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.common;
-
-public class RetryPolicy {
- private String[] hostnames;
- private Integer maximumRetries;
-
- public Integer getMaximumRetries() {
- return maximumRetries;
- }
-
- public String getNextHostName(String uri) throws RetryException {
- Integer position = null;
-
- for (int i = 0; i < hostnames.length; i++) {
- if (uri.contains(hostnames[i])) {
- position = i;
- break;
- }
- }
-
- if (position == null) {
- throw new RetryException("No match found for the provided uri[" + uri + "] " +
- "so the next host name could not be retreived");
- }
- position++;
-
- if (position > hostnames.length - 1) {
- position = 0;
- }
- return hostnames[position];
- }
-
- public RetryPolicy(String[] hostnames, Integer maximumRetries) {
- this.hostnames = hostnames;
- this.maximumRetries = maximumRetries;
- }
-
-}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/AdditionalHeaderWebTarget.java b/src/main/java/org/onap/dcae/common/AdditionalHeaderWebTarget.java
index e814778..fe61155 100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/AdditionalHeaderWebTarget.java
+++ b/src/main/java/org/onap/dcae/common/AdditionalHeaderWebTarget.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
@@ -26,7 +26,7 @@ import javax.ws.rs.core.UriBuilder;
import java.net.URI;
import java.util.Map;
-class AdditionalHeaderWebTarget implements WebTarget {
+public class AdditionalHeaderWebTarget implements WebTarget {
private WebTarget base;
private String token;
private String headerName;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/AnyNode.java b/src/main/java/org/onap/dcae/common/AnyNode.java
index 860fecc..8980f1b 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/AnyNode.java
+++ b/src/main/java/org/onap/dcae/common/AnyNode.java
@@ -1,8 +1,9 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018 Nokia Networks Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,8 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import io.vavr.collection.List;
import io.vavr.collection.Set;
@@ -26,15 +26,19 @@ import io.vavr.control.Option;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.util.stream.StreamSupport;
import static io.vavr.API.Set;
+/**
+ * This class is a wrapper for 2 most used entities of org.json lib: JSONArray and JSONObject and comprises utility
+ * methods for fast access of json structures without need to explicitly coerce between them. While using this, bear in
+ * mind it does not contain exception handling - it is assumed that when using, the parsed json structure is known.
+ *
+ * @author koblosz
+ */
public class AnyNode {
- private static final Logger log = LoggerFactory.getLogger(AnyNode.class);
private Object obj;
@@ -46,46 +50,18 @@ public class AnyNode {
return new AnyNode(new JSONObject(content));
}
- /**
- * Returns key set of underlying object. It is assumed that underlying object is of type org.json.JSONObject.
- *
- * @return key set of underlying objects
- */
public Set<String> keys() {
return Set(asJsonObject().keySet().toArray(new String[]{}));
}
- /**
- * Returns value associated with specified key wrapped with AnyValue object. It is assumed that this is of type
- * org.json.JSONObject.
- *
- * @param key for querying value from jsonobject
- * @return value associated with specified key
- */
public AnyNode get(String key) {
return new AnyNode(asJsonObject().get(key));
}
- /**
- * Returns string representation of this. If it happens to have null, the value is treated as
- * org.json.JSONObject.NULL and "null" string is returned then.
- *
- * @return string representation of this
- */
public String toString() {
return this.obj.toString();
}
- /**
- * Returns optional of object under specified key, wrapped with AnyNode object.
- * If underlying object is not of type org.json.JSONObject
- * or underlying object has no given key
- * or given key is null
- * then Optional.empty will be returned.
- *
- * @param key for querying value from AnyNode object
- * @return optional of object under specified key
- */
public Option<AnyNode> getAsOption(String key) {
try {
AnyNode value = get(key);
@@ -94,39 +70,20 @@ public class AnyNode {
}
return Option.some(value);
} catch (JSONException ex) {
- log.error(ex.getMessage(), ex);
return Option.none();
}
}
- /**
- * Converts underlying object to map representation with map values wrapped with AnyNode object. It is assumed that
- * underlying object is of type org.json.JSONObject.
- *
- * @return converts underlying object to map representation
- */
public List<AnyNode> toList() {
return List.ofAll(StreamSupport.stream(((JSONArray) this.obj).spliterator(), false).map(AnyNode::new));
}
- /**
- * Checks if specified key is present in this. It is assumed that this is of type JSONObject.
- *
- * @param key is used to check presence in anynode object
- * @return true if specified key is present in this
- */
public boolean has(String key) {
return !getAsOption(key).isEmpty();
}
- /**
- * Returns as JSONObject.
- *
- * @return jsonobject
- */
private JSONObject asJsonObject() {
return (JSONObject) this.obj;
}
-
}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/AuthType.java b/src/main/java/org/onap/dcae/common/AuthType.java
index 2072631..d87321e 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/AuthType.java
+++ b/src/main/java/org/onap/dcae/common/AuthType.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
public enum AuthType {
NONE, BASIC, DIGEST, OAUTH, Unspecified;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/Constants.java b/src/main/java/org/onap/dcae/common/Constants.java
index 5f8925d..1fe5624 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/Constants.java
+++ b/src/main/java/org/onap/dcae/common/Constants.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,25 +18,29 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
public class Constants {
public static final String KDEFAULT_TEMP_FILENAME = "templateFileName";
+ public static final String KDEFAULT_REQUESTBODY = "requestBody";
public static final String KSETTING_REST_API_URL = "restapiUrl";
+ public static final String KSETTING_REST_UNAME = "restapiUser";
+ public static final String KSETTING_REST_PASSWORD = "restapiPassword";
public static final String KSETTING_HTTP_METHOD = "httpMethod";
public static final String KSETTING_RESP_PREFIX = "responsePrefix";
public static final String KSETTING_SKIP_SENDING = "skipSending";
public static final String KSETTING_FORMAT = "format";
- public static final String KSETTING_DMAAPCONFIGS = "collector.dmaapfile";
- public static final String[] KDEFAULT_DMAAPCONFIGS = new String[]{"./etc/DmaapConfig.json"};
public static final String KSETTING_SSE_CONNECT_URL = "sseConnectURL";
- public static final int KDEFAULT_MAXQUEUEDEVENTS = 1024 * 4;
- public static final String RESPONSE_CODE = "restapi-result.response-code";
- public static final String OUTPUT_IDENTIFIER = "restapi-result.ietf-subscribed-notifications:output.identifier";
- public static final String RESPONSE_CODE_200 = "200";
- public static final String KCONFIG = "c";
- public static final String KSETTING_UNAME = "restapiUser";
- public static final String KSETTING_PASSWORD = "restapiPassword";
+ public static final String KSETTING_AUTH_TYPE = "authType";
+ public static final String KSETTING_CONTENT_TYPE = "contentType";
+ public static final String KSETTING_OAUTH_CONSUMER_KEY = "oAuthConsumerKey";
+ public static final String KSETTING_OAUTH_CONSUMER_SECRET = "oAuthConsumerSecret";
+ public static final String KSETTING_OAUTH_SIGNATURE_METHOD = "oAuthSignatureMethod";
+ public static final String KSETTING_OAUTH_VERSION = "oAuthVersion";
+ public static final String KSETTING_TOKENID = "tokenId";
+ public static final String KSETTING_CUSTOMHTTP_HEADER = "customHttpHeaders";
+ public static final String KSETTING_DUMP_HEADER = "dumpHeaders";
+ public static final String KSETTING_RETURN_REQUEST_PAYLOAD = "returnRequestPayload";
public static final String KSETTING_TRUST_STORE_FILENAME = "trustStoreFileName";
public static final String KSETTING_TRUST_STORE_PASSWORD = "trustStorePassword";
public static final String KSETTING_KEY_STORE_FILENAME = "keyStoreFileName";
diff --git a/src/main/java/org/onap/dcae/common/DataChangeEventListener.java b/src/main/java/org/onap/dcae/common/DataChangeEventListener.java
new file mode 100755
index 0000000..6e13f73
--- /dev/null
+++ b/src/main/java/org/onap/dcae/common/DataChangeEventListener.java
@@ -0,0 +1,86 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.restconf
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.common;
+
+import org.glassfish.jersey.media.sse.EventListener;
+import org.glassfish.jersey.media.sse.InboundEvent;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.onap.dcae.RestConfCollector;
+import org.onap.dcae.controller.PersistentEventConnection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DataChangeEventListener implements EventListener {
+ private static final Logger log = LoggerFactory.getLogger(DataChangeEventListener.class);
+ private PersistentEventConnection conn;
+
+ public DataChangeEventListener(PersistentEventConnection conn) {
+ this.conn = conn;
+ }
+
+ @Override
+ public void onEvent(InboundEvent event) {
+ try {
+ log.info("SSE Event is received");
+ String s = event.readData();
+ jsonType type = isJSONValid(s);
+ if (type == jsonType.OBJECT) {
+ JSONObject jsonObj = new JSONObject(s);
+ EventData ev = new EventData(this.conn, jsonObj);
+ log.info("SSE Event in json " + jsonObj.toString());
+ RestConfCollector.handleEvents(ev);
+ } else if (type == jsonType.ARRAY) {
+ JSONArray jsonArr = new JSONArray(s);
+ for (int j = 0; j < jsonArr.length(); j++) {
+ JSONObject jsonObj = jsonArr.getJSONObject(j);
+ EventData ev = new EventData(this.conn, jsonObj);
+ log.info("SSE Event in json " + jsonObj.toString());
+ RestConfCollector.handleEvents(ev);
+ }
+ } else {
+ log.info("Received heart beat ");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private enum jsonType {
+ OBJECT, ARRAY, NONE;
+ }
+
+ public jsonType isJSONValid(String test) {
+ try {
+ new JSONObject(test);
+ log.info("Received a Json object");
+ } catch (JSONException ex) {
+ try {
+ new JSONArray(test);
+ return jsonType.ARRAY;
+ } catch (JSONException ex1) {
+ return jsonType.NONE;
+ }
+ }
+ return jsonType.OBJECT;
+ }
+}
diff --git a/src/main/java/org/onap/dcae/common/EventConnectionState.java b/src/main/java/org/onap/dcae/common/EventConnectionState.java
new file mode 100644
index 0000000..3e53247
--- /dev/null
+++ b/src/main/java/org/onap/dcae/common/EventConnectionState.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.restconf
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.common;
+
+public enum EventConnectionState {
+
+ INIT, SUBSCRIBED, UNSUBSCRIBED, Unspecified;
+
+ public static EventConnectionState fromString(String s) {
+ if ("init".equalsIgnoreCase(s)) {
+ return INIT;
+ }
+ if ("subscribed".equalsIgnoreCase(s)) {
+ return SUBSCRIBED;
+ }
+ if ("unsubscribed".equalsIgnoreCase(s)) {
+ return UNSUBSCRIBED;
+ }
+ if ("unspecified".equalsIgnoreCase(s)) {
+ return Unspecified;
+ }
+ throw new IllegalArgumentException("Invalid value for format: " + s);
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryException.java b/src/main/java/org/onap/dcae/common/EventData.java
index aa40c33..b97d8e4 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryException.java
+++ b/src/main/java/org/onap/dcae/common/EventData.java
@@ -1,8 +1,8 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,11 +17,26 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+package org.onap.dcae.common;
-package org.onap.dcae.collectors.restconf.common;
+import org.json.JSONObject;
+import org.onap.dcae.controller.PersistentEventConnection;
-public class RetryException extends Exception {
- public RetryException(String message) {
- super(message);
+public class EventData {
+ private PersistentEventConnection conn;
+ private JSONObject eventObj;
+
+
+ public EventData(PersistentEventConnection conn, JSONObject eventObj) {
+ this.conn = conn;
+ this.eventObj = eventObj;
+ }
+
+ public PersistentEventConnection getConn() {
+ return conn;
+ }
+
+ public JSONObject getEventObj() {
+ return eventObj;
}
}
diff --git a/src/main/java/org/onap/dcae/common/EventProcessor.java b/src/main/java/org/onap/dcae/common/EventProcessor.java
new file mode 100644
index 0000000..bb0f095
--- /dev/null
+++ b/src/main/java/org/onap/dcae/common/EventProcessor.java
@@ -0,0 +1,103 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.restconf
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.common;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.onap.dcae.RestConfCollector;
+import org.onap.dcae.common.publishing.EventPublisher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+public class EventProcessor implements Runnable {
+ private static final Logger log = LoggerFactory.getLogger(EventProcessor.class);
+
+ private Map<String, String[]> streamidHash = new HashMap<>();
+ public EventData ev;
+ private EventPublisher eventPublisher;
+
+ public EventProcessor(EventPublisher eventPublisher, Map<String, String[]> streamidHash) {
+ this.eventPublisher = eventPublisher;
+ this.streamidHash.putAll(streamidHash);
+ }
+
+
+ @Override
+ public void run() {
+ try {
+
+ while (true) {
+ ev = RestConfCollector.fProcessingInputQueue.take();
+
+ // As long as the producer is running we remove elements from
+ // the queue.
+ log.info("QueueSize:" + RestConfCollector.fProcessingInputQueue.size() + "\tEventProcessor\tRemoving element: " +
+ ev.getEventObj());
+ /*@TODO: Right now all event publish to single domain and consume by VES collector. Later maybe send to specific domain */
+ String[] streamIdList = streamidHash.get("notification");
+ log.info("streamIdList:" + Arrays.toString(streamIdList));
+
+ if (streamIdList.length == 0) {
+ log.error("No StreamID defined for publish - Message dropped" + ev.getEventObj());
+ } else {
+ sendEventsToStreams(streamIdList, ev);
+ }
+ log.info("Event published" + ev.getEventObj());
+ }
+ } catch (Exception e) {
+ log.error("EventProcessor InterruptedException" + e.getMessage());
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private void sendEventsToStreams(String[] streamIdList, EventData ev) {
+ for (String aStreamIdList : streamIdList) {
+ log.info("Invoking publisher for streamId:" + aStreamIdList);
+ if (!ev.getConn().getEvent_ruleId().equals("")) {
+ JSONObject customHeader = new JSONObject();
+ customHeader.put("rule-id", ev.getConn().getEvent_ruleId());
+ eventPublisher.sendEvent(overrideEvent(customHeader, ev.getEventObj()), aStreamIdList);
+ } else {
+ eventPublisher.sendEvent(ev.getEventObj(), aStreamIdList);
+ }
+ }
+ }
+
+ private static JSONObject overrideEvent(JSONObject json1, JSONObject json2) {
+ JSONObject mergedJSON;
+ try {
+ mergedJSON = new JSONObject(json1, JSONObject.getNames(json1));
+ for (String key : JSONObject.getNames(json2)) {
+ mergedJSON.put(key, json2.get(key));
+ }
+
+ } catch (JSONException e) {
+ throw new RuntimeException("JSON Exception" + e);
+ }
+ log.info("Merged json " + mergedJSON);
+ return mergedJSON;
+ }
+}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/Format.java b/src/main/java/org/onap/dcae/common/Format.java
index 710a576..3539684 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/Format.java
+++ b/src/main/java/org/onap/dcae/common/Format.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
public enum Format {
JSON, XML, NONE;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpMethod.java b/src/main/java/org/onap/dcae/common/HttpMethod.java
index b5c8e71..730ff2d 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpMethod.java
+++ b/src/main/java/org/onap/dcae/common/HttpMethod.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
public enum HttpMethod {
GET, POST, PUT, DELETE, PATCH;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpResponse.java b/src/main/java/org/onap/dcae/common/HttpResponse.java
index 01505c3..3d69ec8 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpResponse.java
+++ b/src/main/java/org/onap/dcae/common/HttpResponse.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import javax.ws.rs.core.MultivaluedMap;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/JsonParser.java b/src/main/java/org/onap/dcae/common/JsonParser.java
index 16a5b7d..6ce02f2 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/JsonParser.java
+++ b/src/main/java/org/onap/dcae/common/JsonParser.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/Parameters.java b/src/main/java/org/onap/dcae/common/Parameters.java
index b0f7dfc..5bc85a5 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/Parameters.java
+++ b/src/main/java/org/onap/dcae/common/Parameters.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import java.util.Set;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfContext.java b/src/main/java/org/onap/dcae/common/RestConfContext.java
index e1ea001..0f95151 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfContext.java
+++ b/src/main/java/org/onap/dcae/common/RestConfContext.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import java.util.HashMap;
import java.util.Set;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNode.java b/src/main/java/org/onap/dcae/common/RestapiCallNode.java
index 33abca9..af0245d 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNode.java
+++ b/src/main/java/org/onap/dcae/common/RestapiCallNode.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,17 +18,14 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.UniformInterfaceException;
-import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.*;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.api.client.filter.HTTPDigestAuthFilter;
+import com.sun.jersey.api.client.filter.LoggingFilter;
import com.sun.jersey.client.urlconnection.HTTPSProperties;
import com.sun.jersey.oauth.client.OAuthClientFilter;
import com.sun.jersey.oauth.signature.OAuthParameters;
@@ -43,34 +40,28 @@ import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.UriBuilder;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketException;
-import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyStore;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
-import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.getParameters;
-import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.parseParam;
+import static org.onap.dcae.common.RestapiCallNodeUtil.getParameters;
+import static org.onap.dcae.common.RestapiCallNodeUtil.parseParam;
public class RestapiCallNode {
private static final Logger log = LoggerFactory.getLogger(RestapiCallNode.class);
public void sendRequest(Map<String, String> paramMap, RestConfContext ctx, Integer retryCount) throws Exception {
- RetryPolicy retryPolicy = null;
HttpResponse r = new HttpResponse();
try {
Parameters p = getParameters(paramMap);
String pp = p.responsePrefix != null ? p.responsePrefix + '.' : "";
String req = null;
if (p.templateFileName != null) {
+ log.info("p.templateFileName " + p.templateFileName);
String reqTemplate = readFile(p.templateFileName);
req = buildXmlJsonRequest(ctx, reqTemplate, p.format);
} else if (p.requestBody != null) {
@@ -102,8 +93,10 @@ public class RestapiCallNode {
}
if (mm != null) {
- for (Map.Entry<String, String> entry : mm.entrySet())
+ for (Map.Entry<String, String> entry : mm.entrySet()) {
ctx.setAttribute(pp + entry.getKey(), entry.getValue());
+ log.info("ctx.setAttribute :=> {} value {} ", pp + entry.getKey(), entry.getValue());
+ }
}
}
}
@@ -115,34 +108,13 @@ public class RestapiCallNode {
log.error("Error sending the request: " + e.getMessage(), e);
String prefix = parseParam(paramMap, "responsePrefix", false, null);
- if (null == retryPolicy || !shouldRetry) {
+ if (!shouldRetry || (retryCount == null) || (retryCount == 0)) {
setFailureResponseStatus(ctx, prefix, e.getMessage(), r);
} else {
- if (retryCount == null) {
- retryCount = 0;
- }
- String retryMessage = retryCount + " attempts were made out of " + retryPolicy.getMaximumRetries() +
- " maximum retries.";
- log.debug(retryMessage);
try {
- retryCount = retryCount + 1;
- if (retryCount < retryPolicy.getMaximumRetries() + 1) {
- URI uri = new URI(paramMap.get("restapiUrl"));
- String hostname = uri.getHost();
- String retryString = retryPolicy.getNextHostName(uri.toString());
- URI uriTwo = new URI(retryString);
- URI retryUri = UriBuilder.fromUri(uri).host(uriTwo.getHost()).port(uriTwo.getPort()).scheme(
- uriTwo.getScheme()).build();
- paramMap.put("restapiUrl", retryUri.toString());
- log.debug("URL was set to {}", retryUri.toString());
- log.debug("Failed to communicate with host {}. Request will be re-attempted using the host {}.",
- hostname, retryString);
- log.debug("This is retry attempt {} out of {}", retryCount, retryPolicy.getMaximumRetries());
- sendRequest(paramMap, ctx, retryCount);
- } else {
- log.debug("Maximum retries reached, calling setFailureResponseStatus.");
- setFailureResponseStatus(ctx, prefix, e.getMessage(), r);
- }
+ retryCount = retryCount - 1;
+ log.debug("This is retry attempt {} ", retryCount);
+ sendRequest(paramMap, ctx, retryCount);
} catch (Exception ex) {
log.error("Could not attempt retry.", ex);
String retryErrorMessage =
@@ -165,8 +137,9 @@ public class RestapiCallNode {
template = expandRepeats(ctx, template, 1);
Map<String, String> mm = new HashMap<>();
- for (String s : ctx.getAttributeKeySet())
+ for (String s : ctx.getAttributeKeySet()) {
mm.put(s, ctx.getAttribute(s));
+ }
StringBuilder ss = new StringBuilder();
int i = 0;
while (i < template.length()) {
@@ -317,14 +290,14 @@ public class RestapiCallNode {
client.addFilter(new HTTPDigestAuthFilter(p.restapiUser, p.restapiPassword));
} else {
throw new Exception("oAUTH authentication type selected but all restapiUser and restapiPassword " +
- "parameters doesn't exist", new Throwable());
+ "parameters doesn't exist", new Throwable());
}
} else if (p.authtype == AuthType.BASIC) {
if (p.restapiUser != null && p.restapiPassword != null) {
client.addFilter(new HTTPBasicAuthFilter(p.restapiUser, p.restapiPassword));
} else {
throw new Exception("oAUTH authentication type selected but all restapiUser and restapiPassword " +
- "parameters doesn't exist", new Throwable());
+ "parameters doesn't exist", new Throwable());
}
} else if (p.authtype == AuthType.OAUTH) {
if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null && p.oAuthSignatureMethod != null) {
@@ -337,8 +310,8 @@ public class RestapiCallNode {
.consumerSecret(p.oAuthConsumerSecret);
client.addFilter(new OAuthClientFilter(client.getProviders(), params, secrets));
} else {
- throw new Exception("oAUTH authentication type selected but all oAuthConsumerKey, oAuthConsumerSecret " +
- "and oAuthSignatureMethod parameters doesn't exist", new Throwable());
+ throw new Exception("oAUTH authentication type selected but all oAuthConsumerKey, voAuthConsumerSecret " +
+ "and oAuthSignatureMethod parameters doesn't exist", new Throwable());
}
}
}
@@ -346,7 +319,6 @@ public class RestapiCallNode {
}
protected HttpResponse sendHttpRequest(String request, Parameters p) throws Exception {
-
ClientConfig config = new DefaultClientConfig();
SSLContext ssl = null;
if (p.ssl && p.restapiUrl.startsWith("https")) {
@@ -356,17 +328,20 @@ public class RestapiCallNode {
HostnameVerifier hostnameVerifier = (hostname, session) -> true;
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
- new HTTPSProperties(hostnameVerifier, ssl));
+ new HTTPSProperties(hostnameVerifier, ssl));
}
logProperties(config.getProperties());
Client client = Client.create(config);
client.setConnectTimeout(5000);
+ client.addFilter(new LoggingFilter());
WebResource webResource = addAuthType(client, p).resource(p.restapiUrl);
log.info("Sending request:");
log.info(request);
+ log.info("URL: " + p.restapiUrl + " method " + p.httpMethod.toString() + " Custome headr " + p.customHttpHeaders);
+
long t1 = System.currentTimeMillis();
HttpResponse r = new HttpResponse();
@@ -390,19 +365,17 @@ public class RestapiCallNode {
for (String singlePair : keyValuePairs) {
int equalPosition = singlePair.indexOf('=');
webResourceBuilder.header(singlePair.substring(0, equalPosition),
- singlePair.substring(equalPosition + 1, singlePair.length()));
+ singlePair.substring(equalPosition + 1, singlePair.length()));
}
}
- webResourceBuilder.header("X-ECOMP-RequestID", org.slf4j.MDC.get("X-ECOMP-RequestID"));
-
ClientResponse response;
try {
response = webResourceBuilder.method(p.httpMethod.toString(), ClientResponse.class, request);
} catch (UniformInterfaceException | ClientHandlerException e) {
throw new Exception("Exception while sending http request to client "
- + e.getLocalizedMessage(), e);
+ + e.getLocalizedMessage(), e);
}
r.code = response.getStatus();
@@ -452,6 +425,7 @@ public class RestapiCallNode {
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("PKCS12");
char[] pwd = p.keyStorePassword.toCharArray();
+ log.info("pwd " + pwd + " " + p.keyStorePassword);
ks.load(in, pwd);
kmf.init(ks, pwd);
@@ -490,21 +464,4 @@ public class RestapiCallNode {
for (String name : ll)
log.info("--- {}:{}", name, String.valueOf(mm.get(name)));
}
-
- private static class FileParam {
-
- public String fileName;
- public String url;
- public String user;
- public String password;
- public HttpMethod httpMethod;
- public String responsePrefix;
- public boolean skipSending;
- public String oAuthConsumerKey;
- public String oAuthConsumerSecret;
- public String oAuthSignatureMethod;
- public String oAuthVersion;
- public AuthType authtype;
- }
-
} \ No newline at end of file
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNodeUtil.java b/src/main/java/org/onap/dcae/common/RestapiCallNodeUtil.java
index 0e1d03b..1ff00dd 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNodeUtil.java
+++ b/src/main/java/org/onap/dcae/common/RestapiCallNodeUtil.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
import org.glassfish.jersey.client.oauth1.ConsumerCredentials;
@@ -37,18 +37,30 @@ public class RestapiCallNodeUtil {
private static final Logger log = LoggerFactory.getLogger(RestapiCallNodeUtil.class);
+
private RestapiCallNodeUtil() {
// Preventing instantiation of the same.
}
+ public static String getUriMethod(Boolean authEnabled) {
+ /*@TODO: As per configuration */
+// String uri;
+// if (authEnabled) {
+// uri = "https://";
+// } else {
+// uri = "http://";
+// }
+ return "https://";
+ }
+
public static Parameters getParameters(Map<String, String> paramMap) throws Exception {
Parameters p = new Parameters();
p.templateFileName = parseParam(paramMap, "templateFileName", false, null);
p.requestBody = parseParam(paramMap, "requestBody", false, null);
p.restapiUrl = parseParam(paramMap, "restapiUrl", true, null);
validateUrl(p.restapiUrl);
- p.restapiUser = parseParam(paramMap, "restapiUser", false, null);
- p.restapiPassword = parseParam(paramMap, "restapiPassword", false, null);
+ p.restapiUser = null;//parseParam(paramMap, "restapiUser", false, null);
+ p.restapiPassword = null;//parseParam(paramMap, "restapiPassword", false, null);
p.oAuthConsumerKey = parseParam(paramMap, "oAuthConsumerKey", false, null);
p.oAuthConsumerSecret = parseParam(paramMap, "oAuthConsumerSecret", false, null);
p.oAuthSignatureMethod = parseParam(paramMap, "oAuthSignatureMethod", false, null);
@@ -72,9 +84,11 @@ public class RestapiCallNodeUtil {
p.partner = parseParam(paramMap, "partner", false, null);
p.dumpHeaders = Boolean.valueOf(parseParam(paramMap, "dumpHeaders", false, null));
p.returnRequestPayload = Boolean.valueOf(parseParam(paramMap, "returnRequestPayload", false, null));
+ log.info(p.toString());
return p;
}
+
public static String parseParam(Map<String, String> paramMap, String name, boolean required, String def)
throws Exception {
String s = paramMap.get(name);
@@ -132,43 +146,45 @@ public class RestapiCallNodeUtil {
}
public static Client addAuthType(Client client, Parameters p) {
- if (p.authtype == AuthType.Unspecified) {
- if (p.restapiUser != null && p.restapiPassword != null) {
- client.register(HttpAuthenticationFeature.basic(p.restapiUser, p.restapiPassword));
- } else if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null
- && p.oAuthSignatureMethod != null) {
- Feature oAuth1Feature = OAuth1ClientSupport
- .builder(new ConsumerCredentials(p.oAuthConsumerKey, p.oAuthConsumerSecret))
- .version(p.oAuthVersion).signatureMethod(p.oAuthSignatureMethod).feature().build();
- client.register(oAuth1Feature);
- }
- } else {
- if (p.authtype == AuthType.DIGEST) {
- if (p.restapiUser != null && p.restapiPassword != null) {
- client.register(HttpAuthenticationFeature.digest(p.restapiUser, p.restapiPassword));
- } else {
- throw new IllegalArgumentException(
- "oAUTH authentication type selected but all restapiUser and restapiPassword " +
- "parameters doesn't exist", new Throwable());
- }
- } else if (p.authtype == AuthType.BASIC) {
+ if (p != null) {
+ if (p.authtype == AuthType.Unspecified) {
if (p.restapiUser != null && p.restapiPassword != null) {
client.register(HttpAuthenticationFeature.basic(p.restapiUser, p.restapiPassword));
- } else {
- throw new IllegalArgumentException(
- "oAUTH authentication type selected but all restapiUser and restapiPassword " +
- "parameters doesn't exist", new Throwable());
- }
- } else if (p.authtype == AuthType.OAUTH) {
- if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null && p.oAuthSignatureMethod != null) {
+ } else if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null
+ && p.oAuthSignatureMethod != null) {
Feature oAuth1Feature = OAuth1ClientSupport
.builder(new ConsumerCredentials(p.oAuthConsumerKey, p.oAuthConsumerSecret))
.version(p.oAuthVersion).signatureMethod(p.oAuthSignatureMethod).feature().build();
client.register(oAuth1Feature);
- } else {
- throw new IllegalArgumentException(
- "oAUTH authentication type selected but all oAuthConsumerKey, oAuthConsumerSecret " +
- "and oAuthSignatureMethod parameters doesn't exist", new Throwable());
+ }
+ } else {
+ if (p.authtype == AuthType.DIGEST) {
+ if (p.restapiUser != null && p.restapiPassword != null) {
+ client.register(HttpAuthenticationFeature.digest(p.restapiUser, p.restapiPassword));
+ } else {
+ throw new IllegalArgumentException(
+ "oAUTH authentication type selected but all restapiUser and restapiPassword " +
+ "parameters doesn't exist", new Throwable());
+ }
+ } else if (p.authtype == AuthType.BASIC) {
+ if (p.restapiUser != null && p.restapiPassword != null) {
+ client.register(HttpAuthenticationFeature.basic(p.restapiUser, p.restapiPassword));
+ } else {
+ throw new IllegalArgumentException(
+ "oAUTH authentication type selected but all restapiUser and restapiPassword " +
+ "parameters doesn't exist", new Throwable());
+ }
+ } else if (p.authtype == AuthType.OAUTH) {
+ if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null && p.oAuthSignatureMethod != null) {
+ Feature oAuth1Feature = OAuth1ClientSupport
+ .builder(new ConsumerCredentials(p.oAuthConsumerKey, p.oAuthConsumerSecret))
+ .version(p.oAuthVersion).signatureMethod(p.oAuthSignatureMethod).feature().build();
+ client.register(oAuth1Feature);
+ } else {
+ throw new IllegalArgumentException(
+ "oAUTH authentication type selected but all oAuthConsumerKey, oAuthConsumerSecret " +
+ "and oAuthSignatureMethod parameters doesn't exist", new Throwable());
+ }
}
}
}
diff --git a/src/main/java/org/onap/dcae/common/SSLContextCreator.java b/src/main/java/org/onap/dcae/common/SSLContextCreator.java
new file mode 100644
index 0000000..db3d123
--- /dev/null
+++ b/src/main/java/org/onap/dcae/common/SSLContextCreator.java
@@ -0,0 +1,83 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.common;
+
+import org.springframework.boot.web.server.Ssl;
+
+import java.nio.file.Path;
+
+public class SSLContextCreator {
+ private final String keyStorePassword;
+ private final String certAlias;
+ private final Path keyStoreFile;
+
+ private Path trustStoreFile;
+ private String trustStorePassword;
+ private boolean hasTlsClientAuthentication = false;
+
+ public static SSLContextCreator create(final Path keyStoreFile, final String certAlias, final String password) {
+ return new SSLContextCreator(keyStoreFile, certAlias, password);
+ }
+
+ private SSLContextCreator(final Path keyStoreFile, final String certAlias, final String password) {
+ this.certAlias = certAlias;
+ this.keyStoreFile = keyStoreFile;
+ this.keyStorePassword = password;
+ }
+
+ public SSLContextCreator withTlsClientAuthentication(final Path trustStoreFile, final String password) {
+ hasTlsClientAuthentication = true;
+ this.trustStoreFile = trustStoreFile;
+ this.trustStorePassword = password;
+
+ return this;
+ }
+
+ private void configureKeyStore(final Ssl ssl) {
+ final String keyStore = keyStoreFile.toAbsolutePath().toString();
+
+ ssl.setKeyStore(keyStore);
+ ssl.setKeyPassword(keyStorePassword);
+ ssl.setKeyAlias(certAlias);
+ }
+
+ private void configureTrustStore(final Ssl ssl) {
+ final String trustStore = trustStoreFile.toAbsolutePath().toString();
+
+ ssl.setTrustStore(trustStore);
+ ssl.setTrustStorePassword(trustStorePassword);
+ ssl.setClientAuth(Ssl.ClientAuth.NEED);
+ }
+
+ public Ssl build() {
+ final Ssl ssl = new Ssl();
+ ssl.setEnabled(true);
+
+ configureKeyStore(ssl);
+
+ if (hasTlsClientAuthentication) {
+ configureTrustStore(ssl);
+ }
+
+ return ssl;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlJsonUtil.java b/src/main/java/org/onap/dcae/common/XmlJsonUtil.java
index 6cac728..877f9e5 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlJsonUtil.java
+++ b/src/main/java/org/onap/dcae/common/XmlJsonUtil.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlParser.java b/src/main/java/org/onap/dcae/common/XmlParser.java
index 80bf2fc..06a4a66 100755
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlParser.java
+++ b/src/main/java/org/onap/dcae/common/XmlParser.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* org.onap.dcaegen2.collectors.restconf
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParser.java b/src/main/java/org/onap/dcae/common/publishing/DMaaPConfigurationParser.java
index 7e65d34..dada578 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParser.java
+++ b/src/main/java/org/onap/dcae/common/publishing/DMaaPConfigurationParser.java
@@ -1,8 +1,9 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,27 +18,29 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
+package org.onap.dcae.common.publishing;
import io.vavr.collection.List;
import io.vavr.collection.Map;
import io.vavr.control.Option;
import io.vavr.control.Try;
-import org.onap.dcae.collectors.restconf.common.AnyNode;
+import org.onap.dcae.common.AnyNode;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
-import static io.vavr.API.List;
-import static io.vavr.API.Try;
-import static io.vavr.API.Tuple;
-import static io.vavr.API.unchecked;
-import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.enhanceError;
-import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.f;
+import org.json.JSONObject;
+
+import static io.vavr.API.*;
+import static org.onap.dcae.common.publishing.VavrUtils.enhanceError;
+import static org.onap.dcae.common.publishing.VavrUtils.f;
-public class DMaaPConfigurationParser {
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+@SuppressWarnings("mapFailure takes a generic varargs, unchecked because of Javas type system limitation, actually safe to do")
+public final class DMaaPConfigurationParser {
public static Try<Map<String, PublisherConfig>> parseToDomainMapping(Path configLocation) {
return readFromFile(configLocation)
@@ -45,6 +48,11 @@ public class DMaaPConfigurationParser {
.flatMap(DMaaPConfigurationParser::toConfigMap);
}
+ public static Try<Map<String, PublisherConfig>> parseToDomainMapping(JSONObject config) {
+ return toJSON(config.toString())
+ .flatMap(DMaaPConfigurationParser::toConfigMap);
+ }
+
private static Try<String> readFromFile(Path configLocation) {
return Try(() -> new String(Files.readAllBytes(configLocation)))
.mapFailure(enhanceError(f("Could not read DMaaP configuration from location: '%s'", configLocation)));
@@ -57,8 +65,7 @@ public class DMaaPConfigurationParser {
private static Try<Map<String, PublisherConfig>> toConfigMap(AnyNode config) {
return Try(() -> usesLegacyFormat(config) ? parseLegacyFormat(config) : parseNewFormat(config))
- .mapFailure(enhanceError(
- f("Parsing DMaaP configuration: '%s' failed, probably it is in unexpected format", config)));
+ .mapFailure(enhanceError(f("Parsing DMaaP configuration: '%s' failed, probably it is in unexpected format", config)));
}
private static boolean usesLegacyFormat(AnyNode dMaaPConfig) {
@@ -103,5 +110,4 @@ public class DMaaPConfigurationParser {
.map(credentials -> new PublisherConfig(destinations, topic, credentials._1, credentials._2))
.getOrElse(new PublisherConfig(destinations, topic));
}
-
}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisher.java b/src/main/java/org/onap/dcae/common/publishing/DMaaPEventPublisher.java
index 4c14275..1209b38 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisher.java
+++ b/src/main/java/org/onap/dcae/common/publishing/DMaaPEventPublisher.java
@@ -1,8 +1,10 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,9 +20,10 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common.event.publishing;
+package org.onap.dcae.common.publishing;
import com.att.nsa.cambria.client.CambriaBatchingPublisher;
+import io.vavr.collection.Map;
import io.vavr.control.Try;
import org.json.JSONObject;
import org.slf4j.Logger;
@@ -28,27 +31,38 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
-public class DMaaPEventPublisher implements EventPublisher {
+import static org.onap.dcae.common.publishing.VavrUtils.f;
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+class DMaaPEventPublisher implements EventPublisher {
private static final int PENDING_MESSAGE_LOG_THRESHOLD = 100;
private static final Logger log = LoggerFactory.getLogger(DMaaPEventPublisher.class);
private final DMaaPPublishersCache publishersCache;
private final Logger outputLogger;
- DMaaPEventPublisher(DMaaPPublishersCache DMaaPPublishersCache,
+ DMaaPEventPublisher(DMaaPPublishersCache publishersCache,
Logger outputLogger) {
- this.publishersCache = DMaaPPublishersCache;
+ this.publishersCache = publishersCache;
this.outputLogger = outputLogger;
}
@Override
public void sendEvent(JSONObject event, String domain) {
+
publishersCache.getPublisher(domain)
.onEmpty(() ->
- log.warn(VavrUtils.f("Could not find event publisher for domain: '%s', dropping message: '%s'", domain, event)))
+ log.warn(f("Could not find event publisher for domain: '%s', dropping message: '%s'", domain, event)))
.forEach(publisher -> sendEvent(event, domain, publisher));
}
+ @Override
+ public void reconfigure(Map<String, PublisherConfig> dMaaPConfig) {
+ log.info("reconfigure ");
+ publishersCache.reconfigure(dMaaPConfig);
+ }
+
private void sendEvent(JSONObject event, String domain, CambriaBatchingPublisher publisher) {
Try.run(() -> uncheckedSendEvent(event, domain, publisher))
.onFailure(exc -> closePublisher(event, domain, exc));
@@ -56,20 +70,18 @@ public class DMaaPEventPublisher implements EventPublisher {
private void uncheckedSendEvent(JSONObject event, String domain, CambriaBatchingPublisher publisher)
throws IOException {
- System.out.println("printing publisher information" + publisher);
int pendingMsgs = publisher.send("MyPartitionKey", event.toString());
if (pendingMsgs > PENDING_MESSAGE_LOG_THRESHOLD) {
log.info("Pending messages count: " + pendingMsgs);
}
- String infoMsg = VavrUtils.f("Event: '%s' scheduled to be send asynchronously on domain: '%s'", event, domain);
+ String infoMsg = f("Event: '%s' scheduled to be send asynchronously on domain: '%s'", event, domain);
log.info(infoMsg);
outputLogger.info(infoMsg);
}
private void closePublisher(JSONObject event, String domain, Throwable e) {
- log.error(VavrUtils.f("Unable to schedule event: '%s' on domain: '%s'. Closing publisher and dropping message.",
- event, domain), e);
+ log.error(f("Unable to schedule event: '%s' on domain: '%s'. Closing publisher and dropping message.",
+ event, domain), e);
publishersCache.closePublisherFor(domain);
}
-
}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersBuilder.java b/src/main/java/org/onap/dcae/common/publishing/DMaaPPublishersBuilder.java
index e6c7600..8020b60 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersBuilder.java
+++ b/src/main/java/org/onap/dcae/common/publishing/DMaaPPublishersBuilder.java
@@ -1,8 +1,9 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,8 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
+package org.onap.dcae.common.publishing;
import com.att.nsa.cambria.client.CambriaBatchingPublisher;
import com.att.nsa.cambria.client.CambriaClientBuilders;
@@ -26,15 +26,14 @@ import com.att.nsa.cambria.client.CambriaClientBuilders.PublisherBuilder;
import io.vavr.control.Try;
import static io.vavr.API.Try;
-import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.enhanceError;
-import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.f;
+import static org.onap.dcae.common.publishing.VavrUtils.enhanceError;
+import static org.onap.dcae.common.publishing.VavrUtils.f;
/**
* @author Pawel Szalapski (pawel.szalapski@nokia.com)
*/
final class DMaaPPublishersBuilder {
- @SuppressWarnings("mapFailure takes a generic varargs, unchecked because of Javas type system limitation, actually safe to do")
static Try<CambriaBatchingPublisher> buildPublisher(PublisherConfig config) {
return Try(() -> builder(config).build())
.mapFailure(enhanceError(f("DMaaP client builder throws exception for this configuration: '%s'", config)));
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCache.java b/src/main/java/org/onap/dcae/common/publishing/DMaaPPublishersCache.java
index 6974bc9..8f4c761 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCache.java
+++ b/src/main/java/org/onap/dcae/common/publishing/DMaaPPublishersCache.java
@@ -1,8 +1,10 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,15 +19,10 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
+package org.onap.dcae.common.publishing;
import com.att.nsa.cambria.client.CambriaBatchingPublisher;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.cache.RemovalListener;
-import com.google.common.cache.RemovalNotification;
+import com.google.common.cache.*;
import io.vavr.collection.Map;
import io.vavr.control.Option;
import org.slf4j.Logger;
@@ -37,9 +34,12 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import static io.vavr.API.Option;
-import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.f;
+import static org.onap.dcae.common.publishing.VavrUtils.f;
-public class DMaaPPublishersCache {
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+class DMaaPPublishersCache {
private static final Logger log = LoggerFactory.getLogger(DMaaPPublishersCache.class);
private final LoadingCache<String, CambriaBatchingPublisher> publishersCache;
@@ -74,6 +74,17 @@ public class DMaaPPublishersCache {
publishersCache.invalidate(streamId);
}
+ synchronized void reconfigure(Map<String, PublisherConfig> newConfig) {
+ log.info("reconfigure in DMaaPPublishersCache");
+ Map<String, PublisherConfig> currentConfig = dMaaPConfiguration.get();
+ Map<String, PublisherConfig> removedConfigurations = currentConfig
+ .filterKeys(domain -> !newConfig.containsKey(domain));
+ Map<String, PublisherConfig> changedConfigurations = newConfig
+ .filterKeys(e -> currentConfig.containsKey(e) && !currentConfig.get(e).equals(newConfig.get(e)));
+ dMaaPConfiguration.set(newConfig);
+ removedConfigurations.merge(changedConfigurations).forEach(e -> publishersCache.invalidate(e._1));
+ }
+
static class OnPublisherRemovalListener implements RemovalListener<String, CambriaBatchingPublisher> {
@Override
@@ -86,10 +97,11 @@ public class DMaaPPublishersCache {
java.util.List<?> stuck = publisher.close(timeout, unit);
if (!stuck.isEmpty()) {
log.error(f("Publisher got stuck and did not manage to close in '%s' '%s', "
- + "%s messages were dropped", stuck.size(), timeout, unit));
+ + "%s messages were dropped", stuck.size(), timeout, unit));
}
} catch (InterruptedException | IOException e) {
log.error("Could not close Cambria publisher, some messages might have been dropped", e);
+ Thread.currentThread().interrupt();
}
}
}
@@ -107,4 +119,5 @@ public class DMaaPPublishersCache {
.get();
}
}
+
}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/EventPublisher.java b/src/main/java/org/onap/dcae/common/publishing/EventPublisher.java
index 28aace8..91736ec 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/EventPublisher.java
+++ b/src/main/java/org/onap/dcae/common/publishing/EventPublisher.java
@@ -1,8 +1,9 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,13 +18,15 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common.event.publishing;
-
+package org.onap.dcae.common.publishing;
import io.vavr.collection.Map;
import org.json.JSONObject;
import org.slf4j.Logger;
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
public interface EventPublisher {
static EventPublisher createPublisher(Logger outputLogger, Map<String, PublisherConfig> dMaaPConfig) {
@@ -32,4 +35,5 @@ public interface EventPublisher {
void sendEvent(JSONObject event, String domain);
+ void reconfigure(Map<String, PublisherConfig> dMaaPConfig);
}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/PublisherConfig.java b/src/main/java/org/onap/dcae/common/publishing/PublisherConfig.java
index 0e14a42..67aca1d 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/PublisherConfig.java
+++ b/src/main/java/org/onap/dcae/common/publishing/PublisherConfig.java
@@ -1,8 +1,9 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,14 +18,18 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common.event.publishing;
+package org.onap.dcae.common.publishing;
import io.vavr.collection.List;
import io.vavr.control.Option;
import java.util.Objects;
-public class PublisherConfig {
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+public final class PublisherConfig {
+
private final List<String> destinations;
private final String topic;
private String userName;
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/VavrUtils.java b/src/main/java/org/onap/dcae/common/publishing/VavrUtils.java
index 4a82bed..1db4e18 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/VavrUtils.java
+++ b/src/main/java/org/onap/dcae/common/publishing/VavrUtils.java
@@ -1,8 +1,8 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,16 +17,20 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
+package org.onap.dcae.common.publishing;
import io.vavr.API;
import io.vavr.API.Match.Case;
+import java.util.function.Consumer;
+import org.slf4j.Logger;
import static io.vavr.API.$;
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+public final class VavrUtils {
-public class VavrUtils {
private VavrUtils() {
// utils aggregator
}
@@ -34,7 +38,7 @@ public class VavrUtils {
/**
* Shortcut for 'string interpolation'
*/
- static String f(String msg, Object... args) {
+ public static String f(String msg, Object... args) {
return String.format(msg, args);
}
@@ -42,7 +46,17 @@ public class VavrUtils {
* Wrap failure with a more descriptive message of what has failed and chain original cause. Used to provide a
* context for errors instead of raw exception.
*/
- static Case<Throwable, Throwable> enhanceError(String msg) {
+ public static Case<Throwable, Throwable> enhanceError(String msg) {
return API.Case($(), e -> new RuntimeException(msg, e));
}
+
+ public static Case<Throwable, Throwable> enhanceError(String pattern, Object... arguments) {
+ return API.Case($(), e -> new RuntimeException(f(pattern, arguments), e));
+ }
+
+ public static Consumer<Throwable> logError(Logger withLogger) {
+ return e -> withLogger.error(e.getMessage(), e);
+ }
+
+
}
diff --git a/src/main/java/org/onap/dcae/controller/AccessController.java b/src/main/java/org/onap/dcae/controller/AccessController.java
new file mode 100644
index 0000000..83673b8
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/AccessController.java
@@ -0,0 +1,243 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.restconf
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.onap.dcae.ApplicationException;
+import org.onap.dcae.ApplicationSettings;
+import org.onap.dcae.common.Constants;
+import org.onap.dcae.common.RestConfContext;
+import org.onap.dcae.common.RestapiCallNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import static java.nio.file.Files.readAllBytes;
+import static org.onap.dcae.common.RestapiCallNodeUtil.getUriMethod;
+
+public class AccessController {
+ private static final Logger log = LoggerFactory.getLogger(AccessController.class);
+ /* Collector properties */
+ private ApplicationSettings properties;
+
+ /* Controller specific information */
+ private ControllerConfigInfo cfgInfo;
+ private RestConfContext ctx;
+ RestapiCallNode restApiCallNode;
+
+ /* Maps of Events */
+ private Map<String, PersistentEventConnection> eventList = new ConcurrentHashMap<>();
+ private ExecutorService executor = Executors.newCachedThreadPool();
+ private Map<String, String> paraMap;
+
+ public AccessController(JSONObject controller,
+ ApplicationSettings properties) {
+ this.cfgInfo = new ControllerConfigInfo(controller.get("controller_name").toString(),
+ controller.get("controller_restapiUrl").toString(),
+ controller.get("controller_restapiUser").toString(),
+ controller.get("controller_restapiPassword").toString(),
+ controller.get("controller_accessTokenUrl").toString(),
+ controller.get("controller_accessTokenFile").toString(),
+ controller.get("controller_subscriptionUrl").toString(),
+ controller.get("controller_accessTokenMethod").toString(),
+ controller.get("controller_subsMethod").toString());
+ this.properties = properties;
+ this.ctx = new RestConfContext();
+ this.restApiCallNode = new RestapiCallNode();
+ this.paraMap = new HashMap<>();
+
+ prepareControllerParamMap();
+
+ log.info("AccesController Created {} {} {} {} {} {}",
+ this.cfgInfo.getController_name(),
+ this.cfgInfo.getController_restapiUrl(),
+ this.cfgInfo.getController_restapiPassword(),
+ this.cfgInfo.getController_restapiUser(),
+ this.cfgInfo.getController_accessTokenUrl(),
+ this.cfgInfo.getController_accessTokenFile());
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof AccessController)) return false;
+ AccessController that = (AccessController) o;
+ return that.cfgInfo.getController_name().equals(that.cfgInfo.getController_name());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.cfgInfo.getController_name());
+ }
+
+ public RestapiCallNode getRestApiCallNode() {
+ return restApiCallNode;
+ }
+
+ private void fetch_TokenId() {
+
+
+ modifyControllerParamMap(Constants.KSETTING_REST_API_URL, getUriMethod(this.properties.authorizationEnabled()) + cfgInfo.getController_restapiUrl() + cfgInfo.getController_accessTokenUrl());
+ modifyControllerParamMap(Constants.KDEFAULT_TEMP_FILENAME, cfgInfo.getController_accessTokenFile());
+ modifyControllerParamMap(Constants.KSETTING_REST_UNAME, cfgInfo.getController_restapiUser());
+ modifyControllerParamMap(Constants.KSETTING_REST_PASSWORD, cfgInfo.getController_restapiPassword());
+ modifyControllerParamMap(Constants.KSETTING_HTTP_METHOD, cfgInfo.getController_accessTokenMethod());
+
+ String httpResponse = null;
+ try {
+
+ restApiCallNode.sendRequest(this.paraMap, ctx, null);
+ String key = getControllerParamMapValue(Constants.KSETTING_RESP_PREFIX).concat(".").concat("httpResponse");
+ httpResponse = ctx.getAttribute(key);
+ log.info("httpResponse ", httpResponse + " key " + key);
+ JSONObject jsonObj = new JSONObject(httpResponse);
+ log.info("jsonObj ", jsonObj.toString());
+ //JSONObject data = jsonObj.getJSONObject("data");
+ //String tokenId = data.get("accessSession").toString();
+ //@TODO: Make return field dynamic
+ String tokenId = jsonObj.get("accessSession").toString();
+ log.info("token 1" + tokenId);
+ modifyControllerParamMap(Constants.KSETTING_TOKENID, tokenId);
+ modifyControllerParamMap(Constants.KSETTING_CUSTOMHTTP_HEADER, "X-ACCESS-TOKEN=" + tokenId);
+ } catch (Exception e) {
+ log.info("Access token is not supported" + e.getMessage());
+ log.info("http response " + httpResponse);
+ }
+ }
+
+ public void activate() {
+ fetch_TokenId();
+ printControllerParamMap();
+ /* Create eventlist from properties */
+ JSONArray contollers = new JSONArray(properties.rcc_policy());
+ for (int i = 0; i < contollers.length(); i++) {
+ JSONObject controller = contollers.getJSONObject(i);
+ if (controller.get("controller_name").equals(this.getCfgInfo().getController_name())) {
+ JSONArray eventlists = controller.getJSONArray("event_details");
+ for (int j = 0; j < eventlists.length(); j++) {
+ JSONObject event = eventlists.getJSONObject(j);
+ String name = event.get("event_name").toString();
+ PersistentEventConnection conn = new PersistentEventConnection(name,
+ event.get("event_description").toString(),
+ Boolean.parseBoolean(event.get("event_sseventUrlEmbed").toString()),
+ event.get("event_sseventsField").toString(),
+ event.get("event_sseventsUrl").toString(),
+ event.get("event_subscriptionTemplate").toString(),
+ event.get("event_unSubscriptionTemplate").toString(),
+ event.get("event_ruleId").toString(),
+ this);
+
+ eventList.put(name, conn);
+ executor.execute(conn);
+ }
+ }
+ }
+ }
+
+ public RestConfContext getCtx() {
+ return ctx;
+ }
+
+ public ApplicationSettings getProperties() {
+ return properties;
+ }
+
+ public ControllerConfigInfo getCfgInfo() {
+ return cfgInfo;
+ }
+
+ public Map<String, String> getParaMap() {
+ return this.paraMap;
+ }
+
+ private void prepareControllerParamMap() {
+ /* Adding the fields in ParaMap */
+ paraMap.put(Constants.KDEFAULT_TEMP_FILENAME, null);
+ paraMap.put(Constants.KSETTING_REST_API_URL, null);
+ paraMap.put(Constants.KSETTING_HTTP_METHOD, "post");
+ paraMap.put(Constants.KSETTING_RESP_PREFIX, "responsePrefix");
+ paraMap.put(Constants.KSETTING_SKIP_SENDING, "false");
+ paraMap.put(Constants.KSETTING_SSE_CONNECT_URL, null);
+ paraMap.put(Constants.KSETTING_FORMAT, "json");
+
+ paraMap.put(Constants.KSETTING_REST_UNAME, null);
+ paraMap.put(Constants.KSETTING_REST_PASSWORD, null);
+ paraMap.put(Constants.KDEFAULT_REQUESTBODY, null);
+
+ paraMap.put(Constants.KSETTING_AUTH_TYPE, "unspecified");
+ paraMap.put(Constants.KSETTING_CONTENT_TYPE, "application/json");
+ paraMap.put(Constants.KSETTING_OAUTH_CONSUMER_KEY, null);
+ paraMap.put(Constants.KSETTING_OAUTH_CONSUMER_SECRET, null);
+ paraMap.put(Constants.KSETTING_OAUTH_SIGNATURE_METHOD, null);
+ paraMap.put(Constants.KSETTING_OAUTH_VERSION, null);
+
+ paraMap.put(Constants.KSETTING_CUSTOMHTTP_HEADER, null);
+ paraMap.put(Constants.KSETTING_TOKENID, null);
+ paraMap.put(Constants.KSETTING_DUMP_HEADER, "false");
+ paraMap.put(Constants.KSETTING_RETURN_REQUEST_PAYLOAD, "false");
+
+ paraMap.put(Constants.KSETTING_TRUST_STORE_FILENAME, this.getProperties().truststoreFileLocation());
+ String trustPassword = getKeyStorePassword(toAbsolutePath(this.getProperties().truststorePasswordFileLocation()));
+ paraMap.put(Constants.KSETTING_TRUST_STORE_PASSWORD, trustPassword);
+ paraMap.put(Constants.KSETTING_KEY_STORE_FILENAME, this.getProperties().keystoreFileLocation());
+ String KeyPassword = getKeyStorePassword(toAbsolutePath(this.getProperties().keystorePasswordFileLocation()));
+ paraMap.put(Constants.KSETTING_KEY_STORE_PASSWORD, KeyPassword);
+
+ }
+
+ private Path toAbsolutePath(final String path) {
+ return Paths.get(path).toAbsolutePath();
+ }
+
+ private String getKeyStorePassword(final Path location) {
+ try {
+ return new String(readAllBytes(location));
+ } catch (Exception e) {
+ log.error("Could not read password from: '" + location + "'.", e);
+ throw new ApplicationException(e);
+ }
+ }
+
+ public void modifyControllerParamMap(String fieldName, String value) {
+ paraMap.put(fieldName, value);
+ }
+
+ public String getControllerParamMapValue(String fieldName) {
+ return paraMap.get(fieldName);
+ }
+
+ public void printControllerParamMap() {
+ log.info("----------------Controller Param Map-------------------");
+ for (String name : paraMap.keySet()) {
+ String value = paraMap.get(name);
+ log.info(name + " : " + value);
+ }
+ }
+}
diff --git a/src/main/java/org/onap/dcae/controller/ConfigFilesFacade.java b/src/main/java/org/onap/dcae/controller/ConfigFilesFacade.java
new file mode 100644
index 0000000..4542fb5
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/ConfigFilesFacade.java
@@ -0,0 +1,131 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import io.vavr.CheckedRunnable;
+import io.vavr.Tuple2;
+import io.vavr.collection.Map;
+import io.vavr.control.Try;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.FileNotFoundException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static io.vavr.API.Try;
+import static org.onap.dcae.common.publishing.VavrUtils.*;
+import static org.onap.dcae.controller.Conversions.toList;
+
+class ConfigFilesFacade {
+
+ private static Logger log = LoggerFactory.getLogger(ConfigFilesFacade.class);
+
+ private final Path dMaaPConfigPath;
+ private final Path propertiesPath;
+
+ public ConfigFilesFacade(Path dMaaPConfigPath, Path propertiesPath) {
+ this.dMaaPConfigPath = dMaaPConfigPath;
+ this.propertiesPath = propertiesPath;
+ }
+
+ Try<Map<String, String>> readCollectorProperties() {
+ log.info(f("Reading collector properties from path: '%s'", propertiesPath));
+ return Try(this::readProperties)
+ .map(prop -> toList(prop.getKeys()).toMap(k -> k, k -> (String) prop.getProperty(k)))
+ .mapFailure(enhanceError("Unable to read properties configuration from path '%s'", propertiesPath))
+ .onFailure(logError(log))
+ .peek(props -> log.info(f("Read following collector properties: '%s'", props)));
+ }
+
+ Try<JSONObject> readDMaaPConfiguration() {
+ log.info(f("Reading DMaaP configuration from file: '%s'", dMaaPConfigPath));
+ return readFile(dMaaPConfigPath)
+ .recover(FileNotFoundException.class, __ -> "{}")
+ .mapFailure(enhanceError("Unable to read DMaaP configuration from file '%s'", dMaaPConfigPath))
+ .flatMap(Conversions::toJson)
+ .onFailure(logError(log))
+ .peek(props -> log.info(f("Read following DMaaP properties: '%s'", props)));
+ }
+
+ Try<Void> writeDMaaPConfiguration(JSONObject dMaaPConfiguration) {
+ log.info(f("Writing DMaaP configuration '%s' into file '%s'", dMaaPConfiguration, dMaaPConfigPath));
+ return writeFile(dMaaPConfigPath, indentConfiguration(dMaaPConfiguration.toString()))
+ .mapFailure(enhanceError("Could not save new DMaaP configuration to path '%s'", dMaaPConfigPath))
+ .onFailure(logError(log))
+ .peek(__ -> log.info("Written successfully"));
+ }
+
+
+ Try<Void> writeProperties(Map<String, String> properties) {
+ log.info(f("Writing properties configuration '%s' into file '%s'", properties, propertiesPath));
+ return Try.run(saveProperties(properties))
+ .mapFailure(enhanceError("Could not save properties to path '%s'", properties))
+ .onFailure(logError(log))
+ .peek(__ -> log.info("Written successfully"));
+ }
+
+ private Try<String> readFile(Path path) {
+ return Try(() -> new String(Files.readAllBytes(path), StandardCharsets.UTF_8))
+ .mapFailure(enhanceError("Could not read content from path: '%s'", path));
+ }
+
+ private Try<Void> writeFile(Path path, String content) {
+ return Try.run(() -> Files.write(path, content.getBytes()))
+ .mapFailure(enhanceError("Could not write content to path: '%s'", path));
+ }
+
+ private PropertiesConfiguration readProperties() throws ConfigurationException {
+ PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration();
+ propertiesConfiguration.setDelimiterParsingDisabled(true);
+ propertiesConfiguration.load(propertiesPath.toFile());
+ return propertiesConfiguration;
+ }
+
+ private CheckedRunnable saveProperties(Map<String, String> properties) {
+ return () -> {
+ PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration(propertiesPath.toFile());
+ propertiesConfiguration.setEncoding(null);
+ for (Tuple2<String, String> property : properties) {
+ updateProperty(propertiesConfiguration, property);
+ }
+ propertiesConfiguration.save();
+ };
+ }
+
+ private void updateProperty(PropertiesConfiguration propertiesConfiguration, Tuple2<String, String> property) {
+ if (propertiesConfiguration.containsKey(property._1)) {
+ propertiesConfiguration.setProperty(property._1, property._2);
+ } else {
+ propertiesConfiguration.addProperty(property._1, property._2);
+ }
+ }
+
+ private String indentConfiguration(String configuration) {
+ return new JSONObject(configuration).toString(4);
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/controller/ConfigLoader.java b/src/main/java/org/onap/dcae/controller/ConfigLoader.java
new file mode 100644
index 0000000..1b7e60b
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/ConfigLoader.java
@@ -0,0 +1,147 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import io.vavr.Function0;
+import io.vavr.Function1;
+import io.vavr.collection.HashMap;
+import io.vavr.collection.Map;
+import io.vavr.control.Try;
+import org.json.JSONObject;
+import org.onap.dcae.RestConfCollector;
+import org.onap.dcae.common.publishing.PublisherConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.file.Path;
+import java.util.function.Consumer;
+
+import static org.onap.dcae.common.publishing.DMaaPConfigurationParser.parseToDomainMapping;
+import static org.onap.dcae.controller.ConfigParsing.getDMaaPConfig;
+import static org.onap.dcae.controller.ConfigParsing.getProperties;
+import static org.onap.dcae.controller.EnvPropertiesReader.readEnvProps;
+
+public class ConfigLoader {
+
+ private static final String SKIP_MSG = "Skipping dynamic configuration update";
+ private static Logger log = LoggerFactory.getLogger(ConfigLoader.class);
+ private final Consumer<Map<String, PublisherConfig>> eventPublisherReconfigurer;
+ private final ConfigFilesFacade configFilesFacade;
+ private final Function1<EnvProps, Try<JSONObject>> configurationSource;
+ private final Function0<Map<String, String>> envVariablesSupplier;
+ private boolean toRestart = false;
+
+ ConfigLoader(Consumer<Map<String, PublisherConfig>> eventPublisherReconfigurer,
+ ConfigFilesFacade configFilesFacade,
+ Function1<EnvProps, Try<JSONObject>> configurationSource,
+ Function0<Map<String, String>> envVariablesSupplier) {
+ this.eventPublisherReconfigurer = eventPublisherReconfigurer;
+ this.configFilesFacade = configFilesFacade;
+ this.configurationSource = configurationSource;
+ this.envVariablesSupplier = envVariablesSupplier;
+ }
+
+ public static ConfigLoader create(Consumer<Map<String, PublisherConfig>> eventPublisherReconfigurer,
+ Path dMaaPConfigFile, Path propertiesConfigFile) {
+ log.info("ConfigLoader create ....");
+ return new ConfigLoader(eventPublisherReconfigurer,
+ new ConfigFilesFacade(dMaaPConfigFile, propertiesConfigFile),
+ ConfigSource::getAppConfig,
+ () -> HashMap.ofAll(System.getenv()));
+ }
+
+ public void updateConfig() {
+ log.info("Trying to dynamically update config from Config Binding Service");
+ readEnvProps(envVariablesSupplier.get())
+ .onEmpty(() -> log.warn(SKIP_MSG))
+ .forEach(this::updateConfig);
+ }
+
+ private void updateConfig(EnvProps props) {
+ configurationSource.apply(props)
+ .onFailure(logSkip())
+ .onSuccess(newConf -> {
+ updateConfigurationProperties(newConf);
+ updateDMaaPProperties(newConf);
+ reloadApplication();
+ }
+ );
+ }
+
+ private void reloadApplication() {
+ if (toRestart) {
+ log.info("New app config - Application will be restarted");
+ RestConfCollector.restartApplication();
+ }
+ }
+
+ private void updateDMaaPProperties(JSONObject newConf) {
+ configFilesFacade.readDMaaPConfiguration()
+ .onFailure(logSkip())
+ .onSuccess(oldDMaaPConf -> getDMaaPConfig(newConf)
+ .onEmpty(() -> log.warn(SKIP_MSG))
+ .forEach(newDMaaPConf -> compareAndOverwriteDMaaPConfig(oldDMaaPConf, newDMaaPConf)));
+ }
+
+
+ private void updateConfigurationProperties(JSONObject newConf) {
+ configFilesFacade.readCollectorProperties()
+ .onFailure(logSkip())
+ .onSuccess(oldProps -> compareAndOverwritePropertiesConfig(newConf, oldProps));
+ }
+
+ private void compareAndOverwritePropertiesConfig(JSONObject newConf, Map<String, String> oldProps) {
+ Map<String, String> newProperties = getProperties(newConf);
+ Map<String, String> result = oldProps.filterKeys((s) -> newProperties.keySet().contains(s));
+ if (!result.equals(newProperties)) {
+ configFilesFacade.writeProperties(newProperties)
+ .onSuccess(__ -> {
+ toRestart = true;
+ log.info("New properties configuration written to file");
+ })
+ .onFailure(logSkip());
+ } else {
+ log.info("Collector properties from CBS are the same as currently used ones. " + SKIP_MSG);
+ }
+ }
+
+ private void compareAndOverwriteDMaaPConfig(JSONObject oldDMaaPConf, JSONObject newDMaaPConf) {
+ if (!oldDMaaPConf.toString().equals(newDMaaPConf.toString())) {
+ parseToDomainMapping(newDMaaPConf)
+ .onFailure(exc -> log.error(SKIP_MSG, exc))
+ .onSuccess(eventPublisherReconfigurer)
+ .onSuccess(parsedConfig ->
+ configFilesFacade.writeDMaaPConfiguration(newDMaaPConf)
+ .onFailure(logSkip())
+ .onSuccess(__ -> {
+ toRestart = true;
+ log.info("New dMaaP configuration written to file");
+ }));
+ } else {
+ log.info("DMaaP config from CBS is the same as currently used one. " + SKIP_MSG);
+ }
+ }
+
+ private Consumer<Throwable> logSkip() {
+ return __ -> log.error(SKIP_MSG);
+ }
+}
diff --git a/src/main/java/org/onap/dcae/controller/ConfigParsing.java b/src/main/java/org/onap/dcae/controller/ConfigParsing.java
new file mode 100644
index 0000000..fea3451
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/ConfigParsing.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import io.vavr.collection.Map;
+import io.vavr.control.Option;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static io.vavr.API.Try;
+import static io.vavr.API.Tuple;
+import static org.onap.dcae.common.publishing.VavrUtils.f;
+import static org.onap.dcae.controller.Conversions.toList;
+
+interface ConfigParsing {
+
+ Logger log = LoggerFactory.getLogger(ConfigParsing.class);
+
+ static Option<JSONObject> getDMaaPConfig(JSONObject configuration) {
+ log.info(f("Getting DMaaP configuration from app configuration: '%s'", configuration));
+ return toList(configuration.toMap().entrySet().iterator())
+ .filter(t -> t.getKey().startsWith("streams_publishes"))
+ .headOption()
+ .flatMap(e -> Try(() -> configuration.getJSONObject(e.getKey())).toOption())
+ .onEmpty(() -> log.warn(f("App configuration '%s' is missing DMaaP configuration ('streams_publishes' key) "
+ + "or DMaaP configuration is not a valid json document", configuration)))
+ .peek(dMaaPConf -> log.info(f("Found following DMaaP configuration: '%s'", dMaaPConf)));
+ }
+
+ static Map<String, String> getProperties(JSONObject configuration) {
+ log.info(f("Getting properties configuration from app configuration: '%s'", configuration));
+ Map<String, String> confEntries = toList(configuration.toMap().entrySet().iterator())
+ .toMap(e -> Tuple(e.getKey(), String.valueOf(e.getValue())))
+ .filterKeys(e -> !e.startsWith("streams_publishes"));
+ log.info(f("Found following app properties: '%s'", confEntries));
+ return confEntries;
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/controller/ConfigSource.java b/src/main/java/org/onap/dcae/controller/ConfigSource.java
new file mode 100644
index 0000000..78cb147
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/ConfigSource.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import com.mashape.unirest.http.HttpResponse;
+import com.mashape.unirest.http.Unirest;
+import io.vavr.control.Try;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static io.vavr.API.Try;
+import static org.onap.dcae.common.publishing.VavrUtils.enhanceError;
+import static org.onap.dcae.common.publishing.VavrUtils.f;
+
+final class ConfigSource {
+
+ private static final Logger log = LoggerFactory.getLogger(ConfigSource.class);
+
+ static Try<JSONObject> getAppConfig(EnvProps envProps) {
+ log.info("Fetching app configuration from CBS");
+ return callConsulForCBSConfiguration(envProps)
+ .peek(strBody -> log.info(f("Received following CBS configuration from Consul '%s'", strBody)))
+ .flatMap(Conversions::toJsonArray)
+ .flatMap(ConfigSource::withdrawCatalog)
+ .flatMap(json -> constructFullCBSUrl(envProps, json))
+ .flatMap(cbsUrl -> callCBSForAppConfig(envProps, cbsUrl))
+ .flatMap(Conversions::toJson)
+ .peek(jsonNode -> log.info(f("Received app configuration: '%s'", jsonNode)))
+ .onFailure(exc -> log.error("Could not fetch application config", exc));
+ }
+
+ private static Try<String> callConsulForCBSConfiguration(EnvProps envProps) {
+ return executeGet(envProps.consulProtocol + "://" + envProps.consulHost + ":" +
+ envProps.consulPort + "/v1/catalog/service/" + envProps.cbsName)
+ .mapFailure(enhanceError("Unable to retrieve CBS configuration from Consul"));
+ }
+
+ private static Try<String> constructFullCBSUrl(EnvProps envProps, JSONObject json) {
+ return Try(() -> envProps.cbsProtocol + "://" + json.get("ServiceAddress").toString() + ":" +
+ json.get("ServicePort").toString())
+ .mapFailure(enhanceError("ServiceAddress / ServicePort missing from CBS conf: '%s'", json));
+ }
+
+ private static Try<JSONObject> withdrawCatalog(JSONArray json) {
+ return Try(() -> new JSONObject(json.get(0).toString()))
+ .mapFailure(enhanceError("CBS response '%s' is in invalid format,"
+ + " most probably is it not a list of configuration objects", json));
+ }
+
+ private static Try<String> callCBSForAppConfig(EnvProps envProps, String cbsUrl) {
+ log.info("Calling CBS for application config");
+ return executeGet(cbsUrl + "/service_component/" + envProps.appName)
+ .mapFailure(enhanceError("Unable to fetch configuration from CBS"));
+ }
+
+
+ private static Try<String> executeGet(String url) {
+ log.info(f("Calling HTTP GET on url: '%s'", url));
+ return Try(() -> Unirest.get(url).asString())
+ .mapFailure(enhanceError("Http call (GET '%s') failed.", url))
+ .filter(
+ res -> res.getStatus() == 200,
+ res -> new RuntimeException(f("HTTP call (GET '%s') failed with status %s and body '%s'",
+ url, res.getStatus(), res.getBody())))
+ .map(HttpResponse::getBody)
+ .peek(body -> log.info(f("HTTP GET on '%s' returned body '%s'", url, body)));
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/controller/ControllerConfigInfo.java b/src/main/java/org/onap/dcae/controller/ControllerConfigInfo.java
new file mode 100644
index 0000000..2941b9b
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/ControllerConfigInfo.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.restconf
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+public class ControllerConfigInfo {
+ private String controller_name;
+ private String controller_restapiUrl;
+ private String controller_restapiUser;
+ private String controller_restapiPassword;
+ private String controller_accessTokenUrl;
+ private String controller_accessTokenFile;
+ private String controller_subscriptionUrl;
+ private String controller_accessTokenMethod;
+ private String controller_subsMethod;
+
+ public ControllerConfigInfo(String controller_name,
+ String controller_restapiUrl,
+ String controller_restapiUser,
+ String controller_restapiPassword,
+ String controller_accessTokenUrl,
+ String controller_accessTokenFile,
+ String controller_subscriptionUrl,
+ String controller_accessTokenMethod,
+ String controller_subsMethod) {
+ this.controller_name = controller_name;
+ this.controller_restapiUrl = controller_restapiUrl;
+ this.controller_restapiUser = controller_restapiUser;
+ this.controller_restapiPassword = controller_restapiPassword;
+ this.controller_accessTokenUrl = controller_accessTokenUrl;
+ this.controller_accessTokenFile = controller_accessTokenFile;
+ this.controller_subscriptionUrl = controller_subscriptionUrl;
+ this.controller_accessTokenMethod = controller_accessTokenMethod;
+ this.controller_subsMethod = controller_subsMethod;
+ }
+
+ public String getController_name() {
+ return controller_name;
+ }
+
+ public String getController_restapiUrl() {
+ return controller_restapiUrl;
+ }
+
+ public String getController_restapiUser() {
+ return controller_restapiUser;
+ }
+
+ public String getController_restapiPassword() {
+ return controller_restapiPassword;
+ }
+
+ public String getController_accessTokenUrl() {
+ return controller_accessTokenUrl;
+ }
+
+ public String getController_accessTokenFile() {
+ return controller_accessTokenFile;
+ }
+
+ public String getController_accessTokenMethod() {
+ return controller_accessTokenMethod;
+ }
+
+ public String getController_subsMethod() {
+ return controller_subsMethod;
+ }
+
+ public String getController_subscriptionUrl() {
+ return controller_subscriptionUrl;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/dcae/controller/Conversions.java b/src/main/java/org/onap/dcae/controller/Conversions.java
new file mode 100644
index 0000000..0a3e7c7
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/Conversions.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import static org.onap.dcae.common.publishing.VavrUtils.enhanceError;
+
+import io.vavr.API;
+import io.vavr.collection.List;
+import io.vavr.control.Try;
+import java.util.Iterator;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.stream.StreamSupport;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+interface Conversions {
+
+ static Try<JSONObject> toJson(String strBody) {
+ return API.Try(() -> new JSONObject(strBody))
+ .mapFailure(enhanceError("Value '%s' is not a valid JSON document", strBody));
+ }
+
+ static Try<JSONArray> toJsonArray(String strBody) {
+ return API.Try(() -> new JSONArray(strBody))
+ .mapFailure(enhanceError("Value '%s' is not a valid JSON array", strBody));
+ }
+
+ static <T> List<T> toList(Iterator<T> iterator) {
+ return List.ofAll(StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false));
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/controller/EnvPropertiesReader.java b/src/main/java/org/onap/dcae/controller/EnvPropertiesReader.java
new file mode 100644
index 0000000..3feeacc
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/EnvPropertiesReader.java
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import io.vavr.collection.Map;
+import io.vavr.control.Option;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static io.vavr.API.List;
+import static io.vavr.API.Try;
+import static org.onap.dcae.common.publishing.VavrUtils.f;
+
+final class EnvPropertiesReader {
+
+ private final static Logger log = LoggerFactory.getLogger(EnvPropertiesReader.class);
+
+ static Option<EnvProps> readEnvProps(Map<String, String> environmentVariables) {
+ log.info("Loading necessary environment variables for dynamic configuration update");
+ int consulPort = getConsulPort(environmentVariables);
+ String consulProtocol = getConsulProtocol(environmentVariables);
+ String cbsProtocol = getCbsProtocol(environmentVariables);
+ Option<String> consulHost = getConsulHost(environmentVariables);
+ Option<String> cbsServiceName = getCBSName(environmentVariables);
+ Option<String> collectorAppName = getAppName(environmentVariables);
+ return Option.sequence(List(consulHost, cbsServiceName, collectorAppName))
+ .map(e -> new EnvProps(consulProtocol, e.get(0), consulPort, cbsProtocol, e.get(1), e.get(2)))
+ .onEmpty(() -> log.warn("Some required environment variables are missing"))
+ .peek(props -> log.info(f("Discovered following environment variables: '%s'", props)));
+ }
+
+ private static Option<String> getAppName(Map<String, String> environmentVariables) {
+ return environmentVariables.get("HOSTNAME")
+ .orElse(environmentVariables.get("SERVICE_NAME"))
+ .onEmpty(() -> log.warn("App service name (as registered in CBS) (env var: 'HOSTNAME' / 'SERVICE_NAME') "
+ + "is missing error environment variables."));
+ }
+
+ private static Option<String> getCBSName(Map<String, String> environmentVariables) {
+ return environmentVariables.get("CONFIG_BINDING_SERVICE")
+ .onEmpty(() -> log.warn("Name of CBS Service (as registered in Consul) (env var: 'CONFIG_BINDING_SERVICE') "
+ + "is missing from environment variables."));
+ }
+
+ private static Integer getConsulPort(Map<String, String> environmentVariables) {
+ return environmentVariables.get("CONSUL_PORT")
+ .flatMap(str -> Try(() -> Integer.valueOf(str))
+ .onFailure(exc -> log.warn("Consul port is not an integer value", exc))
+ .toOption())
+ .onEmpty(() -> log.warn("Consul port (env var: 'CONSUL_PORT') is missing from environment variables. "
+ + "Using default value of 8500"))
+ .getOrElse(8500);
+ }
+
+ private static Option<String> getConsulHost(Map<String, String> environmentVariables) {
+ return environmentVariables.get("CONSUL_HOST")
+ .onEmpty(() -> log.warn("Consul host (env var: 'CONSUL_HOST') (without port) "
+ + "is missing from environment variables."));
+ }
+
+ private static String getConsulProtocol(Map<String, String> environmentVariables) {
+ return getProtocolFrom("CONSUL_PROTOCOL", environmentVariables);
+ }
+
+ private static String getCbsProtocol(Map<String, String> environmentVariables) {
+ return getProtocolFrom("CBS_PROTOCOL", environmentVariables);
+ }
+
+ private static String getProtocolFrom(String variableName, Map<String, String> environmentVariables) {
+ return environmentVariables.get(variableName)
+ .onEmpty(() -> log.warn("Consul protocol (env var: '" + variableName + "') is missing "
+ + "from environment variables."))
+ .getOrElse("http");
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/controller/EnvProps.java b/src/main/java/org/onap/dcae/controller/EnvProps.java
new file mode 100644
index 0000000..a2d381d
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/EnvProps.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import java.util.Objects;
+
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+final class EnvProps {
+
+ final String consulProtocol;
+ final String consulHost;
+ final int consulPort;
+ final String cbsName;
+ final String cbsProtocol;
+ final String appName;
+
+ EnvProps(String consulProtocol, String consulHost, int consulPort, String cbsProtocol, String cbsName, String appName) {
+ this.consulProtocol = consulProtocol;
+ this.consulHost = consulHost;
+ this.consulPort = consulPort;
+ this.cbsProtocol = cbsProtocol;
+ this.cbsName = cbsName;
+ this.appName = appName;
+ }
+
+ @Override
+ public String toString() {
+ return "EnvProps{" +
+ "consulProtocol='" + consulProtocol + '\'' +
+ ", consulHost='" + consulHost + '\'' +
+ ", consulPort=" + consulPort +
+ ", cbsProtocol='" + cbsProtocol + '\'' +
+ ", cbsName='" + cbsName + '\'' +
+ ", appName='" + appName + '\'' +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ EnvProps envProps = (EnvProps) o;
+ return consulPort == envProps.consulPort &&
+ Objects.equals(consulProtocol, envProps.consulProtocol) &&
+ Objects.equals(consulHost, envProps.consulHost) &&
+ Objects.equals(cbsProtocol, envProps.cbsProtocol) &&
+ Objects.equals(cbsName, envProps.cbsName) &&
+ Objects.equals(appName, envProps.appName);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/dcae/controller/PersistentEventConnection.java b/src/main/java/org/onap/dcae/controller/PersistentEventConnection.java
new file mode 100644
index 0000000..1c0d85b
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/PersistentEventConnection.java
@@ -0,0 +1,207 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.restconf
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.controller;
+
+import org.glassfish.jersey.media.sse.EventSource;
+import org.glassfish.jersey.media.sse.SseFeature;
+import org.onap.dcae.common.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.HttpHeaders;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.onap.dcae.common.RestapiCallNodeUtil.*;
+
+public class PersistentEventConnection implements Runnable {
+ public String event_name;
+ private String event_description;
+ private boolean event_sseventUrlEmbed;
+ private String event_sseventsField;
+ private String event_sseventsUrl;
+ private String event_subscriptionTemplate;
+ private String event_unSubscriptionTemplate;
+ private String event_ruleId;
+ private EventConnectionState state;
+ private volatile boolean running = true;
+ private static final Logger log = LoggerFactory.getLogger(PersistentEventConnection.class);
+
+
+ private RestConfContext ctx;
+ private AccessController parentCtrllr;
+ private Map<String, String> eventParaMap;
+
+ public PersistentEventConnection(String event_name,
+ String event_description,
+ boolean event_sseventUrlEmbed,
+ String event_sseventsField,
+ String event_sseventsUrl,
+ String event_subscriptionTemplate,
+ String event_unSubscriptionTemplate,
+ String event_ruleId,
+ AccessController parentCtrllr) {
+ this.event_name = event_name;
+ this.event_description = event_description;
+ this.event_sseventUrlEmbed = event_sseventUrlEmbed;
+ this.event_sseventsField = event_sseventsField;
+ this.event_sseventsUrl = event_sseventsUrl;
+ this.event_subscriptionTemplate = event_subscriptionTemplate;
+ this.event_unSubscriptionTemplate = event_unSubscriptionTemplate;
+ this.event_ruleId = event_ruleId;
+ this.state = EventConnectionState.INIT;
+
+ this.ctx = new RestConfContext();
+ for (String s : parentCtrllr.getCtx().getAttributeKeySet()) {
+ this.ctx.setAttribute(s, ctx.getAttribute(s));
+ }
+ this.parentCtrllr = parentCtrllr;
+ this.eventParaMap = new HashMap<>();
+ this.eventParaMap.putAll(parentCtrllr.getParaMap());
+ printEventParamMap();
+ log.info("New persistent connection created " + event_name);
+ }
+
+ @Override
+ public void run() {
+ Parameters p = null;
+ try {
+ modifyEventParamMap(Constants.KSETTING_REST_API_URL, getUriMethod(parentCtrllr.getProperties().authorizationEnabled())
+ + parentCtrllr.getCfgInfo().getController_restapiUrl()
+ + parentCtrllr.getCfgInfo().getController_subscriptionUrl());
+ modifyEventParamMap(Constants.KDEFAULT_TEMP_FILENAME, event_subscriptionTemplate);
+ modifyEventParamMap(Constants.KSETTING_REST_UNAME, parentCtrllr.getCfgInfo().getController_restapiUser());
+ modifyEventParamMap(Constants.KSETTING_REST_PASSWORD, parentCtrllr.getCfgInfo().getController_restapiPassword());
+ modifyEventParamMap(Constants.KSETTING_HTTP_METHOD, parentCtrllr.getCfgInfo().getController_subsMethod());
+
+ parentCtrllr.getRestApiCallNode().sendRequest(eventParaMap, ctx, null);
+ } catch (Exception e) {
+ log.error("Exception occured!", e);
+ Thread.currentThread().interrupt();
+ }
+
+ /* Retrieve url from result and construct SSE url */
+ if (event_sseventUrlEmbed) {
+ String key = getEventParamMapValue(Constants.KSETTING_RESP_PREFIX).concat(".").concat(event_sseventsField);
+ log.info("key " + key);
+ this.event_sseventsUrl = ctx.getAttribute(key);
+ }
+
+ log.info("SSE received url " + event_sseventsUrl);
+ try {
+ p = getParameters(eventParaMap);
+ } catch (Exception e) {
+ log.error("Exception occured!", e);
+ Thread.currentThread().interrupt();
+ }
+ printEventParamMap();
+ String url = getUriMethod(parentCtrllr.getProperties().authorizationEnabled()) +
+ parentCtrllr.getCfgInfo().getController_restapiUrl() + event_sseventsUrl;
+ Client client = ignoreSslClient().register(SseFeature.class);
+ WebTarget target = addAuthType(client, p).target(url);
+ String tokenId = getEventParamMapValue(Constants.KSETTING_TOKENID);
+ String headerName = "X-ACCESS-TOKEN";
+ if (tokenId == null) {
+ headerName = HttpHeaders.AUTHORIZATION;
+ tokenId = getAuthorizationToken(parentCtrllr.getCfgInfo().getController_restapiUser(),
+ parentCtrllr.getCfgInfo().getController_restapiPassword());
+ }
+ AdditionalHeaderWebTarget newTarget = new AdditionalHeaderWebTarget(target, tokenId, headerName);
+ EventSource eventSource = EventSource.target(newTarget).build();
+ eventSource.register(new DataChangeEventListener(this));
+ eventSource.open();
+ log.info("Connected to SSE source");
+ while (running) {
+ try {
+ log.info("SSE state " + eventSource.isOpen());
+ Thread.sleep(5000);
+ } catch (InterruptedException ie) {
+ log.info("Exception: " + ie.getMessage());
+ Thread.currentThread().interrupt();
+ running = false;
+ }
+ }
+ eventSource.close();
+ log.info("Closed connection to SSE source");
+ }
+
+ private String getAuthorizationToken(String userName, String password) {
+ return "Basic " + Base64.getEncoder().encodeToString((
+ userName + ":" + password).getBytes());
+ }
+
+ private Client ignoreSslClient() {
+ SSLContext sslcontext = null;
+
+ try {
+ sslcontext = SSLContext.getInstance("TLS");
+ sslcontext.init(null, new TrustManager[]{new X509TrustManager() {
+ @Override
+ public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+ }
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return new X509Certificate[0];
+ }
+ }}, new java.security.SecureRandom());
+ } catch (NoSuchAlgorithmException | KeyManagementException e) {
+ throw new IllegalStateException(e);
+ }
+
+ return ClientBuilder.newBuilder().sslContext(sslcontext).hostnameVerifier((s1, s2) -> true).build();
+ }
+
+ public String getEvent_ruleId() {
+ return event_ruleId;
+ }
+
+ public void modifyEventParamMap(String fieldName, String value) {
+ eventParaMap.put(fieldName, value);
+ }
+
+ public String getEventParamMapValue(String fieldName) {
+ return eventParaMap.get(fieldName);
+ }
+
+ public void printEventParamMap() {
+ log.info("----------------Event Param Map-------------------");
+ for (String name : eventParaMap.keySet()) {
+ String value = eventParaMap.get(name);
+ log.info(name + " : " + value);
+ }
+ }
+}
diff --git a/src/main/java/org/onap/dcae/restapi/ApiAuthInterceptor.java b/src/main/java/org/onap/dcae/restapi/ApiAuthInterceptor.java
new file mode 100644
index 0000000..654ad20
--- /dev/null
+++ b/src/main/java/org/onap/dcae/restapi/ApiAuthInterceptor.java
@@ -0,0 +1,77 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.restapi;
+
+import io.vavr.control.Option;
+import java.io.IOException;
+import java.util.Base64;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.dcae.ApplicationSettings;
+import org.onap.dcaegen2.services.sdk.security.CryptPassword;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+final class ApiAuthInterceptor extends HandlerInterceptorAdapter {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ApiAuthInterceptor.class);
+ private final CryptPassword cryptPassword = new CryptPassword();
+ private final ApplicationSettings applicationSettings;
+
+
+
+ ApiAuthInterceptor(ApplicationSettings applicationSettings) {
+ this.applicationSettings = applicationSettings;
+
+ }
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
+ Object handler) throws IOException {
+ if (applicationSettings.authorizationEnabled()) {
+ String authorizationHeader = request.getHeader("Authorization");
+ if (authorizationHeader == null || !isAuthorized(authorizationHeader)) {
+ response.setStatus(400);
+
+ response.getWriter().write(ApiException.UNAUTHORIZED_USER.toJSON().toString());
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean isAuthorized(String authorizationHeader) {
+ try {
+ String encodedData = authorizationHeader.split(" ")[1];
+ String decodedData = new String(Base64.getDecoder().decode(encodedData));
+ String providedUser = decodedData.split(":")[0].trim();
+ String providedPassword = decodedData.split(":")[1].trim();
+ Option<String> maybeSavedPassword = applicationSettings.validAuthorizationCredentials().get(providedUser);
+ boolean userRegistered = maybeSavedPassword.isDefined();
+ return userRegistered && cryptPassword.matches(providedPassword,maybeSavedPassword.get());
+ } catch (Exception e) {
+ LOG.warn(String.format("Could not check if user is authorized (header: '%s')), probably malformed header.",
+ authorizationHeader), e);
+ return false;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/dcae/restapi/ApiConfiguration.java b/src/main/java/org/onap/dcae/restapi/ApiConfiguration.java
new file mode 100644
index 0000000..28a61bc
--- /dev/null
+++ b/src/main/java/org/onap/dcae/restapi/ApiConfiguration.java
@@ -0,0 +1,48 @@
+/*
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.restapi;
+
+import org.onap.dcae.ApplicationSettings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@EnableWebMvc
+@Configuration
+public class ApiConfiguration implements WebMvcConfigurer {
+
+ private final ApplicationSettings applicationSettings;
+
+
+ @Autowired
+ ApiConfiguration(ApplicationSettings applicationSettings) {
+ this.applicationSettings = applicationSettings;
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new ApiAuthInterceptor(applicationSettings));
+ }
+}
diff --git a/src/main/java/org/onap/dcae/restapi/ApiException.java b/src/main/java/org/onap/dcae/restapi/ApiException.java
new file mode 100644
index 0000000..d8c21b1
--- /dev/null
+++ b/src/main/java/org/onap/dcae/restapi/ApiException.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.restapi;
+
+import com.google.common.base.CaseFormat;
+import org.json.JSONObject;
+
+/**
+ * @author Pawel Szalapski (pawel.szalapski@nokia.com)
+ */
+public enum ApiException {
+ UNAUTHORIZED_USER(ExceptionType.POLICY_EXCEPTION, "POL2000", "Unauthorized user", 401);
+
+ public final int httpStatusCode;
+ private final ExceptionType type;
+ private final String code;
+ private final String details;
+
+ ApiException(ExceptionType type, String code, String details, int httpStatusCode) {
+ this.type = type;
+ this.code = code;
+ this.details = details;
+ this.httpStatusCode = httpStatusCode;
+ }
+
+ public JSONObject toJSON() {
+ JSONObject exceptionTypeNode = new JSONObject();
+ exceptionTypeNode.put("messageId", code);
+ exceptionTypeNode.put("text", details);
+
+ JSONObject requestErrorNode = new JSONObject();
+ requestErrorNode.put(type.toString(), exceptionTypeNode);
+
+ JSONObject rootNode = new JSONObject();
+ rootNode.put("requestError", requestErrorNode);
+ return rootNode;
+ }
+
+ public enum ExceptionType {
+ POLICY_EXCEPTION;
+
+ @Override
+ public String toString() {
+ return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, this.name());
+ }
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStore.java b/src/main/java/org/onap/dcae/restapi/RccRestController.java
index 0d1762f..75cfa15 100755..100644
--- a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStore.java
+++ b/src/main/java/org/onap/dcae/restapi/RccRestController.java
@@ -1,8 +1,8 @@
-/*-
+/*
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,36 +18,24 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.restapi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
-import java.util.HashMap;
+@RestController
+public class RccRestController {
+ private static final Logger log = LoggerFactory.getLogger(RccRestController.class);
-public class RetryPolicyStore {
- private static final Logger log = LoggerFactory.getLogger(RetryPolicyStore.class);
-
- HashMap<String, RetryPolicy> retryPolicies;
- public String proxyServers;
-
- public String getProxyServers() {
- return proxyServers;
- }
-
- public void setProxyServers(String admServers) {
- this.proxyServers = admServers;
- String[] adminServersArray = admServers.split(",");
- RetryPolicy adminPortalRetry = new RetryPolicy(adminServersArray, adminServersArray.length);
- retryPolicies.put("dme2proxy", adminPortalRetry);
+ @GetMapping("/")
+ String mainPage() {
+ return "Welcome to RestConfCollector";
}
- public RetryPolicyStore() {
- retryPolicies = new HashMap<>();
+ @GetMapping("/healthcheck")
+ public String healthy() {
+ return "hello";
}
-
- public RetryPolicy getRetryPolicy(String policyName) {
- return (this.retryPolicies.get(policyName));
- }
-
-}
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/dcae/restapi/ServletConfig.java b/src/main/java/org/onap/dcae/restapi/ServletConfig.java
new file mode 100644
index 0000000..6a6a761
--- /dev/null
+++ b/src/main/java/org/onap/dcae/restapi/ServletConfig.java
@@ -0,0 +1,108 @@
+/*
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.restapi;
+
+import org.onap.dcae.ApplicationException;
+import org.onap.dcae.ApplicationSettings;
+import org.onap.dcae.common.SSLContextCreator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.server.Ssl;
+import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import static java.nio.file.Files.readAllBytes;
+
+@Component
+public class ServletConfig implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
+
+ private static final Logger log = LoggerFactory.getLogger(ServletConfig.class);
+
+ @Autowired
+ private ApplicationSettings properties;
+
+ @Override
+ public void customize(ConfigurableServletWebServerFactory container) {
+ final boolean hasClientTlsAuthentication = properties.clientTlsAuthenticationEnabled();
+ log.info("WebServerFactoryCustomizer initializing........");
+ if (hasClientTlsAuthentication || properties.authorizationEnabled()) {
+ container.setSsl(hasClientTlsAuthentication ? httpsContextWithTlsAuthentication() : simpleHttpsContext());
+ container.setPort(properties.httpsPort());
+ } else {
+ container.setPort(properties.httpPort());
+ }
+ }
+
+ private SSLContextCreator simpleHttpsContextBuilder() {
+ log.info("Enabling SSL");
+
+ final Path keyStore = toAbsolutePath(properties.rcc_keystoreFileLocation());
+ log.info("Using keyStore path: " + keyStore);
+
+ final Path keyStorePasswordLocation = toAbsolutePath(properties.rcc_keystorePasswordFileLocation());
+ final String keyStorePassword = getKeyStorePassword(keyStorePasswordLocation);
+ log.info("Using keyStore password from: " + keyStorePasswordLocation);
+
+ final String alias = properties.keystoreAlias();
+
+ return SSLContextCreator.create(keyStore, alias, keyStorePassword);
+ }
+
+ private Ssl simpleHttpsContext() {
+ return simpleHttpsContextBuilder().build();
+ }
+
+ private Ssl httpsContextWithTlsAuthentication() {
+ final SSLContextCreator sslContextCreator = simpleHttpsContextBuilder();
+
+ log.info("Enabling TLS client authorization");
+
+ final Path trustStore = toAbsolutePath(properties.truststoreFileLocation());
+ log.info("Using trustStore path: " + trustStore);
+
+ final Path trustPasswordFileLocation = toAbsolutePath(properties.truststorePasswordFileLocation());
+ final String trustStorePassword = getKeyStorePassword(trustPasswordFileLocation);
+ log.info("Using trustStore password from: " + trustPasswordFileLocation);
+
+ return sslContextCreator.withTlsClientAuthentication(trustStore, trustStorePassword).build();
+ }
+
+ private Path toAbsolutePath(final String path) {
+ return Paths.get(path).toAbsolutePath();
+ }
+
+ private String getKeyStorePassword(final Path location) {
+ try {
+ return new String(readAllBytes(location));
+ } catch (IOException e) {
+ log.error("Could not read keystore password from: '" + location + "'.", e);
+ throw new ApplicationException(e);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/dcae/restapi/SwaggerConfig.java b/src/main/java/org/onap/dcae/restapi/SwaggerConfig.java
new file mode 100644
index 0000000..fc47ba8
--- /dev/null
+++ b/src/main/java/org/onap/dcae/restapi/SwaggerConfig.java
@@ -0,0 +1,44 @@
+/*
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.restapi;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .select()
+ .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.any())
+ .build();
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/restapi/WebMvcConfig.java b/src/main/java/org/onap/dcae/restapi/WebMvcConfig.java
new file mode 100644
index 0000000..d015b45
--- /dev/null
+++ b/src/main/java/org/onap/dcae/restapi/WebMvcConfig.java
@@ -0,0 +1,57 @@
+/*
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.restapi;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+
+@Configuration
+public class WebMvcConfig extends WebMvcConfigurationSupport {
+
+ @Override
+ protected void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry
+ .addResourceHandler("swagger-ui.html")
+ .addResourceLocations("classpath:/META-INF/resources/");
+
+ registry
+ .addResourceHandler("/webjars/**")
+ .addResourceLocations("classpath:/META-INF/resources/webjars/");
+
+ registry
+ .addResourceHandler("**")
+ .addResourceLocations("classpath:/templates/");
+ }
+
+ @Bean
+ public InternalResourceViewResolver jspViewResolver() {
+ InternalResourceViewResolver resolver = new InternalResourceViewResolver();
+ resolver.setPrefix("/");
+ resolver.setSuffix(".html");
+ return resolver;
+ }
+
+}
diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt
new file mode 100644
index 0000000..9f2d466
--- /dev/null
+++ b/src/main/resources/banner.txt
@@ -0,0 +1,7 @@
+ _____ _ _____ __ _____ _ _ _
+| __ \ | | / ____| / _| / ____| | || | | |
+| |__) | ___ ___ | |_ | | ___ _ __ | |_ | | ___ | || | ___ ___ | |_ ___ _ __
+| _ / / _ \/ __|| __|| | / _ \ | '_ \ | _| | | / _ \ | || | / _ \ / __|| __|/ _ \ | '__|
+| | \ \| __/\__ \| |_ | |____| (_) || | | || | | |____| (_) || || || __/| (__ | |_| (_) || |
+|_| \_\\___||___/ \__| \_____|\___/ |_| |_||_| \_____|\___/ |_||_| \___| \___| \__|\___/ |_|
+
diff --git a/src/main/scripts/docker_entry.sh b/src/main/scripts/docker_entry.sh
index 78b83f6..c51bc84 100755
--- a/src/main/scripts/docker_entry.sh
+++ b/src/main/scripts/docker_entry.sh
@@ -1,4 +1,23 @@
#!/bin/sh
+###
+# ============LICENSE_START=======================================================
+# org.onap.dcaegen2.restconfcollector
+# ================================================================================
+# Copyright (C) 2018-2019 Huawei. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
echo "INFO: USING RESTCONF CONTROLLER"
diff --git a/src/main/scripts/restConfCollector.sh b/src/main/scripts/restConfCollector.sh
index 88893c0..9a211fd 100755
--- a/src/main/scripts/restConfCollector.sh
+++ b/src/main/scripts/restConfCollector.sh
@@ -1,4 +1,23 @@
#!/bin/sh
+###
+# ============LICENSE_START=======================================================
+# org.onap.dcaegen2.restconfcollector
+# ================================================================================
+# Copyright (C) 2018-2019 Huawei. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
usage() {
echo "restConfCollector.sh <start/stop>"
@@ -47,7 +66,7 @@ else
JAVA=$JAVA_HOME
fi
-MAINCLASS=org.onap.dcae.collectors.restconf.common.RestConfCollector
+MAINCLASS=org.onap.dcae.RestConfCollector
# determine a path separator that works for this platform
PATHSEP=":"
diff --git a/src/test/java/org/onap/dcae/AccessControllerTest.java b/src/test/java/org/onap/dcae/AccessControllerTest.java
new file mode 100644
index 0000000..74d3da1
--- /dev/null
+++ b/src/test/java/org/onap/dcae/AccessControllerTest.java
@@ -0,0 +1,114 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import io.vavr.collection.Map;
+import org.json.JSONArray;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.dcae.common.RestConfContext;
+import org.onap.dcae.common.RestapiCallNode;
+import org.onap.dcae.controller.AccessController;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.json.JSONObject;
+
+import static java.nio.file.Files.readAllBytes;
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+import static org.onap.dcae.CLIUtils.processCmdLine;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class AccessControllerTest {
+ @Mock
+ private ApplicationSettings properties;
+
+ @Mock
+ private RestConfContext ctx;
+
+ @Mock
+ private RestapiCallNode restApiCallNode;
+
+ protected static final Path RESOURCES = Paths.get("src", "test", "resources");
+ protected static final Path KEYSTORE = Paths.get(RESOURCES.toString(), "keystore");
+ protected static final Path KEYSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "passwordfile");
+ protected static final Path TRUSTSTORE = Paths.get(RESOURCES.toString(), "truststore");
+ protected static final Path TRUSTSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "trustpasswordfile");
+ protected static final Path RCC_KEYSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "rcc_passwordfile");
+ protected static final Path RCC_KEYSTORE = Paths.get(RESOURCES.toString(), "sdnc.p12");
+
+ @Test
+ public void createAndGetAccessControler() {
+ when(properties.truststoreFileLocation()).thenReturn(TRUSTSTORE.toString());
+ when(properties.truststorePasswordFileLocation()).thenReturn(TRUSTSTORE_PASSWORD_FILE.toString());
+ when(properties.keystoreFileLocation()).thenReturn(KEYSTORE.toString());
+ when(properties.keystorePasswordFileLocation()).thenReturn(KEYSTORE_PASSWORD_FILE.toString());
+ when(properties.rcc_keystoreFileLocation()).thenReturn(RCC_KEYSTORE.toString());
+ when(properties.rcc_keystorePasswordFileLocation()).thenReturn(RCC_KEYSTORE_PASSWORD_FILE.toString());
+ try {
+ when(readAllBytes(null)).thenReturn("colletor".getBytes());
+ } catch (Exception e){}
+ JSONObject controller = new JSONObject("{\"controller_name\":\"AccessM&C\",\"controller_restapiUrl\":\"10.118.191.43:26335\",\"controller_restapiUser\":\"access\",\"controller_restapiPassword\":\"Huawei@123\",\"controller_accessTokenUrl\":\"/rest/plat/smapp/v1/oauth/token\",\"controller_accessTokenFile\":\"./etc/access-token.json\",\"controller_accessTokenMethod\":\"put\",\"controller_subsMethod\":\"post\",\"controller_subscriptionUrl\":\"/restconf/v1/operations/huawei-nce-notification-action:establish-subscription\",\"event_details\":[{\"event_name\":\"ONT_registration\",\"event_description\":\"ONTregistartionevent\",\"event_sseventUrlEmbed\":\"true\",\"event_sseventsField\":\"output.url\",\"event_sseventsUrl\":\"null\",\"event_subscriptionTemplate\":\"./etc/ont_registartion_subscription_template.json\",\"event_unSubscriptionTemplate\":\"./etc/ont_registartion_unsubscription_template.json\",\"event_ruleId\":\"777777777\"}]}");
+ try {
+ AccessController acClr = new AccessController(controller,
+ properties);
+
+ // then
+ assertEquals(acClr.getCfgInfo().getController_name(), "AccessM&C");
+ assertEquals(acClr.getCfgInfo().getController_accessTokenMethod(), "put");
+ assertEquals(acClr.getCfgInfo().getController_subsMethod(), "post");
+ assertEquals(acClr.getCfgInfo().getController_subscriptionUrl(), "/restconf/v1/operations/huawei-nce-notification-action:establish-subscription");
+ } catch (Exception e){}
+ }
+
+ @Test
+ public void accessControllerSuccessfullyActivated() {
+ when(properties.truststoreFileLocation()).thenReturn(TRUSTSTORE.toString());
+ when(properties.truststorePasswordFileLocation()).thenReturn(TRUSTSTORE_PASSWORD_FILE.toString());
+ when(properties.keystoreFileLocation()).thenReturn(KEYSTORE.toString());
+ when(properties.keystorePasswordFileLocation()).thenReturn(KEYSTORE_PASSWORD_FILE.toString());
+ when(properties.rcc_keystoreFileLocation()).thenReturn(RCC_KEYSTORE.toString());
+ when(properties.rcc_keystorePasswordFileLocation()).thenReturn(RCC_KEYSTORE_PASSWORD_FILE.toString());
+ when(properties.rcc_policy()).thenReturn("[{\"controller_name\":\"AccessM&C\",\"controller_restapiUrl\":\"10.118.191.43:26335\",\"controller_restapiUser\":\"access\",\"controller_restapiPassword\":\"Huawei@123\",\"controller_accessTokenUrl\":\"/rest/plat/smapp/v1/oauth/token\",\"controller_accessTokenFile\":\"./etc/access-token.json\",\"controller_accessTokenMethod\":\"put\",\"controller_subsMethod\":\"post\",\"controller_subscriptionUrl\":\"/restconf/v1/operations/huawei-nce-notification-action:establish-subscription\",\"event_details\":[{\"event_name\":\"ONT_registration\",\"event_description\":\"ONTregistartionevent\",\"event_sseventUrlEmbed\":\"true\",\"event_sseventsField\":\"output.url\",\"event_sseventsUrl\":\"null\",\"event_subscriptionTemplate\":\"./etc/ont_registartion_subscription_template.json\",\"event_unSubscriptionTemplate\":\"./etc/ont_registartion_unsubscription_template.json\",\"event_ruleId\":\"777777777\"}]}]");
+ when(ctx.getAttribute("responsePrefix.httpResponse")).thenReturn("{\"accessSession\" : \"1234567890\",\"result\" : \"Ok\"}");
+ try {
+ doThrow(new Exception()).when(restApiCallNode).sendRequest(null, null, 0);
+ } catch (Exception e){}
+ try {
+ when(readAllBytes(null)).thenReturn("colletor".getBytes());
+ } catch (Exception e){}
+
+ JSONObject controller = new JSONObject("{\"controller_name\":\"AccessM&C\",\"controller_restapiUrl\":\"10.118.191.43:26335\",\"controller_restapiUser\":\"access\",\"controller_restapiPassword\":\"Huawei@123\",\"controller_accessTokenUrl\":\"/rest/plat/smapp/v1/oauth/token\",\"controller_accessTokenFile\":\"./etc/access-token.json\",\"controller_accessTokenMethod\":\"put\",\"controller_subsMethod\":\"post\",\"controller_subscriptionUrl\":\"/restconf/v1/operations/huawei-nce-notification-action:establish-subscription\",\"event_details\":[{\"event_name\":\"ONT_registration\",\"event_description\":\"ONTregistartionevent\",\"event_sseventUrlEmbed\":\"true\",\"event_sseventsField\":\"output.url\",\"event_sseventsUrl\":\"null\",\"event_subscriptionTemplate\":\"./etc/ont_registartion_subscription_template.json\",\"event_unSubscriptionTemplate\":\"./etc/ont_registartion_unsubscription_template.json\",\"event_ruleId\":\"777777777\"}]}");
+ try {
+ AccessController acClr = new AccessController(controller,
+ properties);
+ acClr.activate();
+ } catch (Exception e){}
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/AnyNodeTest.java b/src/test/java/org/onap/dcae/AnyNodeTest.java
index 301f148..20fbf35 100755..100644
--- a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/AnyNodeTest.java
+++ b/src/test/java/org/onap/dcae/AnyNodeTest.java
@@ -1,8 +1,8 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,30 +18,32 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcae.collectors.restconf.restconftest;
+package org.onap.dcae;
+
+import static org.assertj.core.api.Assertions.assertThat;
import com.google.common.collect.Sets;
+import java.util.Set;
import org.junit.BeforeClass;
import org.junit.Test;
-import org.onap.dcae.collectors.restconf.common.AnyNode;
-
-import java.util.Set;
-
-import static org.assertj.core.api.Assertions.assertThat;
+import org.onap.dcae.common.AnyNode;
+/**
+ * Created by koblosz on 07.06.18.
+ */
public class AnyNodeTest {
private static final String SAMPLE_JSON_FILEPATH = "{\n"
- + " \"channels\": [{\n"
- + " \"one\": \"number1\", \"two\": \"number2\", \"three\": \"number3\"}],\n"
- + " \"sampleStrList\": [\"1\", \"2\", \"3\", \"4\", \"5\"],\n"
- + " \"sampleNestedObject\": {\"a\": 1, \"b\": 2},\n"
- + " \"sampleInt\": 1,\n"
- + " \"sampleString\": \"str\",\n"
- + " \"sampleNull\": null\n"
- + "}\n";
+ + " \"channels\": [{\n"
+ + " \"one\": \"number1\", \"two\": \"number2\", \"three\": \"number3\"}],\n"
+ + " \"sampleStrList\": [\"1\", \"2\", \"3\", \"4\", \"5\"],\n"
+ + " \"sampleNestedObject\": {\"a\": 1, \"b\": 2},\n"
+ + " \"sampleInt\": 1,\n"
+ + " \"sampleString\": \"str\",\n"
+ + " \"sampleNull\": null\n"
+ + "}\n";
private static final Set<String> EXPECTED_JSON_KEYS = Sets
- .newHashSet("channels", "sampleStrList", "sampleNestedObject", "sampleInt", "sampleString", "sampleNull");
+ .newHashSet("channels", "sampleStrList", "sampleNestedObject", "sampleInt", "sampleString", "sampleNull");
private static AnyNode node;
diff --git a/src/test/java/org/onap/dcae/ApplicationSettingsTest.java b/src/test/java/org/onap/dcae/ApplicationSettingsTest.java
new file mode 100644
index 0000000..1e1a115
--- /dev/null
+++ b/src/test/java/org/onap/dcae/ApplicationSettingsTest.java
@@ -0,0 +1,337 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import static org.junit.Assert.assertTrue;
+import static org.onap.dcae.CLIUtils.processCmdLine;
+
+import io.vavr.collection.HashMap;
+import io.vavr.collection.Map;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Objects;
+import org.junit.Test;
+
+public class ApplicationSettingsTest {
+
+ @Test
+ public void shouldMakeApplicationSettingsOutOfCLIArguments() {
+ // given
+ String[] cliArguments = {"-param1", "param1value", "-param2", "param2value"};
+
+ // when
+ ApplicationSettings configurationAccessor = new ApplicationSettings(cliArguments, CLIUtils::processCmdLine);
+ String param1value = configurationAccessor.getStringDirectly("param1");
+ String param2value = configurationAccessor.getStringDirectly("param2");
+
+ // then
+ assertEquals("param1value", param1value);
+ assertEquals("param2value", param2value);
+ }
+
+ @Test
+ public void shouldMakeApplicationSettingsOutOfCLIArgumentsAndAConfigurationFile()
+ throws IOException {
+ // given
+ File tempConfFile = File.createTempFile("doesNotMatter", "doesNotMatter");
+ Files.write(tempConfFile.toPath(), Arrays.asList("section.subSection1=abc", "section.subSection2=zxc"));
+ tempConfFile.deleteOnExit();
+ String[] cliArguments = {"-param1", "param1value", "-param2", "param2value", "-c", tempConfFile.toString()};
+
+ // when
+ ApplicationSettings configurationAccessor = new ApplicationSettings(cliArguments, CLIUtils::processCmdLine);
+ String param1value = configurationAccessor.getStringDirectly("param1");
+ String param2value = configurationAccessor.getStringDirectly("param2");
+ String fromFileParam1Value = configurationAccessor.getStringDirectly("section.subSection1");
+ String fromFileParam2Value = configurationAccessor.getStringDirectly("section.subSection2");
+
+ // then
+ assertEquals("param1value", param1value);
+ assertEquals("param2value", param2value);
+ assertEquals("abc", fromFileParam1Value);
+ assertEquals("zxc", fromFileParam2Value);
+ }
+
+ @Test
+ public void shouldCLIArgumentsOverrideConfigFileParameters() throws IOException {
+ // given
+ String[] cliArguments = {"-section.subSection1", "abc"};
+ File tempConfFile = File.createTempFile("doesNotMatter", "doesNotMatter");
+ Files.write(tempConfFile.toPath(), singletonList("section.subSection1=zxc"));
+ tempConfFile.deleteOnExit();
+
+ // when
+ ApplicationSettings configurationAccessor = new ApplicationSettings(cliArguments, CLIUtils::processCmdLine);
+ String actuallyOverridenByCLIParam = configurationAccessor.getStringDirectly("section.subSection1");
+
+ // then
+ assertEquals("abc", actuallyOverridenByCLIParam);
+ }
+
+ @Test
+ public void shouldReturnHTTPPort() throws IOException {
+ // when
+ int applicationPort = fromTemporaryConfiguration("collector.rcc.service.port=8090")
+ .httpPort();
+
+ // then
+ assertEquals(8090, applicationPort);
+ }
+
+ @Test
+ public void shouldReturnDefaultHTTPPort() throws IOException {
+ // when
+ int applicationPort = fromTemporaryConfiguration().httpPort();
+
+ // then
+ assertEquals(8686, applicationPort);
+ }
+
+ @Test
+ public void shouldReturnIfHTTPSIsEnabled() throws IOException {
+ // when
+ boolean httpsEnabled = fromTemporaryConfiguration("collector.rcc.service.secure.port=8687")
+ .httpsEnabled();
+
+ // then
+ assertTrue(httpsEnabled);
+ }
+
+ @Test
+ public void shouldReturnIfHTTPIsEnabled() throws IOException {
+ // when
+ boolean httpsEnabled = fromTemporaryConfiguration("collector.service.port=8686").httpsEnabled();
+ // then
+ assertTrue(httpsEnabled);
+ }
+
+ @Test
+ public void shouldByDefaultHTTPSBeDisabled() throws IOException {
+ // when
+ boolean httpsEnabled = fromTemporaryConfiguration().httpsEnabled();
+
+ // then
+ assertTrue(httpsEnabled);
+ }
+
+ @Test
+ public void shouldReturnHTTPSPort() throws IOException {
+ // when
+ int httpsPort = fromTemporaryConfiguration("collector.service.secure.port=8687")
+ .httpsPort();
+
+ // then
+ assertEquals(8687, httpsPort);
+ }
+
+
+ @Test
+ public void shouldReturnLocationOfThePasswordFile() throws IOException {
+ // when
+ String passwordFileLocation = fromTemporaryConfiguration("collector.rcc.keystore.passwordfile=/somewhere/password")
+ .keystorePasswordFileLocation();
+
+ // then
+ assertEquals(sanitizePath("/somewhere/password"), passwordFileLocation);
+ }
+
+ @Test
+ public void shouldReturnDefaultLocationOfThePasswordFile() throws IOException {
+ // when
+ String passwordFileLocation = fromTemporaryConfiguration().keystorePasswordFileLocation();
+
+ // then
+ assertEquals(sanitizePath("etc/passwordfile"), passwordFileLocation);
+ }
+
+ @Test
+ public void shouldReturnLocationOfTheKeystoreFile() throws IOException {
+ // when
+ String keystoreFileLocation = fromTemporaryConfiguration("collector.rcc.keystore.file.location=/somewhere/keystore")
+ .keystoreFileLocation();
+
+ // then
+ assertEquals(sanitizePath("/somewhere/keystore"), keystoreFileLocation);
+ }
+
+ @Test
+ public void shouldReturnLocationOfTheDefaultKeystoreFile() throws IOException {
+ // when
+ String keystoreFileLocation = fromTemporaryConfiguration().keystoreFileLocation();
+
+ // then
+ assertEquals(sanitizePath("etc/sdnc.p12"), keystoreFileLocation);
+ }
+
+ @Test
+ public void shouldReturnDMAAPConfigFileLocation() throws IOException {
+ // when
+ String dmaapConfigFileLocation = fromTemporaryConfiguration("collector.dmaapfile=/somewhere/dmaapFile")
+ .dMaaPConfigurationFileLocation();
+
+ // then
+ assertEquals(sanitizePath("/somewhere/dmaapFile"), dmaapConfigFileLocation);
+ }
+
+ @Test
+ public void shouldReturnDefaultDMAAPConfigFileLocation() throws IOException {
+ // when
+ String dmaapConfigFileLocation = fromTemporaryConfiguration().dMaaPConfigurationFileLocation();
+
+ // then
+ assertEquals(sanitizePath("etc/DmaapConfig.json"), dmaapConfigFileLocation);
+ }
+
+ @Test
+ public void shouldReturnMaximumAllowedQueuedEvents() throws IOException {
+ // when
+ int maximumAllowedQueuedEvents = fromTemporaryConfiguration("collector.rcc.inputQueue.maxPending=10000")
+ .maximumAllowedQueuedEvents();
+
+ // then
+ assertEquals(10000, maximumAllowedQueuedEvents);
+ }
+
+ @Test
+ public void shouldReturnDefaultMaximumAllowedQueuedEvents() throws IOException {
+ // when
+ int maximumAllowedQueuedEvents = fromTemporaryConfiguration().maximumAllowedQueuedEvents();
+
+ // then
+ assertEquals(1024 * 4, maximumAllowedQueuedEvents);
+ }
+
+
+
+
+// @Test
+// public void shouldReturnDMAAPStreamId() throws IOException {
+// // given
+// Map<String, String[]> expected = HashMap.of(
+// "s", new String[]{"something", "something2"},
+// "s2", new String[]{"something3"}
+// );
+//
+// // when
+// Map<String, String[]> dmaapStreamID = fromTemporaryConfiguration(
+// "collector.dmaap.streamid=s=something,something2|s2=something3")
+// .dMaaPStreamsMapping();
+//
+// // then
+// assertArrayEquals(expected.get("s").get(), Objects.requireNonNull(dmaapStreamID).get("s").get());
+// assertArrayEquals(expected.get("s2").get(), Objects.requireNonNull(dmaapStreamID).get("s2").get());
+// assertEquals(expected.keySet(), dmaapStreamID.keySet());
+// }
+//
+// @Test
+// public void shouldReturnDefaultDMAAPStreamId() throws IOException {
+// // when
+// Map<String, String[]> dmaapStreamID = fromTemporaryConfiguration().dMaaPStreamsMapping();
+//
+// // then
+// assertEquals(dmaapStreamID, HashMap.empty());
+// }
+
+ @Test
+ public void shouldReturnIfAuthorizationIsEnabled() throws IOException {
+ // when
+ boolean authorizationEnabled = fromTemporaryConfiguration("collector.header.authflag=1")
+ .authorizationEnabled();
+
+ // then
+ assertTrue(authorizationEnabled);
+ }
+
+ @Test
+ public void shouldAuthorizationBeDisabledByDefault() throws IOException {
+ // when
+ boolean authorizationEnabled = fromTemporaryConfiguration().authorizationEnabled();
+
+ // then
+ assertFalse(authorizationEnabled);
+ }
+
+ @Test
+ public void shouldReturnValidCredentials() throws IOException {
+ // when
+ Map<String, String> allowedUsers = fromTemporaryConfiguration(
+ "collector.header.authlist=pasza,c2ltcGxlcGFzc3dvcmQNCg==|someoneelse,c2ltcGxlcGFzc3dvcmQNCg=="
+ ).validAuthorizationCredentials();
+
+ // then
+ assertEquals(allowedUsers.get("pasza").get(), "c2ltcGxlcGFzc3dvcmQNCg==");
+ assertEquals(allowedUsers.get("someoneelse").get(), "c2ltcGxlcGFzc3dvcmQNCg==");
+ }
+
+ @Test
+ public void shouldbyDefaultThereShouldBeNoValidCredentials() throws IOException {
+ // when
+ Map<String, String> userToBase64PasswordDelimitedByCommaSeparatedByPipes = fromTemporaryConfiguration().
+ validAuthorizationCredentials();
+
+ // then
+ assertTrue(userToBase64PasswordDelimitedByCommaSeparatedByPipes.isEmpty());
+ }
+
+
+ @Test
+ public void shouldReturnCambriaConfigurationFileLocation() throws IOException {
+ // when
+ String cambriaConfigurationFileLocation = fromTemporaryConfiguration(
+ "collector.dmaapfile=/somewhere/dmaapConfig")
+ .dMaaPConfigurationFileLocation();
+
+ // then
+ assertEquals(sanitizePath("/somewhere/dmaapConfig"), cambriaConfigurationFileLocation);
+ }
+
+ @Test
+ public void shouldReturnDefaultCambriaConfigurationFileLocation() throws IOException {
+ // when
+ String cambriaConfigurationFileLocation = fromTemporaryConfiguration()
+ .dMaaPConfigurationFileLocation();
+
+ // then
+ assertEquals(sanitizePath("etc/DmaapConfig.json"), cambriaConfigurationFileLocation);
+ }
+
+ private static ApplicationSettings fromTemporaryConfiguration(String... fileLines)
+ throws IOException {
+ File tempConfFile = File.createTempFile("doesNotMatter", "doesNotMatter");
+ Files.write(tempConfFile.toPath(), Arrays.asList(fileLines));
+ tempConfFile.deleteOnExit();
+ return new ApplicationSettings(new String[]{"-c", tempConfFile.toString()}, args -> processCmdLine(args), "");
+ }
+
+ private String sanitizePath(String path) {
+ return Paths.get(path).toString();
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/CLIUtilsTest.java b/src/test/java/org/onap/dcae/CLIUtilsTest.java
new file mode 100644
index 0000000..caf88ac
--- /dev/null
+++ b/src/test/java/org/onap/dcae/CLIUtilsTest.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import io.vavr.collection.Map;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CLIUtilsTest {
+
+ @Test
+ public void shouldConvertArgsToPropertiesMap() {
+ // given
+ String[] args = {"-withOutValue", "-collector.service.port", "8000", "-collector.service.secure.port", "8687"};
+
+ //when
+ Map<String, String> properties = CLIUtils.processCmdLine(args);
+
+ //then
+ assertThat(properties.get("collector.service.port").get()).isEqualTo("8000");
+ assertThat(properties.get("collector.service.secure.port").get()).isEqualTo("8687");
+ assertThat(properties.get("withOutValue").get()).isEqualTo("");
+ }
+
+ @Test
+ public void shouldReturnEmptyMapIfThereIsNoArgs() {
+ //given
+ String[] args = {};
+
+ //when
+ Map<String, String> properties = CLIUtils.processCmdLine(args);
+
+ //then
+ assertThat(properties).isEmpty();
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/TLSTest.java b/src/test/java/org/onap/dcae/TLSTest.java
new file mode 100644
index 0000000..ddb39ee
--- /dev/null
+++ b/src/test/java/org/onap/dcae/TLSTest.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import io.vavr.collection.HashMap;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+import org.springframework.http.HttpStatus;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.when;
+import static org.onap.dcae.TLSTest.HttpsConfiguration.USERNAME;
+import static org.onap.dcae.TLSTest.HttpsConfiguration.PASSWORD;
+
+public class TLSTest extends TLSTestBase {
+
+ @Nested
+ @Import(HttpConfiguration.class)
+ class HttpTest extends TestClassBase {
+
+ @Test
+ public void shouldHttpRequestSucceed() {
+ assertEquals(HttpStatus.OK, makeHttpRequest().getStatusCode());
+ }
+
+ @Test
+ public void shouldHttpsRequestFail() {
+ assertThrows(Exception.class, this::makeHttpsRequest);
+ }
+ }
+
+
+ static class HttpConfiguration extends TLSTestBase.ConfigurationBase {
+ @Override
+ protected void configureSettings(ApplicationSettings settings) {
+ }
+ }
+
+ static class HttpsConfiguration extends TLSTestBase.ConfigurationBase {
+ public static final String USERNAME = "TestUser";
+ public static final String PASSWORD = "TestPassword";
+
+ @Override
+ protected void configureSettings(ApplicationSettings settings) {
+ when(settings.keystoreFileLocation()).thenReturn(KEYSTORE.toString());
+ when(settings.keystorePasswordFileLocation()).thenReturn(KEYSTORE_PASSWORD_FILE.toString());
+ when(settings.rcc_keystoreFileLocation()).thenReturn(RCC_KEYSTORE.toString());
+ when(settings.rcc_keystorePasswordFileLocation()).thenReturn(RCC_KEYSTORE_PASSWORD_FILE.toString());
+ when(settings.authorizationEnabled()).thenReturn(true);
+ when(settings.validAuthorizationCredentials()).thenReturn(HashMap.of(USERNAME, "$2a$10$51tDgG2VNLde5E173Ay/YO.Fq.aD.LR2Rp8pY3QAKriOSPswvGviy"));
+ }
+ }
+
+ static class HttpsConfigurationWithTLSAuthentication extends HttpsConfiguration {
+ @Override
+ protected void configureSettings(ApplicationSettings settings) {
+ super.configureSettings(settings);
+ when(settings.authorizationEnabled()).thenReturn(false);
+ when(settings.clientTlsAuthenticationEnabled()).thenReturn(true);
+ when(settings.truststoreFileLocation()).thenReturn(TRUSTSTORE.toString());
+ when(settings.truststorePasswordFileLocation()).thenReturn(TRUSTSTORE_PASSWORD_FILE.toString());
+ }
+ }
+
+ static class HttpsConfigurationWithTLSAuthenticationAndBasicAuth extends HttpsConfigurationWithTLSAuthentication {
+ @Override
+ protected void configureSettings(ApplicationSettings settings) {
+ super.configureSettings(settings);
+ when(settings.authorizationEnabled()).thenReturn(true);
+ }
+ }
+}
diff --git a/src/test/java/org/onap/dcae/TLSTestBase.java b/src/test/java/org/onap/dcae/TLSTestBase.java
new file mode 100644
index 0000000..fdcc6e6
--- /dev/null
+++ b/src/test/java/org/onap/dcae/TLSTestBase.java
@@ -0,0 +1,154 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae;
+
+import org.json.JSONObject;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.support.BasicAuthenticationInterceptor;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import static org.onap.dcae.TestingUtilities.*;
+
+@Configuration
+@ExtendWith(SpringExtension.class)
+public class TLSTestBase {
+ protected static final String KEYSTORE_ALIAS = "tomcat";
+ protected static final Path RESOURCES = Paths.get("src", "test", "resources");
+ protected static final Path KEYSTORE = Paths.get(RESOURCES.toString(), "keystore");
+ protected static final Path KEYSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "passwordfile");
+ protected static final Path TRUSTSTORE = Paths.get(RESOURCES.toString(), "truststore");
+ protected static final Path TRUSTSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "trustpasswordfile");
+ protected static final Path RCC_KEYSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "rcc_passwordfile");
+ protected static final Path RCC_KEYSTORE = Paths.get(RESOURCES.toString(), "sdnc.p12");
+
+ protected static abstract class ConfigurationBase {
+ protected final ApplicationSettings settings = Mockito.mock(ApplicationSettings.class);
+
+ @Bean
+ @Primary
+ public ApplicationSettings settings() {
+ configureSettings(settings);
+ return settings;
+ }
+
+ protected abstract void configureSettings(final ApplicationSettings settings);
+ }
+
+ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+ protected abstract class TestClassBase {
+ @MockBean
+ @Qualifier("inputQueue")
+ protected LinkedBlockingQueue<JSONObject> queue;
+
+ @LocalServerPort
+ private int port;
+
+ private final String keyStorePassword;
+ private final String trustStorePassword;
+
+ public TestClassBase() {
+ keyStorePassword = readFile(RCC_KEYSTORE_PASSWORD_FILE);
+ trustStorePassword = readFile(TRUSTSTORE_PASSWORD_FILE);
+ }
+
+ private String getURL(final String protocol, final String uri) {
+ return protocol + "://localhost:" + port + uri;
+ }
+
+ private RestTemplate addBasicAuth(final RestTemplate template, final String username, final String password) {
+ template.getInterceptors()
+ .add(new BasicAuthenticationInterceptor(username, password));
+
+ return template;
+ }
+
+ public String createHttpURL(String uri) {
+ return getURL("http", uri);
+ }
+
+ public String createHttpsURL(String uri) {
+ return getURL("https", uri);
+ }
+
+ public RestTemplate createHttpRestTemplate() {
+ return new RestTemplate();
+ }
+
+ public RestTemplate createHttpsRestTemplate() {
+ return rethrow(() ->
+ createRestTemplateWithSsl(
+ sslBuilderWithTrustStore(KEYSTORE, keyStorePassword).build()
+ ));
+ }
+
+ public RestTemplate createHttpsRestTemplateWithKeyStore() {
+ return rethrow(() ->
+ createRestTemplateWithSsl(
+ configureKeyStore(
+ sslBuilderWithTrustStore(RCC_KEYSTORE, keyStorePassword),
+ TRUSTSTORE,
+ trustStorePassword
+ ).build())
+ );
+ }
+
+ public ResponseEntity<String> makeHttpRequest() {
+ return createHttpRestTemplate().getForEntity(createHttpURL("/"), String.class);
+ }
+
+ public ResponseEntity<String> makeHttpsRequest() {
+ return createHttpsRestTemplate().getForEntity(createHttpsURL("/"), String.class);
+ }
+
+
+ public ResponseEntity<String> makeHttpsRequestWithBasicAuth(final String username, final String password) {
+ return addBasicAuth(createHttpsRestTemplate(), username, password)
+ .getForEntity(createHttpsURL("/"), String.class);
+
+ }
+
+ public ResponseEntity<String> makeHttpsRequestWithClientCert() {
+ return createHttpsRestTemplateWithKeyStore().getForEntity(createHttpsURL("/"), String.class);
+ }
+
+ public ResponseEntity<String> makeHttpsRequestWithClientCertAndBasicAuth(
+ final String username,
+ final String password) {
+ return addBasicAuth(createHttpsRestTemplateWithKeyStore(), username, password)
+ .getForEntity(createHttpsURL("/"), String.class);
+ }
+ }
+}
diff --git a/src/test/java/org/onap/dcae/TestingUtilities.java b/src/test/java/org/onap/dcae/TestingUtilities.java
new file mode 100644
index 0000000..5ae238a
--- /dev/null
+++ b/src/test/java/org/onap/dcae/TestingUtilities.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae;
+
+import static java.nio.file.Files.readAllBytes;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.vavr.control.Try;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.assertj.core.api.AbstractThrowableAssert;
+import org.assertj.core.api.Java6Assertions;
+import org.json.JSONObject;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+import javax.net.ssl.SSLContext;
+
+public final class TestingUtilities {
+
+ private TestingUtilities() {
+ // utility class, no objects allowed
+ }
+
+ public static void assertJSONObjectsEqual(JSONObject o1, JSONObject o2) {
+ assertThat(o1.toString()).isEqualTo(o2.toString());
+ }
+
+ public static JSONObject readJSONFromFile(Path path) {
+ return rethrow(() -> new JSONObject(readFile(path)));
+ }
+
+ public static String readFile(Path path) {
+ return rethrow(() -> new String(readAllBytes(path)));
+ }
+
+ public static Path createTemporaryFile(String content) {
+ return rethrow(() -> {
+ File temp = File.createTempFile("restconf-collector-tests-created-this-file", ".tmp");
+ temp.deleteOnExit();
+ Path filePath = Paths.get(temp.toString());
+ Files.write(filePath, content.getBytes());
+ return filePath;
+ });
+ }
+
+ /**
+ * Exception in test case usually means there is something wrong, it should never be catched, but rather thrown to
+ * be handled by JUnit framework.
+ */
+ public static <T> T rethrow(CheckedSupplier<T> supplier) {
+ try {
+ return supplier.get();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @FunctionalInterface
+ interface CheckedSupplier<T> {
+
+ T get() throws Exception;
+ }
+
+ public static void assertFailureHasInfo(Try any, String... msgPart) {
+ Java6Assertions.assertThat(any.isFailure()).isTrue();
+ AbstractThrowableAssert<?, ? extends Throwable> o = Java6Assertions.assertThat(any.getCause())
+ .hasCauseInstanceOf(Exception.class);
+ for (String s : msgPart) {
+ o.hasStackTraceContaining(s);
+ }
+ }
+
+ public static SSLContextBuilder sslBuilderWithTrustStore(final Path trustStore, final String pass) {
+ return rethrow(() ->
+ new SSLContextBuilder()
+ .loadTrustMaterial(trustStore.toFile(), pass.toCharArray())
+ );
+ }
+
+ public static SSLContextBuilder configureKeyStore(
+ final SSLContextBuilder builder,
+ final Path keyStore,
+ final String pass) {
+ return rethrow(() -> {
+ KeyStore cks = KeyStore.getInstance(KeyStore.getDefaultType());
+ cks.load(new FileInputStream(keyStore.toFile()), pass.toCharArray());
+
+ builder.loadKeyMaterial(cks, pass.toCharArray());
+
+ return builder;
+ });
+ }
+
+ public static RestTemplate createRestTemplateWithSsl(final SSLContext context) {
+ final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(context);
+ final HttpClient httpClient = HttpClients
+ .custom()
+ .setSSLSocketFactory(socketFactory)
+ .build();
+
+ final HttpComponentsClientHttpRequestFactory factory =
+ new HttpComponentsClientHttpRequestFactory(httpClient);
+
+ return new RestTemplate(factory);
+ }
+}
diff --git a/src/test/java/org/onap/dcae/WiremockBasedTest.java b/src/test/java/org/onap/dcae/WiremockBasedTest.java
new file mode 100644
index 0000000..2144e99
--- /dev/null
+++ b/src/test/java/org/onap/dcae/WiremockBasedTest.java
@@ -0,0 +1,68 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static io.vavr.API.Map;
+
+import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import io.vavr.collection.Map;
+import org.junit.Rule;
+
+public class WiremockBasedTest {
+
+ @Rule
+ public WireMockRule wireMockRule = new WireMockRule(
+ wireMockConfig().dynamicPort().dynamicHttpsPort().keystorePath(null));
+
+ protected void stubConsulToReturnLocalAddressOfCBS() {
+ stubFor(get(urlEqualTo("/v1/catalog/service/CBSName"))
+ .willReturn(aResponse().withBody(validLocalCBSConf())));
+ }
+
+ protected void stubCBSToReturnAppConfig(String sampleConfigForVES) {
+ stubFor(get(urlEqualTo("/service_component/restconfcollector"))
+ .willReturn(aResponse().withBody(sampleConfigForVES)));
+ }
+
+ protected Map<String, String> wiremockBasedEnvProps() {
+ return Map(
+ "CONSUL_HOST", "localhost",
+ "CONSUL_PORT", "" + wireMockRule.port(),
+ "HOSTNAME", "restconfcollector",
+ "CONFIG_BINDING_SERVICE", "CBSName"
+ );
+ }
+
+ protected String validLocalCBSConf() {
+ return ""
+ + "[{ "
+ + "\"ServiceAddress\": \"localhost\","
+ + "\"ServicePort\":" + wireMockRule.port()
+ + "}]";
+ }
+}
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStoreTest.java b/src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStoreTest.java
deleted file mode 100644
index 9508b1a..0000000
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStoreTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2019 IBM. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-
-package org.onap.dcae.collectors.restconf.common;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.*;
-
-public class RetryPolicyStoreTest {
-
- RetryPolicyStore retryPolicyStore;
- String proxyServers;
-
- @Before
- public void setUp() throws Exception {
- retryPolicyStore = new RetryPolicyStore();
- proxyServers = "3.3.3.3,4.4.4.4,5.5.5.5";
- }
-
- @Test
- public void getProxyServers() {
- retryPolicyStore.setProxyServers(proxyServers);
- assertThat(retryPolicyStore.getProxyServers(), is(proxyServers));
- }
-
- @Test
- public void setProxyServers() throws RetryException {
- retryPolicyStore.setProxyServers(proxyServers);
- RetryPolicy actual = retryPolicyStore.getRetryPolicy("dme2proxy");
- assertThat(3, is(actual.getMaximumRetries()));
- assertThat("4.4.4.4", is(actual.getNextHostName("3.3.3.3")));
- assertThat("5.5.5.5", is(actual.getNextHostName("4.4.4.4")));
- }
-
- @Test
- public void getRetryPolicy() {
- String[] adminServersArray = {"3.3.3.3","4.4.4.4","5.5.5.5"};
- RetryPolicy retryPolicy = new RetryPolicy(adminServersArray, adminServersArray.length);
- retryPolicyStore.retryPolicies.put("dme2proxy", retryPolicy);
- assertThat(retryPolicyStore.getRetryPolicy("dme2proxy"), is(retryPolicy));
- }
-} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyTest.java b/src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyTest.java
deleted file mode 100644
index 1b8cfcb..0000000
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/RetryPolicyTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2019 IBM. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.common;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class RetryPolicyTest {
-
- String[] hostnames;
- Integer maximumRetries;
- RetryPolicy retryPolicy;
-
- @Before
- public void setUp() throws Exception {
- hostnames = "test1.com,test2.com,test3.com,4.4.4.4".split(",");
- maximumRetries = 3;
- retryPolicy = new RetryPolicy(this.hostnames, this.maximumRetries);
- }
-
- @Test
- public void testGetMaximumRetries() {
- assertEquals(maximumRetries, retryPolicy.getMaximumRetries());
- }
-
- @Test
- public void testGetNextHostName() throws RetryException {
- assertEquals(hostnames[2], retryPolicy.getNextHostName("http://" + hostnames[1] + "/endpoint"));
- assertEquals(hostnames[0], retryPolicy.getNextHostName("http://" + hostnames[3] + "/endpoint"));
- }
-
- @Test(expected = RetryException.class)
- public void testGetNextHostNameWithException() throws RetryException {
- retryPolicy.getNextHostName("abc");
- }
-} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParserTest.java b/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParserTest.java
deleted file mode 100755
index 730d257..0000000
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParserTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
-
-import io.vavr.collection.Map;
-import io.vavr.control.Try;
-import org.junit.Test;
-
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import static io.vavr.API.List;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.onap.dcae.collectors.restconf.common.event.publishing.DMaaPConfigurationParser.parseToDomainMapping;
-
-public class DMaaPConfigurationParserTest {
- @Test
- public void testParseCredentialsForGen2() {
- Path path = Paths.get("src/test/resources/testParseDMaaPCredentialsGen2.json");
- Try<Map<String, PublisherConfig>> publisherConfigs = parseToDomainMapping(path);
-
- PublisherConfig authCredentialsNulls = publisherConfigs.get().get("auth-credentials-null").getOrNull();
- assertThat(authCredentialsNulls.userName().isEmpty()).isTrue();
- assertThat(authCredentialsNulls.password().isEmpty()).isTrue();
- assertThat(authCredentialsNulls.isSecured()).isFalse();
-
- PublisherConfig authCredentialsPresent = publisherConfigs.get().get("auth-credentials-present").getOrNull();
- assertThat(authCredentialsPresent.userName().getOrNull()).isEqualTo("sampleUser");
- assertThat(authCredentialsPresent.password().getOrNull()).isEqualTo("samplePassword");
- assertThat(authCredentialsPresent.isSecured()).isTrue();
-
- PublisherConfig authCredentialsKeysMissing = publisherConfigs.get().get("auth-credentials-missing").getOrNull();
- assertThat(authCredentialsKeysMissing.userName().isEmpty()).isTrue();
- assertThat(authCredentialsKeysMissing.password().isEmpty()).isTrue();
- assertThat(authCredentialsKeysMissing.isSecured()).isFalse();
- }
-
-
- @Test
- public void testParseCredentialsForLegacy() {
- Path path = Paths.get("src/test/resources/testParseDMaaPCredentialsLegacy.json");
- Try<Map<String, PublisherConfig>> publisherConfigs = parseToDomainMapping(path);
-
- PublisherConfig authCredentialsNull = publisherConfigs.get().get("auth-credentials-null").getOrNull();
- assertThat(authCredentialsNull.userName().isEmpty()).isTrue();
- assertThat(authCredentialsNull.password().isEmpty()).isTrue();
- assertThat(authCredentialsNull.isSecured()).isFalse();
-
- PublisherConfig authCredentialsPresent = publisherConfigs.get().get("auth-credentials-present").getOrNull();
- assertThat(authCredentialsPresent.userName().getOrNull()).isEqualTo("sampleUser");
- assertThat(authCredentialsPresent.password().getOrNull()).isEqualTo("samplePassword");
- assertThat(authCredentialsPresent.isSecured()).isTrue();
-
- PublisherConfig authCredentialsMissing = publisherConfigs.get().get("auth-credentials-missing").getOrNull();
- assertThat(authCredentialsMissing.userName().isEmpty()).isTrue();
- assertThat(authCredentialsMissing.password().isEmpty()).isTrue();
- assertThat(authCredentialsMissing.isSecured()).isFalse();
- }
-
-
- @Test
- public void testParseGen2() {
- Path path = Paths.get("src/test/resources/testParseDMaaPGen2.json");
- Try<Map<String, PublisherConfig>> publisherConfigs = parseToDomainMapping(path);
-
- PublisherConfig withEventsSegment = publisherConfigs.get().get("event-segments-with-port").getOrNull();
- assertThat(withEventsSegment.destinations()).isEqualTo(List("UEBHOST:3904"));
- assertThat(withEventsSegment.topic()).isEqualTo("DCAE-RESTCONF-COLLECTOR-EVENTS-DEV");
-
- PublisherConfig withOtherSegment = publisherConfigs.get().get("other-segments-without-ports").getOrNull();
- assertThat(withOtherSegment.destinations()).isEqualTo(List("UEBHOST"));
- assertThat(withOtherSegment.topic()).isEqualTo("DCAE-RESTCONF-COLLECTOR-EVENTS-DEV");
- }
-
- @Test
- public void testParseLegacy() {
- Path exemplaryConfig = Paths.get("src/test/resources/testParseDMaaPLegacy.json");
- Try<Map<String, PublisherConfig>> publisherConfigs =
- parseToDomainMapping(exemplaryConfig);
-
- PublisherConfig urlFirstThenHosts = publisherConfigs.get().get("url-precedes-hosts").getOrNull();
- assertThat(urlFirstThenHosts.destinations()).isEqualTo(List("127.0.0.1:3904"));
- assertThat(urlFirstThenHosts.topic()).isEqualTo("DCAE-RESTCONF-COLLECTOR-EVENTS-DEV");
-
- PublisherConfig urlKeyMissing = publisherConfigs.get().get("url-key-missing").getOrNull();
- assertThat(urlKeyMissing.destinations()).isEqualTo(List("h1.att.com", "h2.att.com"));
- assertThat(urlKeyMissing.topic()).isEqualTo("DCAE-RESTCONF-COLLECTOR-EVENTS-DEV");
-
- PublisherConfig urlIsMissing = publisherConfigs.get().get("url-is-null").getOrNull();
- assertThat(urlIsMissing.destinations()).isEqualTo(List("h1.att.com", "h2.att.com"));
- assertThat(urlIsMissing.topic()).isEqualTo("DCAE-RESTCONF-COLLECTOR-EVENTS-DEV");
- }
-}
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/RestConfProcTest.java b/src/test/java/org/onap/dcae/collectors/restconf/restconftest/RestConfProcTest.java
deleted file mode 100755
index 3c55618..0000000
--- a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/RestConfProcTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.restconftest;
-
-import com.att.nsa.cmdLine.NsaCommandLineUtil;
-import com.att.nsa.drumlin.service.framework.DrumlinServlet;
-import com.att.nsa.drumlin.till.nv.impl.nvPropertiesFile;
-import com.att.nsa.drumlin.till.nv.impl.nvReadableStack;
-import com.att.nsa.drumlin.till.nv.impl.nvReadableTable;
-import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
-import org.glassfish.jersey.media.sse.SseFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.junit.Test;
-import org.onap.dcae.collectors.restconf.common.Constants;
-import org.onap.dcae.collectors.restconf.common.RestConfCollector;
-import org.onap.dcae.collectors.restconf.common.RestConfContext;
-import org.onap.dcae.collectors.restconf.common.RestConfProc;
-
-import java.net.URI;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-public class RestConfProcTest {
-
- private static final URI CONTEXT = URI.create("http://localhost:8080/");
-
- @Test
- public void testEstablishPersistentConnection() throws Exception {
-
- final Map<String, String> argMap = new HashMap<>();
- final String config = NsaCommandLineUtil.getSetting(argMap, Constants.KCONFIG, "collector.properties");
- final URL settingStream = DrumlinServlet.findStream(config, RestConfCollector.class);
-
- final nvReadableStack settings = new nvReadableStack();
-
- settings.push(new nvPropertiesFile(settingStream));
- settings.push(new nvReadableTable(argMap));
-
- RestConfProc restConfProc = new RestConfProc(settings);
-
- final ResourceConfig resourceConfig = new ResourceConfig(SseResource.class, SseFeature.class);
- GrizzlyHttpServerFactory.createHttpServer(CONTEXT, resourceConfig);
- RestConfContext ctx = new RestConfContext();
- ctx.setAttribute("prop.encoding-json", "encoding-json");
- ctx.setAttribute("restapi-result.response-code", "200");
- ctx.setAttribute("restapi-result.ietf-subscribed-notifications:output.identifier", "100");
-
- Map<String, String> p = new HashMap<>();
- p.put("sseConnectURL", "http://localhost:8080/ssevents");
- p.put("subscriberId", "networkId");
- p.put("responsePrefix", "restapi-result");
- p.put("restapiUrl", "https://localhost:8080/restconf/operations/" +
- "ietf-subscribed-notifications:establish-subscription");
- p.put("restapiUser", "access");
- p.put("restapiPassword", "abc@123");
-
- restConfProc.establishPersistentConnection(p, ctx);
- Thread.sleep(1000);
- }
-}
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/SseResource.java b/src/test/java/org/onap/dcae/collectors/restconf/restconftest/SseResource.java
deleted file mode 100755
index 558cba8..0000000
--- a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/SseResource.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.restconftest;
-
-import org.glassfish.jersey.media.sse.EventOutput;
-import org.glassfish.jersey.media.sse.OutboundEvent;
-import org.glassfish.jersey.media.sse.SseFeature;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import java.io.IOException;
-
-@Path("ssevents")
-public class SseResource {
-
- @GET
- @Produces(SseFeature.SERVER_SENT_EVENTS)
- public EventOutput getServerSentEvents() throws IOException {
- String data = "{"
- + "\"ietf-notification:notification\" : {"
- + " \"eventTime\" : \"2017-10-25T08:22:33.44Z\","
- + " \"ietf-yang-push:push-change-update\": {"
- + "\"subscription-id\":\"89\","
- + "\"datastore-changes\": {"
- + "\"ietf-yang-patch:yang-patch\":{"
- + "\"patch-id\":\"1\","
- + "\"edit\":[{"
- + "\"edit-id\":\"edit1\","
- + "\"operation\":\"merge\","
- + "\"target\":\"/ietf-interfaces:interfaces-state\","
- + "\"value\": {"
- + "\"ietf-interfaces:interfaces-state\":{"
- + "\"interface\": {"
- + "\"name\":\"eth0\","
- + "\"oper-status\":\"down\","
- + "}"
- + "}"
- + "}"
- + "}]"
- + "}"
- + "}"
- + "}"
- + "}"
- + "}";
- final EventOutput result = new EventOutput();
- result.write(new OutboundEvent.Builder().data(String.class, data).build());
- result.close();
- return result;
- }
-}
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/TestRestConfCollector.java b/src/test/java/org/onap/dcae/collectors/restconf/restconftest/TestRestConfCollector.java
deleted file mode 100755
index 59e6e72..0000000
--- a/src/test/java/org/onap/dcae/collectors/restconf/restconftest/TestRestConfCollector.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
- * ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcae.collectors.restconf.restconftest;
-
-import com.att.nsa.cmdLine.NsaCommandLineUtil;
-import com.att.nsa.drumlin.till.nv.impl.nvReadableStack;
-import com.att.nsa.drumlin.till.nv.impl.nvReadableTable;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.junit.Test;
-import org.onap.dcae.collectors.restconf.common.Constants;
-import org.onap.dcae.collectors.restconf.common.RestConfProc;
-
-import java.io.FileReader;
-import java.util.Map;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import static org.junit.Assert.assertEquals;
-
-public class TestRestConfCollector {
- @Test
- public void testParseCLIArguments() {
- // given
- String args[] = {"-a", "aa"};
- Map<String, String> argMap = NsaCommandLineUtil.processCmdLine(args, true);
- // when
- nvReadableStack settings = new nvReadableStack();
- settings.push(new nvReadableTable(argMap));
-
- // then
- assertEquals(settings.getString("a", "default"), "aa");
- }
-
- @Test
- public void shouldPutValidRestConfEventOnProcessingQueueWithoutExceptions() throws Exception {
- // given
- RestConfProc.fProcessingInputQueue = new LinkedBlockingQueue<>(
- Constants.KDEFAULT_MAXQUEUEDEVENTS);
- JsonElement restConfEvent = new JsonParser().parse(new FileReader("src/test/resources/RestConfEvent.json"));
- JSONObject validRestConfEvent = new JSONObject(restConfEvent.toString());
- JSONArray jsonArrayMod = new JSONArray().put(validRestConfEvent);
-
- // then
- RestConfProc.handleEvents(jsonArrayMod);
- }
-}
diff --git a/src/test/java/org/onap/dcae/common/ApiExceptionTest.java b/src/test/java/org/onap/dcae/common/ApiExceptionTest.java
new file mode 100644
index 0000000..58cf9e4
--- /dev/null
+++ b/src/test/java/org/onap/dcae/common/ApiExceptionTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.common;
+
+import static org.junit.Assert.assertEquals;
+
+import org.json.JSONObject;
+import org.junit.Test;
+import org.onap.dcae.restapi.ApiException;
+import org.onap.dcae.restapi.ApiException.ExceptionType;
+
+public class ApiExceptionTest {
+
+
+ @Test
+ public void shouldStringifyPolicyExceptionTypeAccordingToSpecification() {
+ assertEquals(ExceptionType.POLICY_EXCEPTION.toString(), "PolicyException");
+ }
+
+ @Test
+ public void shouldConvertExceptionToBackwardCompatibleFormat() {
+ JSONObject responseBody = ApiException.UNAUTHORIZED_USER.toJSON();
+ assertEquals(responseBody.toString(), new JSONObject(""
+ + "{ "
+ + " 'requestError': { "
+ + " 'PolicyException': { "
+ + " 'messageId': 'POL2000', "
+ + " 'text': 'Unauthorized user' "
+ + " } "
+ + " } "
+ + "} "
+ .replace("'", "\"")
+ ).toString());
+ }
+}
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/AuthTypeTest.java b/src/test/java/org/onap/dcae/common/AuthTypeTest.java
index 8eaee6f..a8a8729 100644
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/AuthTypeTest.java
+++ b/src/test/java/org/onap/dcae/common/AuthTypeTest.java
@@ -1,8 +1,8 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2019 IBM. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,10 +17,10 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import org.junit.Test;
+import org.onap.dcae.common.AuthType;
import static org.junit.Assert.*;
diff --git a/src/test/java/org/onap/dcae/common/DataChangeEventListnerTest.java b/src/test/java/org/onap/dcae/common/DataChangeEventListnerTest.java
new file mode 100644
index 0000000..95c8012
--- /dev/null
+++ b/src/test/java/org/onap/dcae/common/DataChangeEventListnerTest.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.common;
+
+
+import org.glassfish.jersey.media.sse.EventInput;
+import org.glassfish.jersey.media.sse.InboundEvent;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import static org.mockito.Mockito.*;
+
+import org.onap.dcae.RestConfCollector;
+import org.onap.dcae.common.publishing.DMaaPConfigurationParser;
+import org.onap.dcae.common.publishing.EventPublisher;
+
+
+import org.slf4j.LoggerFactory;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.concurrent.LinkedBlockingQueue;
+
+@RunWith(MockitoJUnitRunner.class)
+public class DataChangeEventListnerTest {
+ @Mock
+ InboundEvent event;
+
+ @Test
+ public void testDataChangeEventListenerString() {
+ when(event.readData()).thenReturn("");
+ DataChangeEventListener listner = new DataChangeEventListener(null);
+ listner.onEvent(event);
+ }
+
+ @Test
+ public void testDataChangeEventListenerJsonObject() {
+ when(event.readData()).thenReturn("{\"name\":\"john\",\"age\":22,\"class\":\"mca\"}");
+ RestConfCollector.fProcessingInputQueue = new LinkedBlockingQueue<>(4);
+ DataChangeEventListener listner = new DataChangeEventListener(null);
+ listner.onEvent(event);
+ }
+ @Test
+ public void testDataChangeEventListenerJsonArray() {
+ when(event.readData()).thenReturn("[{ \"name\":\"Ford\", \"models\":[ \"Fiesta\",\"Focus\", \"Mustang\" ] },{\"name\":\"BMW\", \"models\":[ \"320\", \"X3\",\"X5\" ] },{\"name\":\"Fiat\",\"models\":[ \"500\", \"Panda\" ]}]");
+ RestConfCollector.fProcessingInputQueue = new LinkedBlockingQueue<>(4);
+ DataChangeEventListener listner = new DataChangeEventListener(null);
+ listner.onEvent(event);
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/common/EventConnectionStateTest.java b/src/test/java/org/onap/dcae/common/EventConnectionStateTest.java
new file mode 100644
index 0000000..c6327bc
--- /dev/null
+++ b/src/test/java/org/onap/dcae/common/EventConnectionStateTest.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.common;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class EventConnectionStateTest {
+
+ @Test
+ public void fromString() {
+ assertEquals(EventConnectionState.INIT, EventConnectionState.fromString("init"));
+ assertEquals(EventConnectionState.SUBSCRIBED, EventConnectionState.fromString("subscribed"));
+ assertEquals(EventConnectionState.UNSUBSCRIBED, EventConnectionState.fromString("unsubscribed"));
+ assertEquals(EventConnectionState.Unspecified, EventConnectionState.fromString("unspecified"));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void fromStringWithException() {
+ EventConnectionState.fromString("test");
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/common/EventProcessorTest.java b/src/test/java/org/onap/dcae/common/EventProcessorTest.java
new file mode 100644
index 0000000..f32cc2e
--- /dev/null
+++ b/src/test/java/org/onap/dcae/common/EventProcessorTest.java
@@ -0,0 +1,104 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.common;
+
+
+
+import org.json.JSONObject;
+import org.junit.Before;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.dcae.ApplicationSettings;
+import org.onap.dcae.RestConfCollector;
+import org.onap.dcae.common.publishing.DMaaPConfigurationParser;
+import org.onap.dcae.common.publishing.EventPublisher;
+import org.onap.dcae.common.publishing.PublisherConfig;
+import org.onap.dcae.controller.AccessController;
+import org.onap.dcae.controller.PersistentEventConnection;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.mock.mockito.MockBean;
+
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.concurrent.LinkedBlockingQueue;
+
+
+
+import static io.vavr.API.Map;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.when;
+import static org.onap.dcae.common.publishing.DMaaPConfigurationParser.parseToDomainMapping;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class EventProcessorTest {
+
+
+
+ @Mock
+ private ApplicationSettings properties;
+
+ private EventPublisher eventPublisher;
+
+ Path path = Paths.get("src/test/resources/testParseDMaaPCredentialsLegacy.json");
+ java.util.Map<String, String[]> streamMap;
+ protected static final Path RESOURCES = Paths.get("src", "test", "resources");
+ protected static final Path KEYSTORE = Paths.get(RESOURCES.toString(), "keystore");
+ protected static final Path KEYSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "passwordfile");
+ protected static final Path TRUSTSTORE = Paths.get(RESOURCES.toString(), "truststore");
+ protected static final Path TRUSTSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "trustpasswordfile");
+ protected static final Path RCC_KEYSTORE_PASSWORD_FILE = Paths.get(RESOURCES.toString(), "rcc_passwordfile");
+ protected static final Path RCC_KEYSTORE = Paths.get(RESOURCES.toString(), "sdnc.p12");
+
+ @Before
+ public void setUp() {
+ eventPublisher = EventPublisher.createPublisher(LoggerFactory.getLogger("some_log"), DMaaPConfigurationParser.
+ parseToDomainMapping(path).get());
+ streamMap = RestConfCollector.parseStreamIdToStreamHashMapping("notification=device-registration");
+
+ }
+
+ @Test
+ public void testEventProcessorRunException() {
+ when(properties.truststoreFileLocation()).thenReturn(TRUSTSTORE.toString());
+ when(properties.truststorePasswordFileLocation()).thenReturn(TRUSTSTORE_PASSWORD_FILE.toString());
+ when(properties.keystoreFileLocation()).thenReturn(KEYSTORE.toString());
+ when(properties.keystorePasswordFileLocation()).thenReturn(KEYSTORE_PASSWORD_FILE.toString());
+ when(properties.rcc_keystoreFileLocation()).thenReturn(RCC_KEYSTORE.toString());
+ when(properties.rcc_keystorePasswordFileLocation()).thenReturn(RCC_KEYSTORE_PASSWORD_FILE.toString());
+ JSONObject controller = new JSONObject("{\"controller_name\":\"AccessM&C\",\"controller_restapiUrl\":\"10.118.191.43:26335\",\"controller_restapiUser\":\"access\",\"controller_restapiPassword\":\"Huawei@123\",\"controller_accessTokenUrl\":\"/rest/plat/smapp/v1/oauth/token\",\"controller_accessTokenFile\":\"./etc/access-token.json\",\"controller_accessTokenMethod\":\"put\",\"controller_subsMethod\":\"post\",\"controller_subscriptionUrl\":\"/restconf/v1/operations/huawei-nce-notification-action:establish-subscription\",\"event_details\":[{\"event_name\":\"ONT_registration\",\"event_description\":\"ONTregistartionevent\",\"event_sseventUrlEmbed\":\"true\",\"event_sseventsField\":\"output.url\",\"event_sseventsUrl\":\"null\",\"event_subscriptionTemplate\":\"./etc/ont_registartion_subscription_template.json\",\"event_unSubscriptionTemplate\":\"./etc/ont_registartion_unsubscription_template.json\",\"event_ruleId\":\"777777777\"}]}");
+ AccessController acClr = new AccessController(controller,
+ properties);
+
+ PersistentEventConnection p = new PersistentEventConnection("","",true, "",
+ "","","","1234646346", acClr);
+ RestConfCollector.fProcessingInputQueue = new LinkedBlockingQueue<>(4);
+ RestConfCollector.fProcessingInputQueue.offer(new EventData(p, new JSONObject("{}")));
+ RestConfCollector.fProcessingInputQueue.offer(new EventData(null, null));
+ EventProcessor ev = new EventProcessor(eventPublisher, streamMap);
+ ev.run();
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/FormatTest.java b/src/test/java/org/onap/dcae/common/FormatTest.java
index dd4159b..e54dd9b 100644
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/FormatTest.java
+++ b/src/test/java/org/onap/dcae/common/FormatTest.java
@@ -1,8 +1,8 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2019 IBM. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,10 +17,10 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import org.junit.Test;
+import org.onap.dcae.common.Format;
import static org.junit.Assert.assertEquals;
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/RestConfContextTest.java b/src/test/java/org/onap/dcae/common/RestConfContextTest.java
index 696c254..00b07f8 100644
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/RestConfContextTest.java
+++ b/src/test/java/org/onap/dcae/common/RestConfContextTest.java
@@ -1,8 +1,8 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2019 IBM. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,10 +18,10 @@
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common;
+package org.onap.dcae.common;
import org.junit.Test;
+import org.onap.dcae.common.RestConfContext;
import static org.junit.Assert.*;
diff --git a/src/test/java/org/onap/dcae/common/XmlJsonUtilTest.java b/src/test/java/org/onap/dcae/common/XmlJsonUtilTest.java
new file mode 100644
index 0000000..3cf065e
--- /dev/null
+++ b/src/test/java/org/onap/dcae/common/XmlJsonUtilTest.java
@@ -0,0 +1,81 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.common;
+
+import org.json.XML;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+
+public class XmlJsonUtilTest {
+
+ @Test
+ public void getJsonOrXmlTest() {
+ String var = "result";
+ Map<String, String> mm = new HashMap<>();
+
+
+ mm.put("result.time", "2018 12:04");
+ mm.put("result.status", "200");
+ mm.put("result.output", "xml2json");
+ mm.put("result.[", "start");
+ mm.put("result.]", "end");
+ try {
+ String str = XmlJsonUtil.getXml(mm, var);
+ assertEquals(str.startsWith("<"), true);
+ String str2 = XmlJsonUtil.getJson(mm, var);
+ assertEquals(str2.startsWith("{"), true);
+ }catch (Exception e) {}
+ }
+
+ @Test
+ public void removeEmptystructFromXml() {
+ String var = "<time>2018 12:04</time>\n" +
+ "<output>t2</output>\n" +
+ "<start>bad\n" +
+ "<status>200</status>";
+ Map<String, String> mm = new HashMap<>();
+ try {
+ String str = XmlJsonUtil.removeEmptyStructXml(var);
+
+ }catch (Exception e) {}
+ }
+
+ @Test
+ public void removeEmptystructFromJson() {
+ String var = "{\n" +
+ "\t\"output\": \"xml2json\",\n" +
+ "\t\"time\": \"2018 12:04\",\n" +
+ "\t\"\": \"end\",\n" +
+ "\t\"status\": \"200\"\n" +
+ "}";
+ Map<String, String> mm = new HashMap<>();
+
+ try {
+ String str = XmlJsonUtil.removeEmptyStructJson(var);
+ }catch (Exception e) {}
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/common/XmlParserTest.java b/src/test/java/org/onap/dcae/common/XmlParserTest.java
new file mode 100644
index 0000000..b005c89
--- /dev/null
+++ b/src/test/java/org/onap/dcae/common/XmlParserTest.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.common;
+
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.*;
+
+public class XmlParserTest {
+
+ @Test
+ public void setAttribute() {
+ String convert = "<time>2018 12:04</time>\n" +
+ "<output>t2</output>\n" +
+ "<status>200</status>";
+ Set<String> listNameList = new HashSet<>();
+ listNameList.add("result");
+ Map<String, String> propMap;
+ try {
+ propMap = XmlParser.convertToProperties(convert, listNameList);
+ System.out.println(propMap);
+ }catch (Exception e) {}
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisherTest.java b/src/test/java/org/onap/dcae/common/publishing/DMaaPEventPublisherTest.java
index 3e1095d..2865b75 100755..100644
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisherTest.java
+++ b/src/test/java/org/onap/dcae/common/publishing/DMaaPEventPublisherTest.java
@@ -1,8 +1,9 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,16 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
-
-import com.att.nsa.cambria.client.CambriaBatchingPublisher;
-import org.json.JSONObject;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-
-import java.io.IOException;
+package org.onap.dcae.common.publishing;
import static io.vavr.API.Option;
import static org.mockito.ArgumentMatchers.anyString;
@@ -35,6 +27,13 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import com.att.nsa.cambria.client.CambriaBatchingPublisher;
+import java.io.IOException;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+
public class DMaaPEventPublisherTest {
private static final String STREAM_ID = "sampleStreamId";
@@ -63,6 +62,8 @@ public class DMaaPEventPublisherTest {
verify(cambriaPublisher).send("MyPartitionKey", event.toString());
}
+
+
@Test
public void shouldCloseConnectionWhenExceptionOccurred() throws Exception {
// given
@@ -75,4 +76,4 @@ public class DMaaPEventPublisherTest {
// then
verify(DMaaPPublishersCache).closePublisherFor(STREAM_ID);
}
-}
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCacheTest.java b/src/test/java/org/onap/dcae/common/publishing/DMaaPPublishersCacheTest.java
index 6ebf273..2884e44 100755..100644
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCacheTest.java
+++ b/src/test/java/org/onap/dcae/common/publishing/DMaaPPublishersCacheTest.java
@@ -1,8 +1,9 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2018 Huawei. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,18 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
-
-import com.att.nsa.cambria.client.CambriaBatchingPublisher;
-import io.vavr.collection.Map;
-import io.vavr.control.Option;
-import org.junit.Before;
-import org.junit.Test;
-import org.onap.dcae.collectors.restconf.common.event.publishing.DMaaPPublishersCache.OnPublisherRemovalListener;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
+package org.onap.dcae.common.publishing;
import static io.vavr.API.List;
import static io.vavr.API.Map;
@@ -36,8 +26,20 @@ import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
+import com.att.nsa.cambria.client.CambriaBatchingPublisher;
+import io.vavr.collection.Map;
+import io.vavr.control.Option;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.dcae.common.publishing.DMaaPPublishersCache.CambriaPublishersCacheLoader;
+import org.onap.dcae.common.publishing.DMaaPPublishersCache.OnPublisherRemovalListener;
+
+
public class DMaaPPublishersCacheTest {
private String streamId1;
@@ -66,7 +68,7 @@ public class DMaaPPublishersCacheTest {
public void shouldCloseCambriaPublisherOnCacheInvalidate() throws IOException, InterruptedException {
// given
CambriaBatchingPublisher cambriaPublisherMock1 = mock(CambriaBatchingPublisher.class);
- DMaaPPublishersCache.CambriaPublishersCacheLoader cacheLoaderMock = mock(DMaaPPublishersCache.CambriaPublishersCacheLoader.class);
+ CambriaPublishersCacheLoader cacheLoaderMock = mock(CambriaPublishersCacheLoader.class);
DMaaPPublishersCache dMaaPPublishersCache = new DMaaPPublishersCache(cacheLoaderMock,
new OnPublisherRemovalListener(),
dMaaPConfigs);
@@ -90,4 +92,36 @@ public class DMaaPPublishersCacheTest {
assertTrue("should not exist", dMaaPPublishersCache.getPublisher("non-existing").isEmpty());
}
+
+ @Test
+ public void shouldCloseOnlyChangedPublishers() throws IOException, InterruptedException {
+ // given
+ CambriaBatchingPublisher cambriaPublisherMock1 = mock(CambriaBatchingPublisher.class);
+ CambriaBatchingPublisher cambriaPublisherMock2 = mock(CambriaBatchingPublisher.class);
+ CambriaPublishersCacheLoader cacheLoaderMock = mock(CambriaPublishersCacheLoader.class);
+ String firstDomain = "domain1";
+ String secondDomain = "domain2";
+ Map<String, PublisherConfig> oldConfig = Map(firstDomain,
+ new PublisherConfig(List("destination1"), "topic1"),
+ secondDomain,
+ new PublisherConfig(List("destination2"), "topic2",
+ "user", "pass"));
+ Map<String, PublisherConfig> newConfig = Map(firstDomain, new PublisherConfig(List("destination1"), "topic1"),
+ secondDomain, new PublisherConfig(List("destination2"), "topic2"));
+ DMaaPPublishersCache dMaaPPublishersCache = new DMaaPPublishersCache(cacheLoaderMock,
+ new OnPublisherRemovalListener(),
+ oldConfig);
+ when(cacheLoaderMock.load(firstDomain)).thenReturn(cambriaPublisherMock1);
+ when(cacheLoaderMock.load(secondDomain)).thenReturn(cambriaPublisherMock2);
+
+ dMaaPPublishersCache.getPublisher(firstDomain);
+ dMaaPPublishersCache.getPublisher(secondDomain);
+
+ // when
+ dMaaPPublishersCache.reconfigure(newConfig);
+
+ // then
+ verify(cambriaPublisherMock2).close(20, TimeUnit.SECONDS);
+ verifyZeroInteractions(cambriaPublisherMock1);
+ }
} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/JsonParserTest.java b/src/test/java/org/onap/dcae/common/publishing/JsonParserTest.java
index a5609f9..f00df2c 100644
--- a/src/test/java/org/onap/dcae/collectors/restconf/common/event/publishing/JsonParserTest.java
+++ b/src/test/java/org/onap/dcae/common/publishing/JsonParserTest.java
@@ -1,8 +1,8 @@
/*-
* ============LICENSE_START=======================================================
- * org.onap.dcaegen2.collectors.restconf
+ * org.onap.dcaegen2.restconfcollector
* ================================================================================
- * Copyright (C) 2019 IBM. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,22 +17,22 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
-package org.onap.dcae.collectors.restconf.common.event.publishing;
+package org.onap.dcae.common.publishing;
import java.util.Map;
import org.junit.Test;
-import org.onap.dcae.collectors.restconf.common.JsonParser;
+import org.onap.dcae.common.JsonParser;
import junit.framework.Assert;
+
public class JsonParserTest {
@Test
public void convertToPropertiesTest() throws Exception {
String testJson="{\"prop2\"=\"value\", \"prop1\"=\"value\"}";
- Map<String, String> response=JsonParser.convertToProperties(testJson);
+ Map<String, String> response= JsonParser.convertToProperties(testJson);
Assert.assertEquals("value", response.get("prop2"));
}
}
diff --git a/src/test/java/org/onap/dcae/controller/ConfigCBSSourceTest.java b/src/test/java/org/onap/dcae/controller/ConfigCBSSourceTest.java
new file mode 100644
index 0000000..5c8593e
--- /dev/null
+++ b/src/test/java/org/onap/dcae/controller/ConfigCBSSourceTest.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.onap.dcae.TestingUtilities.assertFailureHasInfo;
+import static org.onap.dcae.controller.ConfigSource.getAppConfig;
+
+import io.vavr.control.Try;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.onap.dcae.WiremockBasedTest;
+
+
+public class ConfigCBSSourceTest extends WiremockBasedTest {
+
+ @Test
+ public void shouldReturnValidAppConfiguration() {
+ // given
+ String sampleConfigForVES = "{\"collector.rcc.service.port\": 8686}";
+
+ stubConsulToReturnLocalAddressOfCBS();
+ stubCBSToReturnAppConfig(sampleConfigForVES);
+
+ // when
+ Try<JSONObject> actual = tryToGetConfig();
+
+ // then
+ assertThat(actual.get().toString()).isEqualTo(new JSONObject(sampleConfigForVES).toString());
+ }
+
+ @Test
+ public void shouldReturnFailureOnFailureToCommunicateWithConsul() {
+ // given
+ stubFor(get(urlEqualTo("/v1/catalog/service/CBSName"))
+ .willReturn(aResponse().withStatus(400)));
+
+ // when
+ Try<JSONObject> actual = tryToGetConfig();
+
+ // then
+ assertFailureHasInfo(actual, "HTTP", "Consul", "400",
+ "http://localhost:" + wireMockRule.port() + "/v1/catalog/service/CBSName");
+ }
+
+ @Test
+ public void shouldReturnFailureOnBadJsonFromConsul() {
+ // given
+ stubFor(get(urlEqualTo("/v1/catalog/service/CBSName"))
+ .willReturn(aResponse().withStatus(200).withBody("[{")));
+
+ // when
+ Try<JSONObject> actual = tryToGetConfig();
+
+ // then
+ assertFailureHasInfo(actual, "JSON", "array", "[{");
+ }
+
+ @Test
+ public void shouldReturnFailureOnInvalidCatalogFormat() {
+ // given
+ String notAListCatalog = ""
+ + "{"
+ + "\"ServiceAddress\":\"localhost\","
+ + "\"ServicePort\":" + wireMockRule.port()
+ + "}";
+
+ stubFor(get(urlEqualTo("/v1/catalog/service/CBSName"))
+ .willReturn(aResponse().withStatus(200).withBody(notAListCatalog)));
+
+ // when
+ Try<JSONObject> actual = tryToGetConfig();
+
+ // then
+ assertFailureHasInfo(actual, "JSON", "array", notAListCatalog);
+ }
+
+
+ @Test
+ public void shouldReturnFailureIfConfigIsMissingRequiredProperties() {
+ // given
+ String actualConf = "{\"ServicePort\":" + wireMockRule.port() + "}";
+ String asCatalog = "[" + actualConf + "]";
+
+ stubFor(get(urlEqualTo("/v1/catalog/service/CBSName"))
+ .willReturn(aResponse().withStatus(200).withBody(asCatalog)));
+
+ // when
+ Try<JSONObject> actual = tryToGetConfig();
+
+ // then
+ assertFailureHasInfo(actual, "ServiceAddress", "ServicePort", "missing", actualConf);
+ }
+
+
+ @Test
+ public void shouldReturnFailureOnFailureToCommunicateWithCBS() {
+ // given
+ stubFor(get(urlEqualTo("/v1/catalog/service/CBSName"))
+ .willReturn(aResponse().withStatus(200).withBody(validLocalCBSConf())));
+ stubFor(get(urlEqualTo("/service_component/restconfcollector"))
+ .willReturn(aResponse().withStatus(400)));
+
+ // when
+ Try<JSONObject> actual = tryToGetConfig();
+
+ // then
+ assertFailureHasInfo(actual, "HTTP", "CBS", "400",
+ "http://localhost:" + wireMockRule.port() + "/service_component/restconfcollector");
+ }
+
+ @Test
+ public void shouldReturnFailureIfAppIsInvalidJsonDocument() {
+ // given
+ String invalidAppConf = "[$";
+ stubConsulToReturnLocalAddressOfCBS();
+ stubCBSToReturnAppConfig(invalidAppConf);
+
+ // when
+ Try<JSONObject> actual = tryToGetConfig();
+
+ // then
+ assertFailureHasInfo(actual, "JSON", "document", invalidAppConf);
+ }
+
+ private Try<JSONObject> tryToGetConfig() {
+ return getAppConfig(new EnvProps("http", "localhost", wireMockRule.port(), "http", "CBSName", "restconfcollector"));
+ }
+}
+
diff --git a/src/test/java/org/onap/dcae/controller/ConfigFilesFacadeTest.java b/src/test/java/org/onap/dcae/controller/ConfigFilesFacadeTest.java
new file mode 100644
index 0000000..4130ceb
--- /dev/null
+++ b/src/test/java/org/onap/dcae/controller/ConfigFilesFacadeTest.java
@@ -0,0 +1,140 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import static io.vavr.API.Map;
+import static io.vavr.API.Some;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.onap.dcae.TestingUtilities.assertFailureHasInfo;
+import static org.onap.dcae.TestingUtilities.assertJSONObjectsEqual;
+import static org.onap.dcae.TestingUtilities.createTemporaryFile;
+import static org.onap.dcae.TestingUtilities.readFile;
+import static org.onap.dcae.TestingUtilities.readJSONFromFile;
+
+import io.vavr.collection.Map;
+import io.vavr.control.Try;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.json.JSONObject;
+import org.junit.Test;
+
+public class ConfigFilesFacadeTest {
+
+ private static final Path NON_EXISTENT = Paths.get("/non-existent");
+ private static final ConfigFilesFacade TO_NON_EXISTENT_POINTING_FACADE = new ConfigFilesFacade(NON_EXISTENT,
+ NON_EXISTENT);
+
+ @Test
+ public void shouldReadPropertyFile() {
+ // given
+ Path temporaryFile = createTemporaryFile("some.property=10");
+
+ // when
+ ConfigFilesFacade configFilesFacade = new ConfigFilesFacade(temporaryFile, temporaryFile);
+
+ Try<Map<String, String>> propertiesConfigurations = configFilesFacade.readCollectorProperties();
+
+ // then
+ assertThat(propertiesConfigurations.isSuccess()).isTrue();
+ assertThat(propertiesConfigurations.get().containsKey("some.property")).isTrue();
+ assertThat(propertiesConfigurations.get().get("some.property")).isEqualTo(Some("10"));
+ }
+
+
+ @Test
+ public void shouldReadDMaaPFile() {
+ // given
+ Path temporaryFile = createTemporaryFile("{}");
+
+ // when
+ ConfigFilesFacade configFilesFacade = new ConfigFilesFacade(temporaryFile, temporaryFile);
+
+ Try<JSONObject> dMaaPConfiguration = configFilesFacade.readDMaaPConfiguration();
+
+ // then
+ assertThat(dMaaPConfiguration.isSuccess()).isTrue();
+ assertThat(dMaaPConfiguration.get().toString()).isEqualTo("{}");
+ }
+
+ @Test
+ public void shouldWriteDMaaPConf() {
+ // given
+ Path temporaryFile = createTemporaryFile("{}");
+ JSONObject desiredConf = new JSONObject("{\"key\": 1}");
+
+ // when
+ ConfigFilesFacade configFilesFacade = new ConfigFilesFacade(temporaryFile, temporaryFile);
+
+ Try<Void> propertiesConfigurations = configFilesFacade.writeDMaaPConfiguration(desiredConf);
+
+ // then
+ assertThat(propertiesConfigurations.isSuccess()).isTrue();
+ assertJSONObjectsEqual(readJSONFromFile(temporaryFile), desiredConf);
+ }
+
+
+ @Test
+ public void shouldWriteProperties() {
+ // given
+ Path temporaryFile = createTemporaryFile("{}");
+
+ // when
+ ConfigFilesFacade configFilesFacade = new ConfigFilesFacade(temporaryFile, temporaryFile);
+ Try<Void> propertiesConfigurations = configFilesFacade.writeProperties(Map("prop1", "hi"));
+
+ // then
+ assertThat(propertiesConfigurations.isSuccess()).isTrue();
+ assertThat(readFile(temporaryFile).trim()).isEqualTo("prop1 = hi");
+ }
+
+ @Test
+ public void shouldContainPropertiesPathInCaseOfFailures() {
+ Try<Map<String, String>> result = TO_NON_EXISTENT_POINTING_FACADE.readCollectorProperties();
+ assertThat(result.isFailure()).isTrue();
+ assertFailureHasInfo(result, NON_EXISTENT.toString());
+ }
+
+ @Test
+ public void shouldContainDMaaPPathPathInCaseOfFailures() {
+ Try<JSONObject> result = TO_NON_EXISTENT_POINTING_FACADE.readDMaaPConfiguration();
+ assertThat(result.isFailure()).isTrue();
+ assertFailureHasInfo(result, NON_EXISTENT.toString());
+ }
+
+ @Test
+ public void shouldContainPropertiesPathPathInCaseOfFailuresOnWrite() {
+ // given
+ Try<Void> result = TO_NON_EXISTENT_POINTING_FACADE.writeProperties(Map("any", "any"));
+ assertThat(result.isFailure()).isTrue();
+ assertFailureHasInfo(result, NON_EXISTENT.toString());
+ }
+
+ @Test
+ public void shouldContainDMaaPPathPathInCaseOfFailuresOnWrite() {
+ // given
+ Try<Void> result = TO_NON_EXISTENT_POINTING_FACADE.writeDMaaPConfiguration(new JSONObject());
+ assertThat(result.isFailure()).isTrue();
+ assertFailureHasInfo(result, NON_EXISTENT.toString());
+ }
+
+}
+
diff --git a/src/test/java/org/onap/dcae/controller/ConfigLoaderIntegrationE2ETest.java b/src/test/java/org/onap/dcae/controller/ConfigLoaderIntegrationE2ETest.java
new file mode 100644
index 0000000..730a98d
--- /dev/null
+++ b/src/test/java/org/onap/dcae/controller/ConfigLoaderIntegrationE2ETest.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import static io.vavr.API.Map;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+import static org.onap.dcae.TestingUtilities.createTemporaryFile;
+import static org.onap.dcae.TestingUtilities.readFile;
+import static org.onap.dcae.TestingUtilities.readJSONFromFile;
+import static org.onap.dcae.common.publishing.VavrUtils.f;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.dcae.ApplicationSettings;
+import org.onap.dcae.RestConfCollector;
+import org.onap.dcae.WiremockBasedTest;
+import org.onap.dcae.common.publishing.DMaaPConfigurationParser;
+import org.onap.dcae.common.publishing.EventPublisher;
+
+public class ConfigLoaderIntegrationE2ETest extends WiremockBasedTest {
+
+ @Test
+ public void testSuccessfulE2EFlow() {
+ // given
+// Path dMaaPConfigFile = createTemporaryFile("{}");
+// Path collectorPropertiesFile = createTemporaryFile("");
+// Path dMaaPConfigSource = Paths.get("src/test/resources/testParseDMaaPCredentialsGen2.json");
+// JSONObject dMaaPConf = readJSONFromFile(dMaaPConfigSource);
+// stubConsulToReturnLocalAddressOfCBS();
+// stubCBSToReturnAppConfig(f("{\"collector.port\": 8686, \"streams_publishes\": %s}}", dMaaPConf));
+//
+// EventPublisher eventPublisherMock = mock(EventPublisher.class);
+//
+// Mockito.mock(RestConfCollector.class);
+// ConfigFilesFacade configFilesFacade = new ConfigFilesFacade(dMaaPConfigFile, collectorPropertiesFile);
+// ConfigLoader configLoader = new ConfigLoader(eventPublisherMock::reconfigure, configFilesFacade, ConfigSource::getAppConfig, () -> wiremockBasedEnvProps());
+// configLoader.updateConfig();
+//
+// // then
+// assertThat(readJSONFromFile(dMaaPConfigSource).toString()).isEqualTo(dMaaPConf.toString());
+// assertThat(readFile(collectorPropertiesFile).trim()).isEqualTo("collector.port = 8686");
+// verify(eventPublisherMock, times(1)).reconfigure(
+// DMaaPConfigurationParser.parseToDomainMapping(dMaaPConf).get()
+// );
+ }
+
+ @Test
+ public void shouldNotReconfigureNotOverwriteIfConfigurationHasNotChanged() {
+ // given
+ Path dMaaPConfigFile = createTemporaryFile("{}");
+ Path collectorPropertiesFile = createTemporaryFile("");
+ JSONObject dMaaPConf = readJSONFromFile(Paths.get("src/test/resources/testParseDMaaPCredentialsGen2.json"));
+ stubConsulToReturnLocalAddressOfCBS();
+ stubCBSToReturnAppConfig(f("{\"collector.port\": 8686, \"streams_publishes\": %s}}", dMaaPConf));
+ EventPublisher eventPublisherMock = mock(EventPublisher.class);
+ ConfigFilesFacade configFilesFacade = new ConfigFilesFacade(dMaaPConfigFile, collectorPropertiesFile);
+ configFilesFacade.writeProperties(Map("collector.port", "8686"));
+ configFilesFacade.writeDMaaPConfiguration(dMaaPConf);
+
+ // when
+ ConfigLoader configLoader = new ConfigLoader(eventPublisherMock::reconfigure, configFilesFacade, ConfigSource::getAppConfig, () -> wiremockBasedEnvProps());
+ configLoader.updateConfig();
+
+ // then
+ verifyZeroInteractions(eventPublisherMock);
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/controller/ConfigParsingTest.java b/src/test/java/org/onap/dcae/controller/ConfigParsingTest.java
new file mode 100644
index 0000000..7792b71
--- /dev/null
+++ b/src/test/java/org/onap/dcae/controller/ConfigParsingTest.java
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.controller;
+
+
+import static io.vavr.API.Map;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.onap.dcae.TestingUtilities.assertJSONObjectsEqual;
+import static org.onap.dcae.TestingUtilities.readJSONFromFile;
+
+import io.vavr.collection.Map;
+import io.vavr.control.Option;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class ConfigParsingTest {
+
+ @Test
+ public void shouldReturnDMaaPConfig() {
+ JSONObject dMaaPConf = new JSONObject("{\"auth-credentials-present\": {\"aaf_username\": \"sampleUser\",\"dmaap_info\": {\"topic_url\": \"http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV\",},\"aaf_password\": \"samplePassword\"}}");
+ JSONObject root = new JSONObject();
+ root.put("key1", "someProperty");
+ root.put("key2", "someProperty");
+ root.put("streams_publishes", dMaaPConf);
+
+ Option<JSONObject> dMaaPConfig = ConfigParsing.getDMaaPConfig(root);
+
+ assertThat(dMaaPConfig.isEmpty()).isFalse();
+ assertJSONObjectsEqual(dMaaPConfig.get(), dMaaPConf);
+ }
+
+ @Test
+ public void shouldReturnEmptyIfDMaaPConfigIsInvalid() {
+ JSONObject root = new JSONObject();
+ root.put("streams_publishes", 1);
+
+ Option<JSONObject> dMaaPConfig = ConfigParsing.getDMaaPConfig(root);
+
+ assertThat(dMaaPConfig.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void getProperties() {
+ JSONObject dMaaPConf = new JSONObject("{\"auth-credentials-present\": {\"aaf_username\": \"sampleUser\",\"dmaap_info\": {\"topic_url\": \"http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV\",},\"aaf_password\": \"samplePassword\"}}");
+ JSONObject root = new JSONObject();
+ root.put("key1", "someProperty");
+ root.put("key2", "someProperty");
+ root.put("streams_publishes", dMaaPConf);
+
+ Map<String, String> properties = ConfigParsing.getProperties(root);
+ assertThat(properties).isEqualTo(Map("key1", "someProperty", "key2", "someProperty"));
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/controller/EnvPropertiesReaderTest.java b/src/test/java/org/onap/dcae/controller/EnvPropertiesReaderTest.java
new file mode 100644
index 0000000..2e215a7
--- /dev/null
+++ b/src/test/java/org/onap/dcae/controller/EnvPropertiesReaderTest.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.controller;
+
+import static io.vavr.API.Map;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.onap.dcae.controller.EnvPropertiesReader.readEnvProps;
+
+import io.vavr.collection.Map;
+import org.junit.Test;
+
+
+public class EnvPropertiesReaderTest {
+
+ @Test
+ public void shouldReturnEmptyOnMissingConsulHost() {
+ Map<String, String> envs = Map(
+ "CONFIG_BINDING_SERVICE", "doesNotMatter",
+ "HOSTNAME", "doesNotMatter");
+ assertTrue(readEnvProps(envs).isEmpty());
+ }
+
+ @Test
+ public void shouldReturnEmptyOnMissingCBSName() {
+ Map<String, String> envs = Map(
+ "CONSUL_HOST", "doesNotMatter",
+ "HOSTNAME", "doesNotMatter");
+ assertTrue(readEnvProps(envs).isEmpty());
+ }
+
+ @Test
+ public void shouldReturnEmptyOnMissingVESAppName() {
+ Map<String, String> envs = Map(
+ "CONSUL_HOST", "doesNotMatter",
+ "CONFIG_BINDING_SERVICE", "doesNotMatter");
+ assertTrue(readEnvProps(envs).isEmpty());
+ }
+
+ @Test
+ public void shouldReturnSomeOfAllProperties() {
+ Map<String, String> envs = Map(
+ "CONSUL_HOST", "doesNotMatter",
+ "HOSTNAME", "doesNotMatter",
+ "CONFIG_BINDING_SERVICE", "doesNotMatter");
+ assertFalse(readEnvProps(envs).isEmpty());
+ }
+
+}
+
diff --git a/src/test/java/org/onap/dcae/controller/EnvPropsTest.java b/src/test/java/org/onap/dcae/controller/EnvPropsTest.java
new file mode 100644
index 0000000..e9c194e
--- /dev/null
+++ b/src/test/java/org/onap/dcae/controller/EnvPropsTest.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.controller;
+
+import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import junit.framework.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.onap.dcae.common.Format;
+
+
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static org.junit.Assert.assertEquals;
+
+public class EnvPropsTest {
+ @Rule
+ public WireMockRule wireMockRule = new WireMockRule(
+ wireMockConfig().dynamicPort().dynamicHttpsPort().keystorePath(null));
+ @Test
+ public void fromString() {
+ Assert.assertEquals(new EnvProps("http", "localhost", wireMockRule.port(), "http", "CBSName", "restconfcollector").equals(new EnvProps("http", "localhost", wireMockRule.port(), "http", "CBSName", "restconfcollector")), true);
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/dcae/restapi/ApiAuthInterceptionTest.java b/src/test/java/org/onap/dcae/restapi/ApiAuthInterceptionTest.java
new file mode 100644
index 0000000..1427438
--- /dev/null
+++ b/src/test/java/org/onap/dcae/restapi/ApiAuthInterceptionTest.java
@@ -0,0 +1,177 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.restconfcollector
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Huawei. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.restapi;
+
+import io.vavr.collection.HashMap;
+import io.vavr.collection.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.dcae.ApplicationSettings;
+import org.slf4j.Logger;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class ApiAuthInterceptionTest {
+ private static final String USERNAME = "Foo";
+ private static final String PASSWORD = "Bar";
+ private static final Map<String, String> CREDENTIALS = HashMap.of(USERNAME, PASSWORD);
+
+ @Mock
+ private Logger log;
+
+ @Mock
+ private ApplicationSettings settings;
+
+ @Mock
+ private HttpServletResponse response;
+
+ @Mock
+ private Object obj;
+
+ @Mock
+ private PrintWriter writer;
+
+ @InjectMocks
+ private ApiAuthInterceptor sut;
+
+
+ private HttpServletRequest createEmptyRequest() {
+ return MockMvcRequestBuilders
+ .post("")
+ .buildRequest(null);
+ }
+
+ private HttpServletRequest createRequestWithAuthorizationHeader() {
+ return SecurityMockMvcRequestPostProcessors
+ .httpBasic(USERNAME, PASSWORD)
+ .postProcessRequest(
+ MockMvcRequestBuilders
+ .post("")
+ .buildRequest(null));
+ }
+
+ @Test
+ public void shouldSucceedWhenAuthorizationIsDisabled() throws IOException {
+ // given
+ final HttpServletRequest request = createEmptyRequest();
+
+ when(settings.authorizationEnabled()).thenReturn(false);
+
+ // when
+ final boolean isAuthorized = sut.preHandle(request, response, obj);
+
+ // then
+ assertTrue(isAuthorized);
+ }
+
+ @Test
+ public void shouldFailDueToEmptyBasicAuthorizationHeader() throws IOException {
+ // given
+ final HttpServletRequest request = createEmptyRequest();
+
+ when(settings.authorizationEnabled()).thenReturn(true);
+ when(response.getWriter()).thenReturn(writer);
+
+ // when
+ final boolean isAuthorized = sut.preHandle(request, response, obj);
+
+
+ // then
+ assertFalse(isAuthorized);
+
+ verify(response).setStatus(HttpStatus.BAD_REQUEST.value());
+ verify(writer).write(ApiException.UNAUTHORIZED_USER.toJSON().toString());
+ }
+
+ @Test
+ public void shouldFailDueToBasicAuthenticationUserMissingFromSettings() throws IOException {
+ // given
+ final HttpServletRequest request = createRequestWithAuthorizationHeader();
+
+ when(settings.authorizationEnabled()).thenReturn(true);
+ when(response.getWriter()).thenReturn(writer);
+
+ // when
+ final boolean isAuthorized = sut.preHandle(request, response, obj);
+
+ // then
+ assertFalse(isAuthorized);
+
+ verify(response).setStatus(HttpStatus.BAD_REQUEST.value());
+ verify(writer).write(ApiException.UNAUTHORIZED_USER.toJSON().toString());
+ }
+
+ @Test
+ public void shouldSucceed() throws IOException {
+ // given
+ final HttpServletRequest request = createRequestWithAuthorizationHeader();
+ when(settings.authorizationEnabled()).thenReturn(true);
+ when(settings.validAuthorizationCredentials()).thenReturn(
+ HashMap.of(USERNAME, "$2a$10$BsZkEynNm/93wbAeeZuxJeu6IHRyQl4XReqDg2BtYOFDhUsz20.3G"));
+ when(response.getWriter()).thenReturn(writer);
+
+ // when
+ final boolean isAuthorized = sut.preHandle(request, response, obj);
+
+ // then
+ assertTrue(isAuthorized);
+ }
+
+ @Test
+ public void shouldFailDueToInvalidBasicAuthorizationHeaderValue() throws IOException {
+ // given
+ final HttpServletRequest request =
+ MockMvcRequestBuilders
+ .post("")
+ .header(HttpHeaders.AUTHORIZATION, "FooBar")
+ .buildRequest(null);
+
+ when(settings.authorizationEnabled()).thenReturn(true);
+ when(settings.validAuthorizationCredentials()).thenReturn(CREDENTIALS);
+ when(response.getWriter()).thenReturn(writer);
+
+ // when
+ final boolean isAuthorized = sut.preHandle(request, response, obj);
+
+ // then
+ assertFalse(isAuthorized);
+
+ verify(response).setStatus(HttpStatus.BAD_REQUEST.value());
+ verify(writer).write(ApiException.UNAUTHORIZED_USER.toJSON().toString());
+ }
+}
diff --git a/src/test/resources/RestConfEvent.json b/src/test/resources/RestConfEvent.json
deleted file mode 100755
index 93d0b64..0000000
--- a/src/test/resources/RestConfEvent.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "ietf-notification:notification" : {
- "eventTime" : "eventtime",
- "ietf-yang-push:push-change-update": {
- "subscription-id":"100",
- "datastore-changes": {
- "ietf-yang-patch:yang-patch":{
- "patch-id":"patch-id",
- "edit":[{
- "edit-id":"edit-id",
- "operation":"create",
- "target":"target",
- "value": {
- "ietf-interfaces:interfaces-state":{
- "interface": {
- "name":"eth0",
- "oper-status":"up"
- }
- }
- }
- }]
- }
- }
- }
- }
-} \ No newline at end of file
diff --git a/src/test/resources/controller-config_dmaap_ip.json b/src/test/resources/controller-config_dmaap_ip.json
new file mode 100755
index 0000000..060c51e
--- /dev/null
+++ b/src/test/resources/controller-config_dmaap_ip.json
@@ -0,0 +1,238 @@
+{
+ "header.authflag": 1,
+ "collector.inputQueue.maxPending": 8096,
+ "collector.schema.checkflag": 1,
+ "collector.keystore.file.location": "/opt/app/dcae-certificate/keystore.jks",
+ "tomcat.maxthreads": "200",
+ "collector.keystore.passwordfile": "/opt/app/dcae-certificate/.password",
+ "collector.service.secure.port": 8687,
+ "collector.schema.file": "{\"v1\":\"./etc/CommonEventFormat_27.2.json\",\"v2\":\"./etc/CommonEventFormat_27.2.json\",\"v3\":\"./etc/CommonEventFormat_27.2.json\",\"v4\":\"./etc/CommonEventFormat_27.2.json\",\"v5\":\"./etc/CommonEventFormat_28.4.json\"}",
+ "collector.dmaap.streamid": "fault=ves-fault,ves-fault-secondary|syslog=ves-syslog,ves-syslog-secondary|heartbeat=ves-heartbeat,ves-heartbeat-secondary|measurementsForVfScaling=ves-measurement,ves-measurement-secondary|mobileFlow=ves-mobileflow,ves-mobileflow-secondary|other=ves-other,ves-other-secondary|stateChange=ves-statechange,ves-statechange-secondary|thresholdCrossingAlert=ves-thresholdCrossingAlert,ves-thresholdCrossingAlert-secondary|voiceQuality=ves-voicequality,ves-voicequality-secondary|sipSignaling=ves-sipsignaling,ves-sipsignaling-secondary",
+ "streams_subscribes": {},
+ "collector.service.port": -1,
+ "services_calls": {},
+ "streams_publishes": {
+ "ves-other": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-fault": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-syslog": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-other-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-syslog-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-thresholdCrossingAlert-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-voicequality": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-sipsignaling-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-heartbeat": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-mobileflow-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-heartbeat-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-measurement-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-measurement": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-sipsignaling": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-statechange-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-voicequality-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-fault-secondary": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-statechange": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-mobileflow": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ },
+ "ves-thresholdCrossingAlert": {
+ "aaf_username": null,
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "client_id": null,
+ "location": "mtl5",
+ "client_role": null,
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+ }
+ }
+ },
+ "event.transform.flag": 1,
+ "header.authlist": "sample1,$2a$10$pgjaxDzSuc6XVFEeqvxQ5u90DKJnM/u7TJTcinAlFJVaavXMWf/Zi|userid1,$2a$10$61gNubgJJl9lh3nvQvY9X.x4e5ETWJJ7ao7ZhJEvmfJigov26Z6uq|userid2,$2a$10$G52y/3uhuhWAMy.bx9Se8uzWinmbJa.dlm1LW6bYPdPkkywLDPLiy"
+}
diff --git a/src/test/resources/controller-config_singleline_ip.json b/src/test/resources/controller-config_singleline_ip.json
new file mode 100755
index 0000000..752a64f
--- /dev/null
+++ b/src/test/resources/controller-config_singleline_ip.json
@@ -0,0 +1,128 @@
+{
+ "header.authflag": "1",
+ "collector.schema.file": "{\"v1\": \"./etc/CommonEventFormat_27.2.json\", \"v2\": \"./etc/CommonEventFormat_27.2.json\", \"v3\": \"./etc/CommonEventFormat_27.2.json\", \"v4\": \"./etc/CommonEventFormat_27.2.json\", \"v5\": \"./etc/CommonEventFormat_28.4.json\"}",
+ "collector.keystore.passwordfile": "/opt/app/dcae-certificate/.password",
+ "tomcat.maxthreads": "200",
+ "collector.dmaap.streamid": "fault=ves-fault|syslog=ves-syslog|heartbeat=ves-heartbeat|measurementsForVfScaling=ves-measurement|mobileFlow=ves-mobileflow|other=ves-other|stateChange=ves-statechange|thresholdCrossingAlert=ves-thresholdCrossingAlert|voiceQuality=ves-voicequality|sipSignaling=ves-sipsignaling",
+ "streams_subscribes": {},
+ "collector.inputQueue.maxPending": "8096",
+ "streams_publishes": {
+ "ves-mobileflow": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590629043",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-SEC-MOBILEFLOW-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-measurement": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590433916",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-ENC-MEASUREMENT-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-voicequality": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590778397",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-VES-VOICEQUALITY-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-thresholdCrossingAlert": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590728150",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-SEC-TCA-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-fault": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590384670",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-SEC-FAULT-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-heartbeat": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590530041",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-SEC-HEARTBEAT-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-sipsignaling": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590828736",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-VES-SIPSIGNALING-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-syslog": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590482019",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-SEC-SYSLOG-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-other": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590581045",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-SEC-OTHER-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ },
+ "ves-statechange": {
+ "type": "message_router",
+ "dmaap_info": {
+ "client_id": "1517590677649",
+ "client_role": "com.att.secCollector.member",
+ "location": "rdm5bdcc2",
+ "topic_url": "https://DMAAPHOST:3905/events/com.att.dcae.dmaap.FTL.24256-SEC-STATECHANGE-OUTPUT-v1"
+ },
+ "aaf_username": "userid@namespace",
+ "aaf_password": "authpwd"
+ }
+ },
+ "collector.schema.checkflag": "1",
+ "services_calls": {},
+ "event.transform.flag": "1",
+ "collector.keystore.file.location": "/opt/app/dcae-certificate/keystore.jks",
+ "collector.header.authlist": "sample1,$2a$10$pgjaxDzSuc6XVFEeqvxQ5u90DKJnM/u7TJTcinAlFJVaavXMWf/Zi|userid1,$2a$10$61gNubgJJl9lh3nvQvY9X.x4e5ETWJJ7ao7ZhJEvmfJigov26Z6uq|userid2,$2a$10$G52y/3uhuhWAMy.bx9Se8uzWinmbJa.dlm1LW6bYPdPkkywLDPLiy",
+ "collector.rcc.service.secure.port": "8687",
+ "collector.rcc.service.port": "-1"
+} \ No newline at end of file
diff --git a/src/test/resources/keystore b/src/test/resources/keystore
new file mode 100755
index 0000000..f0822cb
--- /dev/null
+++ b/src/test/resources/keystore
Binary files differ
diff --git a/src/test/resources/passwordfile b/src/test/resources/passwordfile
new file mode 100755
index 0000000..11e1e24
--- /dev/null
+++ b/src/test/resources/passwordfile
@@ -0,0 +1 @@
+vestest \ No newline at end of file
diff --git a/src/test/resources/rcc_passwordfile b/src/test/resources/rcc_passwordfile
new file mode 100755
index 0000000..25acfbf
--- /dev/null
+++ b/src/test/resources/rcc_passwordfile
@@ -0,0 +1 @@
+collector \ No newline at end of file
diff --git a/src/test/resources/sdnc.p12 b/src/test/resources/sdnc.p12
new file mode 100755
index 0000000..15c8893
--- /dev/null
+++ b/src/test/resources/sdnc.p12
Binary files differ
diff --git a/src/test/resources/testDmaapConfig_ip.json b/src/test/resources/testDmaapConfig_ip.json
new file mode 100755
index 0000000..247db78
--- /dev/null
+++ b/src/test/resources/testDmaapConfig_ip.json
@@ -0,0 +1,12 @@
+{
+
+ "channels": [{
+ "name": "sec_fault_ueb",
+ "type": "out",
+ "class": "HpCambriaOutputStream",
+ "cambria.hosts": "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com",
+ "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV",
+ "stripHpId": "true"
+ }
+ ]
+}
diff --git a/src/test/resources/testFullDmaapConfig_gen2.json b/src/test/resources/testFullDmaapConfig_gen2.json
new file mode 100755
index 0000000..6880466
--- /dev/null
+++ b/src/test/resources/testFullDmaapConfig_gen2.json
@@ -0,0 +1,24 @@
+{
+ "ves-fault-secondary": {
+ "aaf_username": "sampleUsername",
+ "dmaap_info": {
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
+ "location": "mtl5",
+ "client_id": null,
+ "client_role": null
+ },
+ "type": "message_router",
+ "aaf_password": "SamplePasswd"
+ },
+ "ves-thresholdCrossingAlert-secondary": {
+ "aaf_username": "sampleUsername2",
+ "dmaap_info": {
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
+ "location": "mtl5",
+ "client_id": null,
+ "client_role": null
+ },
+ "type": "message_router",
+ "aaf_password": "SamplePassWD2"
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/testParseDMaaPCredentialsGen2.json b/src/test/resources/testParseDMaaPCredentialsGen2.json
index 23230c1..953cb6e 100755
--- a/src/test/resources/testParseDMaaPCredentialsGen2.json
+++ b/src/test/resources/testParseDMaaPCredentialsGen2.json
@@ -2,20 +2,20 @@
"auth-credentials-null": {
"aaf_username": null,
"dmaap_info": {
- "topic_url": "http://UEBHOST:3904/events/DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
},
"aaf_password": null
},
"auth-credentials-present": {
"aaf_username": "sampleUser",
"dmaap_info": {
- "topic_url": "http://UEBHOST:3904/events/DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
},
"aaf_password": "samplePassword"
},
"auth-credentials-missing": {
"dmaap_info": {
- "topic_url": "http://UEBHOST:3904/events/DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
}
}
} \ No newline at end of file
diff --git a/src/test/resources/testParseDMaaPCredentialsGen2Temp.json b/src/test/resources/testParseDMaaPCredentialsGen2Temp.json
new file mode 100755
index 0000000..fef7a8b
--- /dev/null
+++ b/src/test/resources/testParseDMaaPCredentialsGen2Temp.json
@@ -0,0 +1,9 @@
+{
+ "auth-credentials-present": {
+ "aaf_username": "sampleUser",
+ "dmaap_info": {
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
+ },
+ "aaf_password": "samplePassword"
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/testParseDMaaPCredentialsLegacy.json b/src/test/resources/testParseDMaaPCredentialsLegacy.json
index ee215e2..9f19b2c 100755
--- a/src/test/resources/testParseDMaaPCredentialsLegacy.json
+++ b/src/test/resources/testParseDMaaPCredentialsLegacy.json
@@ -4,7 +4,7 @@
"name": "auth-credentials-null",
"cambria.url": "127.0.0.1:3904",
"cambria.hosts": "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com",
- "cambria.topic": "DCAE-RESTCONF-COLLECTOR-EVENTS-DEV",
+ "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV",
"basicAuthPassword": null,
"basicAuthUsername": null
},
@@ -12,7 +12,7 @@
"name": "auth-credentials-present",
"cambria.url": "127.0.0.1:3904",
"cambria.hosts": "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com",
- "cambria.topic": "DCAE-RESTCONF-COLLECTOR-EVENTS-DEV",
+ "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV",
"basicAuthPassword": "samplePassword",
"basicAuthUsername": "sampleUser"
},
@@ -20,7 +20,7 @@
"name": "auth-credentials-missing",
"cambria.url": "127.0.0.1:3904",
"cambria.hosts": "uebsb91kcdc.it.att.com,uebsb92kcdc.it.att.com,uebsb93kcdc.it.att.com",
- "cambria.topic": "DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV"
}
]
} \ No newline at end of file
diff --git a/src/test/resources/testParseDMaaPGen2.json b/src/test/resources/testParseDMaaPGen2.json
index 4ef04a2..5b4fe6a 100755
--- a/src/test/resources/testParseDMaaPGen2.json
+++ b/src/test/resources/testParseDMaaPGen2.json
@@ -1,12 +1,12 @@
{
"event-segments-with-port": {
"dmaap_info": {
- "topic_url": "http://UEBHOST:3904/events/DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "topic_url": "http://UEBHOST:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV",
}
},
"other-segments-without-ports": {
"dmaap_info": {
- "topic_url": "http://UEBHOST:3904/somethingHere/DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "topic_url": "http://UEBHOST:3904/somethingHere/DCAE-SE-COLLECTOR-EVENTS-DEV",
}
}
} \ No newline at end of file
diff --git a/src/test/resources/testParseDMaaPLegacy.json b/src/test/resources/testParseDMaaPLegacy.json
index fda9c60..9661e30 100755
--- a/src/test/resources/testParseDMaaPLegacy.json
+++ b/src/test/resources/testParseDMaaPLegacy.json
@@ -4,18 +4,18 @@
"name": "url-precedes-hosts",
"cambria.url": "127.0.0.1:3904",
"cambria.hosts": "h1.att.com,h2.att.com",
- "cambria.topic": "DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV",
},
{
"name": "url-key-missing",
"cambria.hosts": "h1.att.com,h2.att.com",
- "cambria.topic": "DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV",
},
{
"name": "url-is-null",
"cambria.url": null,
"cambria.hosts": "h1.att.com,h2.att.com",
- "cambria.topic": "DCAE-RESTCONF-COLLECTOR-EVENTS-DEV"
+ "cambria.topic": "DCAE-SE-COLLECTOR-EVENTS-DEV"
}
]
} \ No newline at end of file
diff --git a/src/test/resources/test_anynode_class.json b/src/test/resources/test_anynode_class.json
new file mode 100755
index 0000000..0d34945
--- /dev/null
+++ b/src/test/resources/test_anynode_class.json
@@ -0,0 +1,9 @@
+{
+ "channels": [{
+ "one": "number1", "two": "number2", "three": "number3"}],
+ "sampleStrList": ["1", "2", "3", "4", "5"],
+ "sampleNestedObject": {"a": 1, "b": 2},
+ "sampleInt": 1,
+ "sampleString": "str",
+ "sampleNull": null
+}
diff --git a/src/test/resources/testcollector.properties b/src/test/resources/testcollector.properties
new file mode 100755
index 0000000..677e1c8
--- /dev/null
+++ b/src/test/resources/testcollector.properties
@@ -0,0 +1,10 @@
+collector.rcc.service.port=9999
+collector.rcc.service.secure.port=8687
+collector.rcc.keystore.file.location=../etc/keystore
+collector.rcc.keystore.passwordfile=./etc/passwordfile
+collector.rcc.dmaap.streamid=fault=sec_fault|syslog=sec_syslog|heartbeat=sec_heartbeat|measurementsForVfScaling=sec_measurement|mobileFlow=sec_mobileflow|other=sec_other|stateChange=sec_statechange|thresholdCrossingAlert=sec_thresholdCrossingAlert|voiceQuality=ves_voicequality|sipSignaling=ves_sipsignaling
+collector.dmaapfile=./etc/DmaapConfig.json
+collector.header.authflag=1
+collector.header.authlist=sample1,$2a$10$pgjaxDzSuc6XVFEeqvxQ5u90DKJnM/u7TJTcinAlFJVaavXMWf/Zi|userid1,$2a$10$61gNubgJJl9lh3nvQvY9X.x4e5ETWJJ7ao7ZhJEvmfJigov26Z6uq|userid2,$2a$10$G52y/3uhuhWAMy.bx9Se8uzWinmbJa.dlm1LW6bYPdPkkywLDPLiy
+
+
diff --git a/src/test/resources/trustpasswordfile b/src/test/resources/trustpasswordfile
new file mode 100755
index 0000000..11e1e24
--- /dev/null
+++ b/src/test/resources/trustpasswordfile
@@ -0,0 +1 @@
+vestest \ No newline at end of file
diff --git a/src/test/resources/truststore b/src/test/resources/truststore
new file mode 100755
index 0000000..b0802a7
--- /dev/null
+++ b/src/test/resources/truststore
Binary files differ
diff --git a/version.properties b/version.properties
index 2ddebb3..7b8b963 100644
--- a/version.properties
+++ b/version.properties
@@ -1,5 +1,5 @@
major=1
-minor=0
+minor=1
patch=0
base_version=${major}.${minor}.${patch}
release_version=${base_version}