From c489a2eb22484e798c39a978bc8b61821b92322f Mon Sep 17 00:00:00 2001 From: an4828 Date: Mon, 22 Jan 2018 17:17:34 -0500 Subject: TCA: Replace any openecomp reference by onap Change-Id: I7c6d812ab5c1d7b30c63653d1974b0b1abc099be Signed-off-by: an4828 Issue-ID: DCAEGEN2-224 Signed-off-by: an4828 --- .gitignore | 1 + LICENSE.txt | 3 - README.md | 2 +- cpd-exclude.properties | 2 +- .../dcae/apod/analytics/aai/AAIClientFactory.java | 74 + .../aai/domain/config/AAIEnrichmentConfig.java | 33 + .../aai/domain/config/AAIHttpClientConfig.java | 131 ++ .../domain/config/AAIHttpClientConfigBuilder.java | 89 + .../analytics/aai/module/AnalyticsAAIModule.java | 54 + .../analytics/aai/service/AAIEnrichmentClient.java | 45 + .../aai/service/AAIEnrichmentClientFactory.java | 40 + .../aai/service/AAIEnrichmentClientImpl.java | 202 ++ .../apod/analytics/aai/service/AAIHttpClient.java | 39 + .../aai/service/AAIHttpClientFactory.java | 41 + .../analytics/aai/service/AAIHttpClientImpl.java | 159 ++ .../aai/utils/ssl/AlwaysTrustingTrustStrategy.java | 55 + .../dcae/apod/analytics/aai/AAIClientFactory.java | 74 - .../aai/domain/config/AAIEnrichmentConfig.java | 33 - .../aai/domain/config/AAIHttpClientConfig.java | 131 -- .../domain/config/AAIHttpClientConfigBuilder.java | 89 - .../analytics/aai/module/AnalyticsAAIModule.java | 54 - .../analytics/aai/service/AAIEnrichmentClient.java | 45 - .../aai/service/AAIEnrichmentClientFactory.java | 40 - .../aai/service/AAIEnrichmentClientImpl.java | 202 -- .../apod/analytics/aai/service/AAIHttpClient.java | 39 - .../aai/service/AAIHttpClientFactory.java | 41 - .../analytics/aai/service/AAIHttpClientImpl.java | 159 -- .../aai/utils/ssl/AlwaysTrustingTrustStrategy.java | 55 - .../aai/BaseAnalyticsAAIGuiceUnitTest.java | 31 + .../analytics/aai/BaseAnalyticsAAIUnitTest.java | 83 + .../apod/analytics/aai/it/AAIClientFactoryIT.java | 81 + .../apod/analytics/aai/it/BaseAnalyticsAAIIT.java | 76 + .../aai/service/AAIEnrichmentClientImplTest.java | 96 + .../aai/service/AAIHttpClientImplTest.java | 109 + .../aai/BaseAnalyticsAAIGuiceUnitTest.java | 31 - .../analytics/aai/BaseAnalyticsAAIUnitTest.java | 83 - .../apod/analytics/aai/it/AAIClientFactoryIT.java | 81 - .../apod/analytics/aai/it/BaseAnalyticsAAIIT.java | 76 - .../aai/service/AAIEnrichmentClientImplTest.java | 96 - .../aai/service/AAIHttpClientImplTest.java | 109 - .../src/test/resources/logback-test.xml | 2 +- dcae-analytics-cdap-common/pom.xml | 226 +- .../cdap/common/CDAPComponentsConstants.java | 244 +++ .../cdap/common/CDAPMetricsConstants.java | 119 ++ .../analytics/cdap/common/CDAPPluginConstants.java | 71 + .../domain/tca/ThresholdCalculatorOutput.java | 94 + .../common/exception/CDAPSettingsException.java | 51 + .../persistance/tca/TCAAlertsAbatementEntity.java | 157 ++ .../tca/TCAAlertsAbatementPersister.java | 127 ++ .../persistance/tca/TCACalculatorMessageType.java | 43 + .../persistance/tca/TCAMessageStatusEntity.java | 550 +++++ .../persistance/tca/TCAMessageStatusPersister.java | 241 +++ .../common/persistance/tca/TCAVESAlertEntity.java | 78 + .../persistance/tca/TCAVESAlertsPersister.java | 102 + .../cdap/common/settings/CDAPAppConfig.java | 47 + .../cdap/common/settings/CDAPAppPreferences.java | 31 + .../cdap/common/settings/CDAPAppSettings.java | 35 + .../cdap/common/settings/CDAPBaseAppConfig.java | 64 + .../cdap/common/settings/CDAPBasePluginConfig.java | 53 + .../cdap/common/settings/CDAPPluginSettings.java | 31 + .../analytics/cdap/common/utils/DMaaPMRUtils.java | 144 ++ .../cdap/common/utils/ValidationUtils.java | 107 + .../validation/CDAPAppSettingsValidator.java | 52 + .../cdap/common/CDAPComponentsConstants.java | 244 --- .../cdap/common/CDAPMetricsConstants.java | 119 -- .../analytics/cdap/common/CDAPPluginConstants.java | 71 - .../domain/tca/ThresholdCalculatorOutput.java | 94 - .../common/exception/CDAPSettingsException.java | 51 - .../persistance/tca/TCAAlertsAbatementEntity.java | 157 -- .../tca/TCAAlertsAbatementPersister.java | 127 -- .../persistance/tca/TCACalculatorMessageType.java | 43 - .../persistance/tca/TCAMessageStatusEntity.java | 550 ----- .../persistance/tca/TCAMessageStatusPersister.java | 241 --- .../common/persistance/tca/TCAVESAlertEntity.java | 78 - .../persistance/tca/TCAVESAlertsPersister.java | 102 - .../cdap/common/settings/CDAPAppConfig.java | 47 - .../cdap/common/settings/CDAPAppPreferences.java | 31 - .../cdap/common/settings/CDAPAppSettings.java | 35 - .../cdap/common/settings/CDAPBaseAppConfig.java | 64 - .../cdap/common/settings/CDAPBasePluginConfig.java | 53 - .../cdap/common/settings/CDAPPluginSettings.java | 31 - .../analytics/cdap/common/utils/DMaaPMRUtils.java | 144 -- .../cdap/common/utils/ValidationUtils.java | 107 - .../validation/CDAPAppSettingsValidator.java | 52 - .../common/BaseAnalyticsCDAPCommonUnitTest.java | 89 + .../tca/TCAAlertsAbatementPersisterTest.java | 123 ++ .../tca/TCACalculatorMessageTypeTest.java | 38 + .../tca/TCAMessageStatusPersisterTest.java | 128 ++ .../persistance/tca/TCAVESAlertsPersisterTest.java | 63 + .../common/settings/CDAPBaseAppConfigTest.java | 58 + .../cdap/common/utils/DMaaPMRUtilsTest.java | 112 + .../cdap/common/utils/ValidationUtilsTest.java | 80 + .../common/BaseAnalyticsCDAPCommonUnitTest.java | 89 - .../tca/TCAAlertsAbatementPersisterTest.java | 123 -- .../tca/TCACalculatorMessageTypeTest.java | 38 - .../tca/TCAMessageStatusPersisterTest.java | 128 -- .../persistance/tca/TCAVESAlertsPersisterTest.java | 63 - .../common/settings/CDAPBaseAppConfigTest.java | 58 - .../cdap/common/utils/DMaaPMRUtilsTest.java | 112 - .../cdap/common/utils/ValidationUtilsTest.java | 80 - .../src/test/resources/logback-test.xml | 110 +- dcae-analytics-cdap-plugins/pom.xml | 632 +++--- .../batch/sink/dmaap/DMaaPMROutputFormat.java | 94 + .../sink/dmaap/DMaaPMROutputFormatProvider.java | 116 ++ .../batch/sink/dmaap/DMaaPMRRecordWriter.java | 58 + .../cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java | 90 + .../cdap/plugins/common/PluginSchema.java | 37 + .../config/dmaap/BaseDMaaPMRPluginConfig.java | 159 ++ .../config/dmaap/DMaaPMRSinkPluginConfig.java | 101 + .../config/dmaap/DMaaPMRSourcePluginConfig.java | 134 ++ .../config/filter/JsonPathFilterPluginConfig.java | 125 ++ .../domain/config/tca/SimpleTCAPluginConfig.java | 154 ++ .../schema/dmaap/DMaaPSourceOutputSchema.java | 59 + .../plugins/sparkcompute/tca/SimpleTCAPlugin.java | 175 ++ .../plugins/streaming/dmaap/DMaaPMRReceiver.java | 118 ++ .../plugins/streaming/dmaap/DMaaPMRSource.java | 70 + .../streaming/dmaap/MockDMaaPMRReceiver.java | 132 ++ .../plugins/streaming/dmaap/MockDMaaPMRSource.java | 73 + .../plugins/transform/filter/JsonPathFilter.java | 134 ++ .../cdap/plugins/utils/CDAPPluginUtils.java | 295 +++ .../cdap/plugins/utils/DMaaPSinkConfigMapper.java | 112 + .../plugins/utils/DMaaPSourceConfigMapper.java | 118 ++ .../BaseDMaaPMRPluginConfigValidator.java | 72 + .../DMaaPMRSinkPluginConfigValidator.java | 58 + .../DMaaPMRSourcePluginConfigValidator.java | 58 + .../JsonPathFilterPluginConfigValidator.java | 83 + .../validator/SimpleTCAPluginConfigValidator.java | 91 + .../batch/sink/dmaap/DMaaPMROutputFormat.java | 94 - .../sink/dmaap/DMaaPMROutputFormatProvider.java | 116 -- .../batch/sink/dmaap/DMaaPMRRecordWriter.java | 58 - .../cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java | 90 - .../cdap/plugins/common/PluginSchema.java | 37 - .../config/dmaap/BaseDMaaPMRPluginConfig.java | 159 -- .../config/dmaap/DMaaPMRSinkPluginConfig.java | 101 - .../config/dmaap/DMaaPMRSourcePluginConfig.java | 134 -- .../config/filter/JsonPathFilterPluginConfig.java | 125 -- .../domain/config/tca/SimpleTCAPluginConfig.java | 154 -- .../schema/dmaap/DMaaPSourceOutputSchema.java | 59 - .../plugins/sparkcompute/tca/SimpleTCAPlugin.java | 175 -- .../plugins/streaming/dmaap/DMaaPMRReceiver.java | 118 -- .../plugins/streaming/dmaap/DMaaPMRSource.java | 70 - .../streaming/dmaap/MockDMaaPMRReceiver.java | 132 -- .../plugins/streaming/dmaap/MockDMaaPMRSource.java | 73 - .../plugins/transform/filter/JsonPathFilter.java | 134 -- .../cdap/plugins/utils/CDAPPluginUtils.java | 295 --- .../cdap/plugins/utils/DMaaPSinkConfigMapper.java | 112 - .../plugins/utils/DMaaPSourceConfigMapper.java | 118 -- .../BaseDMaaPMRPluginConfigValidator.java | 72 - .../DMaaPMRSinkPluginConfigValidator.java | 58 - .../DMaaPMRSourcePluginConfigValidator.java | 58 - .../JsonPathFilterPluginConfigValidator.java | 83 - .../validator/SimpleTCAPluginConfigValidator.java | 91 - .../plugins/BaseAnalyticsCDAPPluginsUnitTest.java | 238 +++ .../dmaap/DMaaPMROutputFormatProviderTest.java | 77 + .../batch/sink/dmaap/DMaaPMROutputFormatTest.java | 75 + .../batch/sink/dmaap/DMaaPMRRecordWriterTest.java | 62 + .../plugins/batch/sink/dmaap/DMaaPMRSinkTest.java | 95 + .../config/dmaap/DMaaPMRSinkPluginConfigTest.java | 80 + .../dmaap/DMaaPMRSourcePluginConfigTest.java | 84 + .../config/dmaap/TestDMaaPMRSinkPluginConfig.java | 76 + .../dmaap/TestDMaaPMRSourcePluginConfig.java | 84 + .../filter/TestJsonPathFilterPluginConfig.java | 50 + .../config/tca/TestSimpleTCAPluginConfig.java | 56 + .../schema/dmaap/DMaaPSourceOutputSchemaTest.java | 63 + .../cdap/plugins/it/SimpleTCAPluginCDAPIT.java | 229 ++ .../sparkcompute/tca/SimpleTCAPluginTest.java | 119 ++ .../streaming/dmaap/DMaaPMRReceiverTest.java | 75 + .../plugins/streaming/dmaap/DMaaPMRSourceTest.java | 91 + .../streaming/dmaap/MockDMaaPMRReceiverTest.java | 81 + .../streaming/dmaap/MockDMaaPMRSourceTest.java | 74 + .../streaming/dmaap/TestDMaaPMRReceiver.java | 58 + .../transform/filter/JsonPathFilterTest.java | 84 + .../cdap/plugins/utils/CDAPPluginUtilsTest.java | 171 ++ .../plugins/utils/DMaaPSinkConfigMapperTest.java | 57 + .../plugins/utils/DMaaPSourceConfigMapperTest.java | 64 + .../DMaaPMRSinkPluginConfigValidatorTest.java | 86 + .../DMaaPMRSourcePluginConfigValidatorTest.java | 85 + .../JsonPathFilterPluginConfigValidatorTest.java | 107 + .../SimpleTCAPluginConfigValidatorTest.java | 157 ++ .../plugins/BaseAnalyticsCDAPPluginsUnitTest.java | 238 --- .../dmaap/DMaaPMROutputFormatProviderTest.java | 77 - .../batch/sink/dmaap/DMaaPMROutputFormatTest.java | 75 - .../batch/sink/dmaap/DMaaPMRRecordWriterTest.java | 62 - .../plugins/batch/sink/dmaap/DMaaPMRSinkTest.java | 95 - .../config/dmaap/DMaaPMRSinkPluginConfigTest.java | 80 - .../dmaap/DMaaPMRSourcePluginConfigTest.java | 84 - .../config/dmaap/TestDMaaPMRSinkPluginConfig.java | 76 - .../dmaap/TestDMaaPMRSourcePluginConfig.java | 84 - .../filter/TestJsonPathFilterPluginConfig.java | 50 - .../config/tca/TestSimpleTCAPluginConfig.java | 56 - .../schema/dmaap/DMaaPSourceOutputSchemaTest.java | 63 - .../cdap/plugins/it/SimpleTCAPluginCDAPIT.java | 229 -- .../sparkcompute/tca/SimpleTCAPluginTest.java | 119 -- .../streaming/dmaap/DMaaPMRReceiverTest.java | 75 - .../plugins/streaming/dmaap/DMaaPMRSourceTest.java | 91 - .../streaming/dmaap/MockDMaaPMRReceiverTest.java | 81 - .../streaming/dmaap/MockDMaaPMRSourceTest.java | 74 - .../streaming/dmaap/TestDMaaPMRReceiver.java | 58 - .../transform/filter/JsonPathFilterTest.java | 84 - .../cdap/plugins/utils/CDAPPluginUtilsTest.java | 171 -- .../plugins/utils/DMaaPSinkConfigMapperTest.java | 57 - .../plugins/utils/DMaaPSourceConfigMapperTest.java | 64 - .../DMaaPMRSinkPluginConfigValidatorTest.java | 86 - .../DMaaPMRSourcePluginConfigValidatorTest.java | 85 - .../JsonPathFilterPluginConfigValidatorTest.java | 107 - .../SimpleTCAPluginConfigValidatorTest.java | 157 -- .../src/test/resources/logback-test.xml | 110 +- dcae-analytics-cdap-tca/pom.xml | 290 +-- .../cdap/tca/TCAAnalyticsApplication.java | 116 ++ .../cdap/tca/flow/TCAVESCollectorFlow.java | 82 + .../tca/flowlet/TCAVESAAIEnrichmentFlowlet.java | 128 ++ .../tca/flowlet/TCAVESAlertsAbatementFlowlet.java | 169 ++ .../cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java | 71 + .../tca/flowlet/TCAVESMessageRouterFlowlet.java | 59 + .../TCAVESThresholdViolationCalculatorFlowlet.java | 156 ++ .../analytics/cdap/tca/settings/TCAAppConfig.java | 110 + .../cdap/tca/settings/TCAAppPreferences.java | 349 ++++ .../cdap/tca/settings/TCAPolicyPreferences.java | 36 + .../AppPreferencesToPublisherConfigMapper.java | 97 + .../AppPreferencesToSubscriberConfigMapper.java | 113 + .../analytics/cdap/tca/utils/CDAPTCAUtils.java | 321 +++ .../cdap/tca/validator/TCAAppConfigValidator.java | 62 + .../validator/TCAPolicyPreferencesValidator.java | 115 ++ .../tca/validator/TCAPreferencesValidator.java | 84 + .../cdap/tca/worker/BaseTCADMaaPMRWorker.java | 116 ++ .../cdap/tca/worker/TCADMaaPMRPublisherJob.java | 200 ++ .../cdap/tca/worker/TCADMaaPMRSubscriberJob.java | 114 + .../tca/worker/TCADMaaPMockSubscriberWorker.java | 141 ++ .../cdap/tca/worker/TCADMaaPPublisherWorker.java | 146 ++ .../cdap/tca/worker/TCADMaaPSubscriberWorker.java | 124 ++ .../cdap/tca/TCAAnalyticsApplication.java | 116 -- .../cdap/tca/flow/TCAVESCollectorFlow.java | 82 - .../tca/flowlet/TCAVESAAIEnrichmentFlowlet.java | 128 -- .../tca/flowlet/TCAVESAlertsAbatementFlowlet.java | 169 -- .../cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java | 71 - .../tca/flowlet/TCAVESMessageRouterFlowlet.java | 59 - .../TCAVESThresholdViolationCalculatorFlowlet.java | 156 -- .../analytics/cdap/tca/settings/TCAAppConfig.java | 110 - .../cdap/tca/settings/TCAAppPreferences.java | 349 ---- .../cdap/tca/settings/TCAPolicyPreferences.java | 36 - .../AppPreferencesToPublisherConfigMapper.java | 97 - .../AppPreferencesToSubscriberConfigMapper.java | 113 - .../analytics/cdap/tca/utils/CDAPTCAUtils.java | 321 --- .../cdap/tca/validator/TCAAppConfigValidator.java | 62 - .../validator/TCAPolicyPreferencesValidator.java | 115 -- .../tca/validator/TCAPreferencesValidator.java | 84 - .../cdap/tca/worker/BaseTCADMaaPMRWorker.java | 116 -- .../cdap/tca/worker/TCADMaaPMRPublisherJob.java | 200 -- .../cdap/tca/worker/TCADMaaPMRSubscriberJob.java | 114 - .../tca/worker/TCADMaaPMockSubscriberWorker.java | 141 -- .../cdap/tca/worker/TCADMaaPPublisherWorker.java | 146 -- .../cdap/tca/worker/TCADMaaPSubscriberWorker.java | 124 -- .../analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java | 95 + .../cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java | 294 +++ .../cdap/tca/TCAAnalyticsApplicationTest.java | 47 + .../cdap/tca/flow/TCAVESCollectorFlowTest.java | 79 + .../flowlet/TCAVESAlertsAbatementFlowletTest.java | 251 +++ .../tca/flowlet/TCAVESAlertsSinkFlowletTest.java | 78 + .../flowlet/TCAVESMessageRouterFlowletTest.java | 80 + ...VESThresholdViolationCalculatorFlowletTest.java | 163 ++ .../cdap/tca/it/TCAnalyticsAppConfigIT.java | 52 + .../cdap/tca/settings/TCATestAppConfig.java | 62 + .../cdap/tca/settings/TCATestAppConfigHolder.java | 40 + .../cdap/tca/settings/TCATestAppPreferences.java | 176 ++ .../tca/settings/TCATestAppPreferencesTest.java | 41 + .../AppPreferencesToPublisherConfigMapperTest.java | 62 + ...AppPreferencesToSubscriberConfigMapperTest.java | 62 + .../analytics/cdap/tca/utils/CDAPTCAUtilsTest.java | 80 + .../tca/validator/TCAAppConfigValidatorTest.java | 77 + .../TCAPolicyPreferencesValidatorTest.java | 85 + .../tca/validator/TCAPreferencesValidatorTest.java | 86 + .../cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java | 99 + .../tca/worker/TCADMaaPMRPublisherJobTest.java | 158 ++ .../tca/worker/TCADMaaPMRSubscriberJobTest.java | 135 ++ .../tca/worker/TCADMaaPPublisherWorkerTest.java | 87 + .../tca/worker/TCADMaaPSubscriberWorkerTest.java | 88 + .../analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java | 95 - .../cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java | 294 --- .../cdap/tca/TCAAnalyticsApplicationTest.java | 47 - .../cdap/tca/flow/TCAVESCollectorFlowTest.java | 79 - .../flowlet/TCAVESAlertsAbatementFlowletTest.java | 251 --- .../tca/flowlet/TCAVESAlertsSinkFlowletTest.java | 78 - .../flowlet/TCAVESMessageRouterFlowletTest.java | 80 - ...VESThresholdViolationCalculatorFlowletTest.java | 163 -- .../cdap/tca/it/TCAnalyticsAppConfigIT.java | 52 - .../cdap/tca/settings/TCATestAppConfig.java | 62 - .../cdap/tca/settings/TCATestAppConfigHolder.java | 40 - .../cdap/tca/settings/TCATestAppPreferences.java | 176 -- .../tca/settings/TCATestAppPreferencesTest.java | 41 - .../AppPreferencesToPublisherConfigMapperTest.java | 62 - ...AppPreferencesToSubscriberConfigMapperTest.java | 62 - .../analytics/cdap/tca/utils/CDAPTCAUtilsTest.java | 80 - .../tca/validator/TCAAppConfigValidatorTest.java | 77 - .../TCAPolicyPreferencesValidatorTest.java | 85 - .../tca/validator/TCAPreferencesValidatorTest.java | 86 - .../cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java | 99 - .../tca/worker/TCADMaaPMRPublisherJobTest.java | 158 -- .../tca/worker/TCADMaaPMRSubscriberJobTest.java | 135 -- .../tca/worker/TCADMaaPPublisherWorkerTest.java | 87 - .../tca/worker/TCADMaaPSubscriberWorkerTest.java | 88 - .../src/test/resources/logback-test.xml | 110 +- dcae-analytics-common/pom.xml | 230 +-- .../apod/analytics/common/AnalyticsConstants.java | 167 ++ .../exception/DCAEAnalyticsRuntimeException.java | 54 + .../exception/MessageProcessingException.java | 51 + .../service/filter/GenericJsonMessageFilter.java | 115 ++ .../filter/JsonMessageFilterProcessorContext.java | 57 + .../processor/AbstractMessageProcessor.java | 162 ++ .../processor/AbstractProcessorContext.java | 96 + .../processor/GenericMessageChainProcessor.java | 70 + .../service/processor/GenericProcessorInfo.java | 57 + .../common/service/processor/MessageProcessor.java | 84 + .../common/service/processor/ProcessingState.java | 36 + .../common/service/processor/ProcessorContext.java | 70 + .../common/service/processor/ProcessorInfo.java | 49 + .../apod/analytics/common/utils/HTTPUtils.java | 62 + .../common/utils/MessageProcessorUtils.java | 162 ++ .../analytics/common/utils/PersistenceUtils.java | 59 + .../analytics/common/validation/DCAEValidator.java | 31 + .../validation/GenericValidationResponse.java | 84 + .../common/validation/ValidationResponse.java | 90 + .../apod/analytics/common/AnalyticsConstants.java | 167 -- .../exception/DCAEAnalyticsRuntimeException.java | 54 - .../exception/MessageProcessingException.java | 51 - .../service/filter/GenericJsonMessageFilter.java | 115 -- .../filter/JsonMessageFilterProcessorContext.java | 57 - .../processor/AbstractMessageProcessor.java | 162 -- .../processor/AbstractProcessorContext.java | 96 - .../processor/GenericMessageChainProcessor.java | 70 - .../service/processor/GenericProcessorInfo.java | 57 - .../common/service/processor/MessageProcessor.java | 84 - .../common/service/processor/ProcessingState.java | 36 - .../common/service/processor/ProcessorContext.java | 70 - .../common/service/processor/ProcessorInfo.java | 49 - .../apod/analytics/common/utils/HTTPUtils.java | 62 - .../common/utils/MessageProcessorUtils.java | 162 -- .../analytics/common/utils/PersistenceUtils.java | 59 - .../analytics/common/validation/DCAEValidator.java | 31 - .../validation/GenericValidationResponse.java | 84 - .../common/validation/ValidationResponse.java | 90 - .../common/BaseAnalyticsCommonUnitTest.java | 81 + .../filter/GenericJsonMessageFilterTest.java | 151 ++ .../processor/AbstractMessageProcessorTest.java | 68 + .../processor/AbstractProcessorContextTest.java | 79 + .../GenericMessageChainProcessorTest.java | 96 + .../processor/GenericProcessorInfoTest.java | 53 + .../processor/TestEarlyTerminatingProcessor.java | 39 + .../service/processor/TestMessageProcessor1.java | 41 + .../service/processor/TestMessageProcessor2.java | 41 + .../service/processor/TestProcessorContext.java | 84 + .../apod/analytics/common/utils/HTTPUtilsTest.java | 48 + .../common/utils/MessageProcessorUtilsTest.java | 62 + .../common/utils/PersistenceUtilsTest.java | 40 + .../validation/GenericValidationResponseTest.java | 129 ++ .../common/BaseAnalyticsCommonUnitTest.java | 81 - .../filter/GenericJsonMessageFilterTest.java | 151 -- .../processor/AbstractMessageProcessorTest.java | 68 - .../processor/AbstractProcessorContextTest.java | 79 - .../GenericMessageChainProcessorTest.java | 96 - .../processor/GenericProcessorInfoTest.java | 53 - .../processor/TestEarlyTerminatingProcessor.java | 39 - .../service/processor/TestMessageProcessor1.java | 41 - .../service/processor/TestMessageProcessor2.java | 41 - .../service/processor/TestProcessorContext.java | 84 - .../apod/analytics/common/utils/HTTPUtilsTest.java | 48 - .../common/utils/MessageProcessorUtilsTest.java | 62 - .../common/utils/PersistenceUtilsTest.java | 40 - .../validation/GenericValidationResponseTest.java | 129 -- .../src/test/resources/logback-test.xml | 110 +- dcae-analytics-dmaap/pom.xml | 228 +- .../dcae/apod/analytics/dmaap/DMaaPMRFactory.java | 112 + .../dmaap/domain/config/DMaaPMRBaseConfig.java | 193 ++ .../dmaap/domain/config/DMaaPMRConfig.java | 32 + .../domain/config/DMaaPMRPublisherConfig.java | 248 +++ .../domain/config/DMaaPMRSubscriberConfig.java | 295 +++ .../domain/response/DMaaPMRPublisherResponse.java | 38 + .../response/DMaaPMRPublisherResponseImpl.java | 70 + .../dmaap/domain/response/DMaaPMRResponse.java | 46 + .../domain/response/DMaaPMRSubscriberResponse.java | 40 + .../response/DMaaPMRSubscriberResponseImpl.java | 80 + .../dmaap/module/AnalyticsDMaaPModule.java | 62 + .../dmaap/service/BaseDMaaPMRComponent.java | 378 ++++ .../analytics/dmaap/service/DMaaPMRComponent.java | 29 + .../dmaap/service/publisher/DMaaPMRPublisher.java | 95 + .../service/publisher/DMaaPMRPublisherFactory.java | 49 + .../service/publisher/DMaaPMRPublisherImpl.java | 210 ++ .../service/publisher/DMaaPMRPublisherQueue.java | 87 + .../publisher/DMaaPMRPublisherQueueFactory.java | 45 + .../publisher/DMaaPMRPublisherQueueImpl.java | 126 ++ .../service/subscriber/DMaaPMRSubscriber.java | 57 + .../subscriber/DMaaPMRSubscriberFactory.java | 47 + .../service/subscriber/DMaaPMRSubscriberImpl.java | 129 ++ .../dcae/apod/analytics/dmaap/DMaaPMRFactory.java | 112 - .../dmaap/domain/config/DMaaPMRBaseConfig.java | 193 -- .../dmaap/domain/config/DMaaPMRConfig.java | 32 - .../domain/config/DMaaPMRPublisherConfig.java | 248 --- .../domain/config/DMaaPMRSubscriberConfig.java | 295 --- .../domain/response/DMaaPMRPublisherResponse.java | 38 - .../response/DMaaPMRPublisherResponseImpl.java | 70 - .../dmaap/domain/response/DMaaPMRResponse.java | 46 - .../domain/response/DMaaPMRSubscriberResponse.java | 40 - .../response/DMaaPMRSubscriberResponseImpl.java | 80 - .../dmaap/module/AnalyticsDMaaPModule.java | 62 - .../dmaap/service/BaseDMaaPMRComponent.java | 378 ---- .../analytics/dmaap/service/DMaaPMRComponent.java | 29 - .../dmaap/service/publisher/DMaaPMRPublisher.java | 95 - .../service/publisher/DMaaPMRPublisherFactory.java | 49 - .../service/publisher/DMaaPMRPublisherImpl.java | 210 -- .../service/publisher/DMaaPMRPublisherQueue.java | 87 - .../publisher/DMaaPMRPublisherQueueFactory.java | 45 - .../publisher/DMaaPMRPublisherQueueImpl.java | 126 -- .../service/subscriber/DMaaPMRSubscriber.java | 57 - .../subscriber/DMaaPMRSubscriberFactory.java | 47 - .../service/subscriber/DMaaPMRSubscriberImpl.java | 129 -- .../dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java | 31 + .../dmaap/BaseAnalyticsDMaaPUnitTest.java | 99 + .../apod/analytics/dmaap/DMaaPMRFactoryTest.java | 67 + .../domain/config/DMaaPMRPublisherConfigTest.java | 78 + .../domain/config/DMaaPMRSubscriberConfigTest.java | 84 + .../analytics/dmaap/it/BaseAnalyticsDMaaPIT.java | 109 + .../analytics/dmaap/it/DMaaPMRPublisherImplIT.java | 58 + .../dmaap/it/DMaaPMRSubscriberImplIT.java | 87 + .../dmaap/module/AnalyticsDMaaPTestModule.java | 60 + .../dmaap/service/BaseDMaaPMRComponentTest.java | 300 +++ .../publisher/DMaaPMRPublisherImplTest.java | 210 ++ .../publisher/DMaaPMRPublisherMockImpl.java | 59 + .../publisher/DMaaPMRPublisherQueueImplTest.java | 189 ++ .../publisher/DMaaPMRPublisherQueueMockImpl.java | 53 + .../subscriber/DMaaPMRSubscriberImplTest.java | 158 ++ .../subscriber/DMaaPMRSubscriberMockImpl.java | 48 + .../dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java | 31 - .../dmaap/BaseAnalyticsDMaaPUnitTest.java | 99 - .../apod/analytics/dmaap/DMaaPMRFactoryTest.java | 67 - .../domain/config/DMaaPMRPublisherConfigTest.java | 78 - .../domain/config/DMaaPMRSubscriberConfigTest.java | 84 - .../analytics/dmaap/it/BaseAnalyticsDMaaPIT.java | 109 - .../analytics/dmaap/it/DMaaPMRPublisherImplIT.java | 58 - .../dmaap/it/DMaaPMRSubscriberImplIT.java | 87 - .../dmaap/module/AnalyticsDMaaPTestModule.java | 60 - .../dmaap/service/BaseDMaaPMRComponentTest.java | 300 --- .../publisher/DMaaPMRPublisherImplTest.java | 210 -- .../publisher/DMaaPMRPublisherMockImpl.java | 59 - .../publisher/DMaaPMRPublisherQueueImplTest.java | 189 -- .../publisher/DMaaPMRPublisherQueueMockImpl.java | 53 - .../subscriber/DMaaPMRSubscriberImplTest.java | 158 -- .../subscriber/DMaaPMRSubscriberMockImpl.java | 48 - .../src/test/resources/logback-test.xml | 110 +- .../analytics/it/cucumber/CucumberRunnerIT.java | 40 + .../analytics/it/cucumber/steps/DMaaPMRSteps.java | 129 ++ .../apod/analytics/it/dmaap/DMaaPMRCreator.java | 83 + .../analytics/it/dmaap/DMaaPMRCreatorImpl.java | 225 ++ .../it/module/AnalyticsITInjectorSource.java | 41 + .../analytics/it/module/IntegrationTestModule.java | 126 ++ .../it/plugins/BaseAnalyticsPluginsIT.java | 51 + .../it/plugins/DMaaPMRSourcePluginIT.java | 204 ++ .../dcae/apod/analytics/it/util/StepUtils.java | 43 + .../analytics/it/cucumber/CucumberRunnerIT.java | 40 - .../analytics/it/cucumber/steps/DMaaPMRSteps.java | 129 -- .../apod/analytics/it/dmaap/DMaaPMRCreator.java | 83 - .../analytics/it/dmaap/DMaaPMRCreatorImpl.java | 225 -- .../it/module/AnalyticsITInjectorSource.java | 41 - .../analytics/it/module/IntegrationTestModule.java | 126 -- .../it/plugins/BaseAnalyticsPluginsIT.java | 51 - .../it/plugins/DMaaPMRSourcePluginIT.java | 204 -- .../dcae/apod/analytics/it/util/StepUtils.java | 43 - .../src/test/resources/cucumber.properties | 2 +- .../src/test/resources/logback-test.xml | 2 +- dcae-analytics-model/pom.xml | 258 +-- .../model/BaseDynamicPropertiesProvider.java | 69 + .../apod/analytics/model/DCAEAnalyticsModel.java | 32 + .../analytics/model/DynamicPropertiesProvider.java | 56 + .../apod/analytics/model/config/ConfigModel.java | 33 + .../model/config/tca/BaseTCAAppConfigModel.java | 37 + .../analytics/model/config/tca/BaseTCAHandle.java | 38 + .../apod/analytics/model/config/tca/DMAAPInfo.java | 45 + .../model/config/tca/StreamsPublishes.java | 37 + .../model/config/tca/StreamsSubscribes.java | 37 + .../model/config/tca/TCAAppConfigModel.java | 34 + .../model/config/tca/TCAControllerAppConfig.java | 42 + .../analytics/model/config/tca/TCAHandleIn.java | 39 + .../analytics/model/config/tca/TCAHandleOut.java | 39 + .../analytics/model/domain/cef/AlertAction.java | 32 + .../apod/analytics/model/domain/cef/AlertType.java | 44 + .../analytics/model/domain/cef/BaseCEFModel.java | 39 + .../apod/analytics/model/domain/cef/CEFModel.java | 32 + .../model/domain/cef/CommonEventHeader.java | 181 ++ .../analytics/model/domain/cef/Criticality.java | 31 + .../apod/analytics/model/domain/cef/Domain.java | 41 + .../apod/analytics/model/domain/cef/Event.java | 61 + .../analytics/model/domain/cef/EventListener.java | 45 + .../analytics/model/domain/cef/EventSeverity.java | 36 + .../apod/analytics/model/domain/cef/Field.java | 53 + .../model/domain/cef/InternalHeaderFields.java | 38 + .../domain/cef/MeasurementsForVfScalingFields.java | 81 + .../model/domain/cef/NamedArrayOfFields.java | 55 + .../model/domain/cef/PerformanceCounter.java | 68 + .../apod/analytics/model/domain/cef/Priority.java | 34 + .../domain/cef/ThresholdCrossingAlertFields.java | 158 ++ .../model/domain/cef/VNicPerformance.java | 308 +++ .../analytics/model/domain/policy/PolicyModel.java | 33 + .../domain/policy/tca/BaseTCAPolicyModel.java | 37 + .../domain/policy/tca/ClosedLoopEventStatus.java | 34 + .../domain/policy/tca/ControlLoopSchemaType.java | 33 + .../model/domain/policy/tca/Direction.java | 76 + .../domain/policy/tca/MetricsPerEventName.java | 115 ++ .../model/domain/policy/tca/TCAPolicy.java | 58 + .../model/domain/policy/tca/TCAPolicyModel.java | 35 + .../model/domain/policy/tca/Threshold.java | 127 ++ .../apod/analytics/model/facade/FacadeModel.java | 33 + .../dcae/apod/analytics/model/facade/tca/AAI.java | 41 + .../analytics/model/facade/tca/TCAFacadeModel.java | 31 + .../analytics/model/facade/tca/TCAVESResponse.java | 50 + .../model/util/AnalyticsModelIOUtils.java | 132 ++ .../model/util/AnalyticsModelJsonUtils.java | 104 + .../json/AnalyticsModelObjectMapperSupplier.java | 115 ++ .../model/util/json/CommonEventFormatModule.java | 96 + .../model/util/json/TCAControllerConfigModule.java | 59 + .../model/util/json/TCAFacadeModelModule.java | 49 + .../analytics/model/util/json/TCAPolicyModule.java | 64 + .../mixin/BaseDynamicPropertiesProviderMixin.java | 61 + .../analytics/model/util/json/mixin/JsonMixin.java | 31 + .../util/json/mixin/cef/AlertActionMixin.java | 30 + .../model/util/json/mixin/cef/AlertTypeMixin.java | 61 + .../util/json/mixin/cef/BaseCEFModelMixin.java | 31 + .../json/mixin/cef/CommonEventHeaderMixin.java | 27 + .../util/json/mixin/cef/CriticalityMixin.java | 30 + .../model/util/json/mixin/cef/DomainMixin.java | 30 + .../util/json/mixin/cef/EventListenerMixin.java | 29 + .../model/util/json/mixin/cef/EventMixin.java | 29 + .../util/json/mixin/cef/EventSeverityMixin.java | 30 + .../model/util/json/mixin/cef/FieldMixin.java | 28 + .../json/mixin/cef/InternalHeaderFieldsMixin.java | 28 + .../cef/MeasurementsForVfScalingFieldsMixin.java | 39 + .../json/mixin/cef/NamedArrayOfFieldsMixin.java | 28 + .../json/mixin/cef/PerformanceCounterMixin.java | 29 + .../model/util/json/mixin/cef/PriorityMixin.java | 30 + .../cef/ThresholdCrossingAlertFieldsMixin.java | 29 + .../util/json/mixin/cef/VNicUsageArrayMixin.java | 36 + .../config/tca/BaseTCAAppConfigModelMixin.java | 29 + .../json/mixin/config/tca/BaseTCAHandleMixin.java | 40 + .../util/json/mixin/config/tca/DMAAPInfoMixin.java | 33 + .../mixin/config/tca/StreamsPublishesMixin.java | 34 + .../mixin/config/tca/StreamsSubscribesMixin.java | 34 + .../config/tca/TCAControllerAppConfigMixin.java | 37 + .../model/util/json/mixin/facade/tca/AAIMixin.java | 55 + .../facade/tca/VESCEFMessageResponseMixin.java | 56 + .../mixin/policy/tca/BaseTCAPolicyModelMixin.java | 30 + .../policy/tca/ClosedLoopEventStatusMixin.java | 30 + .../policy/tca/ControlLoopSchemaTypeMixin.java | 29 + .../util/json/mixin/policy/tca/DirectionMixin.java | 30 + .../mixin/policy/tca/MetricsPerEventNameMixin.java | 28 + .../util/json/mixin/policy/tca/TCAPolicyMixin.java | 28 + .../util/json/mixin/policy/tca/ThresholdMixin.java | 46 + .../model/BaseDynamicPropertiesProvider.java | 69 - .../apod/analytics/model/DCAEAnalyticsModel.java | 32 - .../analytics/model/DynamicPropertiesProvider.java | 56 - .../apod/analytics/model/config/ConfigModel.java | 33 - .../model/config/tca/BaseTCAAppConfigModel.java | 37 - .../analytics/model/config/tca/BaseTCAHandle.java | 38 - .../apod/analytics/model/config/tca/DMAAPInfo.java | 45 - .../model/config/tca/StreamsPublishes.java | 37 - .../model/config/tca/StreamsSubscribes.java | 37 - .../model/config/tca/TCAAppConfigModel.java | 34 - .../model/config/tca/TCAControllerAppConfig.java | 42 - .../analytics/model/config/tca/TCAHandleIn.java | 39 - .../analytics/model/config/tca/TCAHandleOut.java | 39 - .../analytics/model/domain/cef/AlertAction.java | 32 - .../apod/analytics/model/domain/cef/AlertType.java | 44 - .../analytics/model/domain/cef/BaseCEFModel.java | 39 - .../apod/analytics/model/domain/cef/CEFModel.java | 32 - .../model/domain/cef/CommonEventHeader.java | 181 -- .../analytics/model/domain/cef/Criticality.java | 31 - .../apod/analytics/model/domain/cef/Domain.java | 41 - .../apod/analytics/model/domain/cef/Event.java | 61 - .../analytics/model/domain/cef/EventListener.java | 45 - .../analytics/model/domain/cef/EventSeverity.java | 36 - .../apod/analytics/model/domain/cef/Field.java | 53 - .../model/domain/cef/InternalHeaderFields.java | 38 - .../domain/cef/MeasurementsForVfScalingFields.java | 81 - .../model/domain/cef/NamedArrayOfFields.java | 55 - .../model/domain/cef/PerformanceCounter.java | 68 - .../apod/analytics/model/domain/cef/Priority.java | 34 - .../domain/cef/ThresholdCrossingAlertFields.java | 158 -- .../model/domain/cef/VNicPerformance.java | 308 --- .../analytics/model/domain/policy/PolicyModel.java | 33 - .../domain/policy/tca/BaseTCAPolicyModel.java | 37 - .../domain/policy/tca/ClosedLoopEventStatus.java | 34 - .../domain/policy/tca/ControlLoopSchemaType.java | 33 - .../model/domain/policy/tca/Direction.java | 76 - .../domain/policy/tca/MetricsPerEventName.java | 115 -- .../model/domain/policy/tca/TCAPolicy.java | 58 - .../model/domain/policy/tca/TCAPolicyModel.java | 35 - .../model/domain/policy/tca/Threshold.java | 127 -- .../apod/analytics/model/facade/FacadeModel.java | 33 - .../dcae/apod/analytics/model/facade/tca/AAI.java | 41 - .../analytics/model/facade/tca/TCAFacadeModel.java | 31 - .../analytics/model/facade/tca/TCAVESResponse.java | 50 - .../model/util/AnalyticsModelIOUtils.java | 132 -- .../model/util/AnalyticsModelJsonUtils.java | 104 - .../json/AnalyticsModelObjectMapperSupplier.java | 115 -- .../model/util/json/CommonEventFormatModule.java | 96 - .../model/util/json/TCAControllerConfigModule.java | 59 - .../model/util/json/TCAFacadeModelModule.java | 49 - .../analytics/model/util/json/TCAPolicyModule.java | 64 - .../mixin/BaseDynamicPropertiesProviderMixin.java | 61 - .../analytics/model/util/json/mixin/JsonMixin.java | 31 - .../util/json/mixin/cef/AlertActionMixin.java | 30 - .../model/util/json/mixin/cef/AlertTypeMixin.java | 61 - .../util/json/mixin/cef/BaseCEFModelMixin.java | 31 - .../json/mixin/cef/CommonEventHeaderMixin.java | 27 - .../util/json/mixin/cef/CriticalityMixin.java | 30 - .../model/util/json/mixin/cef/DomainMixin.java | 30 - .../util/json/mixin/cef/EventListenerMixin.java | 29 - .../model/util/json/mixin/cef/EventMixin.java | 29 - .../util/json/mixin/cef/EventSeverityMixin.java | 30 - .../model/util/json/mixin/cef/FieldMixin.java | 28 - .../json/mixin/cef/InternalHeaderFieldsMixin.java | 28 - .../cef/MeasurementsForVfScalingFieldsMixin.java | 39 - .../json/mixin/cef/NamedArrayOfFieldsMixin.java | 28 - .../json/mixin/cef/PerformanceCounterMixin.java | 29 - .../model/util/json/mixin/cef/PriorityMixin.java | 30 - .../cef/ThresholdCrossingAlertFieldsMixin.java | 29 - .../util/json/mixin/cef/VNicUsageArrayMixin.java | 36 - .../config/tca/BaseTCAAppConfigModelMixin.java | 29 - .../json/mixin/config/tca/BaseTCAHandleMixin.java | 40 - .../util/json/mixin/config/tca/DMAAPInfoMixin.java | 33 - .../mixin/config/tca/StreamsPublishesMixin.java | 34 - .../mixin/config/tca/StreamsSubscribesMixin.java | 34 - .../config/tca/TCAControllerAppConfigMixin.java | 37 - .../model/util/json/mixin/facade/tca/AAIMixin.java | 55 - .../facade/tca/VESCEFMessageResponseMixin.java | 56 - .../mixin/policy/tca/BaseTCAPolicyModelMixin.java | 30 - .../policy/tca/ClosedLoopEventStatusMixin.java | 30 - .../policy/tca/ControlLoopSchemaTypeMixin.java | 29 - .../util/json/mixin/policy/tca/DirectionMixin.java | 30 - .../mixin/policy/tca/MetricsPerEventNameMixin.java | 28 - .../util/json/mixin/policy/tca/TCAPolicyMixin.java | 28 - .../util/json/mixin/policy/tca/ThresholdMixin.java | 46 - .../model/BaseAnalyticsModelUnitTest.java | 154 ++ .../model/domain/cef/EventSeverityTest.java | 71 + .../apod/analytics/model/facade/tca/AAITest.java | 57 + .../model/facade/tca/TCAVESResponseTest.java | 76 + .../model/util/AnalyticsModelIOUtilsTest.java | 86 + .../model/util/AnalyticsModelJsonUtilsTest.java | 80 + .../apod/analytics/model/util/ConfigHolder.java | 33 + .../apod/analytics/model/util/TestAppConfig.java | 38 + .../AnalyticsModelObjectMapperSupplierTest.java | 64 + .../util/json/mixin/cef/AlertTypeMixinTest.java | 51 + .../json/mixin/cef/EventListenerMixinTest.java | 83 + .../tca/TCAControllerAppConfigMixinTest.java | 63 + .../mixin/facade/tca/TCAVESResponseMixinTest.java | 55 + .../json/mixin/policy/tca/TCAPolicyMixinTest.java | 51 + .../model/BaseAnalyticsModelUnitTest.java | 154 -- .../model/domain/cef/EventSeverityTest.java | 71 - .../apod/analytics/model/facade/tca/AAITest.java | 57 - .../model/facade/tca/TCAVESResponseTest.java | 76 - .../model/util/AnalyticsModelIOUtilsTest.java | 86 - .../model/util/AnalyticsModelJsonUtilsTest.java | 80 - .../apod/analytics/model/util/ConfigHolder.java | 33 - .../apod/analytics/model/util/TestAppConfig.java | 38 - .../AnalyticsModelObjectMapperSupplierTest.java | 64 - .../util/json/mixin/cef/AlertTypeMixinTest.java | 51 - .../json/mixin/cef/EventListenerMixinTest.java | 83 - .../tca/TCAControllerAppConfigMixinTest.java | 63 - .../mixin/facade/tca/TCAVESResponseMixinTest.java | 55 - .../json/mixin/policy/tca/TCAPolicyMixinTest.java | 51 - .../src/test/resources/logback-test.xml | 110 +- dcae-analytics-tca/pom.xml | 214 +- .../processor/AbstractTCAECEFPolicyProcessor.java | 61 + .../tca/processor/TCACEFJsonProcessor.java | 98 + .../tca/processor/TCACEFPolicyDomainFilter.java | 84 + .../tca/processor/TCACEFPolicyEventNameFilter.java | 91 + .../processor/TCACEFPolicyThresholdsProcessor.java | 138 ++ .../tca/processor/TCACEFProcessorContext.java | 103 + .../dcae/apod/analytics/tca/utils/TCAUtils.java | 1016 +++++++++ .../processor/AbstractTCAECEFPolicyProcessor.java | 61 - .../tca/processor/TCACEFJsonProcessor.java | 98 - .../tca/processor/TCACEFPolicyDomainFilter.java | 84 - .../tca/processor/TCACEFPolicyEventNameFilter.java | 91 - .../processor/TCACEFPolicyThresholdsProcessor.java | 138 -- .../tca/processor/TCACEFProcessorContext.java | 103 - .../dcae/apod/analytics/tca/utils/TCAUtils.java | 1016 --------- .../analytics/tca/BaseAnalyticsTCAUnitTest.java | 162 ++ .../AbstractTCAECEFPolicyProcessorTest.java | 56 + .../tca/processor/TCACEFJsonProcessorTest.java | 117 ++ .../processor/TCACEFPolicyDomainFilterTest.java | 74 + .../processor/TCACEFPolicyEventNameFilterTest.java | 75 + .../TCACEFPolicyThresholdsProcessorTest.java | 81 + .../tca/processor/TCACEFProcessorContextTest.java | 38 + .../apod/analytics/tca/utils/TCAUtilsTest.java | 418 ++++ .../analytics/tca/BaseAnalyticsTCAUnitTest.java | 162 -- .../AbstractTCAECEFPolicyProcessorTest.java | 56 - .../tca/processor/TCACEFJsonProcessorTest.java | 117 -- .../processor/TCACEFPolicyDomainFilterTest.java | 74 - .../processor/TCACEFPolicyEventNameFilterTest.java | 75 - .../TCACEFPolicyThresholdsProcessorTest.java | 81 - .../tca/processor/TCACEFProcessorContextTest.java | 38 - .../apod/analytics/tca/utils/TCAUtilsTest.java | 418 ---- .../src/test/resources/logback-test.xml | 110 +- dcae-analytics-test/pom.xml | 228 +- .../test/BaseDCAEAnalyticsCommonTest.java | 243 +++ .../apod/analytics/test/BaseDCAEAnalyticsIT.java | 29 + .../analytics/test/BaseDCAEAnalyticsUnitTest.java | 29 + .../analytics/test/annotation/GuiceModules.java | 45 + .../analytics/test/runner/GuiceJUnitRunner.java | 100 + .../test/BaseDCAEAnalyticsCommonTest.java | 243 --- .../apod/analytics/test/BaseDCAEAnalyticsIT.java | 29 - .../analytics/test/BaseDCAEAnalyticsUnitTest.java | 29 - .../analytics/test/annotation/GuiceModules.java | 45 - .../analytics/test/runner/GuiceJUnitRunner.java | 100 - .../src/main/resources/logback-test.xml | 110 +- findbugs-exclude.xml | 6 +- pmd-exclude.properties | 2 +- pom.xml | 2184 ++++++++++---------- 714 files changed, 34005 insertions(+), 34007 deletions(-) create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/AAIClientFactory.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClient.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java create mode 100644 dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/AAIClientFactory.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClient.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java delete mode 100644 dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java create mode 100644 dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java create mode 100644 dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java create mode 100644 dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java create mode 100644 dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java create mode 100644 dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java create mode 100644 dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java delete mode 100644 dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java delete mode 100644 dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java delete mode 100644 dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java delete mode 100644 dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java delete mode 100644 dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java delete mode 100644 dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java create mode 100644 dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java delete mode 100644 dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java create mode 100644 dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java delete mode 100644 dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java create mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java delete mode 100644 dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java create mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java delete mode 100644 dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java create mode 100644 dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java delete mode 100644 dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java create mode 100644 dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java delete mode 100644 dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/AnalyticsConstants.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/MessageProcessingException.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/MessageProcessor.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessingState.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorContext.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorInfo.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtils.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtils.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtils.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/DCAEValidator.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponse.java create mode 100644 dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/ValidationResponse.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/AnalyticsConstants.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/MessageProcessingException.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/MessageProcessor.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessingState.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorContext.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorInfo.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtils.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtils.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtils.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/DCAEValidator.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponse.java delete mode 100644 dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/ValidationResponse.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestProcessorContext.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtilsTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java create mode 100644 dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestProcessorContext.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtilsTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java delete mode 100644 dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactory.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java create mode 100644 dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactory.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java delete mode 100644 dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java create mode 100644 dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java delete mode 100644 dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/IntegrationTestModule.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java create mode 100644 dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/util/StepUtils.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/IntegrationTestModule.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java delete mode 100644 dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/util/StepUtils.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/BaseDynamicPropertiesProvider.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DCAEAnalyticsModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DynamicPropertiesProvider.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/ConfigModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAAppConfigModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAHandle.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/DMAAPInfo.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsPublishes.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsSubscribes.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAAppConfigModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAControllerAppConfig.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleIn.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleOut.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertAction.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertType.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/BaseCEFModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CEFModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CommonEventHeader.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Criticality.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Domain.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Event.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventListener.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventSeverity.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Field.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/InternalHeaderFields.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/MeasurementsForVfScalingFields.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/NamedArrayOfFields.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/PerformanceCounter.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Priority.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/ThresholdCrossingAlertFields.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/VNicPerformance.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/PolicyModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/BaseTCAPolicyModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ClosedLoopEventStatus.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ControlLoopSchemaType.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Direction.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/MetricsPerEventName.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicy.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicyModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Threshold.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/FacadeModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/AAI.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAFacadeModel.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAVESResponse.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelIOUtils.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelJsonUtils.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/AnalyticsModelObjectMapperSupplier.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/CommonEventFormatModule.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/TCAControllerConfigModule.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/TCAFacadeModelModule.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/TCAPolicyModule.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/BaseDynamicPropertiesProviderMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/JsonMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/AlertActionMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/AlertTypeMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/BaseCEFModelMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/CommonEventHeaderMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/CriticalityMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/DomainMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/EventListenerMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/EventMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/EventSeverityMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/FieldMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/InternalHeaderFieldsMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/MeasurementsForVfScalingFieldsMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/NamedArrayOfFieldsMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/PerformanceCounterMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/PriorityMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/ThresholdCrossingAlertFieldsMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/VNicUsageArrayMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/config/tca/BaseTCAAppConfigModelMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/config/tca/BaseTCAHandleMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/config/tca/DMAAPInfoMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/config/tca/StreamsPublishesMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/config/tca/StreamsSubscribesMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/config/tca/TCAControllerAppConfigMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/facade/tca/AAIMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/facade/tca/VESCEFMessageResponseMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/BaseTCAPolicyModelMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/ClosedLoopEventStatusMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/ControlLoopSchemaTypeMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/DirectionMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/MetricsPerEventNameMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/TCAPolicyMixin.java create mode 100644 dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/ThresholdMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/BaseDynamicPropertiesProvider.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/DCAEAnalyticsModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/DynamicPropertiesProvider.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/ConfigModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/BaseTCAAppConfigModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/BaseTCAHandle.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/DMAAPInfo.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/StreamsPublishes.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/StreamsSubscribes.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/TCAAppConfigModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/TCAControllerAppConfig.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/TCAHandleIn.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/config/tca/TCAHandleOut.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/AlertAction.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/AlertType.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/BaseCEFModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/CEFModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/CommonEventHeader.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/Criticality.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/Domain.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/Event.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/EventListener.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/EventSeverity.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/Field.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/InternalHeaderFields.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/MeasurementsForVfScalingFields.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/NamedArrayOfFields.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/PerformanceCounter.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/Priority.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/ThresholdCrossingAlertFields.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/cef/VNicPerformance.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/PolicyModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/BaseTCAPolicyModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/ClosedLoopEventStatus.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/ControlLoopSchemaType.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/Direction.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/MetricsPerEventName.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/TCAPolicy.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/TCAPolicyModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/domain/policy/tca/Threshold.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/facade/FacadeModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/facade/tca/AAI.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/facade/tca/TCAFacadeModel.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/facade/tca/TCAVESResponse.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/AnalyticsModelIOUtils.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/AnalyticsModelJsonUtils.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/AnalyticsModelObjectMapperSupplier.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/CommonEventFormatModule.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/TCAControllerConfigModule.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/TCAFacadeModelModule.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/TCAPolicyModule.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/BaseDynamicPropertiesProviderMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/JsonMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/AlertActionMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/AlertTypeMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/BaseCEFModelMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/CommonEventHeaderMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/CriticalityMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/DomainMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/EventListenerMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/EventMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/EventSeverityMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/FieldMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/InternalHeaderFieldsMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/MeasurementsForVfScalingFieldsMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/NamedArrayOfFieldsMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/PerformanceCounterMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/PriorityMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/ThresholdCrossingAlertFieldsMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/VNicUsageArrayMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/config/tca/BaseTCAAppConfigModelMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/config/tca/BaseTCAHandleMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/config/tca/DMAAPInfoMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/config/tca/StreamsPublishesMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/config/tca/StreamsSubscribesMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/config/tca/TCAControllerAppConfigMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/facade/tca/AAIMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/facade/tca/VESCEFMessageResponseMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/BaseTCAPolicyModelMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/ClosedLoopEventStatusMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/ControlLoopSchemaTypeMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/DirectionMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/MetricsPerEventNameMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/TCAPolicyMixin.java delete mode 100644 dcae-analytics-model/src/main/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/ThresholdMixin.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/BaseAnalyticsModelUnitTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/domain/cef/EventSeverityTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/facade/tca/AAITest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAVESResponseTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelIOUtilsTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelJsonUtilsTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/ConfigHolder.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/TestAppConfig.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/json/AnalyticsModelObjectMapperSupplierTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/AlertTypeMixinTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/json/mixin/cef/EventListenerMixinTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/json/mixin/config/tca/TCAControllerAppConfigMixinTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/json/mixin/facade/tca/TCAVESResponseMixinTest.java create mode 100644 dcae-analytics-model/src/test/java/org/onap/dcae/apod/analytics/model/util/json/mixin/policy/tca/TCAPolicyMixinTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/BaseAnalyticsModelUnitTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/domain/cef/EventSeverityTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/facade/tca/AAITest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/facade/tca/TCAVESResponseTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/AnalyticsModelIOUtilsTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/AnalyticsModelJsonUtilsTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/ConfigHolder.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/TestAppConfig.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/json/AnalyticsModelObjectMapperSupplierTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/AlertTypeMixinTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/cef/EventListenerMixinTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/config/tca/TCAControllerAppConfigMixinTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/facade/tca/TCAVESResponseMixinTest.java delete mode 100644 dcae-analytics-model/src/test/java/org/openecomp/dcae/apod/analytics/model/util/json/mixin/policy/tca/TCAPolicyMixinTest.java create mode 100644 dcae-analytics-tca/src/main/java/org/onap/dcae/apod/analytics/tca/processor/AbstractTCAECEFPolicyProcessor.java create mode 100644 dcae-analytics-tca/src/main/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFJsonProcessor.java create mode 100644 dcae-analytics-tca/src/main/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFPolicyDomainFilter.java create mode 100644 dcae-analytics-tca/src/main/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFPolicyEventNameFilter.java create mode 100644 dcae-analytics-tca/src/main/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFPolicyThresholdsProcessor.java create mode 100644 dcae-analytics-tca/src/main/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFProcessorContext.java create mode 100644 dcae-analytics-tca/src/main/java/org/onap/dcae/apod/analytics/tca/utils/TCAUtils.java delete mode 100644 dcae-analytics-tca/src/main/java/org/openecomp/dcae/apod/analytics/tca/processor/AbstractTCAECEFPolicyProcessor.java delete mode 100644 dcae-analytics-tca/src/main/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFJsonProcessor.java delete mode 100644 dcae-analytics-tca/src/main/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFPolicyDomainFilter.java delete mode 100644 dcae-analytics-tca/src/main/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFPolicyEventNameFilter.java delete mode 100644 dcae-analytics-tca/src/main/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFPolicyThresholdsProcessor.java delete mode 100644 dcae-analytics-tca/src/main/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFProcessorContext.java delete mode 100644 dcae-analytics-tca/src/main/java/org/openecomp/dcae/apod/analytics/tca/utils/TCAUtils.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/BaseAnalyticsTCAUnitTest.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/processor/AbstractTCAECEFPolicyProcessorTest.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFJsonProcessorTest.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFPolicyDomainFilterTest.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFPolicyEventNameFilterTest.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFPolicyThresholdsProcessorTest.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/processor/TCACEFProcessorContextTest.java create mode 100644 dcae-analytics-tca/src/test/java/org/onap/dcae/apod/analytics/tca/utils/TCAUtilsTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/BaseAnalyticsTCAUnitTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/processor/AbstractTCAECEFPolicyProcessorTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFJsonProcessorTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFPolicyDomainFilterTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFPolicyEventNameFilterTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFPolicyThresholdsProcessorTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/processor/TCACEFProcessorContextTest.java delete mode 100644 dcae-analytics-tca/src/test/java/org/openecomp/dcae/apod/analytics/tca/utils/TCAUtilsTest.java create mode 100644 dcae-analytics-test/src/main/java/org/onap/dcae/apod/analytics/test/BaseDCAEAnalyticsCommonTest.java create mode 100644 dcae-analytics-test/src/main/java/org/onap/dcae/apod/analytics/test/BaseDCAEAnalyticsIT.java create mode 100644 dcae-analytics-test/src/main/java/org/onap/dcae/apod/analytics/test/BaseDCAEAnalyticsUnitTest.java create mode 100644 dcae-analytics-test/src/main/java/org/onap/dcae/apod/analytics/test/annotation/GuiceModules.java create mode 100644 dcae-analytics-test/src/main/java/org/onap/dcae/apod/analytics/test/runner/GuiceJUnitRunner.java delete mode 100644 dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsCommonTest.java delete mode 100644 dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsIT.java delete mode 100644 dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsUnitTest.java delete mode 100644 dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/annotation/GuiceModules.java delete mode 100644 dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/runner/GuiceJUnitRunner.java diff --git a/.gitignore b/.gitignore index b0cdacc..ff94b20 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ dependency-reduced-pom.xml *_bdio.jsonld blackDuckHubProjectName.txt blackDuckHubProjectVersionName.txt +/bin/ diff --git a/LICENSE.txt b/LICENSE.txt index 69d5fc1..728f803 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -34,7 +34,4 @@ * * ============LICENSE_END============================================ * -* ECOMP is a trademark and service mark of AT&T Intellectual Property. -* */ - diff --git a/README.md b/README.md index 562187e..1f4a0e9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Repository DCAE Analytics Framework Platform Maven GroupId: -------------- -com.att.ecomp.dcae.analytics +org.onap.dcaegen2.analytics.tca Maven Parent ArtifactId: ---------------- diff --git a/cpd-exclude.properties b/cpd-exclude.properties index eb94ed0..636e67b 100644 --- a/cpd-exclude.properties +++ b/cpd-exclude.properties @@ -22,4 +22,4 @@ # List comma separated fully qualified names of classes that can be excluded for CPD (COPY-PASTE-DETECTOR) # Builders for DMaaP MR Configs can have redundant code as they are used as temp place holders for building Immutable # Configs -org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig,org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig +org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig,org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/AAIClientFactory.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/AAIClientFactory.java new file mode 100644 index 0000000..79322ef --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/AAIClientFactory.java @@ -0,0 +1,74 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import org.onap.dcae.apod.analytics.aai.module.AnalyticsAAIModule; +import org.onap.dcae.apod.analytics.aai.service.AAIEnrichmentClient; +import org.onap.dcae.apod.analytics.aai.service.AAIEnrichmentClientFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Factory to create A&AI API Client. + * + * @author Rajiv Singla . Creation Date: 9/18/2017. + */ +public class AAIClientFactory { + + private static final Logger LOG = LoggerFactory.getLogger(AAIClientFactory.class); + + private final Injector injector; + + public AAIClientFactory(final AbstractModule guiceModule) { + LOG.info("Creating instance of AAI Client Factory with Module: {}", guiceModule.getClass().getSimpleName()); + this.injector = Guice.createInjector(guiceModule); + } + + /** + * Creates an instance of {@link AAIEnrichmentClient}. + * + * @param aaiHttpClientConfig A&AI Http Client Config + * + * @return An instance of A&AI Enrichment Client to fetch enrichment details from A&AI API. + */ + public AAIEnrichmentClient getEnrichmentClient(final AAIHttpClientConfig aaiHttpClientConfig) { + LOG.info("Creating instance of A&AI Enrichment Client with A&AI HttpClientConfig: {}", aaiHttpClientConfig); + final AAIEnrichmentClientFactory aaiEnrichmentClientFactory = + injector.getInstance(AAIEnrichmentClientFactory.class); + return aaiEnrichmentClientFactory.create(aaiHttpClientConfig); + } + + + /** + * Static method used to create an instance of {@link AAIClientFactory} itself using default + * guice {@link AnalyticsAAIModule} + * + * @return An instance of AAI Client Factory with {@link AnalyticsAAIModule} guice module configuration + */ + public static AAIClientFactory create() { + return new AAIClientFactory(new AnalyticsAAIModule()); + } + +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java new file mode 100644 index 0000000..4fba3dd --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java @@ -0,0 +1,33 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.domain.config; + +import java.io.Serializable; + +/** + *

+ * Marker interface for all A&AI API Enrichment Configs + *

+ * + * @author Rajiv Singla . Creation Date: 9/14/2017. + */ +public interface AAIEnrichmentConfig extends Serializable { +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java new file mode 100644 index 0000000..3e64364 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java @@ -0,0 +1,131 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.domain.config; + +import com.google.common.base.Objects; + +import java.net.URL; + +/** + * Contains parameters required to create an instance of A&AI Http Client + * + * @author Rajiv Singla . Creation Date: 9/21/2017. + */ +public class AAIHttpClientConfig implements AAIEnrichmentConfig { + + private static final long serialVersionUID = 1L; + + private final String aaiHost; + private final Integer aaiHostPortNumber; + private final String aaiProtocol; + private final String aaiUserName; + private final String aaiUserPassword; + private final URL aaiProxyURL; + private final boolean aaiIgnoreSSLCertificateErrors; + + AAIHttpClientConfig(final String aaiHost, final Integer aaiHostPortNumber, final String aaiProtocol, + final String aaiUserName, final String aaiUserPassword, final URL aaiProxyURL, + final boolean aaiIgnoreSSLCertificateErrors) { + this.aaiHost = aaiHost; + this.aaiHostPortNumber = aaiHostPortNumber; + this.aaiProtocol = aaiProtocol; + this.aaiUserName = aaiUserName; + this.aaiUserPassword = aaiUserPassword; + this.aaiProxyURL = aaiProxyURL; + this.aaiIgnoreSSLCertificateErrors = aaiIgnoreSSLCertificateErrors; + } + + /** + * Provides A&AI Http Client Host + * + * @return A&AI Http Client Host + */ + public String getAaiHost() { + return aaiHost; + } + + /** + * Provides A&AI Http Client Host Port Number + * + * @return A&AI Http Client Host Port Number + */ + public Integer getAaiHostPortNumber() { + return aaiHostPortNumber; + } + + /** + * Provides A&AI Http Client Protocol + * + * @return A&AI Http Client Protocol + */ + public String getAaiProtocol() { + return aaiProtocol; + } + + /** + * Provides A&AI Http Client UserName + * + * @return A&AI Http Client UserName + */ + public String getAaiUserName() { + return aaiUserName; + } + + /** + * Provides A&AI Http Client UserPassword + * + * @return A&AI Http Client UserPassword + */ + public String getAaiUserPassword() { + return aaiUserPassword; + } + + /** + * Returns A&AI Proxy url + * + * @return A&AI Proxy url + */ + public URL getAaiProxyURL() { + return aaiProxyURL; + } + + /** + * Returns true if SSL Certificate errors can be ignored for A&AI Http client + * + * @return true if SSL Certificate errors can be ignored for A&AI Http client + */ + public boolean isAaiIgnoreSSLCertificateErrors() { + return aaiIgnoreSSLCertificateErrors; + } + + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("aaiHost", aaiHost) + .add("aaiHostPortNumber", aaiHostPortNumber) + .add("aaiProtocol", aaiProtocol) + .add("aaiUserName", aaiUserName) + .add("aaiProxyHost", aaiProxyURL == null ? null : aaiProxyURL.getHost()) + .add("aaiIgnoreSSLCertificateErrors", aaiIgnoreSSLCertificateErrors) + .toString(); + } +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java new file mode 100644 index 0000000..ea5d591 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java @@ -0,0 +1,89 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.domain.config; + +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + +import java.io.Serializable; +import java.net.URL; + +/** + * A&AI Http Client Config Builder used to create immutable instance of {@link AAIHttpClientConfig} + * + * @author Rajiv Singla . Creation Date: 9/21/2017. + */ +public class AAIHttpClientConfigBuilder implements Serializable { + + private static final long serialVersionUID = 1L; + + private String aaiHost; + private Integer aaiHostPortNumber; + private String aaiProtocol; + private String aaiUserName; + private String aaiUserPassword; + private URL aaiProxyURL; + private boolean aaiIgnoreSSLCertificateErrors; + + public AAIHttpClientConfigBuilder(final String aaiHost) { + this.aaiHost = aaiHost; + this.aaiHostPortNumber = AnalyticsConstants.DEFAULT_PORT_NUMBER; + this.aaiProtocol = AnalyticsConstants.DEFAULT_PROTOCOL; + this.aaiUserName = AnalyticsConstants.DEFAULT_USER_NAME; + this.aaiUserPassword = AnalyticsConstants.DEFAULT_USER_PASSWORD; + this.aaiIgnoreSSLCertificateErrors = AnalyticsConstants + .TCA_DEFAULT_AAI_ENRICHMENT_IGNORE_SSL_CERTIFICATE_ERRORS; + } + + public AAIHttpClientConfigBuilder setAaiHostPortNumber(final Integer aaiHostPortNumber) { + this.aaiHostPortNumber = aaiHostPortNumber; + return this; + } + + public AAIHttpClientConfigBuilder setAaiProtocol(final String aaiProtocol) { + this.aaiProtocol = aaiProtocol; + return this; + } + + public AAIHttpClientConfigBuilder setAaiUserName(final String aaiUserName) { + this.aaiUserName = aaiUserName; + return this; + } + + public AAIHttpClientConfigBuilder setAaiUserPassword(final String aaiUserPassword) { + this.aaiUserPassword = aaiUserPassword; + return this; + } + + public AAIHttpClientConfigBuilder setAaiProxyURL(final URL aaiProxyURL) { + this.aaiProxyURL = aaiProxyURL; + return this; + } + + public AAIHttpClientConfigBuilder setAaiIgnoreSSLCertificateErrors(final boolean aaiIgnoreSSLCertificateErrors) { + this.aaiIgnoreSSLCertificateErrors = aaiIgnoreSSLCertificateErrors; + return this; + } + + public AAIHttpClientConfig build() { + return new AAIHttpClientConfig(aaiHost, aaiHostPortNumber, aaiProtocol, aaiUserName, aaiUserPassword, + aaiProxyURL, aaiIgnoreSSLCertificateErrors); + } +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java new file mode 100644 index 0000000..dfaf3f3 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java @@ -0,0 +1,54 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.module; + +import com.google.inject.AbstractModule; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.onap.dcae.apod.analytics.aai.service.AAIEnrichmentClient; +import org.onap.dcae.apod.analytics.aai.service.AAIEnrichmentClientFactory; +import org.onap.dcae.apod.analytics.aai.service.AAIEnrichmentClientImpl; +import org.onap.dcae.apod.analytics.aai.service.AAIHttpClient; +import org.onap.dcae.apod.analytics.aai.service.AAIHttpClientFactory; +import org.onap.dcae.apod.analytics.aai.service.AAIHttpClientImpl; + +/** + *

+ * Guice Module to bind concrete implementation of interfaces used in Analytics A&AI API + *

+ * + * @author Rajiv Singla . Creation Date: 9/18/2017. + */ +public class AnalyticsAAIModule extends AbstractModule { + + /** + * Configures A&AI API guice modules + */ + @Override + protected void configure() { + + install(new FactoryModuleBuilder().implement(AAIHttpClient.class, AAIHttpClientImpl.class) + .build(AAIHttpClientFactory.class)); + + install(new FactoryModuleBuilder().implement(AAIEnrichmentClient.class, AAIEnrichmentClientImpl.class) + .build(AAIEnrichmentClientFactory.class)); + + } +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java new file mode 100644 index 0000000..dc2d877 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java @@ -0,0 +1,45 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import java.util.Map; + +/** + *

+ * A client used to get enrichment details from A&AI + *

+ * + * @author Rajiv Singla . Creation Date: 9/15/2017. + */ +public interface AAIEnrichmentClient { + + /** + * Provides enrichment details from A&AI API and returns them as string. If no enrichment lookup fails returns null + * + * @param aaiAPIPath A&AI API Path + * @param queryParams A&AI Query Params map + * @param headers A&AI HTTP Headers + * + * @return Enrichment details from A&AI API and returns them as string. If enrichment lookup fails returns null + */ + String getEnrichmentDetails(String aaiAPIPath, Map queryParams, Map headers); + +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java new file mode 100644 index 0000000..b0fe5b3 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java @@ -0,0 +1,40 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; + +/** + * Factory to initialize instance of {@link AAIEnrichmentClient} for Guice DI injection purposes. + * + * @author Rajiv Singla . Creation Date: 9/19/2017. + */ +public interface AAIEnrichmentClientFactory { + + /** + * Provides an instance of A&AI Enrichment Client used to get details from A&AI API + * + * @param aaiHttpClientConfig A&AI Http Client config used to create A&AI Enrichment client + * + * @return an instance of A&AI Enrichment Client used to get details from A&AI API + */ + AAIEnrichmentClient create(AAIHttpClientConfig aaiHttpClientConfig); +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java new file mode 100644 index 0000000..b154005 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java @@ -0,0 +1,202 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import com.google.common.base.Optional; +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import org.onap.dcae.apod.analytics.common.utils.HTTPUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Iterator; +import java.util.Map; + +import javax.annotation.Nonnull; + + +/** + * A concrete implementation for {@link AAIEnrichmentClient} which uses A&AI REST API to get A&AI Enrichment details + * + * @author Rajiv Singla . Creation Date: 9/18/2017. + */ +public class AAIEnrichmentClientImpl implements AAIEnrichmentClient { + + private static final Logger LOG = LoggerFactory.getLogger(AAIEnrichmentClientImpl.class); + + private final CloseableHttpClient closeableHttpClient; + private final String aaiProtocol; + private final String aaiHost; + private final Integer aaiHostPortNumber; + + @Inject + public AAIEnrichmentClientImpl(@Assisted final AAIHttpClientConfig aaiHttpClientConfig, + final AAIHttpClientFactory aaiHttpClientFactory) { + final AAIHttpClient aaiHttpClient = aaiHttpClientFactory.create(aaiHttpClientConfig); + closeableHttpClient = aaiHttpClient.getAAIHttpClient(); + aaiProtocol = aaiHttpClientConfig.getAaiProtocol(); + aaiHost = aaiHttpClientConfig.getAaiHost(); + aaiHostPortNumber = aaiHttpClientConfig.getAaiHostPortNumber(); + } + + + /** + * Provides enrichment details from A&AI API and returns them as string. If no enrichment lookup fails returns null + * + * @param aaiAPIPath A&AI API Path + * @param queryParams A&AI Query Params map + * @param headers A&AI HTTP Headers + * + * @return Enrichment details from A&AI API and returns them as string. If enrichment lookup fails returns null + */ + @Override + public String getEnrichmentDetails(final String aaiAPIPath, final Map queryParams, + final Map headers) { + + final URI enrichmentURI = + createAAIEnrichmentURI(aaiProtocol, aaiHost, aaiHostPortNumber, aaiAPIPath, queryParams); + + if (enrichmentURI == null) { + return null; + } + + // create new get request + final HttpGet getRequest = new HttpGet(enrichmentURI); + // add http headers + for (Map.Entry headersEntry : headers.entrySet()) { + getRequest.addHeader(headersEntry.getKey(), headersEntry.getValue()); + } + + Optional enrichmentDetails = Optional.absent(); + // execute http get request + try { + enrichmentDetails = closeableHttpClient.execute(getRequest, aaiResponseHandler()); + } catch (IOException ex) { + LOG.error("Failed to get A&AI Enrichment Details for A&AI Enrichment URI: {} A&AI Error: {}", + enrichmentURI, ex); + } + + // return response + if (enrichmentDetails.isPresent()) { + return enrichmentDetails.get(); + } else { + return null; + } + } + + /** + * Create A&AI API Enrichment URI. If invalid URI - null will be returned + * + * @param protocol A&AI API protocol + * @param hostName A&AI API hostname + * @param portNumber A&AI API port number + * @param path A&AI API path + * @param queryParams A&AI API query parameters + * + * @return A&AI API Enrichment URI + */ + private URI createAAIEnrichmentURI(final String protocol, final String hostName, + final Integer portNumber, final String path, + Map queryParams) { + + final URIBuilder uriBuilder = new URIBuilder().setScheme(protocol).setHost(hostName).setPort(portNumber) + .setPath(path); + + // creates custom query string which is not encoded + final String customQuery = createCustomQuery(queryParams); + if (StringUtils.isNoneBlank(customQuery)) { + uriBuilder.setCustomQuery(customQuery); + } + + URI enrichmentURI = null; + try { + enrichmentURI = uriBuilder.build(); + } catch (URISyntaxException e) { + LOG.error("URI Syntax Exception when creating A&AI Enrichment URI. " + + "Protocol: {}, HostName: {}, Port: {}, Path: {}, Custom Query String: {}, Exception: {}", + protocol, hostName, portNumber, path, customQuery, e); + } + + LOG.trace("Created A&AI Enrichment URI: {}", enrichmentURI); + return enrichmentURI; + } + + /** + * Creates Custom Query string to be used for A&AI API URI as A&AI currently does not expect encoded + * query params. + * + * @param queryParams query param map + * + * @return custom query string which does not encode query param values + */ + private static String createCustomQuery(@Nonnull final Map queryParams) { + final StringBuilder queryStringBuilder = new StringBuilder(""); + final Iterator> queryParamIterator = queryParams.entrySet().iterator(); + while (queryParamIterator.hasNext()) { + final Map.Entry queryParamsEntry = queryParamIterator.next(); + queryStringBuilder.append(queryParamsEntry.getKey()); + queryStringBuilder.append("="); + queryStringBuilder.append(queryParamsEntry.getValue()); + if (queryParamIterator.hasNext()) { + queryStringBuilder.append("&"); + } + } + return queryStringBuilder.toString(); + } + + /** + * Response Handler for A&AI Enrichment API + * + * @return Response Handler that + */ + static ResponseHandler> aaiResponseHandler() { + return new ResponseHandler>() { + @Override + public Optional handleResponse(final HttpResponse response) throws IOException { + final int responseCode = response.getStatusLine().getStatusCode(); + final HttpEntity responseEntity = response.getEntity(); + if (HTTPUtils.isSuccessfulResponseCode(responseCode) && null != responseEntity) { + final String aaiResponse = EntityUtils.toString(responseEntity); + return Optional.of(aaiResponse); + } else { + String aaiResponse = responseEntity != null ? EntityUtils.toString(responseEntity) : ""; + LOG.error("Unable to fetch response from A&AI API. A&AI Response Code: {}, " + + "A&AI Response Message: {}", responseCode, aaiResponse); + return Optional.absent(); + } + } + }; + } + +} + diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClient.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClient.java new file mode 100644 index 0000000..3ceff5f --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClient.java @@ -0,0 +1,39 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import org.apache.http.impl.client.CloseableHttpClient; + +/** + * An HTTP Client used to make REST calls to A&AI Enrichment API + * + * @author Rajiv Singla . Creation Date: 9/19/2017. + */ +public interface AAIHttpClient { + + /** + * Provides an instance of {@link CloseableHttpClient} used to make REST calls to A&AI Enrichment API + * + * @return An instance of Closeable HTTP Client used to make A&AI API Rest calls + */ + CloseableHttpClient getAAIHttpClient(); + +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java new file mode 100644 index 0000000..ba04734 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java @@ -0,0 +1,41 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; + +/** + * Factory to initialize instance of {@link AAIHttpClient} for Guice DI injection purposes. + * + * @author Rajiv Singla . Creation Date: 9/22/2017. + */ +public interface AAIHttpClientFactory { + + /** + * Provides an instance of A&AI HTTP Client + * + * @param aaiHttpClientConfig A&AI HTTP Client Config + * + * @return An instance of A&AI HTTP Client + */ + AAIHttpClient create(AAIHttpClientConfig aaiHttpClientConfig); + +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java new file mode 100644 index 0000000..03526ac --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java @@ -0,0 +1,159 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.Credentials; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.DefaultProxyRoutePlanner; +import org.apache.http.ssl.SSLContextBuilder; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import org.onap.dcae.apod.analytics.aai.utils.ssl.AlwaysTrustingTrustStrategy; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; + +/** + *

+ * A concrete implementation of {@link AAIHttpClient} which provides Apache {@link CloseableHttpClient} for + * making rest calls to A&AI Enrichment API. + *

+ * + * @author Rajiv Singla . Creation Date: 9/19/2017. + */ +public class AAIHttpClientImpl implements AAIHttpClient { + + private static final Logger LOG = LoggerFactory.getLogger(AAIHttpClientImpl.class); + + private final AAIHttpClientConfig aaiHttpClientConfig; + + @Inject + public AAIHttpClientImpl(@Assisted final AAIHttpClientConfig aaiHttpClientConfig) { + this.aaiHttpClientConfig = aaiHttpClientConfig; + } + + /** + * Provides an instance of {@link CloseableHttpClient} used to make REST calls to A&AI Enrichment API + * + * @return An instance of Closeable HTTP Client used to make A&AI API Rest calls + */ + @Override + public CloseableHttpClient getAAIHttpClient() { + + final HttpClientBuilder httpClientBuilder = HttpClients.custom().useSystemProperties(); + final boolean aaiIgnoreSSLCertificateErrors = aaiHttpClientConfig.isAaiIgnoreSSLCertificateErrors(); + + // Setup SSL Context to ignore SSL certificate issues if ignoreSSLCertificateErrors is true + LOG.info("SSL Certificate Errors attributed is set to : {}", aaiIgnoreSSLCertificateErrors); + + if (aaiIgnoreSSLCertificateErrors) { + LOG.warn("SSL Certificate Errors will be ignored for this A&AI Http Client Instance"); + try { + SSLContextBuilder sslContextBuilder = new SSLContextBuilder(); + sslContextBuilder.loadTrustMaterial(null, new AlwaysTrustingTrustStrategy()); + httpClientBuilder.setSSLContext(sslContextBuilder.build()); + } catch (NoSuchAlgorithmException e) { + final String errorMessage = "NoSuchAlgorithmException while setting SSL Context for AAI HTTP Client."; + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } catch (KeyStoreException e) { + final String errorMessage = "KeyStoreException while setting SSL Context for AAI HTTP Client."; + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } catch (KeyManagementException e) { + final String errorMessage = "KeyManagementException while setting SSL Context for AAI HTTP Client."; + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); + + } else { + LOG.info("SSL Certification Errors will be enforced for A&AI Http Client instance"); + } + + // Setup credentials and proxy + final String aaiUserName = aaiHttpClientConfig.getAaiUserName(); + + final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + + if (aaiUserName != null) { + final String aaiHost = aaiHttpClientConfig.getAaiHost(); + final Integer aaiHostPortNumber = aaiHttpClientConfig.getAaiHostPortNumber(); + final String aaiUserPassword = aaiHttpClientConfig.getAaiUserPassword(); + LOG.info("Setting A&AI host credentials for AAI Host: {}", aaiHost); + final AuthScope aaiHostPortAuthScope = new AuthScope(aaiHost, aaiHostPortNumber); + final Credentials aaiCredentials = new UsernamePasswordCredentials(aaiUserName, aaiUserPassword); + credentialsProvider.setCredentials(aaiHostPortAuthScope, aaiCredentials); + } else { + LOG.warn("A&AI userName not present. No credentials set for A&AI authentication"); + } + + final URL aaiProxyURL = aaiHttpClientConfig.getAaiProxyURL(); + + if (aaiProxyURL != null) { + final String aaiProxyHost = aaiProxyURL.getHost(); + final Integer aaiProxyPortNumber = aaiProxyURL.getPort(); + final String aaiProxyProtocol = aaiProxyURL.getProtocol(); + final HttpHost proxy = new HttpHost(aaiProxyHost, aaiProxyPortNumber, aaiProxyProtocol); + LOG.info("Setting A&AI Http Client default proxy as: {}", proxy); + final DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); + httpClientBuilder.setRoutePlanner(routePlanner); + + final String userInfo = aaiProxyURL.getUserInfo(); + if (StringUtils.isNotBlank(userInfo)) { + final String[] userInfoArray = userInfo.split(":"); + final String aaiProxyUsername = userInfoArray[0]; + String aaiProxyPassword = null; + if (userInfoArray.length > 1) { + aaiProxyPassword = userInfoArray[1]; + } + LOG.info("Setting A&AI Http Client proxy credentials with username: {}", aaiProxyUsername); + final AuthScope aaiProxyAuthScope = new AuthScope(aaiProxyHost, aaiProxyPortNumber); + final Credentials aaiProxyCredentials = new UsernamePasswordCredentials(aaiProxyUsername, + aaiProxyPassword); + credentialsProvider.setCredentials(aaiProxyAuthScope, aaiProxyCredentials); + } else { + LOG.debug("NO A&AI Proxy Username present.Bypassing setting up A&AI Proxy authentication credentials"); + } + } else { + LOG.debug("A&AI proxy not Enabled - bypassing setting A&AI Proxy settings"); + } + + // setup credentials provider + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + + return httpClientBuilder.build(); + } + +} diff --git a/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java new file mode 100644 index 0000000..1898412 --- /dev/null +++ b/dcae-analytics-aai/src/main/java/org/onap/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java @@ -0,0 +1,55 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.utils.ssl; + +import org.apache.http.ssl.TrustStrategy; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +/** + * An implementation of SSL Trust Strategy which does no SSL certificate validation effectively + * bypassing any SSL certificate related issues + * + * @author Rajiv Singla . Creation Date: 9/19/2017. + */ +public class AlwaysTrustingTrustStrategy implements TrustStrategy { + /** + * Determines whether the certificate chain can be trusted without consulting the trust manager + * configured in the actual SSL context. This method can be used to override the standard JSSE + * certificate verification process. + *

+ * Please note that, if this method returns {@code false}, the trust manager configured + * in the actual SSL context can still clear the certificate as trusted. + * + * @param chain the peer certificate chain + * @param authType the authentication type based on the client certificate + * + * @return {@code true} if the certificate can be trusted without verification by + * the trust manager, {@code false} otherwise. + * + * @throws CertificateException thrown if the certificate is not trusted or invalid. + */ + @Override + public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { + return true; + } +} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/AAIClientFactory.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/AAIClientFactory.java deleted file mode 100644 index 0a8d4ca..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/AAIClientFactory.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai; - -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import org.openecomp.dcae.apod.analytics.aai.module.AnalyticsAAIModule; -import org.openecomp.dcae.apod.analytics.aai.service.AAIEnrichmentClient; -import org.openecomp.dcae.apod.analytics.aai.service.AAIEnrichmentClientFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Factory to create A&AI API Client. - * - * @author Rajiv Singla . Creation Date: 9/18/2017. - */ -public class AAIClientFactory { - - private static final Logger LOG = LoggerFactory.getLogger(AAIClientFactory.class); - - private final Injector injector; - - public AAIClientFactory(final AbstractModule guiceModule) { - LOG.info("Creating instance of AAI Client Factory with Module: {}", guiceModule.getClass().getSimpleName()); - this.injector = Guice.createInjector(guiceModule); - } - - /** - * Creates an instance of {@link AAIEnrichmentClient}. - * - * @param aaiHttpClientConfig A&AI Http Client Config - * - * @return An instance of A&AI Enrichment Client to fetch enrichment details from A&AI API. - */ - public AAIEnrichmentClient getEnrichmentClient(final AAIHttpClientConfig aaiHttpClientConfig) { - LOG.info("Creating instance of A&AI Enrichment Client with A&AI HttpClientConfig: {}", aaiHttpClientConfig); - final AAIEnrichmentClientFactory aaiEnrichmentClientFactory = - injector.getInstance(AAIEnrichmentClientFactory.class); - return aaiEnrichmentClientFactory.create(aaiHttpClientConfig); - } - - - /** - * Static method used to create an instance of {@link AAIClientFactory} itself using default - * guice {@link AnalyticsAAIModule} - * - * @return An instance of AAI Client Factory with {@link AnalyticsAAIModule} guice module configuration - */ - public static AAIClientFactory create() { - return new AAIClientFactory(new AnalyticsAAIModule()); - } - -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java deleted file mode 100644 index 19c284f..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIEnrichmentConfig.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.domain.config; - -import java.io.Serializable; - -/** - *

- * Marker interface for all A&AI API Enrichment Configs - *

- * - * @author Rajiv Singla . Creation Date: 9/14/2017. - */ -public interface AAIEnrichmentConfig extends Serializable { -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java deleted file mode 100644 index 37190a0..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfig.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.domain.config; - -import com.google.common.base.Objects; - -import java.net.URL; - -/** - * Contains parameters required to create an instance of A&AI Http Client - * - * @author Rajiv Singla . Creation Date: 9/21/2017. - */ -public class AAIHttpClientConfig implements AAIEnrichmentConfig { - - private static final long serialVersionUID = 1L; - - private final String aaiHost; - private final Integer aaiHostPortNumber; - private final String aaiProtocol; - private final String aaiUserName; - private final String aaiUserPassword; - private final URL aaiProxyURL; - private final boolean aaiIgnoreSSLCertificateErrors; - - AAIHttpClientConfig(final String aaiHost, final Integer aaiHostPortNumber, final String aaiProtocol, - final String aaiUserName, final String aaiUserPassword, final URL aaiProxyURL, - final boolean aaiIgnoreSSLCertificateErrors) { - this.aaiHost = aaiHost; - this.aaiHostPortNumber = aaiHostPortNumber; - this.aaiProtocol = aaiProtocol; - this.aaiUserName = aaiUserName; - this.aaiUserPassword = aaiUserPassword; - this.aaiProxyURL = aaiProxyURL; - this.aaiIgnoreSSLCertificateErrors = aaiIgnoreSSLCertificateErrors; - } - - /** - * Provides A&AI Http Client Host - * - * @return A&AI Http Client Host - */ - public String getAaiHost() { - return aaiHost; - } - - /** - * Provides A&AI Http Client Host Port Number - * - * @return A&AI Http Client Host Port Number - */ - public Integer getAaiHostPortNumber() { - return aaiHostPortNumber; - } - - /** - * Provides A&AI Http Client Protocol - * - * @return A&AI Http Client Protocol - */ - public String getAaiProtocol() { - return aaiProtocol; - } - - /** - * Provides A&AI Http Client UserName - * - * @return A&AI Http Client UserName - */ - public String getAaiUserName() { - return aaiUserName; - } - - /** - * Provides A&AI Http Client UserPassword - * - * @return A&AI Http Client UserPassword - */ - public String getAaiUserPassword() { - return aaiUserPassword; - } - - /** - * Returns A&AI Proxy url - * - * @return A&AI Proxy url - */ - public URL getAaiProxyURL() { - return aaiProxyURL; - } - - /** - * Returns true if SSL Certificate errors can be ignored for A&AI Http client - * - * @return true if SSL Certificate errors can be ignored for A&AI Http client - */ - public boolean isAaiIgnoreSSLCertificateErrors() { - return aaiIgnoreSSLCertificateErrors; - } - - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("aaiHost", aaiHost) - .add("aaiHostPortNumber", aaiHostPortNumber) - .add("aaiProtocol", aaiProtocol) - .add("aaiUserName", aaiUserName) - .add("aaiProxyHost", aaiProxyURL == null ? null : aaiProxyURL.getHost()) - .add("aaiIgnoreSSLCertificateErrors", aaiIgnoreSSLCertificateErrors) - .toString(); - } -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java deleted file mode 100644 index 3df0050..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/domain/config/AAIHttpClientConfigBuilder.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.domain.config; - -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - -import java.io.Serializable; -import java.net.URL; - -/** - * A&AI Http Client Config Builder used to create immutable instance of {@link AAIHttpClientConfig} - * - * @author Rajiv Singla . Creation Date: 9/21/2017. - */ -public class AAIHttpClientConfigBuilder implements Serializable { - - private static final long serialVersionUID = 1L; - - private String aaiHost; - private Integer aaiHostPortNumber; - private String aaiProtocol; - private String aaiUserName; - private String aaiUserPassword; - private URL aaiProxyURL; - private boolean aaiIgnoreSSLCertificateErrors; - - public AAIHttpClientConfigBuilder(final String aaiHost) { - this.aaiHost = aaiHost; - this.aaiHostPortNumber = AnalyticsConstants.DEFAULT_PORT_NUMBER; - this.aaiProtocol = AnalyticsConstants.DEFAULT_PROTOCOL; - this.aaiUserName = AnalyticsConstants.DEFAULT_USER_NAME; - this.aaiUserPassword = AnalyticsConstants.DEFAULT_USER_PASSWORD; - this.aaiIgnoreSSLCertificateErrors = AnalyticsConstants - .TCA_DEFAULT_AAI_ENRICHMENT_IGNORE_SSL_CERTIFICATE_ERRORS; - } - - public AAIHttpClientConfigBuilder setAaiHostPortNumber(final Integer aaiHostPortNumber) { - this.aaiHostPortNumber = aaiHostPortNumber; - return this; - } - - public AAIHttpClientConfigBuilder setAaiProtocol(final String aaiProtocol) { - this.aaiProtocol = aaiProtocol; - return this; - } - - public AAIHttpClientConfigBuilder setAaiUserName(final String aaiUserName) { - this.aaiUserName = aaiUserName; - return this; - } - - public AAIHttpClientConfigBuilder setAaiUserPassword(final String aaiUserPassword) { - this.aaiUserPassword = aaiUserPassword; - return this; - } - - public AAIHttpClientConfigBuilder setAaiProxyURL(final URL aaiProxyURL) { - this.aaiProxyURL = aaiProxyURL; - return this; - } - - public AAIHttpClientConfigBuilder setAaiIgnoreSSLCertificateErrors(final boolean aaiIgnoreSSLCertificateErrors) { - this.aaiIgnoreSSLCertificateErrors = aaiIgnoreSSLCertificateErrors; - return this; - } - - public AAIHttpClientConfig build() { - return new AAIHttpClientConfig(aaiHost, aaiHostPortNumber, aaiProtocol, aaiUserName, aaiUserPassword, - aaiProxyURL, aaiIgnoreSSLCertificateErrors); - } -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java deleted file mode 100644 index 9074798..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/module/AnalyticsAAIModule.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.module; - -import com.google.inject.AbstractModule; -import com.google.inject.assistedinject.FactoryModuleBuilder; -import org.openecomp.dcae.apod.analytics.aai.service.AAIEnrichmentClient; -import org.openecomp.dcae.apod.analytics.aai.service.AAIEnrichmentClientFactory; -import org.openecomp.dcae.apod.analytics.aai.service.AAIEnrichmentClientImpl; -import org.openecomp.dcae.apod.analytics.aai.service.AAIHttpClient; -import org.openecomp.dcae.apod.analytics.aai.service.AAIHttpClientFactory; -import org.openecomp.dcae.apod.analytics.aai.service.AAIHttpClientImpl; - -/** - *

- * Guice Module to bind concrete implementation of interfaces used in Analytics A&AI API - *

- * - * @author Rajiv Singla . Creation Date: 9/18/2017. - */ -public class AnalyticsAAIModule extends AbstractModule { - - /** - * Configures A&AI API guice modules - */ - @Override - protected void configure() { - - install(new FactoryModuleBuilder().implement(AAIHttpClient.class, AAIHttpClientImpl.class) - .build(AAIHttpClientFactory.class)); - - install(new FactoryModuleBuilder().implement(AAIEnrichmentClient.class, AAIEnrichmentClientImpl.class) - .build(AAIEnrichmentClientFactory.class)); - - } -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java deleted file mode 100644 index 8813cdf..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClient.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import java.util.Map; - -/** - *

- * A client used to get enrichment details from A&AI - *

- * - * @author Rajiv Singla . Creation Date: 9/15/2017. - */ -public interface AAIEnrichmentClient { - - /** - * Provides enrichment details from A&AI API and returns them as string. If no enrichment lookup fails returns null - * - * @param aaiAPIPath A&AI API Path - * @param queryParams A&AI Query Params map - * @param headers A&AI HTTP Headers - * - * @return Enrichment details from A&AI API and returns them as string. If enrichment lookup fails returns null - */ - String getEnrichmentDetails(String aaiAPIPath, Map queryParams, Map headers); - -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java deleted file mode 100644 index bd4a4f2..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; - -/** - * Factory to initialize instance of {@link AAIEnrichmentClient} for Guice DI injection purposes. - * - * @author Rajiv Singla . Creation Date: 9/19/2017. - */ -public interface AAIEnrichmentClientFactory { - - /** - * Provides an instance of A&AI Enrichment Client used to get details from A&AI API - * - * @param aaiHttpClientConfig A&AI Http Client config used to create A&AI Enrichment client - * - * @return an instance of A&AI Enrichment Client used to get details from A&AI API - */ - AAIEnrichmentClient create(AAIHttpClientConfig aaiHttpClientConfig); -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java deleted file mode 100644 index 229ab17..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImpl.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import com.google.common.base.Optional; -import com.google.inject.Inject; -import com.google.inject.assistedinject.Assisted; -import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.util.EntityUtils; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Iterator; -import java.util.Map; - -import javax.annotation.Nonnull; - - -/** - * A concrete implementation for {@link AAIEnrichmentClient} which uses A&AI REST API to get A&AI Enrichment details - * - * @author Rajiv Singla . Creation Date: 9/18/2017. - */ -public class AAIEnrichmentClientImpl implements AAIEnrichmentClient { - - private static final Logger LOG = LoggerFactory.getLogger(AAIEnrichmentClientImpl.class); - - private final CloseableHttpClient closeableHttpClient; - private final String aaiProtocol; - private final String aaiHost; - private final Integer aaiHostPortNumber; - - @Inject - public AAIEnrichmentClientImpl(@Assisted final AAIHttpClientConfig aaiHttpClientConfig, - final AAIHttpClientFactory aaiHttpClientFactory) { - final AAIHttpClient aaiHttpClient = aaiHttpClientFactory.create(aaiHttpClientConfig); - closeableHttpClient = aaiHttpClient.getAAIHttpClient(); - aaiProtocol = aaiHttpClientConfig.getAaiProtocol(); - aaiHost = aaiHttpClientConfig.getAaiHost(); - aaiHostPortNumber = aaiHttpClientConfig.getAaiHostPortNumber(); - } - - - /** - * Provides enrichment details from A&AI API and returns them as string. If no enrichment lookup fails returns null - * - * @param aaiAPIPath A&AI API Path - * @param queryParams A&AI Query Params map - * @param headers A&AI HTTP Headers - * - * @return Enrichment details from A&AI API and returns them as string. If enrichment lookup fails returns null - */ - @Override - public String getEnrichmentDetails(final String aaiAPIPath, final Map queryParams, - final Map headers) { - - final URI enrichmentURI = - createAAIEnrichmentURI(aaiProtocol, aaiHost, aaiHostPortNumber, aaiAPIPath, queryParams); - - if (enrichmentURI == null) { - return null; - } - - // create new get request - final HttpGet getRequest = new HttpGet(enrichmentURI); - // add http headers - for (Map.Entry headersEntry : headers.entrySet()) { - getRequest.addHeader(headersEntry.getKey(), headersEntry.getValue()); - } - - Optional enrichmentDetails = Optional.absent(); - // execute http get request - try { - enrichmentDetails = closeableHttpClient.execute(getRequest, aaiResponseHandler()); - } catch (IOException ex) { - LOG.error("Failed to get A&AI Enrichment Details for A&AI Enrichment URI: {} A&AI Error: {}", - enrichmentURI, ex); - } - - // return response - if (enrichmentDetails.isPresent()) { - return enrichmentDetails.get(); - } else { - return null; - } - } - - /** - * Create A&AI API Enrichment URI. If invalid URI - null will be returned - * - * @param protocol A&AI API protocol - * @param hostName A&AI API hostname - * @param portNumber A&AI API port number - * @param path A&AI API path - * @param queryParams A&AI API query parameters - * - * @return A&AI API Enrichment URI - */ - private URI createAAIEnrichmentURI(final String protocol, final String hostName, - final Integer portNumber, final String path, - Map queryParams) { - - final URIBuilder uriBuilder = new URIBuilder().setScheme(protocol).setHost(hostName).setPort(portNumber) - .setPath(path); - - // creates custom query string which is not encoded - final String customQuery = createCustomQuery(queryParams); - if (StringUtils.isNoneBlank(customQuery)) { - uriBuilder.setCustomQuery(customQuery); - } - - URI enrichmentURI = null; - try { - enrichmentURI = uriBuilder.build(); - } catch (URISyntaxException e) { - LOG.error("URI Syntax Exception when creating A&AI Enrichment URI. " + - "Protocol: {}, HostName: {}, Port: {}, Path: {}, Custom Query String: {}, Exception: {}", - protocol, hostName, portNumber, path, customQuery, e); - } - - LOG.trace("Created A&AI Enrichment URI: {}", enrichmentURI); - return enrichmentURI; - } - - /** - * Creates Custom Query string to be used for A&AI API URI as A&AI currently does not expect encoded - * query params. - * - * @param queryParams query param map - * - * @return custom query string which does not encode query param values - */ - private static String createCustomQuery(@Nonnull final Map queryParams) { - final StringBuilder queryStringBuilder = new StringBuilder(""); - final Iterator> queryParamIterator = queryParams.entrySet().iterator(); - while (queryParamIterator.hasNext()) { - final Map.Entry queryParamsEntry = queryParamIterator.next(); - queryStringBuilder.append(queryParamsEntry.getKey()); - queryStringBuilder.append("="); - queryStringBuilder.append(queryParamsEntry.getValue()); - if (queryParamIterator.hasNext()) { - queryStringBuilder.append("&"); - } - } - return queryStringBuilder.toString(); - } - - /** - * Response Handler for A&AI Enrichment API - * - * @return Response Handler that - */ - static ResponseHandler> aaiResponseHandler() { - return new ResponseHandler>() { - @Override - public Optional handleResponse(final HttpResponse response) throws IOException { - final int responseCode = response.getStatusLine().getStatusCode(); - final HttpEntity responseEntity = response.getEntity(); - if (HTTPUtils.isSuccessfulResponseCode(responseCode) && null != responseEntity) { - final String aaiResponse = EntityUtils.toString(responseEntity); - return Optional.of(aaiResponse); - } else { - String aaiResponse = responseEntity != null ? EntityUtils.toString(responseEntity) : ""; - LOG.error("Unable to fetch response from A&AI API. A&AI Response Code: {}, " + - "A&AI Response Message: {}", responseCode, aaiResponse); - return Optional.absent(); - } - } - }; - } - -} - diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClient.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClient.java deleted file mode 100644 index a4adad9..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClient.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import org.apache.http.impl.client.CloseableHttpClient; - -/** - * An HTTP Client used to make REST calls to A&AI Enrichment API - * - * @author Rajiv Singla . Creation Date: 9/19/2017. - */ -public interface AAIHttpClient { - - /** - * Provides an instance of {@link CloseableHttpClient} used to make REST calls to A&AI Enrichment API - * - * @return An instance of Closeable HTTP Client used to make A&AI API Rest calls - */ - CloseableHttpClient getAAIHttpClient(); - -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java deleted file mode 100644 index e977639..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; - -/** - * Factory to initialize instance of {@link AAIHttpClient} for Guice DI injection purposes. - * - * @author Rajiv Singla . Creation Date: 9/22/2017. - */ -public interface AAIHttpClientFactory { - - /** - * Provides an instance of A&AI HTTP Client - * - * @param aaiHttpClientConfig A&AI HTTP Client Config - * - * @return An instance of A&AI HTTP Client - */ - AAIHttpClient create(AAIHttpClientConfig aaiHttpClientConfig); - -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java deleted file mode 100644 index 34631b1..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImpl.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import com.google.inject.Inject; -import com.google.inject.assistedinject.Assisted; -import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.Credentials; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.DefaultProxyRoutePlanner; -import org.apache.http.ssl.SSLContextBuilder; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import org.openecomp.dcae.apod.analytics.aai.utils.ssl.AlwaysTrustingTrustStrategy; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.net.URL; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; - -/** - *

- * A concrete implementation of {@link AAIHttpClient} which provides Apache {@link CloseableHttpClient} for - * making rest calls to A&AI Enrichment API. - *

- * - * @author Rajiv Singla . Creation Date: 9/19/2017. - */ -public class AAIHttpClientImpl implements AAIHttpClient { - - private static final Logger LOG = LoggerFactory.getLogger(AAIHttpClientImpl.class); - - private final AAIHttpClientConfig aaiHttpClientConfig; - - @Inject - public AAIHttpClientImpl(@Assisted final AAIHttpClientConfig aaiHttpClientConfig) { - this.aaiHttpClientConfig = aaiHttpClientConfig; - } - - /** - * Provides an instance of {@link CloseableHttpClient} used to make REST calls to A&AI Enrichment API - * - * @return An instance of Closeable HTTP Client used to make A&AI API Rest calls - */ - @Override - public CloseableHttpClient getAAIHttpClient() { - - final HttpClientBuilder httpClientBuilder = HttpClients.custom().useSystemProperties(); - final boolean aaiIgnoreSSLCertificateErrors = aaiHttpClientConfig.isAaiIgnoreSSLCertificateErrors(); - - // Setup SSL Context to ignore SSL certificate issues if ignoreSSLCertificateErrors is true - LOG.info("SSL Certificate Errors attributed is set to : {}", aaiIgnoreSSLCertificateErrors); - - if (aaiIgnoreSSLCertificateErrors) { - LOG.warn("SSL Certificate Errors will be ignored for this A&AI Http Client Instance"); - try { - SSLContextBuilder sslContextBuilder = new SSLContextBuilder(); - sslContextBuilder.loadTrustMaterial(null, new AlwaysTrustingTrustStrategy()); - httpClientBuilder.setSSLContext(sslContextBuilder.build()); - } catch (NoSuchAlgorithmException e) { - final String errorMessage = "NoSuchAlgorithmException while setting SSL Context for AAI HTTP Client."; - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } catch (KeyStoreException e) { - final String errorMessage = "KeyStoreException while setting SSL Context for AAI HTTP Client."; - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } catch (KeyManagementException e) { - final String errorMessage = "KeyManagementException while setting SSL Context for AAI HTTP Client."; - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); - - } else { - LOG.info("SSL Certification Errors will be enforced for A&AI Http Client instance"); - } - - // Setup credentials and proxy - final String aaiUserName = aaiHttpClientConfig.getAaiUserName(); - - final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - - if (aaiUserName != null) { - final String aaiHost = aaiHttpClientConfig.getAaiHost(); - final Integer aaiHostPortNumber = aaiHttpClientConfig.getAaiHostPortNumber(); - final String aaiUserPassword = aaiHttpClientConfig.getAaiUserPassword(); - LOG.info("Setting A&AI host credentials for AAI Host: {}", aaiHost); - final AuthScope aaiHostPortAuthScope = new AuthScope(aaiHost, aaiHostPortNumber); - final Credentials aaiCredentials = new UsernamePasswordCredentials(aaiUserName, aaiUserPassword); - credentialsProvider.setCredentials(aaiHostPortAuthScope, aaiCredentials); - } else { - LOG.warn("A&AI userName not present. No credentials set for A&AI authentication"); - } - - final URL aaiProxyURL = aaiHttpClientConfig.getAaiProxyURL(); - - if (aaiProxyURL != null) { - final String aaiProxyHost = aaiProxyURL.getHost(); - final Integer aaiProxyPortNumber = aaiProxyURL.getPort(); - final String aaiProxyProtocol = aaiProxyURL.getProtocol(); - final HttpHost proxy = new HttpHost(aaiProxyHost, aaiProxyPortNumber, aaiProxyProtocol); - LOG.info("Setting A&AI Http Client default proxy as: {}", proxy); - final DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); - httpClientBuilder.setRoutePlanner(routePlanner); - - final String userInfo = aaiProxyURL.getUserInfo(); - if (StringUtils.isNotBlank(userInfo)) { - final String[] userInfoArray = userInfo.split(":"); - final String aaiProxyUsername = userInfoArray[0]; - String aaiProxyPassword = null; - if (userInfoArray.length > 1) { - aaiProxyPassword = userInfoArray[1]; - } - LOG.info("Setting A&AI Http Client proxy credentials with username: {}", aaiProxyUsername); - final AuthScope aaiProxyAuthScope = new AuthScope(aaiProxyHost, aaiProxyPortNumber); - final Credentials aaiProxyCredentials = new UsernamePasswordCredentials(aaiProxyUsername, - aaiProxyPassword); - credentialsProvider.setCredentials(aaiProxyAuthScope, aaiProxyCredentials); - } else { - LOG.debug("NO A&AI Proxy Username present.Bypassing setting up A&AI Proxy authentication credentials"); - } - } else { - LOG.debug("A&AI proxy not Enabled - bypassing setting A&AI Proxy settings"); - } - - // setup credentials provider - httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); - - return httpClientBuilder.build(); - } - -} diff --git a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java b/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java deleted file mode 100644 index b11680b..0000000 --- a/dcae-analytics-aai/src/main/java/org/openecomp/dcae/apod/analytics/aai/utils/ssl/AlwaysTrustingTrustStrategy.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.utils.ssl; - -import org.apache.http.ssl.TrustStrategy; - -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -/** - * An implementation of SSL Trust Strategy which does no SSL certificate validation effectively - * bypassing any SSL certificate related issues - * - * @author Rajiv Singla . Creation Date: 9/19/2017. - */ -public class AlwaysTrustingTrustStrategy implements TrustStrategy { - /** - * Determines whether the certificate chain can be trusted without consulting the trust manager - * configured in the actual SSL context. This method can be used to override the standard JSSE - * certificate verification process. - *

- * Please note that, if this method returns {@code false}, the trust manager configured - * in the actual SSL context can still clear the certificate as trusted. - * - * @param chain the peer certificate chain - * @param authType the authentication type based on the client certificate - * - * @return {@code true} if the certificate can be trusted without verification by - * the trust manager, {@code false} otherwise. - * - * @throws CertificateException thrown if the certificate is not trusted or invalid. - */ - @Override - public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { - return true; - } -} diff --git a/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java new file mode 100644 index 0000000..bf48fed --- /dev/null +++ b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java @@ -0,0 +1,31 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai; + +import org.junit.runner.RunWith; +import org.onap.dcae.apod.analytics.test.runner.GuiceJUnitRunner; + +/** + * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +@RunWith(GuiceJUnitRunner.class) +public abstract class BaseAnalyticsAAIGuiceUnitTest extends BaseAnalyticsAAIUnitTest { +} diff --git a/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java new file mode 100644 index 0000000..61fe227 --- /dev/null +++ b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java @@ -0,0 +1,83 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai; + +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfigBuilder; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author Rajiv Singla . Creation Date: 9/18/2017. + */ +public class BaseAnalyticsAAIUnitTest extends BaseDCAEAnalyticsUnitTest { + + protected static final String AAI_HOST_NAME = "1.2.3.4"; + protected static final Integer AAI_HOST_PORT_NUMBER = 1234; + protected static final String AAI_HOST_PROTOCOL = "https"; + protected static final String AAI_VNF_ENRICHMENT_PATH = "/aai/v11/network/generic-vnfs/generic-vnf"; + protected static final String AAI_VSERVER_NODE_QUERY_PATH = "/aai/v11/search/nodes-query"; + protected static final String AAI_VSERVER_QUERY_RESPONSE_LOCATION = "data/json/aai/aai_vserver_resource_data.json"; + + protected static final Map AAI_HEADERS = new LinkedHashMap<>(); + + static { + AAI_HEADERS.put("X-FromAppId", "vv-temp"); + AAI_HEADERS.put("X-TransactionId", "vv-temp"); + AAI_HEADERS.put("Accept", "application/json"); + AAI_HEADERS.put("Real-Time", "true"); + AAI_HEADERS.put("Content-Type", "application/json"); + } + + protected static final String PROXY_HOST = "proxy.att.com"; + protected static final Integer PROXY_PORT = 80; + protected static final String PROXY_URL = String.format("http://username:password@%s:%s", PROXY_HOST, PROXY_PORT); + + protected static final String AAI_USER_NAME = "DCAE"; + protected static final String AAI_USER_PASSWORD = "DCAE"; + protected static final boolean IGNORE_SSL_CERTIFICATE_ERRORS = true; + + protected AAIHttpClientConfig getAAIHttpClientTestConfig(final boolean ignoreSSLCertificateErrors, + final String proxyURLString) { + URL proxyURL; + if (proxyURLString != null) { + try { + proxyURL = new URL(proxyURLString); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Proxy URL format is Invalid", e); + } + } else { + proxyURL = null; + } + return new AAIHttpClientConfigBuilder(AAI_HOST_NAME) + .setAaiProtocol(AAI_HOST_PROTOCOL) + .setAaiHostPortNumber(AAI_HOST_PORT_NUMBER) + .setAaiUserName(AAI_USER_NAME) + .setAaiUserPassword(AAI_USER_PASSWORD) + .setAaiProxyURL(proxyURL) + .setAaiIgnoreSSLCertificateErrors(ignoreSSLCertificateErrors).build(); + } + +} diff --git a/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java new file mode 100644 index 0000000..3ec7d14 --- /dev/null +++ b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java @@ -0,0 +1,81 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.it; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableMap; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.onap.dcae.apod.analytics.aai.AAIClientFactory; +import org.onap.dcae.apod.analytics.aai.service.AAIEnrichmentClient; + +import java.util.Collections; +import java.util.Map; + +/** + * @author Rajiv Singla . Creation Date: 9/19/2017. + */ +@Ignore +public class AAIClientFactoryIT extends BaseAnalyticsAAIIT { + + private AAIEnrichmentClient enrichmentClient; + + @Before + public void before() { + enrichmentClient = AAIClientFactory.create().getEnrichmentClient(getAAIHttpClientConfig()); + } + + @Test + public void testGetEnrichmentClientForVNF() throws Exception { + final String vnfName = "vCPEInfraVNF13"; + Map queryParams = ImmutableMap.of("vnf-name", vnfName); + final String vCPEInfraVNF13 = + enrichmentClient.getEnrichmentDetails(AAI_VNF_ENRICHMENT_PATH, queryParams, AAI_HEADERS); + LOG.info("Fetched VNF A&AI Enrichment Response: \n{}", vCPEInfraVNF13); + + } + + @Test + public void testGetVServerObjectResourceLink() throws Exception { + final String vServerName = "example-vserver-name-val-2"; + Map queryParams = ImmutableMap.of("search-node-type", "vserver", "filter", + "vserver-name:EQUALS:" + vServerName); + final String serverResourceLink = + enrichmentClient.getEnrichmentDetails(AAI_VSERVER_NODE_QUERY_PATH, queryParams, AAI_HEADERS); + + LOG.info("Fetched Vserver Object Resource Link A&AI Enrichment Response: \n{}", serverResourceLink); + + } + + @Test + public void testGetVServerEnrichmentDetails() throws Exception { + final String serverResourceLink = fromStream(AAI_VSERVER_QUERY_RESPONSE_LOCATION); + final ObjectMapper objectMapper = new ObjectMapper(); + final JsonNode jsonNode = objectMapper.readTree(serverResourceLink); + final String resourceLink = jsonNode.findPath("resource-link").asText(); + final String vServerEnrichmentDetails = + enrichmentClient.getEnrichmentDetails(resourceLink, Collections.emptyMap(), + AAI_HEADERS); + LOG.info("Fetched Vserver enrichment details: \n{}", vServerEnrichmentDetails); + } +} diff --git a/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java new file mode 100644 index 0000000..fbc6cd4 --- /dev/null +++ b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java @@ -0,0 +1,76 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.it; + +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfigBuilder; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author Rajiv Singla . Creation Date: 9/18/2017. + */ +public abstract class BaseAnalyticsAAIIT extends BaseDCAEAnalyticsIT { + + protected static final String AAI_HOST_NAME = "1.2.3.4"; + protected static final Integer AAI_HOST_PORT_NUMBER = 1234; + protected static final String AAI_HOST_PROTOCOL = "https"; + protected static final String AAI_VNF_ENRICHMENT_PATH = "/aai/v11/network/generic-vnfs/generic-vnf"; + protected static final String AAI_VSERVER_NODE_QUERY_PATH = "/aai/v11/search/nodes-query"; + protected static final Map AAI_HEADERS = new LinkedHashMap<>(); + + + protected static final String AAI_VSERVER_QUERY_RESPONSE_LOCATION = "data/json/aai/aai_vserver_resource_data.json"; + + static { + AAI_HEADERS.put("X-FromAppId", "vv-temp"); + AAI_HEADERS.put("X-TransactionId", "vv-temp"); + AAI_HEADERS.put("Accept", "application/json"); + AAI_HEADERS.put("Real-Time", "true"); + AAI_HEADERS.put("Content-Type", "application/json"); + } + + protected static final String AAI_USER_NAME = "DCAE"; + protected static final String AAI_USER_PASSWORD = "DCAE"; + protected static final boolean IGNORE_SSL_CERTIFICATE_ERRORS = true; + + + protected AAIHttpClientConfig getAAIHttpClientConfig() { + try { + URL proxyURL = new URL("http://username:password@proxy.att.com:80"); + return new AAIHttpClientConfigBuilder(AAI_HOST_NAME) + .setAaiProtocol(AAI_HOST_PROTOCOL) + .setAaiHostPortNumber(AAI_HOST_PORT_NUMBER) + .setAaiUserName(AAI_USER_NAME) + .setAaiUserPassword(AAI_USER_PASSWORD) + .setAaiProxyURL(proxyURL) + .setAaiIgnoreSSLCertificateErrors(IGNORE_SSL_CERTIFICATE_ERRORS).build(); + } catch (MalformedURLException e) { + throw new IllegalArgumentException(e); + } + } + + +} diff --git a/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java new file mode 100644 index 0000000..6278af6 --- /dev/null +++ b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java @@ -0,0 +1,96 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.junit.Assert; +import org.junit.Test; +import org.onap.dcae.apod.analytics.aai.BaseAnalyticsAAIUnitTest; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 9/25/2017. + */ +public class AAIEnrichmentClientImplTest extends BaseAnalyticsAAIUnitTest { + + + @Test + public void testGetEnrichmentDetails() throws Exception { + + final String enrichmentResponseJson = "{}"; + + final String vnfName = "vCPEInfraVNF13"; + final AAIHttpClientConfig aaiHttpClientTestConfig = getAAIHttpClientTestConfig(true, PROXY_URL); + Map queryParams = ImmutableMap.of("vnf-name", vnfName); + final AAIHttpClientFactory aaiHttpClientFactory = mock(AAIHttpClientFactory.class); + final CloseableHttpClient closeableHttpClient = mock(CloseableHttpClient.class); + final AAIHttpClient aaiHttpClient = mock(AAIHttpClient.class); + when(aaiHttpClientFactory.create(any(AAIHttpClientConfig.class))).thenReturn(aaiHttpClient); + when(aaiHttpClient.getAAIHttpClient()).thenReturn(closeableHttpClient); + when(closeableHttpClient.execute(any(HttpGet.class), any(ResponseHandler.class))) + .thenReturn(Optional.of(enrichmentResponseJson)); + final AAIEnrichmentClientImpl aaiEnrichmentClient = new AAIEnrichmentClientImpl( + aaiHttpClientTestConfig, aaiHttpClientFactory); + + final String enrichmentDetails = aaiEnrichmentClient.getEnrichmentDetails(AAI_VNF_ENRICHMENT_PATH, + queryParams, AAI_HEADERS); + assertThat("Enrichment response is same", enrichmentDetails, is(enrichmentResponseJson)); + + } + + @Test + public void testAAiResponseHandler() throws Exception { + final ResponseHandler> aaiResponseHandler = + AAIEnrichmentClientImpl.aaiResponseHandler(); + final HttpResponse httpResponse = mock(HttpResponse.class); + final HttpEntity httpEntity = mock(HttpEntity.class); + final String response = "{}"; + InputStream inputStream = new ByteArrayInputStream(response.getBytes()); + when(httpEntity.getContent()).thenReturn(inputStream); + when(httpResponse.getEntity()).thenReturn(httpEntity); + final StatusLine statusLine = mock(StatusLine.class); + when(httpResponse.getStatusLine()).thenReturn(statusLine); + when(statusLine.getStatusCode()).thenReturn(200); + final Optional result = aaiResponseHandler.handleResponse(httpResponse); + assertThat("Response must match", result.get(), is(response)); + } + +} diff --git a/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java new file mode 100644 index 0000000..c073a6c --- /dev/null +++ b/dcae-analytics-aai/src/test/java/org/onap/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java @@ -0,0 +1,109 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.aai.service; + +import org.apache.http.HttpHost; +import org.apache.http.config.ConnectionConfig; +import org.apache.http.config.Registry; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.conn.DefaultHttpClientConnectionOperator; +import org.apache.http.impl.conn.DefaultProxyRoutePlanner; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.impl.conn.SystemDefaultRoutePlanner; +import org.junit.Assert; +import org.junit.Test; +import org.onap.dcae.apod.analytics.aai.BaseAnalyticsAAIUnitTest; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import sun.security.ssl.SSLContextImpl; +import sun.security.ssl.SSLSocketFactoryImpl; + +import javax.net.ssl.HostnameVerifier; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 9/25/2017. + */ +public class AAIHttpClientImplTest extends BaseAnalyticsAAIUnitTest { + + @Test + public void getAAIHttpClientWithIgnoredSSLErrorsAndProxySettings() throws Exception { + + final AAIHttpClientConfig aaiHttpClientTestConfig = + getAAIHttpClientTestConfig(true, PROXY_URL); + final AAIHttpClientImpl aaiHttpClient = new AAIHttpClientImpl(aaiHttpClientTestConfig); + final CloseableHttpClient closeableHttpClient = aaiHttpClient.getAAIHttpClient(); + + final HostnameVerifier hostnameVerifier = getHostNameVerifier(closeableHttpClient); + + assertTrue("HostName Verifier must be NoOpHostnameVerifier", + NoopHostnameVerifier.INSTANCE.getClass().equals(hostnameVerifier.getClass())); + + final DefaultProxyRoutePlanner routePlanner = getPrivateFiledValue(closeableHttpClient, "routePlanner", + DefaultProxyRoutePlanner.class); + + final HttpHost proxyHost = getPrivateFiledValue(routePlanner, "proxy", HttpHost.class); + + final String hostName = proxyHost.getHostName(); + final int port = proxyHost.getPort(); + + assertThat("Proxy Host name must match", hostName, is(PROXY_HOST)); + assertThat("Proxy Port number must match", port, is(PROXY_PORT)); + + } + + @Test + public void getAAIHttpClientWithNoIgnoredSSLErrorsAndProxySettings() throws Exception { + + final AAIHttpClientConfig aaiHttpClientTestConfig = + getAAIHttpClientTestConfig(false, null); + final AAIHttpClientImpl aaiHttpClient = new AAIHttpClientImpl(aaiHttpClientTestConfig); + final CloseableHttpClient closeableHttpClient = aaiHttpClient.getAAIHttpClient(); + final HostnameVerifier hostnameVerifier = getHostNameVerifier(closeableHttpClient); + + assertTrue("HostName Verifier must be DefaultHostNameVerifier", + hostnameVerifier instanceof DefaultHostnameVerifier); + + getPrivateFiledValue(closeableHttpClient, "routePlanner", + SystemDefaultRoutePlanner.class); + } + + + private HostnameVerifier getHostNameVerifier(final CloseableHttpClient closeableHttpClient) { + final PoolingHttpClientConnectionManager connManager = + getPrivateFiledValue(closeableHttpClient, "connManager", + PoolingHttpClientConnectionManager.class); + final DefaultHttpClientConnectionOperator connectionOperator = getPrivateFiledValue(connManager, + "connectionOperator", DefaultHttpClientConnectionOperator.class); + final Registry socketFactoryRegistry = getPrivateFiledValue(connectionOperator, "socketFactoryRegistry", + Registry.class); + final SSLConnectionSocketFactory sslConnectionSocketFactory = (SSLConnectionSocketFactory) + socketFactoryRegistry.lookup("https"); + final HostnameVerifier hostnameVerifier = getPrivateFiledValue(sslConnectionSocketFactory, + "hostnameVerifier", HostnameVerifier.class); + return hostnameVerifier; + } +} diff --git a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java b/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java deleted file mode 100644 index 8c18a74..0000000 --- a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIGuiceUnitTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai; - -import org.junit.runner.RunWith; -import org.openecomp.dcae.apod.analytics.test.runner.GuiceJUnitRunner; - -/** - * @author Rajiv Singla . Creation Date: 10/20/2016. - */ -@RunWith(GuiceJUnitRunner.class) -public abstract class BaseAnalyticsAAIGuiceUnitTest extends BaseAnalyticsAAIUnitTest { -} diff --git a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java b/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java deleted file mode 100644 index 955b5b1..0000000 --- a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/BaseAnalyticsAAIUnitTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai; - -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfigBuilder; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author Rajiv Singla . Creation Date: 9/18/2017. - */ -public class BaseAnalyticsAAIUnitTest extends BaseDCAEAnalyticsUnitTest { - - protected static final String AAI_HOST_NAME = "1.2.3.4"; - protected static final Integer AAI_HOST_PORT_NUMBER = 1234; - protected static final String AAI_HOST_PROTOCOL = "https"; - protected static final String AAI_VNF_ENRICHMENT_PATH = "/aai/v11/network/generic-vnfs/generic-vnf"; - protected static final String AAI_VSERVER_NODE_QUERY_PATH = "/aai/v11/search/nodes-query"; - protected static final String AAI_VSERVER_QUERY_RESPONSE_LOCATION = "data/json/aai/aai_vserver_resource_data.json"; - - protected static final Map AAI_HEADERS = new LinkedHashMap<>(); - - static { - AAI_HEADERS.put("X-FromAppId", "vv-temp"); - AAI_HEADERS.put("X-TransactionId", "vv-temp"); - AAI_HEADERS.put("Accept", "application/json"); - AAI_HEADERS.put("Real-Time", "true"); - AAI_HEADERS.put("Content-Type", "application/json"); - } - - protected static final String PROXY_HOST = "proxy.att.com"; - protected static final Integer PROXY_PORT = 80; - protected static final String PROXY_URL = String.format("http://username:password@%s:%s", PROXY_HOST, PROXY_PORT); - - protected static final String AAI_USER_NAME = "DCAE"; - protected static final String AAI_USER_PASSWORD = "DCAE"; - protected static final boolean IGNORE_SSL_CERTIFICATE_ERRORS = true; - - protected AAIHttpClientConfig getAAIHttpClientTestConfig(final boolean ignoreSSLCertificateErrors, - final String proxyURLString) { - URL proxyURL; - if (proxyURLString != null) { - try { - proxyURL = new URL(proxyURLString); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("Proxy URL format is Invalid", e); - } - } else { - proxyURL = null; - } - return new AAIHttpClientConfigBuilder(AAI_HOST_NAME) - .setAaiProtocol(AAI_HOST_PROTOCOL) - .setAaiHostPortNumber(AAI_HOST_PORT_NUMBER) - .setAaiUserName(AAI_USER_NAME) - .setAaiUserPassword(AAI_USER_PASSWORD) - .setAaiProxyURL(proxyURL) - .setAaiIgnoreSSLCertificateErrors(ignoreSSLCertificateErrors).build(); - } - -} diff --git a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java b/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java deleted file mode 100644 index 5ebca27..0000000 --- a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/AAIClientFactoryIT.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.it; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableMap; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.aai.AAIClientFactory; -import org.openecomp.dcae.apod.analytics.aai.service.AAIEnrichmentClient; - -import java.util.Collections; -import java.util.Map; - -/** - * @author Rajiv Singla . Creation Date: 9/19/2017. - */ -@Ignore -public class AAIClientFactoryIT extends BaseAnalyticsAAIIT { - - private AAIEnrichmentClient enrichmentClient; - - @Before - public void before() { - enrichmentClient = AAIClientFactory.create().getEnrichmentClient(getAAIHttpClientConfig()); - } - - @Test - public void testGetEnrichmentClientForVNF() throws Exception { - final String vnfName = "vCPEInfraVNF13"; - Map queryParams = ImmutableMap.of("vnf-name", vnfName); - final String vCPEInfraVNF13 = - enrichmentClient.getEnrichmentDetails(AAI_VNF_ENRICHMENT_PATH, queryParams, AAI_HEADERS); - LOG.info("Fetched VNF A&AI Enrichment Response: \n{}", vCPEInfraVNF13); - - } - - @Test - public void testGetVServerObjectResourceLink() throws Exception { - final String vServerName = "example-vserver-name-val-2"; - Map queryParams = ImmutableMap.of("search-node-type", "vserver", "filter", - "vserver-name:EQUALS:" + vServerName); - final String serverResourceLink = - enrichmentClient.getEnrichmentDetails(AAI_VSERVER_NODE_QUERY_PATH, queryParams, AAI_HEADERS); - - LOG.info("Fetched Vserver Object Resource Link A&AI Enrichment Response: \n{}", serverResourceLink); - - } - - @Test - public void testGetVServerEnrichmentDetails() throws Exception { - final String serverResourceLink = fromStream(AAI_VSERVER_QUERY_RESPONSE_LOCATION); - final ObjectMapper objectMapper = new ObjectMapper(); - final JsonNode jsonNode = objectMapper.readTree(serverResourceLink); - final String resourceLink = jsonNode.findPath("resource-link").asText(); - final String vServerEnrichmentDetails = - enrichmentClient.getEnrichmentDetails(resourceLink, Collections.emptyMap(), - AAI_HEADERS); - LOG.info("Fetched Vserver enrichment details: \n{}", vServerEnrichmentDetails); - } -} diff --git a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java b/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java deleted file mode 100644 index 8f54f77..0000000 --- a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/it/BaseAnalyticsAAIIT.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.it; - -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfigBuilder; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author Rajiv Singla . Creation Date: 9/18/2017. - */ -public abstract class BaseAnalyticsAAIIT extends BaseDCAEAnalyticsIT { - - protected static final String AAI_HOST_NAME = "1.2.3.4"; - protected static final Integer AAI_HOST_PORT_NUMBER = 1234; - protected static final String AAI_HOST_PROTOCOL = "https"; - protected static final String AAI_VNF_ENRICHMENT_PATH = "/aai/v11/network/generic-vnfs/generic-vnf"; - protected static final String AAI_VSERVER_NODE_QUERY_PATH = "/aai/v11/search/nodes-query"; - protected static final Map AAI_HEADERS = new LinkedHashMap<>(); - - - protected static final String AAI_VSERVER_QUERY_RESPONSE_LOCATION = "data/json/aai/aai_vserver_resource_data.json"; - - static { - AAI_HEADERS.put("X-FromAppId", "vv-temp"); - AAI_HEADERS.put("X-TransactionId", "vv-temp"); - AAI_HEADERS.put("Accept", "application/json"); - AAI_HEADERS.put("Real-Time", "true"); - AAI_HEADERS.put("Content-Type", "application/json"); - } - - protected static final String AAI_USER_NAME = "DCAE"; - protected static final String AAI_USER_PASSWORD = "DCAE"; - protected static final boolean IGNORE_SSL_CERTIFICATE_ERRORS = true; - - - protected AAIHttpClientConfig getAAIHttpClientConfig() { - try { - URL proxyURL = new URL("http://username:password@proxy.att.com:80"); - return new AAIHttpClientConfigBuilder(AAI_HOST_NAME) - .setAaiProtocol(AAI_HOST_PROTOCOL) - .setAaiHostPortNumber(AAI_HOST_PORT_NUMBER) - .setAaiUserName(AAI_USER_NAME) - .setAaiUserPassword(AAI_USER_PASSWORD) - .setAaiProxyURL(proxyURL) - .setAaiIgnoreSSLCertificateErrors(IGNORE_SSL_CERTIFICATE_ERRORS).build(); - } catch (MalformedURLException e) { - throw new IllegalArgumentException(e); - } - } - - -} diff --git a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java b/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java deleted file mode 100644 index 0fbd0e7..0000000 --- a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIEnrichmentClientImplTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableMap; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.StatusLine; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.junit.Assert; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.aai.BaseAnalyticsAAIUnitTest; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.Map; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 9/25/2017. - */ -public class AAIEnrichmentClientImplTest extends BaseAnalyticsAAIUnitTest { - - - @Test - public void testGetEnrichmentDetails() throws Exception { - - final String enrichmentResponseJson = "{}"; - - final String vnfName = "vCPEInfraVNF13"; - final AAIHttpClientConfig aaiHttpClientTestConfig = getAAIHttpClientTestConfig(true, PROXY_URL); - Map queryParams = ImmutableMap.of("vnf-name", vnfName); - final AAIHttpClientFactory aaiHttpClientFactory = mock(AAIHttpClientFactory.class); - final CloseableHttpClient closeableHttpClient = mock(CloseableHttpClient.class); - final AAIHttpClient aaiHttpClient = mock(AAIHttpClient.class); - when(aaiHttpClientFactory.create(any(AAIHttpClientConfig.class))).thenReturn(aaiHttpClient); - when(aaiHttpClient.getAAIHttpClient()).thenReturn(closeableHttpClient); - when(closeableHttpClient.execute(any(HttpGet.class), any(ResponseHandler.class))) - .thenReturn(Optional.of(enrichmentResponseJson)); - final AAIEnrichmentClientImpl aaiEnrichmentClient = new AAIEnrichmentClientImpl( - aaiHttpClientTestConfig, aaiHttpClientFactory); - - final String enrichmentDetails = aaiEnrichmentClient.getEnrichmentDetails(AAI_VNF_ENRICHMENT_PATH, - queryParams, AAI_HEADERS); - assertThat("Enrichment response is same", enrichmentDetails, is(enrichmentResponseJson)); - - } - - @Test - public void testAAiResponseHandler() throws Exception { - final ResponseHandler> aaiResponseHandler = - AAIEnrichmentClientImpl.aaiResponseHandler(); - final HttpResponse httpResponse = mock(HttpResponse.class); - final HttpEntity httpEntity = mock(HttpEntity.class); - final String response = "{}"; - InputStream inputStream = new ByteArrayInputStream(response.getBytes()); - when(httpEntity.getContent()).thenReturn(inputStream); - when(httpResponse.getEntity()).thenReturn(httpEntity); - final StatusLine statusLine = mock(StatusLine.class); - when(httpResponse.getStatusLine()).thenReturn(statusLine); - when(statusLine.getStatusCode()).thenReturn(200); - final Optional result = aaiResponseHandler.handleResponse(httpResponse); - assertThat("Response must match", result.get(), is(response)); - } - -} diff --git a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java b/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java deleted file mode 100644 index 0bb7307..0000000 --- a/dcae-analytics-aai/src/test/java/org/openecomp/dcae/apod/analytics/aai/service/AAIHttpClientImplTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.aai.service; - -import org.apache.http.HttpHost; -import org.apache.http.config.ConnectionConfig; -import org.apache.http.config.Registry; -import org.apache.http.conn.ssl.DefaultHostnameVerifier; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.conn.DefaultHttpClientConnectionOperator; -import org.apache.http.impl.conn.DefaultProxyRoutePlanner; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.impl.conn.SystemDefaultRoutePlanner; -import org.junit.Assert; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.aai.BaseAnalyticsAAIUnitTest; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import sun.security.ssl.SSLContextImpl; -import sun.security.ssl.SSLSocketFactoryImpl; - -import javax.net.ssl.HostnameVerifier; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 9/25/2017. - */ -public class AAIHttpClientImplTest extends BaseAnalyticsAAIUnitTest { - - @Test - public void getAAIHttpClientWithIgnoredSSLErrorsAndProxySettings() throws Exception { - - final AAIHttpClientConfig aaiHttpClientTestConfig = - getAAIHttpClientTestConfig(true, PROXY_URL); - final AAIHttpClientImpl aaiHttpClient = new AAIHttpClientImpl(aaiHttpClientTestConfig); - final CloseableHttpClient closeableHttpClient = aaiHttpClient.getAAIHttpClient(); - - final HostnameVerifier hostnameVerifier = getHostNameVerifier(closeableHttpClient); - - assertTrue("HostName Verifier must be NoOpHostnameVerifier", - NoopHostnameVerifier.INSTANCE.getClass().equals(hostnameVerifier.getClass())); - - final DefaultProxyRoutePlanner routePlanner = getPrivateFiledValue(closeableHttpClient, "routePlanner", - DefaultProxyRoutePlanner.class); - - final HttpHost proxyHost = getPrivateFiledValue(routePlanner, "proxy", HttpHost.class); - - final String hostName = proxyHost.getHostName(); - final int port = proxyHost.getPort(); - - assertThat("Proxy Host name must match", hostName, is(PROXY_HOST)); - assertThat("Proxy Port number must match", port, is(PROXY_PORT)); - - } - - @Test - public void getAAIHttpClientWithNoIgnoredSSLErrorsAndProxySettings() throws Exception { - - final AAIHttpClientConfig aaiHttpClientTestConfig = - getAAIHttpClientTestConfig(false, null); - final AAIHttpClientImpl aaiHttpClient = new AAIHttpClientImpl(aaiHttpClientTestConfig); - final CloseableHttpClient closeableHttpClient = aaiHttpClient.getAAIHttpClient(); - final HostnameVerifier hostnameVerifier = getHostNameVerifier(closeableHttpClient); - - assertTrue("HostName Verifier must be DefaultHostNameVerifier", - hostnameVerifier instanceof DefaultHostnameVerifier); - - getPrivateFiledValue(closeableHttpClient, "routePlanner", - SystemDefaultRoutePlanner.class); - } - - - private HostnameVerifier getHostNameVerifier(final CloseableHttpClient closeableHttpClient) { - final PoolingHttpClientConnectionManager connManager = - getPrivateFiledValue(closeableHttpClient, "connManager", - PoolingHttpClientConnectionManager.class); - final DefaultHttpClientConnectionOperator connectionOperator = getPrivateFiledValue(connManager, - "connectionOperator", DefaultHttpClientConnectionOperator.class); - final Registry socketFactoryRegistry = getPrivateFiledValue(connectionOperator, "socketFactoryRegistry", - Registry.class); - final SSLConnectionSocketFactory sslConnectionSocketFactory = (SSLConnectionSocketFactory) - socketFactoryRegistry.lookup("https"); - final HostnameVerifier hostnameVerifier = getPrivateFiledValue(sslConnectionSocketFactory, - "hostnameVerifier", HostnameVerifier.class); - return hostnameVerifier; - } -} diff --git a/dcae-analytics-aai/src/test/resources/logback-test.xml b/dcae-analytics-aai/src/test/resources/logback-test.xml index f4ba1aa..896da06 100644 --- a/dcae-analytics-aai/src/test/resources/logback-test.xml +++ b/dcae-analytics-aai/src/test/resources/logback-test.xml @@ -40,7 +40,7 @@ - + diff --git a/dcae-analytics-cdap-common/pom.xml b/dcae-analytics-cdap-common/pom.xml index 6fd2662..17acbff 100644 --- a/dcae-analytics-cdap-common/pom.xml +++ b/dcae-analytics-cdap-common/pom.xml @@ -1,113 +1,113 @@ - - - - - - 4.0.0 - - - dcae-analytics - org.onap.dcaegen2.analytics.tca - 2.1.0-SNAPSHOT - - - - dcae-analytics-cdap-common - jar - - - DCAE Analytics CDAP Common - Contains CDAP common code to all CDAP DCAE Analytics Modules - - - ${project.parent.basedir} - - - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-tca - 2.1.0-SNAPSHOT - - - - - co.cask.cdap - cdap-api - - - - - org.apache.hadoop - hadoop-mapreduce-client-core - - - org.apache.hadoop - hadoop-common - - - - - org.slf4j - slf4j-api - - - - ch.qos.logback - logback-core - - - - ch.qos.logback - logback-classic - - - - - com.google.code.findbugs - jsr305 - ${findbugs.jsr305.version} - provided - - - - com.google.code.findbugs - annotations - ${findbugs.annotations.version} - provided - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-test - 2.1.0-SNAPSHOT - test - - - - - - + + + + + + 4.0.0 + + + dcae-analytics + org.onap.dcaegen2.analytics.tca + 2.1.0-SNAPSHOT + + + + dcae-analytics-cdap-common + jar + + + DCAE Analytics CDAP Common + Contains CDAP common code to all CDAP DCAE Analytics Modules + + + ${project.parent.basedir} + + + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-tca + 2.1.0-SNAPSHOT + + + + + co.cask.cdap + cdap-api + + + + + org.apache.hadoop + hadoop-mapreduce-client-core + + + org.apache.hadoop + hadoop-common + + + + + org.slf4j + slf4j-api + + + + ch.qos.logback + logback-core + + + + ch.qos.logback + logback-classic + + + + + com.google.code.findbugs + jsr305 + ${findbugs.jsr305.version} + provided + + + + com.google.code.findbugs + annotations + ${findbugs.annotations.version} + provided + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-test + 2.1.0-SNAPSHOT + test + + + + + + diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java new file mode 100644 index 0000000..32ebda2 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java @@ -0,0 +1,244 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common; + +/** + * Contains static constant variable names and values of all DCAE CDAP Components for + * e.g. app names, app descriptions, streams, datasets, flows, flowlets, workers, outputs etc. + * + *

+ * A strict naming convention must be followed for variable names for CDAP Components names for proper + * identification of CDAP Component variable purpose and function. A custom configuration settings can be + * generated for app + * deployment purposes based on variable naming conventions. + * + * The variable names should have 4 parts separated by an underscore: + *

    + *
  • Name of the DCAE sub module (e.g. TCA) to which variable is applicable
  • + *
  • Information about variable name: + *
      + *
    • FIXED - if variable value is fixed and cannot be changed
    • + *
    • DEFAULT - if variable name is default name and can be changed by cdap settings file + * when application is created
    • + *
    + *
  • + *
  • Actual Descriptive name about the CDAP component (may contain underscrores)
  • + *
  • CDAP component type e.g STREAM, DATASET, APP, FLOW, FLOWLET, OUTPUT
  • + *
+ * + *

e.g TCA_DEFAULT_DMAAP_INPUT_STREAM

+ * + *

RegEx Format (DCAE MODULE NAME)_(FIXED|DEFAULT)_(VARIABLE NAME)_(CDAP COMPONENT TYPE)

+ * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public abstract class CDAPComponentsConstants { + + // =============== Common Module Constants ==================== // + + /** + * Default DCAE App Name. It should be overriden by sub modules + */ + public static final String COMMON_DEFAULT_DCAE_CDAP_NAME_APP = "DCAE_ANALYTICS_GENERIC_APP"; + + /** + * Default DCAE App Description. It should be overriden by sub modules + */ + public static final String COMMON_DEFAULT_DCAE_CDAP_DESCRIPTION_APP = "DCAE ANALYTICS GENERIC APP DESCRIPTION"; + + // =============== TCA Module Constants ==================== // + + /** + * Default TCA application name if application name is not provided from startup configuration + */ + public static final String TCA_DEFAULT_NAME_APP = "dcae-tca"; + + /** + * Default TCA application description if not provided from startup configuration + */ + public static final String TCA_DEFAULT_DESCRIPTION_APP = "DCAE Analytics Threshold Crossing Alert Application"; + + /** + * Default TCA DMaaP Subscriber output stream name if not provided from startup configuration + */ + public static final String TCA_DEFAULT_SUBSCRIBER_OUTPUT_NAME_STREAM = "TCASubscriberOutputStream"; + + + /** + * Fixed TCA DMaaP Subscriber output stream description + */ + public static final String TCA_FIXED_SUBSCRIBER_OUTPUT_DESCRIPTION_STREAM = + "Stream which contains all message from VES Collector DMaaP MR topic"; + + + /** + * Fixed Name of TCA DMaaP Subscriber Worker - which will be fetching DMaaP Messages posting them to CDAP stream + */ + public static final String TCA_FIXED_DMAAP_SUBSCRIBER_WORKER = "TCADMaaPMRSubscriberWorker"; + + /** + * Fixed Description of TCA DMaaP Subscriber Worker + */ + public static final String TCA_FIXED_DMAAP_SUBSCRIBER_DESCRIPTION_WORKER = + "Fetches messages from DMaaP MR Topic at frequent intervals and writes them to a CDAP stream"; + + /** + * Fixed Name of TCA DMaaP Publisher Worker - which will be publishing messages to DMaaP MR + */ + public static final String TCA_FIXED_DMAAP_PUBLISHER_WORKER = "TCADMaaPMRPublisherWorker"; + + /** + * Fixed Description of TCA DMaaP Publisher Worker + */ + public static final String TCA_FIXED_DMAAP_PUBLISHER_DESCRIPTION_WORKER = + "Polls TCA Alerts Table at frequent intervals for new alerts and publishes them to DMaaP MR Topic"; + + /** + * Fixed name for TCA VES Collector Messages Processing Flow + */ + public static final String TCA_FIXED_VES_COLLECTOR_NAME_FLOW = "TCAVESCollectorFlow"; + + + /** + * Fixed description for TCA VES Collector Messages Processing Flow + */ + public static final String TCA_FIXED_VES_COLLECTOR_DESCRIPTION_FLOW = "Flow performs TCA on VES Collector Messages"; + + + /** + * Fixed Name for TCA VES Message Router Flowlet + */ + public static final String TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET = "TCAVESMessageRouterFlowlet"; + + /** + * Fixed Description for TCA VES Message Router Flowlet + */ + public static final String TCA_FIXED_VES_MESSAGE_ROUTER_DESCRIPTION_FLOWLET = + "Routes message received from TCA VES Collector to TCA Threshold Calculator Flowlet instances"; + + /** + * Fixed TCA VES Message Router Flowlet Output + */ + public static final String TCA_FIXED_VES_MESSAGE_ROUTER_OUTPUT = "TCAVESMessageRouterFlowlet"; + + /** + * Fixed Name for TCA VES Message Policy Violated Threshold Calculator Flowlet + */ + public static final String TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET = + "TCAVESThresholdViolationCalculatorFlowlet"; + + /** + * Fixed Description for TCA VES Message Policy Violated Threshold Calculator Flowlet + */ + public static final String TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_DESCRIPTION_FLOWLET = + "Applies TCA Policy Thresholds to VES Message and determined if any message violated TCA Policy thresholds"; + + /** + * Fixed Name for TCA VES Message Policy Violated Threshold Calculator Output + */ + public static final String TCA_FIXED_VES_TCA_CALCULATOR_NAME_OUTPUT = "TCAThresholdViolationCalculatorOutput"; + + + /** + * Fixed Name for TCA VES Alerts Abatement Flowlet + */ + public static final String TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET = "TCAVESAlertsAbatementFlowlet"; + + /** + * Fixed Description for TCA VES Alerts Abatement Flowlet + */ + public static final String TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET = + "Determines if abatement event needs to be posted to downstream systems"; + + /** + * Fixed Name for TCA VES Alerts Abatement Flowlet output + */ + public static final String TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_OUTPUT = "TCAVESAlertsAbatementFlowletOutput"; + + + /** + * Fixed Name for TCA VES A&AI Enrichment Flowlet + */ + public static final String TCA_FIXED_VES_AAI_ENRICHMENT_NAME_FLOWLET = "TCAVESAAIEnrichmentFlowlet"; + + /** + * Fixed Description for TCA VES A&AI Enrichment Flowlet + */ + public static final String TCA_FIXED_VES_AAI_ENRICHMENT_DESCRIPTION_FLOWLET = + "Performs A&AI Enrichment of non abated alerts"; + + /** + * Fixed Name for TCA VES A&AI Enrichment Flowlet output + */ + public static final String TCA_FIXED_VES_AAI_ENRICHMENT_NAME_OUTPUT = "TCAVESAAIEnrichmentFlowletOutput"; + + /** + * Fixed Name for TCA VES Alerts Sink Flowlet + */ + public static final String TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET = "TCAVESAlertsSinkFlowlet"; + + /** + * Fixed Description for TCA VES Alerts Sink Flowlet + */ + public static final String TCA_FIXED_VES_ALERTS_SINK_DESCRIPTION_FLOWLET = + "Saves messages which violated TCA Policy in a data set"; + + + /** + * Default Name for TCA VES Message status table which contain status of all messages processed by TCA + */ + public static final String TCA_DEFAULT_VES_MESSAGE_STATUS_NAME_TABLE = "TCAVESMessageStatusTable"; + + + /** + * Fixed Description for TCA VES Message status table which contain status of all messages processed by TCA + */ + public static final String TCA_FIXED_VES_MESSAGE_STATUS_DESCRIPTION_TABLE = + "Store processing information about all incoming TCA VES Messages"; + + /** + * Default Name for TCA VES Alerts table which contains alerts that can be send to downstream systems + */ + public static final String TCA_DEFAULT_VES_ALERTS_NAME_TABLE = "TCAVESAlertsTable"; + + /** + * Fixed Description for TCA VES Alerts table which contains alerts that can be send to downstream systems + */ + public static final String TCA_FIXED_VES_ALERTS_DESCRIPTION_TABLE = + "Stores alert messages that need to be DMaaP"; + + /** + * Default Name for TCA Alerts abatement table which contains information to send out abated alerts + */ + public static final String TCA_DEFAULT_ALERTS_ABATEMENT_NAME_TABLE = "TCAAlertsAbatementTable"; + + /** + * Fixed Description for TCA Alerts abatement table which contains information to determine abatement alerts + */ + public static final String TCA_FIXED_ALERTS_ABATEMENT_DESCRIPTION_TABLE = + "Stores information to determine creation of abatement alerts"; + + + private CDAPComponentsConstants() { + + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java new file mode 100644 index 0000000..b8bce1f --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java @@ -0,0 +1,119 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common; + +/** + * Contains all metrics names used for DCAE CDAP modules + * + *

+ * Format should be (ModuleName)_(Description of metrics)_METRIC e.g. TCA_WORKER_FAILED_ATTEMPTS_METRIC + *

+ * + * @author Rajiv Singla . Creation Date: 10/25/2016. + */ +public abstract class CDAPMetricsConstants { + + /** + * Metric captures count of all responses received from DMaaP MR Subscriber Topic + */ + public static final String DMAAP_MR_SUBSCRIBER_ALL_RESPONSES_COUNT_METRIC = + "dmaap.subscriber.fetch.all_responses"; + + /** + * Metric captures count of responses from DMaaP MR Subscriber Topic which does not have 200 HTTP Response code. + * This can be due to DMaaP topic being down or any internal server errors etc. + */ + public static final String DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC = + "dmaap.subscriber.fetch.unsuccessful"; + + /** + * Metric that counts the number of successful (200 HTTP Response Code) calls to DMaaP which did not had empty + * messages + */ + public static final String DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC = + "dmaap.subscriber.fetch.no_message"; + + /** + * Metric to count total number of message processed by DMaaP MR subscriber + */ + public static final String DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC = "dmaap.subscriber.message.count"; + + + /** + * Metric to record time taken in ms by subscriber in its most recent call to fetch DMaaP MR messages + */ + public static final String DMAAP_MR_SUBSCRIBER_RESPONSE_TIME_MS_METRIC = "dmaap.subscriber.fetch.response_time"; + + /** + * Metric captures the count of number of times DMaaP MR Subscriber was unable to write to DMaaP Stream due + * some CDAP error while writing to stream. This should ideally never happen assuming we have enough space + * on CDAP machine and CDAP process is functioning normally + */ + public static final String TCA_SUBSCRIBER_FAILURE_TO_WRITE_TO_STREAM_METRIC = "tca.subscriber.stream.writing.error"; + + + /** + * Metric captures number of VES messages that are not applicable as per TCA Policy + */ + public static final String TCA_VES_INAPPLICABLE_MESSAGES_METRIC = "tca.ves.calculator.inapplicable"; + + /** + * Metric captures number of VES messages that are applicable as per TCA Policy but don't violate any thresholds + */ + public static final String TCA_VES_COMPLIANT_MESSAGES_METRIC = "tca.ves.calculator.compliant"; + + /** + * Metrics captures number of VES messages that are applicable as per TCA Policy and does violate thresholds and + * will likely cause an alert + */ + public static final String TCA_VES_NON_COMPLIANT_MESSAGES_METRIC = "tca.ves.calculator.non_compliant"; + + + /** + * Metric that counts the number of publisher look ups in alerts table which resulted in 0 new alerts + */ + public static final String TCA_PUBLISHER_NO_NEW_ALERTS_LOOKUP_METRIC = "tca.publisher.lookup.no_message"; + + /** + * Metric that counts the number of new alerts found by the publisher in alerts table + */ + public static final String TCA_PUBLISHER_NEW_ALERTS_METRIC = "tca.publisher.lookup.new_messages"; + + /** + * Metric that counts the number of alerts deleted by publisher in alerts table + */ + public static final String TCA_PUBLISHER_DELETED_ALERTS_METRIC = "tca.publisher.deleted.alerts"; + + /** + * Metric that counts the number of publisher calls to DMaaP which resulted in successful response code + */ + public static final String TCA_PUBLISHER_SUCCESSFUL_DMAAP_RESPONSE_METRIC = "tca.publisher.publish.successful"; + + /** + * Metric that counts the number of publisher calls to DMaaP which resulted in unsuccessful response code + */ + public static final String TCA_PUBLISHER_UNSUCCESSFUL_DMAAP_RESPONSE_METRIC = "tca.publisher.publish.unsuccessful"; + + private CDAPMetricsConstants() { + + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java new file mode 100644 index 0000000..9cfedaf --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java @@ -0,0 +1,71 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common; + +/** + *

+ * Contains CDAP Plugin Constants + *

+ * @author Rajiv Singla . Creation Date: 1/17/2017. + */ +public abstract class CDAPPluginConstants { + + /** + * Common Reference Name property name and description used to create an external Dataset for metadata, lineage + * purposes + */ + public static class Reference { + + public static final String REFERENCE_NAME = "referenceName"; + public static final String REFERENCE_NAME_DESCRIPTION = + "This will be used to uniquely identify this source/sink for lineage, annotating metadata, etc."; + + private Reference() { + // private constructor + } + + } + + /** + * Contains fields for DMaaP MR Sink Map Reduce Hadoop Configuration + */ + public static class DMaaPMRSinkHadoopConfigFields { + + public static final String HOST_NAME = "dmaap.mr.sink.hostName"; + public static final String PORT_NUMBER = "dmaap.mr.sink.portNumber"; + public static final String TOPIC_NAME = "dmaap.mr.sink.topicName"; + public static final String PROTOCOL = "dmaap.mr.sink.protocol"; + public static final String USER_NAME = "dmaap.mr.sink.userName"; + public static final String USER_PASS = "dmaap.mr.sink.userPassword"; + public static final String CONTENT_TYPE = "dmaap.mr.sink.contentType"; + public static final String MAX_BATCH_SIZE = "dmaap.mr.sink.maxBatchSize"; + public static final String MAX_RECOVER_QUEUE_SIZE = "dmaap.mr.sink.maxRecoveryQueueSize"; + + private DMaaPMRSinkHadoopConfigFields() { + // private constructor + } + } + + + private CDAPPluginConstants() { + // private constructor + } +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java new file mode 100644 index 0000000..3580a2c --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java @@ -0,0 +1,94 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.domain.tca; + +import com.google.common.base.Objects; + +import java.io.Serializable; + +/** + * Simple POJO emitted by threshold calculator + * + * @author Rajiv Singla . Creation Date: 9/11/2017. + */ +public class ThresholdCalculatorOutput implements Serializable { + + private static final long serialVersionUID = 1L; + + protected String cefMessage; + protected String tcaPolicy; + protected String violatedMetricsPerEventName; + protected String alertMessage; + + public ThresholdCalculatorOutput() { + // no arg constructor + } + + public ThresholdCalculatorOutput(String cefMessage, String tcaPolicy, + String violatedMetricsPerEventName, String alertMessage) { + this.cefMessage = cefMessage; + this.tcaPolicy = tcaPolicy; + this.violatedMetricsPerEventName = violatedMetricsPerEventName; + this.alertMessage = alertMessage; + } + + public String getCefMessage() { + return cefMessage; + } + + public void setCefMessage(String cefMessage) { + this.cefMessage = cefMessage; + } + + public String getTcaPolicy() { + return tcaPolicy; + } + + public void setTcaPolicy(String tcaPolicy) { + this.tcaPolicy = tcaPolicy; + } + + public String getViolatedMetricsPerEventName() { + return violatedMetricsPerEventName; + } + + public void setViolatedMetricsPerEventName(String violatedMetricsPerEventName) { + this.violatedMetricsPerEventName = violatedMetricsPerEventName; + } + + public String getAlertMessage() { + return alertMessage; + } + + public void setAlertMessage(String alertMessage) { + this.alertMessage = alertMessage; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("cefMessage", cefMessage) + .add("tcaPolicy", tcaPolicy) + .add("violatedMetricsPerEventName", violatedMetricsPerEventName) + .add("alertMessage", alertMessage) + .toString(); + } +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java new file mode 100644 index 0000000..0729be3 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java @@ -0,0 +1,51 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.exception; + +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.slf4j.Logger; + +/** + * Runtime exception which signals that DCAE CDAP App settings (e.g. app config, preferences) validation failed + * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public class CDAPSettingsException extends DCAEAnalyticsRuntimeException { + + /** + * @param message - Error Message for Exception + * @param cause - Actual Exception which caused {@link DCAEAnalyticsRuntimeException} + */ + public CDAPSettingsException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates and logs the DCAE App Config Exception to given logger + * + * @param message - Error Message for Exception and logging + * @param logger - Logger used for logging exception + * @param cause - Actual exception which caused + */ + public CDAPSettingsException(String message, Logger logger, Throwable cause) { + super(message, logger, cause); + } +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java new file mode 100644 index 0000000..6c6aaea --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java @@ -0,0 +1,157 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import com.google.common.base.Objects; +import org.apache.hadoop.io.Writable; +import org.apache.hadoop.io.WritableUtils; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.io.Serializable; + +/** + * TCA Alerts Abatement Entity is used to persist information to determine if abatement event need to sent to downstream + * systems + * + * @author Rajiv Singla . Creation Date: 9/11/2017. + */ +public class TCAAlertsAbatementEntity implements Writable, Serializable { + + private static final long serialVersionUID = 1L; + + private long creationTS; + private String requestId; + // Kept as string to avoid null checks + private String abatementSentTS; + + /** + * No Arg constructor required for Jackson Json Serialization / Deserialization + */ + public TCAAlertsAbatementEntity() { + // required no arg constructor + } + + /** + * Creates TCA Alerts Abatement Entity to persist information to determine if abatement alerts need to be posted + * + * @param creationTS record creation time + * @param requestId request ID of generated alert + * @param abatementSentTS time when abatement was sent out for that alert if any + */ + public TCAAlertsAbatementEntity(long creationTS, String requestId, String abatementSentTS) { + this.creationTS = creationTS; + this.requestId = requestId; + this.abatementSentTS = abatementSentTS; + } + + /** + * Timestamp when record was created + * + * @return timestamp when record was created + */ + public long getCreationTS() { + return creationTS; + } + + /** + * Set value for timestamp when record was created + * + * @param creationTS new value for timestamp when record was created + */ + public void setCreationTS(long creationTS) { + this.creationTS = creationTS; + } + + /** + * Request Id of ONSET alert which was sent + * + * @return request Id of ONSET alert which was sent + */ + public String getRequestId() { + return requestId; + } + + /** + * Set Request Id of ONSET alert + * + * @param requestId set new value for ONSET alert request id + */ + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + + /** + * Get abatement Sent Timestamp + * + * @return get abatement alert sent timestamp + */ + public String getAbatementSentTS() { + return abatementSentTS; + } + + /** + * Set timestamp when abatement alert is sent + * + * @param abatementSentTS sent new value for timestamp when abatement alert is sent + */ + public void setAbatementSentTS(String abatementSentTS) { + this.abatementSentTS = abatementSentTS; + } + + /** + * Write entity to Table + * + * @param dataOutput data output + * @throws IOException io exception + */ + @Override + public void write(DataOutput dataOutput) throws IOException { + WritableUtils.writeVLong(dataOutput, creationTS); + WritableUtils.writeString(dataOutput, requestId); + WritableUtils.writeString(dataOutput, abatementSentTS); + } + + /** + * Read entity from table + * + * @param dataInput data input + * @throws IOException io exception + */ + @Override + public void readFields(DataInput dataInput) throws IOException { + creationTS = WritableUtils.readVLong(dataInput); + requestId = WritableUtils.readString(dataInput); + abatementSentTS = WritableUtils.readString(dataInput); + } + + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("creationTS", creationTS) + .add("requestId", requestId) + .add("abatementSentTS", abatementSentTS) + .toString(); + } +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java new file mode 100644 index 0000000..19cf9c7 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java @@ -0,0 +1,127 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.api.data.schema.UnsupportedTypeException; +import co.cask.cdap.api.dataset.DatasetProperties; +import co.cask.cdap.api.dataset.lib.IndexedTable; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.common.utils.PersistenceUtils; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.model.facade.tca.TCAVESResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.List; + +import static org.onap.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME; + +/** + * Utility methods to persist TCA Alerts Abatement information + * + * @author Rajiv Singla . Creation Date: 9/11/2017. + */ +public abstract class TCAAlertsAbatementPersister { + + private static final Logger LOG = LoggerFactory.getLogger(TCAAlertsAbatementPersister.class); + + private static final Joiner KEY_JOINER = Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER); + + private TCAAlertsAbatementPersister() { + // private constructor + } + + /** + * Creates {@link DatasetProperties} for Alerts Table + * + * @param timeToLiveSeconds alerts table Time to Live + * + * @return Alerts Abatement table properties + */ + public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) { + try { + return ObjectMappedTableProperties.builder() + .setType(TCAAlertsAbatementEntity.class) + .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME) + .setRowKeyExploreType(Schema.Type.STRING) + .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds) + .setDescription(CDAPComponentsConstants.TCA_FIXED_ALERTS_ABATEMENT_DESCRIPTION_TABLE) + .build(); + } catch (UnsupportedTypeException e) { + final String errorMessage = "Unable to convert TCAAlertsAbatementEntity class to Schema"; + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + + + public static void persist(final EventListener eventListener, + final MetricsPerEventName violatedMetricsPerEventName, + final TCAVESResponse tcavesResponse, + final String abatementTS, + final ObjectMappedTable tcaAlertsAbatementTable) { + final String abatementTableKey = createKey(eventListener, violatedMetricsPerEventName); + + final long currentTimestamp = new Date().getTime(); + final String requestID = tcavesResponse.getRequestID(); + final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = new TCAAlertsAbatementEntity(currentTimestamp, + requestID, abatementTS); + tcaAlertsAbatementTable.write(abatementTableKey, tcaAlertsAbatementEntity); + + LOG.debug("Persisted AlertsAbatementEntity: {} with Key: {}", tcaAlertsAbatementEntity, abatementTableKey); + + } + + public static TCAAlertsAbatementEntity lookUpByKey(final EventListener eventListener, + final MetricsPerEventName violatedMetricsPerEventName, + final ObjectMappedTable + tcaAlertsAbatementTable) { + final String abatementTableKey = createKey(eventListener, violatedMetricsPerEventName); + return tcaAlertsAbatementTable.read(abatementTableKey); + } + + + public static String createKey(final EventListener eventListener, + final MetricsPerEventName violatedMetricsPerEventName) { + // no null check required as all are required fields + final String eventName = violatedMetricsPerEventName.getEventName(); + final String sourceName = eventListener.getEvent().getCommonEventHeader().getSourceName(); + final String reportingEntityName = eventListener.getEvent().getCommonEventHeader().getReportingEntityName(); + // violated threshold will always be present + final Threshold violatedThreshold = violatedMetricsPerEventName.getThresholds().get(0); + final String closedLoopControlName = violatedThreshold.getClosedLoopControlName(); + final String fieldPath = violatedThreshold.getFieldPath(); + + final List abatementKeyList = + ImmutableList.of(eventName, sourceName, reportingEntityName, closedLoopControlName, fieldPath); + + return KEY_JOINER.join(abatementKeyList); + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java new file mode 100644 index 0000000..4717a90 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java @@ -0,0 +1,43 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +/** + * TCA Calculator applies TCA Policy to incoming VES messages and classifies them as per this enum + * + * @author Rajiv Singla . Creation Date: 11/15/2016. + */ +public enum TCACalculatorMessageType { + + /** + * VES messages that are not applicable as per TCA Policy + */ + INAPPLICABLE, + /** + * VES messages that are applicable as per TCA Policy but don't violate any thresholds + */ + COMPLIANT, + /** + * VES messages that are applicable as per TCA Policy and also in violation of TCA Policy thresholds + */ + NON_COMPLIANT; + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java new file mode 100644 index 0000000..b3edc64 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java @@ -0,0 +1,550 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import org.apache.hadoop.io.Writable; +import org.apache.hadoop.io.WritableUtils; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Direction; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFPolicyDomainFilter; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFPolicyEventNameFilter; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFPolicyThresholdsProcessor; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.io.Serializable; + +/** + * TCA Message Status is an Entity which is used to persist TCA VES Message status information in Message Status Table + * + * @author Rajiv Singla . Creation Date: 11/16/2016. + */ +public class TCAMessageStatusEntity implements Writable, Serializable { + + private static final long serialVersionUID = 1L; + + private long creationTS; + private int instanceId; + private String messageType; + private String vesMessage; + private String domain; + private String eventName; + private String thresholdPath; + private String thresholdSeverity; + private String thresholdDirection; + private Long thresholdValue; + private String jsonProcessorStatus; + private String jsonProcessorMessage; + private String domainFilterStatus; + private String domainFilterMessage; + private String eventNameFilterStatus; + private String eventNameFilterMessage; + private String thresholdCalculatorStatus; + private String thresholdCalculatorMessage; + private String alertMessage; + + /** + * No Arg constructor required for Jackson Json Serialization / Deserialization + */ + public TCAMessageStatusEntity() { + // no argument constructor required for json serialization / deserialization + } + + /** + * Create new Instance of {@link TCAMessageStatusEntity} + * + * @param creationTS creation Timestamp + * @param instanceId CDAP flowlet instance ID + * @param messageType {@link TCACalculatorMessageType} + * @param vesMessage incoming VES message from collector + * @param domain VES message domain if present + * @param eventName VES message functional role if present + */ + public TCAMessageStatusEntity(final long creationTS, final int instanceId, final String messageType, + final String vesMessage, final String domain, final String eventName) { + this(creationTS, instanceId, messageType, vesMessage, domain, eventName, null, null, null, null, + null, null, null, null, null, null, null, null, null); + } + + + /** + * Create new Instance of {@link TCAMessageStatusEntity} + * + * @param creationTS creation Timestamp + * @param instanceId CDAP flowlet instance ID + * @param messageType {@link TCACalculatorMessageType} + * @param vesMessage incoming VES message from collector + * @param domain VES message domain if present + * @param eventName VES message event name if present + * @param thresholdPath Violated threshold path + * @param thresholdSeverity Violated threshold Severity if any + * @param thresholdDirection Violated threshold Direction if any + * @param thresholdValue Violated threshold value if any + * @param jsonProcessorStatus {@link TCACEFJsonProcessor} status + * @param jsonProcessorMessage {@link TCACEFJsonProcessor} message + * @param domainFilterStatus {@link TCACEFPolicyDomainFilter} status + * @param domainFilterMessage {@link TCACEFPolicyDomainFilter} message + * @param eventNameFilterStatus {@link TCACEFPolicyEventNameFilter} status + * @param eventNameFilterMessage {@link TCACEFPolicyEventNameFilter} message + * @param thresholdCalculatorStatus {@link TCACEFPolicyThresholdsProcessor} status + * @param thresholdCalculatorMessage {@link TCACEFPolicyThresholdsProcessor} message + * @param alertMessage alert message that will be sent out in case of threshold violation + */ + public TCAMessageStatusEntity(long creationTS, int instanceId, String messageType, String vesMessage, + String domain, String eventName, + String thresholdPath, String thresholdSeverity, String thresholdDirection, + Long thresholdValue, + String jsonProcessorStatus, String jsonProcessorMessage, + String domainFilterStatus, String domainFilterMessage, + String eventNameFilterStatus, String eventNameFilterMessage, + String thresholdCalculatorStatus, String thresholdCalculatorMessage, + String alertMessage) { + this.creationTS = creationTS; + this.instanceId = instanceId; + this.messageType = messageType; + this.vesMessage = vesMessage; + this.domain = domain; + this.eventName = eventName; + this.thresholdPath = thresholdPath; + this.thresholdSeverity = thresholdSeverity; + this.thresholdDirection = thresholdDirection; + this.thresholdValue = thresholdValue; + this.jsonProcessorStatus = jsonProcessorStatus; + this.jsonProcessorMessage = jsonProcessorMessage; + this.domainFilterStatus = domainFilterStatus; + this.domainFilterMessage = domainFilterMessage; + this.eventNameFilterStatus = eventNameFilterStatus; + this.eventNameFilterMessage = eventNameFilterMessage; + this.thresholdCalculatorStatus = thresholdCalculatorStatus; + this.thresholdCalculatorMessage = thresholdCalculatorMessage; + this.alertMessage = alertMessage; + } + + /** + * Provides Creation Timestamp + * + * @return creation timestamp long value + */ + public long getCreationTS() { + return creationTS; + } + + /** + * Sets Creations Timestamp + * + * @param creationTS creation timestamp long value + */ + public void setCreationTS(long creationTS) { + this.creationTS = creationTS; + } + + + /** + * Provides CDAP Flowlet instance ID + * + * @return cdap flowlet instance ID + */ + public int getInstanceId() { + return instanceId; + } + + /** + * Sets CDAP Flowlet instance ID + * + * @param instanceId flowlet instance ID + */ + public void setInstanceId(int instanceId) { + this.instanceId = instanceId; + } + + /** + * Provides Message Calculator Type {@link TCACalculatorMessageType} + * + * @return calculator message type + */ + public String getMessageType() { + return messageType; + } + + /** + * Sets Calculator message Type {@link TCACalculatorMessageType} + * + * @param messageType calculator message type + */ + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + /** + * Provides incoming VES Message + * + * @return ves message + */ + public String getVesMessage() { + return vesMessage; + } + + /** + * Set new value for VES message + * + * @param vesMessage ves message + */ + public void setVesMessage(String vesMessage) { + this.vesMessage = vesMessage; + } + + /** + * Provides VES message Domain + * + * @return ves message domain + */ + public String getDomain() { + return domain; + } + + /** + * Sets VES Message Domain + * + * @param domain ves message domain + */ + public void setDomain(String domain) { + this.domain = domain; + } + + /** + * Provides VES Message Event Name + * + * @return ves message Event Name + */ + public String getEventName() { + return eventName; + } + + /** + * Sets VES Message Functional Role + * + * @param eventName ves message Functional Role + */ + public void setEventName(String eventName) { + this.eventName = eventName; + } + + /** + * Violated Threshold Path as extracted from {@link TCAPolicy} + * + * @return violated threshold path + */ + public String getThresholdPath() { + return thresholdPath; + } + + /** + * Sets value for Violated Threshold Path + * + * @param thresholdPath violated threshold path + */ + public void setThresholdPath(String thresholdPath) { + this.thresholdPath = thresholdPath; + } + + /** + * Violated threshold Event Severity + * + * @return event severity + */ + public String getThresholdSeverity() { + return thresholdSeverity; + } + + /** + * Violated Threshold Severity + * + * @param thresholdSeverity violated threshold severity + */ + public void setThresholdSeverity(String thresholdSeverity) { + this.thresholdSeverity = thresholdSeverity; + } + + /** + * Violated Threshold {@link Direction} + * + * @return violated threshold Direction + */ + public String getThresholdDirection() { + return thresholdDirection; + } + + /** + * Sets Violated Threshold Direction + * + * @param thresholdDirection violated threshold direction + */ + public void setThresholdDirection(String thresholdDirection) { + this.thresholdDirection = thresholdDirection; + } + + /** + * Provides Violated Threshold Value + * + * @return violated Threshold value + */ + public Long getThresholdValue() { + return thresholdValue; + } + + /** + * Sets Violated Threshold Value + * + * @param thresholdValue violated threshold value + */ + public void setThresholdValue(Long thresholdValue) { + this.thresholdValue = thresholdValue; + } + + /** + * Provides {@link TCACEFJsonProcessor} status + * + * @return json processor status + */ + public String getJsonProcessorStatus() { + return jsonProcessorStatus; + } + + /** + * Sets Json Processor status + * + * @param jsonProcessorStatus json processor status + */ + public void setJsonProcessorStatus(String jsonProcessorStatus) { + this.jsonProcessorStatus = jsonProcessorStatus; + } + + /** + * Provides {@link TCACEFJsonProcessor} message + * + * @return json processor message + */ + public String getJsonProcessorMessage() { + return jsonProcessorMessage; + } + + /** + * Sets Json Processor Message + * + * @param jsonProcessorMessage json processor message + */ + public void setJsonProcessorMessage(String jsonProcessorMessage) { + this.jsonProcessorMessage = jsonProcessorMessage; + } + + /** + * Provides {@link TCACEFPolicyDomainFilter} status + * + * @return domain filter status + */ + public String getDomainFilterStatus() { + return domainFilterStatus; + } + + /** + * Sets Domain Filter status + * + * @param domainFilterStatus domain filter status + */ + public void setDomainFilterStatus(String domainFilterStatus) { + this.domainFilterStatus = domainFilterStatus; + } + + /** + * Provides {@link TCACEFPolicyDomainFilter} message + * + * @return domain filter message + */ + public String getDomainFilterMessage() { + return domainFilterMessage; + } + + /** + * Sets Domain filter message + * + * @param domainFilterMessage domain filter message + */ + public void setDomainFilterMessage(String domainFilterMessage) { + this.domainFilterMessage = domainFilterMessage; + } + + public String getEventNameFilterStatus() { + return eventNameFilterStatus; + } + + /** + * Provides {@link TCACEFPolicyEventNameFilter} status + * + * @param eventNameFilterStatus functional Role filter status + */ + public void setEventNameFilterStatus(String eventNameFilterStatus) { + this.eventNameFilterStatus = eventNameFilterStatus; + } + + /** + * Provides {@link TCACEFPolicyEventNameFilter} message + * + * @return functional role filter message + */ + public String getEventNameFilterMessage() { + return eventNameFilterMessage; + } + + /** + * Sets Functional Role filter message + * + * @param eventNameFilterMessage functional role filter message + */ + public void setEventNameFilterMessage(String eventNameFilterMessage) { + this.eventNameFilterMessage = eventNameFilterMessage; + } + + /** + * Provides {@link TCACEFPolicyThresholdsProcessor} status + * + * @return threshold processor status + */ + public String getThresholdCalculatorStatus() { + return thresholdCalculatorStatus; + } + + /** + * Sets threshold calculator status + * + * @param thresholdCalculatorStatus threshold calculator status + */ + public void setThresholdCalculatorStatus(String thresholdCalculatorStatus) { + this.thresholdCalculatorStatus = thresholdCalculatorStatus; + } + + /** + * Provides {@link TCACEFPolicyThresholdsProcessor} message + * + * @return threshold processor message + */ + public String getThresholdCalculatorMessage() { + return thresholdCalculatorMessage; + } + + /** + * Sets Threshold Calculator Processor Message + * + * @param thresholdCalculatorMessage threshold calculator message + */ + public void setThresholdCalculatorMessage(String thresholdCalculatorMessage) { + this.thresholdCalculatorMessage = thresholdCalculatorMessage; + } + + /** + * Provides generated alert message + * + * @return generated alert message + */ + public String getAlertMessage() { + return alertMessage; + } + + /** + * Sets alert message + * + * @param alertMessage alert message + */ + public void setAlertMessage(String alertMessage) { + this.alertMessage = alertMessage; + } + + /** + * Write entity to Table + * + * @param dataOutput data output + * + * @throws IOException io exception + */ + @Override + public void write(DataOutput dataOutput) throws IOException { + WritableUtils.writeVLong(dataOutput, creationTS); + WritableUtils.writeVInt(dataOutput, instanceId); + WritableUtils.writeString(dataOutput, messageType); + WritableUtils.writeString(dataOutput, vesMessage); + + WritableUtils.writeString(dataOutput, domain); + WritableUtils.writeString(dataOutput, eventName); + + WritableUtils.writeString(dataOutput, thresholdPath); + WritableUtils.writeString(dataOutput, thresholdSeverity); + WritableUtils.writeString(dataOutput, thresholdDirection); + WritableUtils.writeVLong(dataOutput, thresholdValue); + + WritableUtils.writeString(dataOutput, jsonProcessorStatus); + WritableUtils.writeString(dataOutput, jsonProcessorMessage); + WritableUtils.writeString(dataOutput, domainFilterStatus); + WritableUtils.writeString(dataOutput, domainFilterMessage); + WritableUtils.writeString(dataOutput, eventNameFilterStatus); + WritableUtils.writeString(dataOutput, eventNameFilterMessage); + WritableUtils.writeString(dataOutput, thresholdCalculatorStatus); + WritableUtils.writeString(dataOutput, thresholdCalculatorMessage); + + WritableUtils.writeString(dataOutput, alertMessage); + + } + + /** + * Read entity from table + * + * @param dataInput data input + * @throws IOException io exception + */ + @Override + public void readFields(DataInput dataInput) throws IOException { + creationTS = WritableUtils.readVLong(dataInput); + instanceId = WritableUtils.readVInt(dataInput); + messageType = WritableUtils.readString(dataInput); + vesMessage = WritableUtils.readString(dataInput); + + domain = WritableUtils.readString(dataInput); + eventName = WritableUtils.readString(dataInput); + + thresholdPath = WritableUtils.readString(dataInput); + thresholdSeverity = WritableUtils.readString(dataInput); + thresholdDirection = WritableUtils.readString(dataInput); + thresholdValue = WritableUtils.readVLong(dataInput); + + jsonProcessorStatus = WritableUtils.readString(dataInput); + jsonProcessorMessage = WritableUtils.readString(dataInput); + domainFilterStatus = WritableUtils.readString(dataInput); + domainFilterMessage = WritableUtils.readString(dataInput); + eventNameFilterStatus = WritableUtils.readString(dataInput); + eventNameFilterMessage = WritableUtils.readString(dataInput); + thresholdCalculatorStatus = WritableUtils.readString(dataInput); + thresholdCalculatorMessage = WritableUtils.readString(dataInput); + + alertMessage = WritableUtils.readString(dataInput); + + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java new file mode 100644 index 0000000..89d8d00 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java @@ -0,0 +1,241 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.api.data.schema.UnsupportedTypeException; +import co.cask.cdap.api.dataset.DatasetProperties; +import co.cask.cdap.api.dataset.lib.IndexedTable; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties; +import com.google.common.base.Joiner; +import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.common.service.processor.MessageProcessor; +import org.onap.dcae.apod.analytics.common.service.processor.ProcessorContext; +import org.onap.dcae.apod.analytics.common.utils.PersistenceUtils; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFPolicyDomainFilter; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFPolicyEventNameFilter; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFPolicyThresholdsProcessor; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import javax.annotation.Nullable; + +import static org.onap.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME; + +/** + * + * + * @author Rajiv Singla . Creation Date: 11/15/2016. + */ +public abstract class TCAMessageStatusPersister { + + private static final Logger LOG = LoggerFactory.getLogger(TCAMessageStatusPersister.class); + + private TCAMessageStatusPersister() { + + } + + /** + * Saves Message Status in Table. Assumes no alert was generated + * + * @param processorContext processor Context + * @param instanceId Instance Id + * @param calculatorMessageType Calculation Message Type + * @param messageStatusTable Message Status Table + */ + public static void persist(final TCACEFProcessorContext processorContext, + final int instanceId, + final TCACalculatorMessageType calculatorMessageType, + final ObjectMappedTable messageStatusTable) { + persist(processorContext, instanceId, calculatorMessageType, messageStatusTable, null); + } + + /** + * Saves Message Status in Table. Sets up alert message aslo + * + * @param processorContext processor Context + * @param instanceId Instance Id + * @param calculatorMessageType Calculation Message Type + * @param messageStatusTable Message Status Table + * @param alertMessage Alert message + */ + public static void persist(final TCACEFProcessorContext processorContext, + final int instanceId, + final TCACalculatorMessageType calculatorMessageType, + final ObjectMappedTable messageStatusTable, + @Nullable final String alertMessage) { + + final String rowKey = createKey(calculatorMessageType); + + final Long currentTS = new Date().getTime(); + final String vesMessage = StringEscapeUtils.unescapeJson(processorContext.getMessage()); + + // Find Functional Role and domain + final Pair domainAndEventName = TCAUtils.getDomainAndEventName(processorContext); + final String domain = domainAndEventName.getLeft(); + final String eventName = domainAndEventName.getRight(); + + final TCAMessageStatusEntity tcaMessageStatusEntity = new TCAMessageStatusEntity(currentTS, + instanceId, calculatorMessageType.name(), vesMessage, domain, eventName); + + // add threshold violation fields + addViolatedThreshold(tcaMessageStatusEntity, processorContext); + // add processor status and messages + addMessageProcessorMessages(tcaMessageStatusEntity, processorContext); + // add Alert message + tcaMessageStatusEntity.setAlertMessage( + alertMessage == null ? null : StringEscapeUtils.unescapeJson(alertMessage) + ); + + messageStatusTable.write(rowKey, tcaMessageStatusEntity); + + LOG.debug("Finished persisting VES Status Message with rowKey: {} in Message Status Table.", rowKey); + + } + + + /** + * Create TCA VES Message Status Table Properties + * + * @param timeToLiveSeconds Message Status Table time to live in seconds + * + * @return Message Status table properties + */ + public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) { + + try { + return ObjectMappedTableProperties.builder() + .setType(TCAMessageStatusEntity.class) + .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME) + .setRowKeyExploreType(Schema.Type.STRING) + .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds) + .setDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_STATUS_DESCRIPTION_TABLE) + .build(); + } catch (UnsupportedTypeException e) { + final String errorMessage = "Unable to convert TCAMessageStatusEntity class to Schema"; + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + } + + + /** + * Adds Violated Threshold Parameter values to {@link TCAMessageStatusEntity} + * + * @param tcaMessageStatusEntity message entity that needs to be populated with threshold fields + * @param processorContext processor context + * + */ + private static void addViolatedThreshold(final TCAMessageStatusEntity tcaMessageStatusEntity, + final TCACEFProcessorContext processorContext) { + + final MetricsPerEventName metricsPerEventName = processorContext.getMetricsPerEventName(); + + if (metricsPerEventName != null + && metricsPerEventName.getThresholds() != null + && metricsPerEventName.getThresholds().get(0) != null) { + + final Threshold threshold = metricsPerEventName.getThresholds().get(0); + tcaMessageStatusEntity.setThresholdPath(threshold.getFieldPath()); + tcaMessageStatusEntity.setThresholdSeverity(threshold.getSeverity().name()); + tcaMessageStatusEntity.setThresholdDirection(threshold.getDirection().name()); + tcaMessageStatusEntity.setThresholdValue(threshold.getThresholdValue()); + } + + } + + + /** + * Add TCA CEF Message Processor status information + * + * @param tcaMessageStatusEntity message entity that needs to be populated with message processor fields + * @param processorContext processor context + * + */ + @SuppressWarnings("unchecked") + private static void addMessageProcessorMessages( + final TCAMessageStatusEntity tcaMessageStatusEntity, final TCACEFProcessorContext processorContext) { + final List> messageProcessors = processorContext + .getMessageProcessors(); + + if (messageProcessors != null && !messageProcessors.isEmpty()) { + for (Object messageProcessor : messageProcessors) { + final MessageProcessor tcaMessageProcessor = + (MessageProcessor) messageProcessor; + + final String processingState = tcaMessageProcessor.getProcessingState().name(); + final String processingMessage = tcaMessageProcessor.getProcessingMessage().orNull(); + + if (messageProcessor.getClass().equals(TCACEFJsonProcessor.class)) { + tcaMessageStatusEntity.setJsonProcessorStatus(processingState); + tcaMessageStatusEntity.setJsonProcessorMessage(processingMessage); + } + + if (messageProcessor.getClass().equals(TCACEFPolicyDomainFilter.class)) { + tcaMessageStatusEntity.setDomainFilterStatus(processingState); + tcaMessageStatusEntity.setDomainFilterMessage(processingMessage); + } + + if (messageProcessor.getClass().equals(TCACEFPolicyEventNameFilter.class)) { + tcaMessageStatusEntity.setEventNameFilterStatus(processingState); + tcaMessageStatusEntity.setEventNameFilterMessage(processingMessage); + } + + if (messageProcessor.getClass().equals(TCACEFPolicyThresholdsProcessor.class)) { + tcaMessageStatusEntity.setThresholdCalculatorStatus(processingState); + tcaMessageStatusEntity.setThresholdCalculatorMessage(processingMessage); + } + + } + } + } + + /** + * Creates Row Key for TCA VES Message Status table + * + * Row Key = (Message Type + Decreasing Value) + * + * @param calculatorMessageType calculator message type + * + * @return row key string + */ + private static String createKey(final TCACalculatorMessageType calculatorMessageType) { + + final List keyList = new LinkedList<>(); + keyList.add(calculatorMessageType.name()); + keyList.add(PersistenceUtils.getCurrentTimeReverseSubKey()); + return Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER).join(keyList); + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java new file mode 100644 index 0000000..77af19a --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java @@ -0,0 +1,78 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import org.apache.hadoop.io.Writable; +import org.apache.hadoop.io.WritableUtils; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.io.Serializable; + +/** + * + * @author Rajiv Singla . Creation Date: 11/16/2016. + */ +public class TCAVESAlertEntity implements Writable, Serializable { + + private static final long serialVersionUID = 1L; + + private long creationTS; + private String alertMessage; + + public TCAVESAlertEntity() { + // no argument constructor required for json serialization / deserialization + } + + public TCAVESAlertEntity(long creationTS, String alertMessage) { + this.creationTS = creationTS; + this.alertMessage = alertMessage; + } + + public long getCreationTS() { + return creationTS; + } + + public void setCreationTS(long creationTS) { + this.creationTS = creationTS; + } + + public String getAlertMessage() { + return alertMessage; + } + + public void setAlertMessage(String alertMessage) { + this.alertMessage = alertMessage; + } + + @Override + public void write(DataOutput dataOutput) throws IOException { + WritableUtils.writeVLong(dataOutput, creationTS); + WritableUtils.writeString(dataOutput, alertMessage); + } + + @Override + public void readFields(DataInput dataInput) throws IOException { + creationTS = WritableUtils.readVLong(dataInput); + alertMessage = WritableUtils.readString(dataInput); + } +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java new file mode 100644 index 0000000..252197c --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java @@ -0,0 +1,102 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.api.data.schema.UnsupportedTypeException; +import co.cask.cdap.api.dataset.DatasetProperties; +import co.cask.cdap.api.dataset.lib.IndexedTable; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties; +import org.apache.commons.lang3.StringEscapeUtils; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; + +import static org.onap.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME; + +/** + * + * @author Rajiv Singla . Creation Date: 11/16/2016. + */ +public abstract class TCAVESAlertsPersister { + + private static final Logger LOG = LoggerFactory.getLogger(TCAVESAlertsPersister.class); + + private TCAVESAlertsPersister() { + + } + + /** + * Persists Alert Message to Alerts Table + * + * @param alertMessage alert Message + * @param tcaVESAlertTable alert Table Name + */ + public static void persist(final String alertMessage, final ObjectMappedTable tcaVESAlertTable) { + final Date currentDate = new Date(); + final TCAVESAlertEntity alertEntity = new TCAVESAlertEntity(currentDate.getTime(), + StringEscapeUtils.unescapeJson(alertMessage)); + // row key is same as current timestamp + final String rowKey = createRowKey(currentDate); + tcaVESAlertTable.write(rowKey, alertEntity); + + LOG.debug("Finished persisting VES Alert message ID: {} in VES Alerts table.", rowKey); + } + + + /** + * Creates {@link DatasetProperties} for Alerts Table + * + * @param timeToLiveSeconds alerts table Time to Live + * @return Alerts table properties + */ + public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) { + try { + return ObjectMappedTableProperties.builder() + .setType(TCAVESAlertEntity.class) + .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME) + .setRowKeyExploreType(Schema.Type.STRING) + .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds) + .setDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_DESCRIPTION_TABLE) + .build(); + } catch (UnsupportedTypeException e) { + final String errorMessage = "Unable to convert TCAVESAlertEntity class to Schema"; + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + } + + /** + * Creates Row Key for Alerts Table + * + * @param date current Date + * + * @return row key + */ + public static String createRowKey(final Date date) { + return String.format("%025d", date.getTime()); + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java new file mode 100644 index 0000000..5688928 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java @@ -0,0 +1,47 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.settings; + +/** + *

+ * Minimum Contract for all CDAP App Configs + *

+ * + * @author Rajiv Singla . Creation Date: 11/2/2016. + */ +public interface CDAPAppConfig extends CDAPAppSettings { + + /** + * CDAP Application Name + * + * @return cdap app name + */ + String getAppName(); + + + /** + * CDAP Application Description + * + * @return cdap app description + */ + String getAppDescription(); + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java new file mode 100644 index 0000000..4876db4 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java @@ -0,0 +1,31 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.settings; + +/** + *

+ * Marker Interface for all CDAP Preferences + *

+ * + * @author Rajiv Singla . Creation Date: 11/2/2016. + */ +public interface CDAPAppPreferences extends CDAPAppSettings { +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java new file mode 100644 index 0000000..dc13dfd --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java @@ -0,0 +1,35 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.settings; + +import java.io.Serializable; + +/** + *

+ * A marker interface for all CDAP Related App Settings. + * App Settings can either be preferences, cdap app settings etc. + *

+ * + * + * @author Rajiv Singla . Creation Date: 11/2/2016. + */ +public interface CDAPAppSettings extends Serializable { +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java new file mode 100644 index 0000000..a354e95 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java @@ -0,0 +1,64 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.settings; + +import co.cask.cdap.api.Config; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; + +/** + * Base class for all DACE Analytics Application Configurations + * + * @author Rajiv Singla . Creation Date: 10/4/2016. + */ +public abstract class CDAPBaseAppConfig extends Config implements CDAPAppConfig { + + + /** + * DCAE Analytics App Name + */ + protected String appName = CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_NAME_APP; + + /** + * DCAE Analytics App Description + */ + protected String appDescription = CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_DESCRIPTION_APP; + + + /** + * Returns DCAE Analytics CDAP Application name + * + * @return CDAP application name + */ + @Override + public String getAppName() { + return appName; + } + + /** + * Returns DCAE Analytics CDAP Application descrption + * + * @return CDAP application description + */ + @Override + public String getAppDescription() { + return appDescription; + } +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java new file mode 100644 index 0000000..16c6d49 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java @@ -0,0 +1,53 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.settings; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Macro; +import co.cask.cdap.api.annotation.Name; +import co.cask.cdap.api.plugin.PluginConfig; +import org.onap.dcae.apod.analytics.cdap.common.CDAPPluginConstants; + +/** + *

+ * Base class for all DCAE Analytics CDAP Plugin config + *

+ *

+ * @author Rajiv Singla . Creation Date: 1/17/2017. + */ +public abstract class CDAPBasePluginConfig extends PluginConfig implements CDAPPluginSettings { + + @Name(CDAPPluginConstants.Reference.REFERENCE_NAME) + @Description(CDAPPluginConstants.Reference.REFERENCE_NAME_DESCRIPTION) + @Macro + protected String referenceName; + + /** + * Provides Reference Name that can be used to trace lineage or meta data information inside CDAP container + * + * @return reference name + */ + public String getReferenceName() { + return referenceName; + } + + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java new file mode 100644 index 0000000..c451336 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java @@ -0,0 +1,31 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.settings; + +/** + *

+ * A marker interface for all CDAP Plugin related Settings. + *

+ * + * @author Rajiv Singla . Creation Date: 1/17/2017. + */ +public interface CDAPPluginSettings extends CDAPAppSettings { +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java new file mode 100644 index 0000000..24b2822 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java @@ -0,0 +1,144 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.utils; + +import co.cask.cdap.api.metrics.Metrics; +import com.google.common.base.Optional; +import com.google.common.base.Stopwatch; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.common.utils.HTTPUtils; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * Utility common methods for DMaaP MR functionality + * + * @author Rajiv Singla . Creation Date: 2/6/2017. + */ +public abstract class DMaaPMRUtils { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRUtils.class); + + private DMaaPMRUtils() { + // private constructor + } + + + /** + * Returns messages fetched from DMaaP MR Subscriber. + * + * @param subscriber DMaaP MR Subscriber instance + * @param metrics CDAP metrics + * + * @return messages fetched from DMaaP MR topic + */ + public static Optional> getSubscriberMessages(final DMaaPMRSubscriber subscriber, + final Metrics metrics) { + + final Optional subscriberResponseOptional = + getSubscriberResponse(subscriber, metrics); + + // If response is not present, unable to proceed + if (!subscriberResponseOptional.isPresent()) { + return Optional.absent(); + } + + final DMaaPMRSubscriberResponse subscriberResponse = subscriberResponseOptional.get(); + + // If response code return by the subscriber call is not successful, unable to do proceed + if (!HTTPUtils.isSuccessfulResponseCode(subscriberResponse.getResponseCode())) { + LOG.error("Subscriber was unable to fetch messages properly.Subscriber Response Code: {} " + + "Unable to proceed further....", subscriberResponse.getResponseCode()); + metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC, 1); + return Optional.absent(); + } + + LOG.debug("Subscriber HTTP Response Status Code match successful: {}", subscriberResponse, + HTTPUtils.HTTP_SUCCESS_STATUS_CODE); + + final List actualMessages = subscriberResponse.getFetchedMessages(); + + // If there are no message returned during from Subscriber, nothing to write to CDAP Stream + if (actualMessages.isEmpty()) { + LOG.debug("Subscriber Response has no messages. Nothing to write...."); + metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC, 1); + return Optional.absent(); + } + + LOG.debug("DMaaP MR Subscriber found new messages in DMaaP Topic. Message count: {}", actualMessages.size()); + metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC, actualMessages.size()); + + return Optional.of(actualMessages); + + } + + + /** + * Get Subscriber response and records time taken to fetch messages. Returns Optional.None if Subscriber response + * is null or response status code is not present + * + * @param subscriber - DMaaP Subscriber + * @param metrics - CDAP Metrics collector + * + * @return - Optional of Subscriber Response + */ + public static Optional getSubscriberResponse(final DMaaPMRSubscriber subscriber, + final Metrics metrics) { + + // Record all response count from subscriber + metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_ALL_RESPONSES_COUNT_METRIC, 1); + + // Check how long it took for subscriber to respond + final Stopwatch stopwatch = new Stopwatch(); + stopwatch.start(); + + // Fetch messages from DMaaP MR Topic + DMaaPMRSubscriberResponse subscriberResponse = null; + try { + subscriberResponse = subscriber.fetchMessages(); + } catch (DCAEAnalyticsRuntimeException e) { + LOG.error("Error while fetching messages for DMaaP MR Topic: {}", e); + } + + stopwatch.stop(); + final long subscriberResponseTimeMS = stopwatch.elapsedMillis(); + + // If response is null is null or response code is null, unable to proceed nothing to do + if (subscriberResponse == null || subscriberResponse.getResponseCode() == null) { + LOG.error("Subscriber Response is null or subscriber Response code is null. Unable to proceed further..."); + return Optional.absent(); + } + + LOG.debug("Subscriber Response:{}, Subscriber HTTP Response Status Code {}, Subscriber Response Time(ms): {}", + subscriberResponse, subscriberResponse.getResponseCode(), subscriberResponseTimeMS); + + // Record subscriber response time + metrics.gauge(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_RESPONSE_TIME_MS_METRIC, subscriberResponseTimeMS); + + return Optional.of(subscriberResponse); + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java new file mode 100644 index 0000000..5ab2427 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java @@ -0,0 +1,107 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.utils; + + +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPAppSettings; +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.common.validation.ValidationResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Utility methods to validate null checks, empty string etc + * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public abstract class ValidationUtils { + + private static final Logger LOG = LoggerFactory.getLogger(ValidationUtils.class); + + private ValidationUtils() { + + } + + /** + * Checks if String is empty. For null string true is returned + * + * @param stringValue string value + * @return returns true is string is empty or null + */ + public static boolean isEmpty(@Nullable final String stringValue) { + return stringValue == null || stringValue.isEmpty() || stringValue.trim().isEmpty(); + } + + + /** + * Checks if String value is present. A null, empty, or blank values of string + * are considered not present. + * + * @param stringValue string value to check if it is present or not + * + * @return true if string value is not null, empty or blank + */ + public static boolean isPresent(@Nullable final String stringValue) { + return !isEmpty(stringValue); + } + + + /** + * Provides common functionality to Validates CDAP App Settings. Throws Runtime exception if validation fails + * + * @param appSettings app Settings e.g. App Config, App Preferences etc + * @param appSettingsValidator app Settings validator + * + * @param Settings type e.g. AppConfig or AppPreferences + * @param Validation Response type + * @param Validator Type + */ + public static , + V extends CDAPAppSettingsValidator> void validateSettings(@Nonnull final T appSettings, + @Nonnull final V appSettingsValidator) { + checkNotNull(appSettings, "App Settings must not be null"); + checkNotNull(appSettingsValidator, "App Settings validator must not be null"); + + final String appSettingsClassName = appSettings.getClass().getSimpleName(); + final String appSettingsClassValidator = appSettingsValidator.getClass().getSimpleName(); + + LOG.debug("Validating App Settings for: {}, with App Settings Validator: {} ", + appSettingsClassName, appSettingsClassValidator); + + final R validationResponse = appSettingsValidator.validateAppSettings(appSettings); + + // If setting validation fails throw an exception + if (validationResponse.hasErrors()) { + throw new CDAPSettingsException( + validationResponse.getAllErrorMessage(), LOG, new IllegalArgumentException()); + } + + LOG.debug("App Settings Validation Successful for app Settings: {} with validator: {}", appSettingsClassName, + appSettingsClassValidator); + } + +} diff --git a/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java new file mode 100644 index 0000000..2d3cbb1 --- /dev/null +++ b/dcae-analytics-cdap-common/src/main/java/org/onap/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java @@ -0,0 +1,52 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.validation; + +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPAppSettings; +import org.onap.dcae.apod.analytics.common.validation.DCAEValidator; +import org.onap.dcae.apod.analytics.common.validation.ValidationResponse; + +/** + *

+ * Validates CDAP Application Settings (AppConfig, Preferences etc) + *

+ * + * @param {@link CDAPAppSettings} DCAE Analytics App Settings (e.g. AppConfig, Preferences) + * @param {@link ValidationResponse} Validator response implementations + * + * @author Rajiv Singla . Creation Date: 11/2/2016. + */ +public interface CDAPAppSettingsValidator> + extends DCAEValidator { + + /** + * Validates DCAE Analytics App Settings and return Validation response which can be + * checked for any app setting issues + * + * @param appSettings DCAE CDAP Application Settings (e.g. AppConfig, Preferences etc.) + * @return validation response + */ + R validateAppSettings(T appSettings); + + +} + + diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java deleted file mode 100644 index 0856643..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPComponentsConstants.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common; - -/** - * Contains static constant variable names and values of all DCAE CDAP Components for - * e.g. app names, app descriptions, streams, datasets, flows, flowlets, workers, outputs etc. - * - *

- * A strict naming convention must be followed for variable names for CDAP Components names for proper - * identification of CDAP Component variable purpose and function. A custom configuration settings can be - * generated for app - * deployment purposes based on variable naming conventions. - * - * The variable names should have 4 parts separated by an underscore: - *

    - *
  • Name of the DCAE sub module (e.g. TCA) to which variable is applicable
  • - *
  • Information about variable name: - *
      - *
    • FIXED - if variable value is fixed and cannot be changed
    • - *
    • DEFAULT - if variable name is default name and can be changed by cdap settings file - * when application is created
    • - *
    - *
  • - *
  • Actual Descriptive name about the CDAP component (may contain underscrores)
  • - *
  • CDAP component type e.g STREAM, DATASET, APP, FLOW, FLOWLET, OUTPUT
  • - *
- * - *

e.g TCA_DEFAULT_DMAAP_INPUT_STREAM

- * - *

RegEx Format (DCAE MODULE NAME)_(FIXED|DEFAULT)_(VARIABLE NAME)_(CDAP COMPONENT TYPE)

- * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public abstract class CDAPComponentsConstants { - - // =============== Common Module Constants ==================== // - - /** - * Default DCAE App Name. It should be overriden by sub modules - */ - public static final String COMMON_DEFAULT_DCAE_CDAP_NAME_APP = "DCAE_ANALYTICS_GENERIC_APP"; - - /** - * Default DCAE App Description. It should be overriden by sub modules - */ - public static final String COMMON_DEFAULT_DCAE_CDAP_DESCRIPTION_APP = "DCAE ANALYTICS GENERIC APP DESCRIPTION"; - - // =============== TCA Module Constants ==================== // - - /** - * Default TCA application name if application name is not provided from startup configuration - */ - public static final String TCA_DEFAULT_NAME_APP = "dcae-tca"; - - /** - * Default TCA application description if not provided from startup configuration - */ - public static final String TCA_DEFAULT_DESCRIPTION_APP = "DCAE Analytics Threshold Crossing Alert Application"; - - /** - * Default TCA DMaaP Subscriber output stream name if not provided from startup configuration - */ - public static final String TCA_DEFAULT_SUBSCRIBER_OUTPUT_NAME_STREAM = "TCASubscriberOutputStream"; - - - /** - * Fixed TCA DMaaP Subscriber output stream description - */ - public static final String TCA_FIXED_SUBSCRIBER_OUTPUT_DESCRIPTION_STREAM = - "Stream which contains all message from VES Collector DMaaP MR topic"; - - - /** - * Fixed Name of TCA DMaaP Subscriber Worker - which will be fetching DMaaP Messages posting them to CDAP stream - */ - public static final String TCA_FIXED_DMAAP_SUBSCRIBER_WORKER = "TCADMaaPMRSubscriberWorker"; - - /** - * Fixed Description of TCA DMaaP Subscriber Worker - */ - public static final String TCA_FIXED_DMAAP_SUBSCRIBER_DESCRIPTION_WORKER = - "Fetches messages from DMaaP MR Topic at frequent intervals and writes them to a CDAP stream"; - - /** - * Fixed Name of TCA DMaaP Publisher Worker - which will be publishing messages to DMaaP MR - */ - public static final String TCA_FIXED_DMAAP_PUBLISHER_WORKER = "TCADMaaPMRPublisherWorker"; - - /** - * Fixed Description of TCA DMaaP Publisher Worker - */ - public static final String TCA_FIXED_DMAAP_PUBLISHER_DESCRIPTION_WORKER = - "Polls TCA Alerts Table at frequent intervals for new alerts and publishes them to DMaaP MR Topic"; - - /** - * Fixed name for TCA VES Collector Messages Processing Flow - */ - public static final String TCA_FIXED_VES_COLLECTOR_NAME_FLOW = "TCAVESCollectorFlow"; - - - /** - * Fixed description for TCA VES Collector Messages Processing Flow - */ - public static final String TCA_FIXED_VES_COLLECTOR_DESCRIPTION_FLOW = "Flow performs TCA on VES Collector Messages"; - - - /** - * Fixed Name for TCA VES Message Router Flowlet - */ - public static final String TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET = "TCAVESMessageRouterFlowlet"; - - /** - * Fixed Description for TCA VES Message Router Flowlet - */ - public static final String TCA_FIXED_VES_MESSAGE_ROUTER_DESCRIPTION_FLOWLET = - "Routes message received from TCA VES Collector to TCA Threshold Calculator Flowlet instances"; - - /** - * Fixed TCA VES Message Router Flowlet Output - */ - public static final String TCA_FIXED_VES_MESSAGE_ROUTER_OUTPUT = "TCAVESMessageRouterFlowlet"; - - /** - * Fixed Name for TCA VES Message Policy Violated Threshold Calculator Flowlet - */ - public static final String TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET = - "TCAVESThresholdViolationCalculatorFlowlet"; - - /** - * Fixed Description for TCA VES Message Policy Violated Threshold Calculator Flowlet - */ - public static final String TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_DESCRIPTION_FLOWLET = - "Applies TCA Policy Thresholds to VES Message and determined if any message violated TCA Policy thresholds"; - - /** - * Fixed Name for TCA VES Message Policy Violated Threshold Calculator Output - */ - public static final String TCA_FIXED_VES_TCA_CALCULATOR_NAME_OUTPUT = "TCAThresholdViolationCalculatorOutput"; - - - /** - * Fixed Name for TCA VES Alerts Abatement Flowlet - */ - public static final String TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET = "TCAVESAlertsAbatementFlowlet"; - - /** - * Fixed Description for TCA VES Alerts Abatement Flowlet - */ - public static final String TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET = - "Determines if abatement event needs to be posted to downstream systems"; - - /** - * Fixed Name for TCA VES Alerts Abatement Flowlet output - */ - public static final String TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_OUTPUT = "TCAVESAlertsAbatementFlowletOutput"; - - - /** - * Fixed Name for TCA VES A&AI Enrichment Flowlet - */ - public static final String TCA_FIXED_VES_AAI_ENRICHMENT_NAME_FLOWLET = "TCAVESAAIEnrichmentFlowlet"; - - /** - * Fixed Description for TCA VES A&AI Enrichment Flowlet - */ - public static final String TCA_FIXED_VES_AAI_ENRICHMENT_DESCRIPTION_FLOWLET = - "Performs A&AI Enrichment of non abated alerts"; - - /** - * Fixed Name for TCA VES A&AI Enrichment Flowlet output - */ - public static final String TCA_FIXED_VES_AAI_ENRICHMENT_NAME_OUTPUT = "TCAVESAAIEnrichmentFlowletOutput"; - - /** - * Fixed Name for TCA VES Alerts Sink Flowlet - */ - public static final String TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET = "TCAVESAlertsSinkFlowlet"; - - /** - * Fixed Description for TCA VES Alerts Sink Flowlet - */ - public static final String TCA_FIXED_VES_ALERTS_SINK_DESCRIPTION_FLOWLET = - "Saves messages which violated TCA Policy in a data set"; - - - /** - * Default Name for TCA VES Message status table which contain status of all messages processed by TCA - */ - public static final String TCA_DEFAULT_VES_MESSAGE_STATUS_NAME_TABLE = "TCAVESMessageStatusTable"; - - - /** - * Fixed Description for TCA VES Message status table which contain status of all messages processed by TCA - */ - public static final String TCA_FIXED_VES_MESSAGE_STATUS_DESCRIPTION_TABLE = - "Store processing information about all incoming TCA VES Messages"; - - /** - * Default Name for TCA VES Alerts table which contains alerts that can be send to downstream systems - */ - public static final String TCA_DEFAULT_VES_ALERTS_NAME_TABLE = "TCAVESAlertsTable"; - - /** - * Fixed Description for TCA VES Alerts table which contains alerts that can be send to downstream systems - */ - public static final String TCA_FIXED_VES_ALERTS_DESCRIPTION_TABLE = - "Stores alert messages that need to be DMaaP"; - - /** - * Default Name for TCA Alerts abatement table which contains information to send out abated alerts - */ - public static final String TCA_DEFAULT_ALERTS_ABATEMENT_NAME_TABLE = "TCAAlertsAbatementTable"; - - /** - * Fixed Description for TCA Alerts abatement table which contains information to determine abatement alerts - */ - public static final String TCA_FIXED_ALERTS_ABATEMENT_DESCRIPTION_TABLE = - "Stores information to determine creation of abatement alerts"; - - - private CDAPComponentsConstants() { - - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java deleted file mode 100644 index d336960..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPMetricsConstants.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common; - -/** - * Contains all metrics names used for DCAE CDAP modules - * - *

- * Format should be (ModuleName)_(Description of metrics)_METRIC e.g. TCA_WORKER_FAILED_ATTEMPTS_METRIC - *

- * - * @author Rajiv Singla . Creation Date: 10/25/2016. - */ -public abstract class CDAPMetricsConstants { - - /** - * Metric captures count of all responses received from DMaaP MR Subscriber Topic - */ - public static final String DMAAP_MR_SUBSCRIBER_ALL_RESPONSES_COUNT_METRIC = - "dmaap.subscriber.fetch.all_responses"; - - /** - * Metric captures count of responses from DMaaP MR Subscriber Topic which does not have 200 HTTP Response code. - * This can be due to DMaaP topic being down or any internal server errors etc. - */ - public static final String DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC = - "dmaap.subscriber.fetch.unsuccessful"; - - /** - * Metric that counts the number of successful (200 HTTP Response Code) calls to DMaaP which did not had empty - * messages - */ - public static final String DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC = - "dmaap.subscriber.fetch.no_message"; - - /** - * Metric to count total number of message processed by DMaaP MR subscriber - */ - public static final String DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC = "dmaap.subscriber.message.count"; - - - /** - * Metric to record time taken in ms by subscriber in its most recent call to fetch DMaaP MR messages - */ - public static final String DMAAP_MR_SUBSCRIBER_RESPONSE_TIME_MS_METRIC = "dmaap.subscriber.fetch.response_time"; - - /** - * Metric captures the count of number of times DMaaP MR Subscriber was unable to write to DMaaP Stream due - * some CDAP error while writing to stream. This should ideally never happen assuming we have enough space - * on CDAP machine and CDAP process is functioning normally - */ - public static final String TCA_SUBSCRIBER_FAILURE_TO_WRITE_TO_STREAM_METRIC = "tca.subscriber.stream.writing.error"; - - - /** - * Metric captures number of VES messages that are not applicable as per TCA Policy - */ - public static final String TCA_VES_INAPPLICABLE_MESSAGES_METRIC = "tca.ves.calculator.inapplicable"; - - /** - * Metric captures number of VES messages that are applicable as per TCA Policy but don't violate any thresholds - */ - public static final String TCA_VES_COMPLIANT_MESSAGES_METRIC = "tca.ves.calculator.compliant"; - - /** - * Metrics captures number of VES messages that are applicable as per TCA Policy and does violate thresholds and - * will likely cause an alert - */ - public static final String TCA_VES_NON_COMPLIANT_MESSAGES_METRIC = "tca.ves.calculator.non_compliant"; - - - /** - * Metric that counts the number of publisher look ups in alerts table which resulted in 0 new alerts - */ - public static final String TCA_PUBLISHER_NO_NEW_ALERTS_LOOKUP_METRIC = "tca.publisher.lookup.no_message"; - - /** - * Metric that counts the number of new alerts found by the publisher in alerts table - */ - public static final String TCA_PUBLISHER_NEW_ALERTS_METRIC = "tca.publisher.lookup.new_messages"; - - /** - * Metric that counts the number of alerts deleted by publisher in alerts table - */ - public static final String TCA_PUBLISHER_DELETED_ALERTS_METRIC = "tca.publisher.deleted.alerts"; - - /** - * Metric that counts the number of publisher calls to DMaaP which resulted in successful response code - */ - public static final String TCA_PUBLISHER_SUCCESSFUL_DMAAP_RESPONSE_METRIC = "tca.publisher.publish.successful"; - - /** - * Metric that counts the number of publisher calls to DMaaP which resulted in unsuccessful response code - */ - public static final String TCA_PUBLISHER_UNSUCCESSFUL_DMAAP_RESPONSE_METRIC = "tca.publisher.publish.unsuccessful"; - - private CDAPMetricsConstants() { - - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java deleted file mode 100644 index 3d53d79..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/CDAPPluginConstants.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common; - -/** - *

- * Contains CDAP Plugin Constants - *

- * @author Rajiv Singla . Creation Date: 1/17/2017. - */ -public abstract class CDAPPluginConstants { - - /** - * Common Reference Name property name and description used to create an external Dataset for metadata, lineage - * purposes - */ - public static class Reference { - - public static final String REFERENCE_NAME = "referenceName"; - public static final String REFERENCE_NAME_DESCRIPTION = - "This will be used to uniquely identify this source/sink for lineage, annotating metadata, etc."; - - private Reference() { - // private constructor - } - - } - - /** - * Contains fields for DMaaP MR Sink Map Reduce Hadoop Configuration - */ - public static class DMaaPMRSinkHadoopConfigFields { - - public static final String HOST_NAME = "dmaap.mr.sink.hostName"; - public static final String PORT_NUMBER = "dmaap.mr.sink.portNumber"; - public static final String TOPIC_NAME = "dmaap.mr.sink.topicName"; - public static final String PROTOCOL = "dmaap.mr.sink.protocol"; - public static final String USER_NAME = "dmaap.mr.sink.userName"; - public static final String USER_PASS = "dmaap.mr.sink.userPassword"; - public static final String CONTENT_TYPE = "dmaap.mr.sink.contentType"; - public static final String MAX_BATCH_SIZE = "dmaap.mr.sink.maxBatchSize"; - public static final String MAX_RECOVER_QUEUE_SIZE = "dmaap.mr.sink.maxRecoveryQueueSize"; - - private DMaaPMRSinkHadoopConfigFields() { - // private constructor - } - } - - - private CDAPPluginConstants() { - // private constructor - } -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java deleted file mode 100644 index 2808316..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/domain/tca/ThresholdCalculatorOutput.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.domain.tca; - -import com.google.common.base.Objects; - -import java.io.Serializable; - -/** - * Simple POJO emitted by threshold calculator - * - * @author Rajiv Singla . Creation Date: 9/11/2017. - */ -public class ThresholdCalculatorOutput implements Serializable { - - private static final long serialVersionUID = 1L; - - protected String cefMessage; - protected String tcaPolicy; - protected String violatedMetricsPerEventName; - protected String alertMessage; - - public ThresholdCalculatorOutput() { - // no arg constructor - } - - public ThresholdCalculatorOutput(String cefMessage, String tcaPolicy, - String violatedMetricsPerEventName, String alertMessage) { - this.cefMessage = cefMessage; - this.tcaPolicy = tcaPolicy; - this.violatedMetricsPerEventName = violatedMetricsPerEventName; - this.alertMessage = alertMessage; - } - - public String getCefMessage() { - return cefMessage; - } - - public void setCefMessage(String cefMessage) { - this.cefMessage = cefMessage; - } - - public String getTcaPolicy() { - return tcaPolicy; - } - - public void setTcaPolicy(String tcaPolicy) { - this.tcaPolicy = tcaPolicy; - } - - public String getViolatedMetricsPerEventName() { - return violatedMetricsPerEventName; - } - - public void setViolatedMetricsPerEventName(String violatedMetricsPerEventName) { - this.violatedMetricsPerEventName = violatedMetricsPerEventName; - } - - public String getAlertMessage() { - return alertMessage; - } - - public void setAlertMessage(String alertMessage) { - this.alertMessage = alertMessage; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("cefMessage", cefMessage) - .add("tcaPolicy", tcaPolicy) - .add("violatedMetricsPerEventName", violatedMetricsPerEventName) - .add("alertMessage", alertMessage) - .toString(); - } -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java deleted file mode 100644 index 329a4da..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/exception/CDAPSettingsException.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.exception; - -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.slf4j.Logger; - -/** - * Runtime exception which signals that DCAE CDAP App settings (e.g. app config, preferences) validation failed - * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public class CDAPSettingsException extends DCAEAnalyticsRuntimeException { - - /** - * @param message - Error Message for Exception - * @param cause - Actual Exception which caused {@link DCAEAnalyticsRuntimeException} - */ - public CDAPSettingsException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Creates and logs the DCAE App Config Exception to given logger - * - * @param message - Error Message for Exception and logging - * @param logger - Logger used for logging exception - * @param cause - Actual exception which caused - */ - public CDAPSettingsException(String message, Logger logger, Throwable cause) { - super(message, logger, cause); - } -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java deleted file mode 100644 index 1eb1827..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementEntity.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import com.google.common.base.Objects; -import org.apache.hadoop.io.Writable; -import org.apache.hadoop.io.WritableUtils; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.io.Serializable; - -/** - * TCA Alerts Abatement Entity is used to persist information to determine if abatement event need to sent to downstream - * systems - * - * @author Rajiv Singla . Creation Date: 9/11/2017. - */ -public class TCAAlertsAbatementEntity implements Writable, Serializable { - - private static final long serialVersionUID = 1L; - - private long creationTS; - private String requestId; - // Kept as string to avoid null checks - private String abatementSentTS; - - /** - * No Arg constructor required for Jackson Json Serialization / Deserialization - */ - public TCAAlertsAbatementEntity() { - // required no arg constructor - } - - /** - * Creates TCA Alerts Abatement Entity to persist information to determine if abatement alerts need to be posted - * - * @param creationTS record creation time - * @param requestId request ID of generated alert - * @param abatementSentTS time when abatement was sent out for that alert if any - */ - public TCAAlertsAbatementEntity(long creationTS, String requestId, String abatementSentTS) { - this.creationTS = creationTS; - this.requestId = requestId; - this.abatementSentTS = abatementSentTS; - } - - /** - * Timestamp when record was created - * - * @return timestamp when record was created - */ - public long getCreationTS() { - return creationTS; - } - - /** - * Set value for timestamp when record was created - * - * @param creationTS new value for timestamp when record was created - */ - public void setCreationTS(long creationTS) { - this.creationTS = creationTS; - } - - /** - * Request Id of ONSET alert which was sent - * - * @return request Id of ONSET alert which was sent - */ - public String getRequestId() { - return requestId; - } - - /** - * Set Request Id of ONSET alert - * - * @param requestId set new value for ONSET alert request id - */ - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - - /** - * Get abatement Sent Timestamp - * - * @return get abatement alert sent timestamp - */ - public String getAbatementSentTS() { - return abatementSentTS; - } - - /** - * Set timestamp when abatement alert is sent - * - * @param abatementSentTS sent new value for timestamp when abatement alert is sent - */ - public void setAbatementSentTS(String abatementSentTS) { - this.abatementSentTS = abatementSentTS; - } - - /** - * Write entity to Table - * - * @param dataOutput data output - * @throws IOException io exception - */ - @Override - public void write(DataOutput dataOutput) throws IOException { - WritableUtils.writeVLong(dataOutput, creationTS); - WritableUtils.writeString(dataOutput, requestId); - WritableUtils.writeString(dataOutput, abatementSentTS); - } - - /** - * Read entity from table - * - * @param dataInput data input - * @throws IOException io exception - */ - @Override - public void readFields(DataInput dataInput) throws IOException { - creationTS = WritableUtils.readVLong(dataInput); - requestId = WritableUtils.readString(dataInput); - abatementSentTS = WritableUtils.readString(dataInput); - } - - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("creationTS", creationTS) - .add("requestId", requestId) - .add("abatementSentTS", abatementSentTS) - .toString(); - } -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java deleted file mode 100644 index 3a3182b..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersister.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.api.data.schema.UnsupportedTypeException; -import co.cask.cdap.api.dataset.DatasetProperties; -import co.cask.cdap.api.dataset.lib.IndexedTable; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.model.facade.tca.TCAVESResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Date; -import java.util.List; - -import static org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME; - -/** - * Utility methods to persist TCA Alerts Abatement information - * - * @author Rajiv Singla . Creation Date: 9/11/2017. - */ -public abstract class TCAAlertsAbatementPersister { - - private static final Logger LOG = LoggerFactory.getLogger(TCAAlertsAbatementPersister.class); - - private static final Joiner KEY_JOINER = Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER); - - private TCAAlertsAbatementPersister() { - // private constructor - } - - /** - * Creates {@link DatasetProperties} for Alerts Table - * - * @param timeToLiveSeconds alerts table Time to Live - * - * @return Alerts Abatement table properties - */ - public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) { - try { - return ObjectMappedTableProperties.builder() - .setType(TCAAlertsAbatementEntity.class) - .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME) - .setRowKeyExploreType(Schema.Type.STRING) - .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds) - .setDescription(CDAPComponentsConstants.TCA_FIXED_ALERTS_ABATEMENT_DESCRIPTION_TABLE) - .build(); - } catch (UnsupportedTypeException e) { - final String errorMessage = "Unable to convert TCAAlertsAbatementEntity class to Schema"; - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - - - public static void persist(final EventListener eventListener, - final MetricsPerEventName violatedMetricsPerEventName, - final TCAVESResponse tcavesResponse, - final String abatementTS, - final ObjectMappedTable tcaAlertsAbatementTable) { - final String abatementTableKey = createKey(eventListener, violatedMetricsPerEventName); - - final long currentTimestamp = new Date().getTime(); - final String requestID = tcavesResponse.getRequestID(); - final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = new TCAAlertsAbatementEntity(currentTimestamp, - requestID, abatementTS); - tcaAlertsAbatementTable.write(abatementTableKey, tcaAlertsAbatementEntity); - - LOG.debug("Persisted AlertsAbatementEntity: {} with Key: {}", tcaAlertsAbatementEntity, abatementTableKey); - - } - - public static TCAAlertsAbatementEntity lookUpByKey(final EventListener eventListener, - final MetricsPerEventName violatedMetricsPerEventName, - final ObjectMappedTable - tcaAlertsAbatementTable) { - final String abatementTableKey = createKey(eventListener, violatedMetricsPerEventName); - return tcaAlertsAbatementTable.read(abatementTableKey); - } - - - public static String createKey(final EventListener eventListener, - final MetricsPerEventName violatedMetricsPerEventName) { - // no null check required as all are required fields - final String eventName = violatedMetricsPerEventName.getEventName(); - final String sourceName = eventListener.getEvent().getCommonEventHeader().getSourceName(); - final String reportingEntityName = eventListener.getEvent().getCommonEventHeader().getReportingEntityName(); - // violated threshold will always be present - final Threshold violatedThreshold = violatedMetricsPerEventName.getThresholds().get(0); - final String closedLoopControlName = violatedThreshold.getClosedLoopControlName(); - final String fieldPath = violatedThreshold.getFieldPath(); - - final List abatementKeyList = - ImmutableList.of(eventName, sourceName, reportingEntityName, closedLoopControlName, fieldPath); - - return KEY_JOINER.join(abatementKeyList); - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java deleted file mode 100644 index 9b5c325..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageType.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -/** - * TCA Calculator applies TCA Policy to incoming VES messages and classifies them as per this enum - * - * @author Rajiv Singla . Creation Date: 11/15/2016. - */ -public enum TCACalculatorMessageType { - - /** - * VES messages that are not applicable as per TCA Policy - */ - INAPPLICABLE, - /** - * VES messages that are applicable as per TCA Policy but don't violate any thresholds - */ - COMPLIANT, - /** - * VES messages that are applicable as per TCA Policy and also in violation of TCA Policy thresholds - */ - NON_COMPLIANT; - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java deleted file mode 100644 index 98c9337..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusEntity.java +++ /dev/null @@ -1,550 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import org.apache.hadoop.io.Writable; -import org.apache.hadoop.io.WritableUtils; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Direction; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyDomainFilter; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyEventNameFilter; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyThresholdsProcessor; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.io.Serializable; - -/** - * TCA Message Status is an Entity which is used to persist TCA VES Message status information in Message Status Table - * - * @author Rajiv Singla . Creation Date: 11/16/2016. - */ -public class TCAMessageStatusEntity implements Writable, Serializable { - - private static final long serialVersionUID = 1L; - - private long creationTS; - private int instanceId; - private String messageType; - private String vesMessage; - private String domain; - private String eventName; - private String thresholdPath; - private String thresholdSeverity; - private String thresholdDirection; - private Long thresholdValue; - private String jsonProcessorStatus; - private String jsonProcessorMessage; - private String domainFilterStatus; - private String domainFilterMessage; - private String eventNameFilterStatus; - private String eventNameFilterMessage; - private String thresholdCalculatorStatus; - private String thresholdCalculatorMessage; - private String alertMessage; - - /** - * No Arg constructor required for Jackson Json Serialization / Deserialization - */ - public TCAMessageStatusEntity() { - // no argument constructor required for json serialization / deserialization - } - - /** - * Create new Instance of {@link TCAMessageStatusEntity} - * - * @param creationTS creation Timestamp - * @param instanceId CDAP flowlet instance ID - * @param messageType {@link TCACalculatorMessageType} - * @param vesMessage incoming VES message from collector - * @param domain VES message domain if present - * @param eventName VES message functional role if present - */ - public TCAMessageStatusEntity(final long creationTS, final int instanceId, final String messageType, - final String vesMessage, final String domain, final String eventName) { - this(creationTS, instanceId, messageType, vesMessage, domain, eventName, null, null, null, null, - null, null, null, null, null, null, null, null, null); - } - - - /** - * Create new Instance of {@link TCAMessageStatusEntity} - * - * @param creationTS creation Timestamp - * @param instanceId CDAP flowlet instance ID - * @param messageType {@link TCACalculatorMessageType} - * @param vesMessage incoming VES message from collector - * @param domain VES message domain if present - * @param eventName VES message event name if present - * @param thresholdPath Violated threshold path - * @param thresholdSeverity Violated threshold Severity if any - * @param thresholdDirection Violated threshold Direction if any - * @param thresholdValue Violated threshold value if any - * @param jsonProcessorStatus {@link TCACEFJsonProcessor} status - * @param jsonProcessorMessage {@link TCACEFJsonProcessor} message - * @param domainFilterStatus {@link TCACEFPolicyDomainFilter} status - * @param domainFilterMessage {@link TCACEFPolicyDomainFilter} message - * @param eventNameFilterStatus {@link TCACEFPolicyEventNameFilter} status - * @param eventNameFilterMessage {@link TCACEFPolicyEventNameFilter} message - * @param thresholdCalculatorStatus {@link TCACEFPolicyThresholdsProcessor} status - * @param thresholdCalculatorMessage {@link TCACEFPolicyThresholdsProcessor} message - * @param alertMessage alert message that will be sent out in case of threshold violation - */ - public TCAMessageStatusEntity(long creationTS, int instanceId, String messageType, String vesMessage, - String domain, String eventName, - String thresholdPath, String thresholdSeverity, String thresholdDirection, - Long thresholdValue, - String jsonProcessorStatus, String jsonProcessorMessage, - String domainFilterStatus, String domainFilterMessage, - String eventNameFilterStatus, String eventNameFilterMessage, - String thresholdCalculatorStatus, String thresholdCalculatorMessage, - String alertMessage) { - this.creationTS = creationTS; - this.instanceId = instanceId; - this.messageType = messageType; - this.vesMessage = vesMessage; - this.domain = domain; - this.eventName = eventName; - this.thresholdPath = thresholdPath; - this.thresholdSeverity = thresholdSeverity; - this.thresholdDirection = thresholdDirection; - this.thresholdValue = thresholdValue; - this.jsonProcessorStatus = jsonProcessorStatus; - this.jsonProcessorMessage = jsonProcessorMessage; - this.domainFilterStatus = domainFilterStatus; - this.domainFilterMessage = domainFilterMessage; - this.eventNameFilterStatus = eventNameFilterStatus; - this.eventNameFilterMessage = eventNameFilterMessage; - this.thresholdCalculatorStatus = thresholdCalculatorStatus; - this.thresholdCalculatorMessage = thresholdCalculatorMessage; - this.alertMessage = alertMessage; - } - - /** - * Provides Creation Timestamp - * - * @return creation timestamp long value - */ - public long getCreationTS() { - return creationTS; - } - - /** - * Sets Creations Timestamp - * - * @param creationTS creation timestamp long value - */ - public void setCreationTS(long creationTS) { - this.creationTS = creationTS; - } - - - /** - * Provides CDAP Flowlet instance ID - * - * @return cdap flowlet instance ID - */ - public int getInstanceId() { - return instanceId; - } - - /** - * Sets CDAP Flowlet instance ID - * - * @param instanceId flowlet instance ID - */ - public void setInstanceId(int instanceId) { - this.instanceId = instanceId; - } - - /** - * Provides Message Calculator Type {@link TCACalculatorMessageType} - * - * @return calculator message type - */ - public String getMessageType() { - return messageType; - } - - /** - * Sets Calculator message Type {@link TCACalculatorMessageType} - * - * @param messageType calculator message type - */ - public void setMessageType(String messageType) { - this.messageType = messageType; - } - - /** - * Provides incoming VES Message - * - * @return ves message - */ - public String getVesMessage() { - return vesMessage; - } - - /** - * Set new value for VES message - * - * @param vesMessage ves message - */ - public void setVesMessage(String vesMessage) { - this.vesMessage = vesMessage; - } - - /** - * Provides VES message Domain - * - * @return ves message domain - */ - public String getDomain() { - return domain; - } - - /** - * Sets VES Message Domain - * - * @param domain ves message domain - */ - public void setDomain(String domain) { - this.domain = domain; - } - - /** - * Provides VES Message Event Name - * - * @return ves message Event Name - */ - public String getEventName() { - return eventName; - } - - /** - * Sets VES Message Functional Role - * - * @param eventName ves message Functional Role - */ - public void setEventName(String eventName) { - this.eventName = eventName; - } - - /** - * Violated Threshold Path as extracted from {@link TCAPolicy} - * - * @return violated threshold path - */ - public String getThresholdPath() { - return thresholdPath; - } - - /** - * Sets value for Violated Threshold Path - * - * @param thresholdPath violated threshold path - */ - public void setThresholdPath(String thresholdPath) { - this.thresholdPath = thresholdPath; - } - - /** - * Violated threshold Event Severity - * - * @return event severity - */ - public String getThresholdSeverity() { - return thresholdSeverity; - } - - /** - * Violated Threshold Severity - * - * @param thresholdSeverity violated threshold severity - */ - public void setThresholdSeverity(String thresholdSeverity) { - this.thresholdSeverity = thresholdSeverity; - } - - /** - * Violated Threshold {@link Direction} - * - * @return violated threshold Direction - */ - public String getThresholdDirection() { - return thresholdDirection; - } - - /** - * Sets Violated Threshold Direction - * - * @param thresholdDirection violated threshold direction - */ - public void setThresholdDirection(String thresholdDirection) { - this.thresholdDirection = thresholdDirection; - } - - /** - * Provides Violated Threshold Value - * - * @return violated Threshold value - */ - public Long getThresholdValue() { - return thresholdValue; - } - - /** - * Sets Violated Threshold Value - * - * @param thresholdValue violated threshold value - */ - public void setThresholdValue(Long thresholdValue) { - this.thresholdValue = thresholdValue; - } - - /** - * Provides {@link TCACEFJsonProcessor} status - * - * @return json processor status - */ - public String getJsonProcessorStatus() { - return jsonProcessorStatus; - } - - /** - * Sets Json Processor status - * - * @param jsonProcessorStatus json processor status - */ - public void setJsonProcessorStatus(String jsonProcessorStatus) { - this.jsonProcessorStatus = jsonProcessorStatus; - } - - /** - * Provides {@link TCACEFJsonProcessor} message - * - * @return json processor message - */ - public String getJsonProcessorMessage() { - return jsonProcessorMessage; - } - - /** - * Sets Json Processor Message - * - * @param jsonProcessorMessage json processor message - */ - public void setJsonProcessorMessage(String jsonProcessorMessage) { - this.jsonProcessorMessage = jsonProcessorMessage; - } - - /** - * Provides {@link TCACEFPolicyDomainFilter} status - * - * @return domain filter status - */ - public String getDomainFilterStatus() { - return domainFilterStatus; - } - - /** - * Sets Domain Filter status - * - * @param domainFilterStatus domain filter status - */ - public void setDomainFilterStatus(String domainFilterStatus) { - this.domainFilterStatus = domainFilterStatus; - } - - /** - * Provides {@link TCACEFPolicyDomainFilter} message - * - * @return domain filter message - */ - public String getDomainFilterMessage() { - return domainFilterMessage; - } - - /** - * Sets Domain filter message - * - * @param domainFilterMessage domain filter message - */ - public void setDomainFilterMessage(String domainFilterMessage) { - this.domainFilterMessage = domainFilterMessage; - } - - public String getEventNameFilterStatus() { - return eventNameFilterStatus; - } - - /** - * Provides {@link TCACEFPolicyEventNameFilter} status - * - * @param eventNameFilterStatus functional Role filter status - */ - public void setEventNameFilterStatus(String eventNameFilterStatus) { - this.eventNameFilterStatus = eventNameFilterStatus; - } - - /** - * Provides {@link TCACEFPolicyEventNameFilter} message - * - * @return functional role filter message - */ - public String getEventNameFilterMessage() { - return eventNameFilterMessage; - } - - /** - * Sets Functional Role filter message - * - * @param eventNameFilterMessage functional role filter message - */ - public void setEventNameFilterMessage(String eventNameFilterMessage) { - this.eventNameFilterMessage = eventNameFilterMessage; - } - - /** - * Provides {@link TCACEFPolicyThresholdsProcessor} status - * - * @return threshold processor status - */ - public String getThresholdCalculatorStatus() { - return thresholdCalculatorStatus; - } - - /** - * Sets threshold calculator status - * - * @param thresholdCalculatorStatus threshold calculator status - */ - public void setThresholdCalculatorStatus(String thresholdCalculatorStatus) { - this.thresholdCalculatorStatus = thresholdCalculatorStatus; - } - - /** - * Provides {@link TCACEFPolicyThresholdsProcessor} message - * - * @return threshold processor message - */ - public String getThresholdCalculatorMessage() { - return thresholdCalculatorMessage; - } - - /** - * Sets Threshold Calculator Processor Message - * - * @param thresholdCalculatorMessage threshold calculator message - */ - public void setThresholdCalculatorMessage(String thresholdCalculatorMessage) { - this.thresholdCalculatorMessage = thresholdCalculatorMessage; - } - - /** - * Provides generated alert message - * - * @return generated alert message - */ - public String getAlertMessage() { - return alertMessage; - } - - /** - * Sets alert message - * - * @param alertMessage alert message - */ - public void setAlertMessage(String alertMessage) { - this.alertMessage = alertMessage; - } - - /** - * Write entity to Table - * - * @param dataOutput data output - * - * @throws IOException io exception - */ - @Override - public void write(DataOutput dataOutput) throws IOException { - WritableUtils.writeVLong(dataOutput, creationTS); - WritableUtils.writeVInt(dataOutput, instanceId); - WritableUtils.writeString(dataOutput, messageType); - WritableUtils.writeString(dataOutput, vesMessage); - - WritableUtils.writeString(dataOutput, domain); - WritableUtils.writeString(dataOutput, eventName); - - WritableUtils.writeString(dataOutput, thresholdPath); - WritableUtils.writeString(dataOutput, thresholdSeverity); - WritableUtils.writeString(dataOutput, thresholdDirection); - WritableUtils.writeVLong(dataOutput, thresholdValue); - - WritableUtils.writeString(dataOutput, jsonProcessorStatus); - WritableUtils.writeString(dataOutput, jsonProcessorMessage); - WritableUtils.writeString(dataOutput, domainFilterStatus); - WritableUtils.writeString(dataOutput, domainFilterMessage); - WritableUtils.writeString(dataOutput, eventNameFilterStatus); - WritableUtils.writeString(dataOutput, eventNameFilterMessage); - WritableUtils.writeString(dataOutput, thresholdCalculatorStatus); - WritableUtils.writeString(dataOutput, thresholdCalculatorMessage); - - WritableUtils.writeString(dataOutput, alertMessage); - - } - - /** - * Read entity from table - * - * @param dataInput data input - * @throws IOException io exception - */ - @Override - public void readFields(DataInput dataInput) throws IOException { - creationTS = WritableUtils.readVLong(dataInput); - instanceId = WritableUtils.readVInt(dataInput); - messageType = WritableUtils.readString(dataInput); - vesMessage = WritableUtils.readString(dataInput); - - domain = WritableUtils.readString(dataInput); - eventName = WritableUtils.readString(dataInput); - - thresholdPath = WritableUtils.readString(dataInput); - thresholdSeverity = WritableUtils.readString(dataInput); - thresholdDirection = WritableUtils.readString(dataInput); - thresholdValue = WritableUtils.readVLong(dataInput); - - jsonProcessorStatus = WritableUtils.readString(dataInput); - jsonProcessorMessage = WritableUtils.readString(dataInput); - domainFilterStatus = WritableUtils.readString(dataInput); - domainFilterMessage = WritableUtils.readString(dataInput); - eventNameFilterStatus = WritableUtils.readString(dataInput); - eventNameFilterMessage = WritableUtils.readString(dataInput); - thresholdCalculatorStatus = WritableUtils.readString(dataInput); - thresholdCalculatorMessage = WritableUtils.readString(dataInput); - - alertMessage = WritableUtils.readString(dataInput); - - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java deleted file mode 100644 index 6bfc657..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersister.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.api.data.schema.UnsupportedTypeException; -import co.cask.cdap.api.dataset.DatasetProperties; -import co.cask.cdap.api.dataset.lib.IndexedTable; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties; -import com.google.common.base.Joiner; -import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.common.service.processor.MessageProcessor; -import org.openecomp.dcae.apod.analytics.common.service.processor.ProcessorContext; -import org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyDomainFilter; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyEventNameFilter; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyThresholdsProcessor; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -import javax.annotation.Nullable; - -import static org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME; - -/** - * - * - * @author Rajiv Singla . Creation Date: 11/15/2016. - */ -public abstract class TCAMessageStatusPersister { - - private static final Logger LOG = LoggerFactory.getLogger(TCAMessageStatusPersister.class); - - private TCAMessageStatusPersister() { - - } - - /** - * Saves Message Status in Table. Assumes no alert was generated - * - * @param processorContext processor Context - * @param instanceId Instance Id - * @param calculatorMessageType Calculation Message Type - * @param messageStatusTable Message Status Table - */ - public static void persist(final TCACEFProcessorContext processorContext, - final int instanceId, - final TCACalculatorMessageType calculatorMessageType, - final ObjectMappedTable messageStatusTable) { - persist(processorContext, instanceId, calculatorMessageType, messageStatusTable, null); - } - - /** - * Saves Message Status in Table. Sets up alert message aslo - * - * @param processorContext processor Context - * @param instanceId Instance Id - * @param calculatorMessageType Calculation Message Type - * @param messageStatusTable Message Status Table - * @param alertMessage Alert message - */ - public static void persist(final TCACEFProcessorContext processorContext, - final int instanceId, - final TCACalculatorMessageType calculatorMessageType, - final ObjectMappedTable messageStatusTable, - @Nullable final String alertMessage) { - - final String rowKey = createKey(calculatorMessageType); - - final Long currentTS = new Date().getTime(); - final String vesMessage = StringEscapeUtils.unescapeJson(processorContext.getMessage()); - - // Find Functional Role and domain - final Pair domainAndEventName = TCAUtils.getDomainAndEventName(processorContext); - final String domain = domainAndEventName.getLeft(); - final String eventName = domainAndEventName.getRight(); - - final TCAMessageStatusEntity tcaMessageStatusEntity = new TCAMessageStatusEntity(currentTS, - instanceId, calculatorMessageType.name(), vesMessage, domain, eventName); - - // add threshold violation fields - addViolatedThreshold(tcaMessageStatusEntity, processorContext); - // add processor status and messages - addMessageProcessorMessages(tcaMessageStatusEntity, processorContext); - // add Alert message - tcaMessageStatusEntity.setAlertMessage( - alertMessage == null ? null : StringEscapeUtils.unescapeJson(alertMessage) - ); - - messageStatusTable.write(rowKey, tcaMessageStatusEntity); - - LOG.debug("Finished persisting VES Status Message with rowKey: {} in Message Status Table.", rowKey); - - } - - - /** - * Create TCA VES Message Status Table Properties - * - * @param timeToLiveSeconds Message Status Table time to live in seconds - * - * @return Message Status table properties - */ - public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) { - - try { - return ObjectMappedTableProperties.builder() - .setType(TCAMessageStatusEntity.class) - .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME) - .setRowKeyExploreType(Schema.Type.STRING) - .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds) - .setDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_STATUS_DESCRIPTION_TABLE) - .build(); - } catch (UnsupportedTypeException e) { - final String errorMessage = "Unable to convert TCAMessageStatusEntity class to Schema"; - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - } - - - /** - * Adds Violated Threshold Parameter values to {@link TCAMessageStatusEntity} - * - * @param tcaMessageStatusEntity message entity that needs to be populated with threshold fields - * @param processorContext processor context - * - */ - private static void addViolatedThreshold(final TCAMessageStatusEntity tcaMessageStatusEntity, - final TCACEFProcessorContext processorContext) { - - final MetricsPerEventName metricsPerEventName = processorContext.getMetricsPerEventName(); - - if (metricsPerEventName != null - && metricsPerEventName.getThresholds() != null - && metricsPerEventName.getThresholds().get(0) != null) { - - final Threshold threshold = metricsPerEventName.getThresholds().get(0); - tcaMessageStatusEntity.setThresholdPath(threshold.getFieldPath()); - tcaMessageStatusEntity.setThresholdSeverity(threshold.getSeverity().name()); - tcaMessageStatusEntity.setThresholdDirection(threshold.getDirection().name()); - tcaMessageStatusEntity.setThresholdValue(threshold.getThresholdValue()); - } - - } - - - /** - * Add TCA CEF Message Processor status information - * - * @param tcaMessageStatusEntity message entity that needs to be populated with message processor fields - * @param processorContext processor context - * - */ - @SuppressWarnings("unchecked") - private static void addMessageProcessorMessages( - final TCAMessageStatusEntity tcaMessageStatusEntity, final TCACEFProcessorContext processorContext) { - final List> messageProcessors = processorContext - .getMessageProcessors(); - - if (messageProcessors != null && !messageProcessors.isEmpty()) { - for (Object messageProcessor : messageProcessors) { - final MessageProcessor tcaMessageProcessor = - (MessageProcessor) messageProcessor; - - final String processingState = tcaMessageProcessor.getProcessingState().name(); - final String processingMessage = tcaMessageProcessor.getProcessingMessage().orNull(); - - if (messageProcessor.getClass().equals(TCACEFJsonProcessor.class)) { - tcaMessageStatusEntity.setJsonProcessorStatus(processingState); - tcaMessageStatusEntity.setJsonProcessorMessage(processingMessage); - } - - if (messageProcessor.getClass().equals(TCACEFPolicyDomainFilter.class)) { - tcaMessageStatusEntity.setDomainFilterStatus(processingState); - tcaMessageStatusEntity.setDomainFilterMessage(processingMessage); - } - - if (messageProcessor.getClass().equals(TCACEFPolicyEventNameFilter.class)) { - tcaMessageStatusEntity.setEventNameFilterStatus(processingState); - tcaMessageStatusEntity.setEventNameFilterMessage(processingMessage); - } - - if (messageProcessor.getClass().equals(TCACEFPolicyThresholdsProcessor.class)) { - tcaMessageStatusEntity.setThresholdCalculatorStatus(processingState); - tcaMessageStatusEntity.setThresholdCalculatorMessage(processingMessage); - } - - } - } - } - - /** - * Creates Row Key for TCA VES Message Status table - * - * Row Key = (Message Type + Decreasing Value) - * - * @param calculatorMessageType calculator message type - * - * @return row key string - */ - private static String createKey(final TCACalculatorMessageType calculatorMessageType) { - - final List keyList = new LinkedList<>(); - keyList.add(calculatorMessageType.name()); - keyList.add(PersistenceUtils.getCurrentTimeReverseSubKey()); - return Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER).join(keyList); - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java deleted file mode 100644 index 785ead1..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertEntity.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import org.apache.hadoop.io.Writable; -import org.apache.hadoop.io.WritableUtils; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.io.Serializable; - -/** - * - * @author Rajiv Singla . Creation Date: 11/16/2016. - */ -public class TCAVESAlertEntity implements Writable, Serializable { - - private static final long serialVersionUID = 1L; - - private long creationTS; - private String alertMessage; - - public TCAVESAlertEntity() { - // no argument constructor required for json serialization / deserialization - } - - public TCAVESAlertEntity(long creationTS, String alertMessage) { - this.creationTS = creationTS; - this.alertMessage = alertMessage; - } - - public long getCreationTS() { - return creationTS; - } - - public void setCreationTS(long creationTS) { - this.creationTS = creationTS; - } - - public String getAlertMessage() { - return alertMessage; - } - - public void setAlertMessage(String alertMessage) { - this.alertMessage = alertMessage; - } - - @Override - public void write(DataOutput dataOutput) throws IOException { - WritableUtils.writeVLong(dataOutput, creationTS); - WritableUtils.writeString(dataOutput, alertMessage); - } - - @Override - public void readFields(DataInput dataInput) throws IOException { - creationTS = WritableUtils.readVLong(dataInput); - alertMessage = WritableUtils.readString(dataInput); - } -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java deleted file mode 100644 index cdcdfa0..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersister.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.api.data.schema.UnsupportedTypeException; -import co.cask.cdap.api.dataset.DatasetProperties; -import co.cask.cdap.api.dataset.lib.IndexedTable; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties; -import org.apache.commons.lang3.StringEscapeUtils; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Date; - -import static org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME; - -/** - * - * @author Rajiv Singla . Creation Date: 11/16/2016. - */ -public abstract class TCAVESAlertsPersister { - - private static final Logger LOG = LoggerFactory.getLogger(TCAVESAlertsPersister.class); - - private TCAVESAlertsPersister() { - - } - - /** - * Persists Alert Message to Alerts Table - * - * @param alertMessage alert Message - * @param tcaVESAlertTable alert Table Name - */ - public static void persist(final String alertMessage, final ObjectMappedTable tcaVESAlertTable) { - final Date currentDate = new Date(); - final TCAVESAlertEntity alertEntity = new TCAVESAlertEntity(currentDate.getTime(), - StringEscapeUtils.unescapeJson(alertMessage)); - // row key is same as current timestamp - final String rowKey = createRowKey(currentDate); - tcaVESAlertTable.write(rowKey, alertEntity); - - LOG.debug("Finished persisting VES Alert message ID: {} in VES Alerts table.", rowKey); - } - - - /** - * Creates {@link DatasetProperties} for Alerts Table - * - * @param timeToLiveSeconds alerts table Time to Live - * @return Alerts table properties - */ - public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) { - try { - return ObjectMappedTableProperties.builder() - .setType(TCAVESAlertEntity.class) - .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME) - .setRowKeyExploreType(Schema.Type.STRING) - .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds) - .setDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_DESCRIPTION_TABLE) - .build(); - } catch (UnsupportedTypeException e) { - final String errorMessage = "Unable to convert TCAVESAlertEntity class to Schema"; - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - } - - /** - * Creates Row Key for Alerts Table - * - * @param date current Date - * - * @return row key - */ - public static String createRowKey(final Date date) { - return String.format("%025d", date.getTime()); - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java deleted file mode 100644 index 8f29e34..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.settings; - -/** - *

- * Minimum Contract for all CDAP App Configs - *

- * - * @author Rajiv Singla . Creation Date: 11/2/2016. - */ -public interface CDAPAppConfig extends CDAPAppSettings { - - /** - * CDAP Application Name - * - * @return cdap app name - */ - String getAppName(); - - - /** - * CDAP Application Description - * - * @return cdap app description - */ - String getAppDescription(); - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java deleted file mode 100644 index 06a3e4c..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppPreferences.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.settings; - -/** - *

- * Marker Interface for all CDAP Preferences - *

- * - * @author Rajiv Singla . Creation Date: 11/2/2016. - */ -public interface CDAPAppPreferences extends CDAPAppSettings { -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java deleted file mode 100644 index 72a4048..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPAppSettings.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.settings; - -import java.io.Serializable; - -/** - *

- * A marker interface for all CDAP Related App Settings. - * App Settings can either be preferences, cdap app settings etc. - *

- * - * - * @author Rajiv Singla . Creation Date: 11/2/2016. - */ -public interface CDAPAppSettings extends Serializable { -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java deleted file mode 100644 index 1423978..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfig.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.settings; - -import co.cask.cdap.api.Config; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; - -/** - * Base class for all DACE Analytics Application Configurations - * - * @author Rajiv Singla . Creation Date: 10/4/2016. - */ -public abstract class CDAPBaseAppConfig extends Config implements CDAPAppConfig { - - - /** - * DCAE Analytics App Name - */ - protected String appName = CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_NAME_APP; - - /** - * DCAE Analytics App Description - */ - protected String appDescription = CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_DESCRIPTION_APP; - - - /** - * Returns DCAE Analytics CDAP Application name - * - * @return CDAP application name - */ - @Override - public String getAppName() { - return appName; - } - - /** - * Returns DCAE Analytics CDAP Application descrption - * - * @return CDAP application description - */ - @Override - public String getAppDescription() { - return appDescription; - } -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java deleted file mode 100644 index 5d52ff3..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBasePluginConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.settings; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Macro; -import co.cask.cdap.api.annotation.Name; -import co.cask.cdap.api.plugin.PluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPPluginConstants; - -/** - *

- * Base class for all DCAE Analytics CDAP Plugin config - *

- *

- * @author Rajiv Singla . Creation Date: 1/17/2017. - */ -public abstract class CDAPBasePluginConfig extends PluginConfig implements CDAPPluginSettings { - - @Name(CDAPPluginConstants.Reference.REFERENCE_NAME) - @Description(CDAPPluginConstants.Reference.REFERENCE_NAME_DESCRIPTION) - @Macro - protected String referenceName; - - /** - * Provides Reference Name that can be used to trace lineage or meta data information inside CDAP container - * - * @return reference name - */ - public String getReferenceName() { - return referenceName; - } - - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java deleted file mode 100644 index 203af63..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPPluginSettings.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.settings; - -/** - *

- * A marker interface for all CDAP Plugin related Settings. - *

- * - * @author Rajiv Singla . Creation Date: 1/17/2017. - */ -public interface CDAPPluginSettings extends CDAPAppSettings { -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java deleted file mode 100644 index 950f8c8..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtils.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.utils; - -import co.cask.cdap.api.metrics.Metrics; -import com.google.common.base.Optional; -import com.google.common.base.Stopwatch; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -/** - * Utility common methods for DMaaP MR functionality - * - * @author Rajiv Singla . Creation Date: 2/6/2017. - */ -public abstract class DMaaPMRUtils { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRUtils.class); - - private DMaaPMRUtils() { - // private constructor - } - - - /** - * Returns messages fetched from DMaaP MR Subscriber. - * - * @param subscriber DMaaP MR Subscriber instance - * @param metrics CDAP metrics - * - * @return messages fetched from DMaaP MR topic - */ - public static Optional> getSubscriberMessages(final DMaaPMRSubscriber subscriber, - final Metrics metrics) { - - final Optional subscriberResponseOptional = - getSubscriberResponse(subscriber, metrics); - - // If response is not present, unable to proceed - if (!subscriberResponseOptional.isPresent()) { - return Optional.absent(); - } - - final DMaaPMRSubscriberResponse subscriberResponse = subscriberResponseOptional.get(); - - // If response code return by the subscriber call is not successful, unable to do proceed - if (!HTTPUtils.isSuccessfulResponseCode(subscriberResponse.getResponseCode())) { - LOG.error("Subscriber was unable to fetch messages properly.Subscriber Response Code: {} " + - "Unable to proceed further....", subscriberResponse.getResponseCode()); - metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC, 1); - return Optional.absent(); - } - - LOG.debug("Subscriber HTTP Response Status Code match successful: {}", subscriberResponse, - HTTPUtils.HTTP_SUCCESS_STATUS_CODE); - - final List actualMessages = subscriberResponse.getFetchedMessages(); - - // If there are no message returned during from Subscriber, nothing to write to CDAP Stream - if (actualMessages.isEmpty()) { - LOG.debug("Subscriber Response has no messages. Nothing to write...."); - metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC, 1); - return Optional.absent(); - } - - LOG.debug("DMaaP MR Subscriber found new messages in DMaaP Topic. Message count: {}", actualMessages.size()); - metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC, actualMessages.size()); - - return Optional.of(actualMessages); - - } - - - /** - * Get Subscriber response and records time taken to fetch messages. Returns Optional.None if Subscriber response - * is null or response status code is not present - * - * @param subscriber - DMaaP Subscriber - * @param metrics - CDAP Metrics collector - * - * @return - Optional of Subscriber Response - */ - public static Optional getSubscriberResponse(final DMaaPMRSubscriber subscriber, - final Metrics metrics) { - - // Record all response count from subscriber - metrics.count(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_ALL_RESPONSES_COUNT_METRIC, 1); - - // Check how long it took for subscriber to respond - final Stopwatch stopwatch = new Stopwatch(); - stopwatch.start(); - - // Fetch messages from DMaaP MR Topic - DMaaPMRSubscriberResponse subscriberResponse = null; - try { - subscriberResponse = subscriber.fetchMessages(); - } catch (DCAEAnalyticsRuntimeException e) { - LOG.error("Error while fetching messages for DMaaP MR Topic: {}", e); - } - - stopwatch.stop(); - final long subscriberResponseTimeMS = stopwatch.elapsedMillis(); - - // If response is null is null or response code is null, unable to proceed nothing to do - if (subscriberResponse == null || subscriberResponse.getResponseCode() == null) { - LOG.error("Subscriber Response is null or subscriber Response code is null. Unable to proceed further..."); - return Optional.absent(); - } - - LOG.debug("Subscriber Response:{}, Subscriber HTTP Response Status Code {}, Subscriber Response Time(ms): {}", - subscriberResponse, subscriberResponse.getResponseCode(), subscriberResponseTimeMS); - - // Record subscriber response time - metrics.gauge(CDAPMetricsConstants.DMAAP_MR_SUBSCRIBER_RESPONSE_TIME_MS_METRIC, subscriberResponseTimeMS); - - return Optional.of(subscriberResponse); - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java deleted file mode 100644 index d672593..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtils.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.utils; - - -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPAppSettings; -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.common.validation.ValidationResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Utility methods to validate null checks, empty string etc - * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public abstract class ValidationUtils { - - private static final Logger LOG = LoggerFactory.getLogger(ValidationUtils.class); - - private ValidationUtils() { - - } - - /** - * Checks if String is empty. For null string true is returned - * - * @param stringValue string value - * @return returns true is string is empty or null - */ - public static boolean isEmpty(@Nullable final String stringValue) { - return stringValue == null || stringValue.isEmpty() || stringValue.trim().isEmpty(); - } - - - /** - * Checks if String value is present. A null, empty, or blank values of string - * are considered not present. - * - * @param stringValue string value to check if it is present or not - * - * @return true if string value is not null, empty or blank - */ - public static boolean isPresent(@Nullable final String stringValue) { - return !isEmpty(stringValue); - } - - - /** - * Provides common functionality to Validates CDAP App Settings. Throws Runtime exception if validation fails - * - * @param appSettings app Settings e.g. App Config, App Preferences etc - * @param appSettingsValidator app Settings validator - * - * @param Settings type e.g. AppConfig or AppPreferences - * @param Validation Response type - * @param Validator Type - */ - public static , - V extends CDAPAppSettingsValidator> void validateSettings(@Nonnull final T appSettings, - @Nonnull final V appSettingsValidator) { - checkNotNull(appSettings, "App Settings must not be null"); - checkNotNull(appSettingsValidator, "App Settings validator must not be null"); - - final String appSettingsClassName = appSettings.getClass().getSimpleName(); - final String appSettingsClassValidator = appSettingsValidator.getClass().getSimpleName(); - - LOG.debug("Validating App Settings for: {}, with App Settings Validator: {} ", - appSettingsClassName, appSettingsClassValidator); - - final R validationResponse = appSettingsValidator.validateAppSettings(appSettings); - - // If setting validation fails throw an exception - if (validationResponse.hasErrors()) { - throw new CDAPSettingsException( - validationResponse.getAllErrorMessage(), LOG, new IllegalArgumentException()); - } - - LOG.debug("App Settings Validation Successful for app Settings: {} with validator: {}", appSettingsClassName, - appSettingsClassValidator); - } - -} diff --git a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java b/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java deleted file mode 100644 index 68b6392..0000000 --- a/dcae-analytics-cdap-common/src/main/java/org/openecomp/dcae/apod/analytics/cdap/common/validation/CDAPAppSettingsValidator.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.validation; - -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPAppSettings; -import org.openecomp.dcae.apod.analytics.common.validation.DCAEValidator; -import org.openecomp.dcae.apod.analytics.common.validation.ValidationResponse; - -/** - *

- * Validates CDAP Application Settings (AppConfig, Preferences etc) - *

- * - * @param {@link CDAPAppSettings} DCAE Analytics App Settings (e.g. AppConfig, Preferences) - * @param {@link ValidationResponse} Validator response implementations - * - * @author Rajiv Singla . Creation Date: 11/2/2016. - */ -public interface CDAPAppSettingsValidator> - extends DCAEValidator { - - /** - * Validates DCAE Analytics App Settings and return Validation response which can be - * checked for any app setting issues - * - * @param appSettings DCAE CDAP Application Settings (e.g. AppConfig, Preferences etc.) - * @return validation response - */ - R validateAppSettings(T appSettings); - - -} - - diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java new file mode 100644 index 0000000..6798f8b --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java @@ -0,0 +1,89 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Suppliers; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPAppSettings; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPBaseAppConfig; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; +import org.onap.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; + +/** + * @author Rajiv Singla . Creation Date: 1/12/2017. + */ +public abstract class BaseAnalyticsCDAPCommonUnitTest extends BaseDCAEAnalyticsUnitTest { + + protected static final String CEF_MESSAGE_FILE_LOCATION = "data/json/cef/cef_message.json"; + protected static final String TCA_POLICY_FILE_LOCATION = "data/json/policy/tca_policy.json"; + protected static final ObjectMapper ANALYTICS_MODEL_OBJECT_MAPPER = + Suppliers.memoize(new AnalyticsModelObjectMapperSupplier()).get(); + + /** + * Test Implementation for {@link CDAPBaseAppConfig} + */ + public class CDAPBaseAppConfigImp extends CDAPBaseAppConfig { + } + + + /** + * Test implementation for {@link CDAPAppSettings} + */ + public class CDAPTestAppSettings implements CDAPAppSettings { + + private String settingsField; + + public String getSettingsField() { + return settingsField; + } + + public void setSettingsField(String settingsField) { + this.settingsField = settingsField; + } + } + + + /** + * Test implementation for {@link CDAPAppSettingsValidator} + */ + public class CDAPTestAppSettingsValidator implements CDAPAppSettingsValidator> { + + private static final long serialVersionUID = 1L; + + @Override + public GenericValidationResponse + validateAppSettings(CDAPTestAppSettings cdapTestAppSettings) { + GenericValidationResponse validationResponse = new + GenericValidationResponse<>(); + if (ValidationUtils.isEmpty(cdapTestAppSettings.getSettingsField())) { + validationResponse + .addErrorMessage("settingsField", "Settings Field must not be empty"); + } + return validationResponse; + } + } + + +} diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java new file mode 100644 index 0000000..9415373 --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java @@ -0,0 +1,123 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import co.cask.cdap.api.dataset.DatasetProperties; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; +import org.onap.dcae.apod.analytics.common.utils.PersistenceUtils; +import org.onap.dcae.apod.analytics.model.domain.cef.CommonEventHeader; +import org.onap.dcae.apod.analytics.model.domain.cef.Event; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.model.facade.tca.TCAVESResponse; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 9/13/2017. + */ +public class TCAAlertsAbatementPersisterTest extends BaseAnalyticsCDAPCommonUnitTest { + + private static final String EVENT_NAME = "testEventName"; + private static final String SOURCE_NAME = "testSourceName"; + private static final String REPORTING_ENTITY_NAME = "testReportingEntityName"; + private static final String THRESHOLD_CLOSED_LOOP_CONTROL_NAME = "testControlLoopName"; + private static final String THRESHOLD_FIELD_PATH = "testFieldPath"; + private static final String EXPECTED_LOOKUP_KEY = Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER).join( + ImmutableList.of(EVENT_NAME, SOURCE_NAME, REPORTING_ENTITY_NAME, + THRESHOLD_CLOSED_LOOP_CONTROL_NAME, THRESHOLD_FIELD_PATH)); + + private ObjectMappedTable alertsAbatementTable; + private EventListener eventListener; + private MetricsPerEventName violatedMetricsPerEventName; + private TCAVESResponse tcavesResponse; + private String abatementTS; + private Event event; + private CommonEventHeader commonEventHeader; + private Threshold violatedThreshold; + + @Before + public void before() throws Exception { + alertsAbatementTable = mock(ObjectMappedTable.class); + eventListener = mock(EventListener.class); + event = mock(Event.class); + commonEventHeader = mock(CommonEventHeader.class); + + when(eventListener.getEvent()).thenReturn(event); + when(event.getCommonEventHeader()).thenReturn(commonEventHeader); + when(commonEventHeader.getEventName()).thenReturn(EVENT_NAME); + when(commonEventHeader.getSourceName()).thenReturn(SOURCE_NAME); + when(commonEventHeader.getReportingEntityName()).thenReturn(REPORTING_ENTITY_NAME); + + violatedMetricsPerEventName = mock(MetricsPerEventName.class); + when(violatedMetricsPerEventName.getEventName()).thenReturn(EVENT_NAME); + violatedThreshold = mock(Threshold.class); + when(violatedMetricsPerEventName.getThresholds()).thenReturn(ImmutableList.of(violatedThreshold)); + when(violatedThreshold.getClosedLoopControlName()).thenReturn(THRESHOLD_CLOSED_LOOP_CONTROL_NAME); + when(violatedThreshold.getFieldPath()).thenReturn(THRESHOLD_FIELD_PATH); + tcavesResponse = mock(TCAVESResponse.class); + abatementTS = "1234"; + } + + @Test + public void testGetDatasetProperties() throws Exception { + final DatasetProperties datasetProperties = TCAAlertsAbatementPersister.getDatasetProperties(20000); + assertNotNull(datasetProperties); + } + + @Test + public void testPersist() throws Exception { + + TCAAlertsAbatementPersister.persist(eventListener, violatedMetricsPerEventName, tcavesResponse, + abatementTS, alertsAbatementTable); + verify(alertsAbatementTable, times(1)).write(anyString(), + any(TCAAlertsAbatementEntity.class)); + + } + + @Test + public void testLookUpByKey() throws Exception { + TCAAlertsAbatementPersister.lookUpByKey(eventListener, violatedMetricsPerEventName, alertsAbatementTable); + verify(alertsAbatementTable, times(1)).read(eq(EXPECTED_LOOKUP_KEY)); + } + + @Test + public void testCreateKey() throws Exception { + final String createdKey = TCAAlertsAbatementPersister.createKey(eventListener, violatedMetricsPerEventName); + assertEquals(createdKey, EXPECTED_LOOKUP_KEY); + + } + +} diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java new file mode 100644 index 0000000..2ce1b7f --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java @@ -0,0 +1,38 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 2/16/2017. + */ +public class TCACalculatorMessageTypeTest extends BaseAnalyticsCDAPCommonUnitTest { + + @Test + public void testCalculatorMessageType() throws Exception { + assertThat("There must be 3 calculator message type", TCACalculatorMessageType.values().length, is(3)); + } +} diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java new file mode 100644 index 0000000..2e12a1e --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java @@ -0,0 +1,128 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import co.cask.cdap.api.dataset.DatasetProperties; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import com.google.common.collect.ImmutableList; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; +import org.onap.dcae.apod.analytics.model.domain.cef.CommonEventHeader; +import org.onap.dcae.apod.analytics.model.domain.cef.Domain; +import org.onap.dcae.apod.analytics.model.domain.cef.Event; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.onap.dcae.apod.analytics.model.domain.cef.EventSeverity; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Direction; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 2/16/2017. + */ +public class TCAMessageStatusPersisterTest extends BaseAnalyticsCDAPCommonUnitTest { + + private static final int TEST_INSTANCE_ID = 0; + private static final Domain TEST_DOMAIN = Domain.other; + private static final String TEST_EVENT_NAME = "TEST_EVENT_NAME"; + + private ObjectMappedTable vesMessageStatusTable; + private TCACEFProcessorContext processorContext; + private EventListener eventListener; + private Event event; + private CommonEventHeader commonEventHeader; + + + @Before + @SuppressWarnings("unchecked") + public void before() { + vesMessageStatusTable = mock(ObjectMappedTable.class); + processorContext = mock(TCACEFProcessorContext.class); + eventListener = mock(EventListener.class); + event = mock(Event.class); + commonEventHeader = mock(CommonEventHeader.class); + when(processorContext.getMessage()).thenReturn("testMessage"); + when(processorContext.getCEFEventListener()).thenReturn(eventListener); + when(eventListener.getEvent()).thenReturn(event); + when(event.getCommonEventHeader()).thenReturn(commonEventHeader); + when(commonEventHeader.getEventName()).thenReturn(TEST_EVENT_NAME); + when(commonEventHeader.getDomain()).thenReturn(TEST_DOMAIN); + } + + + @Test + public void testPersistWithInApplicableMessage() throws Exception { + TCAMessageStatusPersister.persist + (processorContext, TEST_INSTANCE_ID, TCACalculatorMessageType.INAPPLICABLE, vesMessageStatusTable); + verify(vesMessageStatusTable, times(1)).write(anyString(), + any(TCAMessageStatusEntity.class)); + } + + @Test + public void testPersistWithNonCompliantMessage() throws Exception { + final MetricsPerEventName metricsPerEventName = mock(MetricsPerEventName.class); + final Threshold threshold = mock(Threshold.class); + when(processorContext.getMetricsPerEventName()).thenReturn(metricsPerEventName); + when((metricsPerEventName.getThresholds())).thenReturn(ImmutableList.of(threshold)); + when(threshold.getDirection()).thenReturn(Direction.GREATER); + when(threshold.getSeverity()).thenReturn(EventSeverity.CRITICAL); + TCAMessageStatusPersister.persist( + processorContext, TEST_INSTANCE_ID, TCACalculatorMessageType.NON_COMPLIANT, + vesMessageStatusTable, "testAlert"); + verify(vesMessageStatusTable, times(1)).write(anyString(), + any(TCAMessageStatusEntity.class)); + } + + @Test + public void testPersistWithCompliantMessage() throws Exception { + final String cefMessage = fromStream(CEF_MESSAGE_FILE_LOCATION); + final String tcaPolicyString = fromStream(TCA_POLICY_FILE_LOCATION); + + final TCAPolicy tcaPolicy = ANALYTICS_MODEL_OBJECT_MAPPER.readValue(tcaPolicyString, TCAPolicy.class); + final TCACEFProcessorContext tcacefProcessorContext = TCAUtils.filterCEFMessage(cefMessage, tcaPolicy); + final TCACEFProcessorContext finalProcessorContext = + TCAUtils.computeThresholdViolations(tcacefProcessorContext); + + TCAMessageStatusPersister.persist(finalProcessorContext, TEST_INSTANCE_ID, + TCACalculatorMessageType.COMPLIANT, vesMessageStatusTable, "testAlert"); + verify(vesMessageStatusTable, times(1)).write(anyString(), + any(TCAMessageStatusEntity.class)); + } + + @Test + public void testGetDatasetProperties() throws Exception { + final DatasetProperties datasetProperties = TCAMessageStatusPersister.getDatasetProperties(20000); + Assert.assertNotNull(datasetProperties); + + } + +} diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java new file mode 100644 index 0000000..558e5a8 --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java @@ -0,0 +1,63 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.persistance.tca; + +import co.cask.cdap.api.dataset.DatasetProperties; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; + +import java.util.Date; + +import static org.hamcrest.CoreMatchers.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * @author Rajiv Singla . Creation Date: 2/16/2017. + */ +public class TCAVESAlertsPersisterTest extends BaseAnalyticsCDAPCommonUnitTest { + + @Test + public void testPersist() throws Exception { + final ObjectMappedTable tcaVESAlertTable = Mockito.mock(ObjectMappedTable.class); + TCAVESAlertsPersister.persist("test alert message", tcaVESAlertTable); + verify(tcaVESAlertTable, times(1)).write(anyString(), + any(TCAVESAlertEntity.class)); + } + + @Test + public void testGetDatasetProperties() throws Exception { + final DatasetProperties datasetProperties = TCAVESAlertsPersister.getDatasetProperties(20000); + Assert.assertNotNull(datasetProperties); + } + + @Test + public void testCreateRowKey() throws Exception { + final String rowKey = TCAVESAlertsPersister.createRowKey(new Date()); + Assert.assertThat(rowKey.toCharArray().length, is(25)); + } + +} diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java new file mode 100644 index 0000000..ca2c2ca --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java @@ -0,0 +1,58 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.settings; + +import org.hamcrest.CoreMatchers; +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class CDAPBaseAppConfigTest extends BaseAnalyticsCDAPCommonUnitTest { + + private CDAPBaseAppConfigImp cdapBaseAppConfigImp = null; + + @Before + public void before() { + cdapBaseAppConfigImp = new CDAPBaseAppConfigImp(); + } + + @Test + public void testGetAppName() throws Exception { + assertThat("Common Default Name must match", + cdapBaseAppConfigImp.getAppName(), + CoreMatchers.is(CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_NAME_APP)); + } + + @Test + public void testGetAppDescription() throws Exception { + assertThat("Default App Description must match", + cdapBaseAppConfigImp.getAppDescription(), + is(CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_DESCRIPTION_APP)); + } + +} diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java new file mode 100644 index 0000000..31ff13b --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java @@ -0,0 +1,112 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.utils; + +import co.cask.cdap.api.metrics.Metrics; +import com.google.common.collect.ImmutableList; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; + +import java.util.Collections; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 2/6/2017. + */ +public class DMaaPMRUtilsTest extends BaseAnalyticsCDAPCommonUnitTest { + + private DMaaPMRSubscriber subscriber; + private Metrics metrics; + + + @Before + public void before() throws Exception { + metrics = mock(Metrics.class); + doNothing().when(metrics).count(anyString(), anyInt()); + subscriber = mock(DMaaPMRSubscriber.class); + } + + @Test + public void testGetSubscriberMessagesWhenMessagesAreFound() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(200); + when(subscriberResponse.getResponseMessage()).thenReturn("testMessage"); + when(subscriberResponse.getFetchedMessages()).thenReturn(ImmutableList.of("testMessage1", "testMessage1")); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); + verify(metrics, Mockito.times(1)).count(ArgumentMatchers.eq(CDAPMetricsConstants + .DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC), eq(2)); + } + + @Test + public void testSubscriberMessagesWhenSubscriberResponseCodeIsNull() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(null); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); + } + + @Test + public void testSubscriberMessagesWhenNoMessagesFound() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(200); + when(subscriberResponse.getResponseMessage()).thenReturn("no messages"); + when(subscriberResponse.getFetchedMessages()).thenReturn(Collections.emptyList()); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); + verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants + .DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC), eq(1)); + } + + + @Test + public void testWhenSubscriberReturnNonSuccessfulReturnCode() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(500); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); + verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants + .DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC), eq(1)); + } + + @Test + public void testWhenSubscriberThrowsException() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(500); + when(subscriber.fetchMessages()).thenThrow(DCAEAnalyticsRuntimeException.class); + DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); + } + +} diff --git a/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java new file mode 100644 index 0000000..d6240fd --- /dev/null +++ b/dcae-analytics-cdap-common/src/test/java/org/onap/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java @@ -0,0 +1,80 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.common.utils; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class ValidationUtilsTest extends BaseAnalyticsCDAPCommonUnitTest { + + @Test + public void testIsEmptyWhenStringIsNull() throws Exception { + assertTrue(ValidationUtils.isEmpty(null)); + } + + @Test + public void testIsEmptyWhenStringIsEmpty() throws Exception { + String emptyString = ""; + assertTrue(ValidationUtils.isEmpty(emptyString)); + } + + @Test + public void testIsEmptyWhenStringIsEmptyWithBlanks() throws Exception { + String blankString = " "; + assertTrue(ValidationUtils.isEmpty(blankString)); + } + + + @Test + public void testIsNotPresent() throws Exception { + assertFalse(ValidationUtils.isPresent(null)); + String emptyString = ""; + assertFalse(ValidationUtils.isPresent(emptyString)); + String blankString = " "; + assertFalse(ValidationUtils.isPresent(blankString)); + String validString = "SomeValue"; + assertTrue(ValidationUtils.isPresent(validString)); + } + + @Test + public void testValidateSettingsWhenValidationPasses() throws Exception { + CDAPTestAppSettings cdapTestAppSettings = new CDAPTestAppSettings(); + cdapTestAppSettings.setSettingsField("testValue"); + ValidationUtils.validateSettings(cdapTestAppSettings, new CDAPTestAppSettingsValidator()); + } + + @Test(expected = CDAPSettingsException.class) + public void testValidateSettingsWhenValidationFails() throws Exception { + + CDAPTestAppSettings cdapTestAppSettings = new CDAPTestAppSettings(); + cdapTestAppSettings.setSettingsField(""); + ValidationUtils.validateSettings(cdapTestAppSettings, new CDAPTestAppSettingsValidator()); + } + +} + diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java deleted file mode 100644 index 793512b..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/BaseAnalyticsCDAPCommonUnitTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Suppliers; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPAppSettings; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPBaseAppConfig; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; -import org.openecomp.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; - -/** - * @author Rajiv Singla . Creation Date: 1/12/2017. - */ -public abstract class BaseAnalyticsCDAPCommonUnitTest extends BaseDCAEAnalyticsUnitTest { - - protected static final String CEF_MESSAGE_FILE_LOCATION = "data/json/cef/cef_message.json"; - protected static final String TCA_POLICY_FILE_LOCATION = "data/json/policy/tca_policy.json"; - protected static final ObjectMapper ANALYTICS_MODEL_OBJECT_MAPPER = - Suppliers.memoize(new AnalyticsModelObjectMapperSupplier()).get(); - - /** - * Test Implementation for {@link CDAPBaseAppConfig} - */ - public class CDAPBaseAppConfigImp extends CDAPBaseAppConfig { - } - - - /** - * Test implementation for {@link CDAPAppSettings} - */ - public class CDAPTestAppSettings implements CDAPAppSettings { - - private String settingsField; - - public String getSettingsField() { - return settingsField; - } - - public void setSettingsField(String settingsField) { - this.settingsField = settingsField; - } - } - - - /** - * Test implementation for {@link CDAPAppSettingsValidator} - */ - public class CDAPTestAppSettingsValidator implements CDAPAppSettingsValidator> { - - private static final long serialVersionUID = 1L; - - @Override - public GenericValidationResponse - validateAppSettings(CDAPTestAppSettings cdapTestAppSettings) { - GenericValidationResponse validationResponse = new - GenericValidationResponse<>(); - if (ValidationUtils.isEmpty(cdapTestAppSettings.getSettingsField())) { - validationResponse - .addErrorMessage("settingsField", "Settings Field must not be empty"); - } - return validationResponse; - } - } - - -} diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java deleted file mode 100644 index ed46e60..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAAlertsAbatementPersisterTest.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import co.cask.cdap.api.dataset.DatasetProperties; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; -import org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils; -import org.openecomp.dcae.apod.analytics.model.domain.cef.CommonEventHeader; -import org.openecomp.dcae.apod.analytics.model.domain.cef.Event; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.model.facade.tca.TCAVESResponse; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 9/13/2017. - */ -public class TCAAlertsAbatementPersisterTest extends BaseAnalyticsCDAPCommonUnitTest { - - private static final String EVENT_NAME = "testEventName"; - private static final String SOURCE_NAME = "testSourceName"; - private static final String REPORTING_ENTITY_NAME = "testReportingEntityName"; - private static final String THRESHOLD_CLOSED_LOOP_CONTROL_NAME = "testControlLoopName"; - private static final String THRESHOLD_FIELD_PATH = "testFieldPath"; - private static final String EXPECTED_LOOKUP_KEY = Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER).join( - ImmutableList.of(EVENT_NAME, SOURCE_NAME, REPORTING_ENTITY_NAME, - THRESHOLD_CLOSED_LOOP_CONTROL_NAME, THRESHOLD_FIELD_PATH)); - - private ObjectMappedTable alertsAbatementTable; - private EventListener eventListener; - private MetricsPerEventName violatedMetricsPerEventName; - private TCAVESResponse tcavesResponse; - private String abatementTS; - private Event event; - private CommonEventHeader commonEventHeader; - private Threshold violatedThreshold; - - @Before - public void before() throws Exception { - alertsAbatementTable = mock(ObjectMappedTable.class); - eventListener = mock(EventListener.class); - event = mock(Event.class); - commonEventHeader = mock(CommonEventHeader.class); - - when(eventListener.getEvent()).thenReturn(event); - when(event.getCommonEventHeader()).thenReturn(commonEventHeader); - when(commonEventHeader.getEventName()).thenReturn(EVENT_NAME); - when(commonEventHeader.getSourceName()).thenReturn(SOURCE_NAME); - when(commonEventHeader.getReportingEntityName()).thenReturn(REPORTING_ENTITY_NAME); - - violatedMetricsPerEventName = mock(MetricsPerEventName.class); - when(violatedMetricsPerEventName.getEventName()).thenReturn(EVENT_NAME); - violatedThreshold = mock(Threshold.class); - when(violatedMetricsPerEventName.getThresholds()).thenReturn(ImmutableList.of(violatedThreshold)); - when(violatedThreshold.getClosedLoopControlName()).thenReturn(THRESHOLD_CLOSED_LOOP_CONTROL_NAME); - when(violatedThreshold.getFieldPath()).thenReturn(THRESHOLD_FIELD_PATH); - tcavesResponse = mock(TCAVESResponse.class); - abatementTS = "1234"; - } - - @Test - public void testGetDatasetProperties() throws Exception { - final DatasetProperties datasetProperties = TCAAlertsAbatementPersister.getDatasetProperties(20000); - assertNotNull(datasetProperties); - } - - @Test - public void testPersist() throws Exception { - - TCAAlertsAbatementPersister.persist(eventListener, violatedMetricsPerEventName, tcavesResponse, - abatementTS, alertsAbatementTable); - verify(alertsAbatementTable, times(1)).write(anyString(), - any(TCAAlertsAbatementEntity.class)); - - } - - @Test - public void testLookUpByKey() throws Exception { - TCAAlertsAbatementPersister.lookUpByKey(eventListener, violatedMetricsPerEventName, alertsAbatementTable); - verify(alertsAbatementTable, times(1)).read(eq(EXPECTED_LOOKUP_KEY)); - } - - @Test - public void testCreateKey() throws Exception { - final String createdKey = TCAAlertsAbatementPersister.createKey(eventListener, violatedMetricsPerEventName); - assertEquals(createdKey, EXPECTED_LOOKUP_KEY); - - } - -} diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java deleted file mode 100644 index 89cf241..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCACalculatorMessageTypeTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 2/16/2017. - */ -public class TCACalculatorMessageTypeTest extends BaseAnalyticsCDAPCommonUnitTest { - - @Test - public void testCalculatorMessageType() throws Exception { - assertThat("There must be 3 calculator message type", TCACalculatorMessageType.values().length, is(3)); - } -} diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java deleted file mode 100644 index 372e9e6..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAMessageStatusPersisterTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import co.cask.cdap.api.dataset.DatasetProperties; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import com.google.common.collect.ImmutableList; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; -import org.openecomp.dcae.apod.analytics.model.domain.cef.CommonEventHeader; -import org.openecomp.dcae.apod.analytics.model.domain.cef.Domain; -import org.openecomp.dcae.apod.analytics.model.domain.cef.Event; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventSeverity; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Direction; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 2/16/2017. - */ -public class TCAMessageStatusPersisterTest extends BaseAnalyticsCDAPCommonUnitTest { - - private static final int TEST_INSTANCE_ID = 0; - private static final Domain TEST_DOMAIN = Domain.other; - private static final String TEST_EVENT_NAME = "TEST_EVENT_NAME"; - - private ObjectMappedTable vesMessageStatusTable; - private TCACEFProcessorContext processorContext; - private EventListener eventListener; - private Event event; - private CommonEventHeader commonEventHeader; - - - @Before - @SuppressWarnings("unchecked") - public void before() { - vesMessageStatusTable = mock(ObjectMappedTable.class); - processorContext = mock(TCACEFProcessorContext.class); - eventListener = mock(EventListener.class); - event = mock(Event.class); - commonEventHeader = mock(CommonEventHeader.class); - when(processorContext.getMessage()).thenReturn("testMessage"); - when(processorContext.getCEFEventListener()).thenReturn(eventListener); - when(eventListener.getEvent()).thenReturn(event); - when(event.getCommonEventHeader()).thenReturn(commonEventHeader); - when(commonEventHeader.getEventName()).thenReturn(TEST_EVENT_NAME); - when(commonEventHeader.getDomain()).thenReturn(TEST_DOMAIN); - } - - - @Test - public void testPersistWithInApplicableMessage() throws Exception { - TCAMessageStatusPersister.persist - (processorContext, TEST_INSTANCE_ID, TCACalculatorMessageType.INAPPLICABLE, vesMessageStatusTable); - verify(vesMessageStatusTable, times(1)).write(anyString(), - any(TCAMessageStatusEntity.class)); - } - - @Test - public void testPersistWithNonCompliantMessage() throws Exception { - final MetricsPerEventName metricsPerEventName = mock(MetricsPerEventName.class); - final Threshold threshold = mock(Threshold.class); - when(processorContext.getMetricsPerEventName()).thenReturn(metricsPerEventName); - when((metricsPerEventName.getThresholds())).thenReturn(ImmutableList.of(threshold)); - when(threshold.getDirection()).thenReturn(Direction.GREATER); - when(threshold.getSeverity()).thenReturn(EventSeverity.CRITICAL); - TCAMessageStatusPersister.persist( - processorContext, TEST_INSTANCE_ID, TCACalculatorMessageType.NON_COMPLIANT, - vesMessageStatusTable, "testAlert"); - verify(vesMessageStatusTable, times(1)).write(anyString(), - any(TCAMessageStatusEntity.class)); - } - - @Test - public void testPersistWithCompliantMessage() throws Exception { - final String cefMessage = fromStream(CEF_MESSAGE_FILE_LOCATION); - final String tcaPolicyString = fromStream(TCA_POLICY_FILE_LOCATION); - - final TCAPolicy tcaPolicy = ANALYTICS_MODEL_OBJECT_MAPPER.readValue(tcaPolicyString, TCAPolicy.class); - final TCACEFProcessorContext tcacefProcessorContext = TCAUtils.filterCEFMessage(cefMessage, tcaPolicy); - final TCACEFProcessorContext finalProcessorContext = - TCAUtils.computeThresholdViolations(tcacefProcessorContext); - - TCAMessageStatusPersister.persist(finalProcessorContext, TEST_INSTANCE_ID, - TCACalculatorMessageType.COMPLIANT, vesMessageStatusTable, "testAlert"); - verify(vesMessageStatusTable, times(1)).write(anyString(), - any(TCAMessageStatusEntity.class)); - } - - @Test - public void testGetDatasetProperties() throws Exception { - final DatasetProperties datasetProperties = TCAMessageStatusPersister.getDatasetProperties(20000); - Assert.assertNotNull(datasetProperties); - - } - -} diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java deleted file mode 100644 index 151cbd9..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/persistance/tca/TCAVESAlertsPersisterTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca; - -import co.cask.cdap.api.dataset.DatasetProperties; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import org.junit.Assert; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; - -import java.util.Date; - -import static org.hamcrest.CoreMatchers.is; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -/** - * @author Rajiv Singla . Creation Date: 2/16/2017. - */ -public class TCAVESAlertsPersisterTest extends BaseAnalyticsCDAPCommonUnitTest { - - @Test - public void testPersist() throws Exception { - final ObjectMappedTable tcaVESAlertTable = Mockito.mock(ObjectMappedTable.class); - TCAVESAlertsPersister.persist("test alert message", tcaVESAlertTable); - verify(tcaVESAlertTable, times(1)).write(anyString(), - any(TCAVESAlertEntity.class)); - } - - @Test - public void testGetDatasetProperties() throws Exception { - final DatasetProperties datasetProperties = TCAVESAlertsPersister.getDatasetProperties(20000); - Assert.assertNotNull(datasetProperties); - } - - @Test - public void testCreateRowKey() throws Exception { - final String rowKey = TCAVESAlertsPersister.createRowKey(new Date()); - Assert.assertThat(rowKey.toCharArray().length, is(25)); - } - -} diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java deleted file mode 100644 index b4bb9e7..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/settings/CDAPBaseAppConfigTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.settings; - -import org.hamcrest.CoreMatchers; -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class CDAPBaseAppConfigTest extends BaseAnalyticsCDAPCommonUnitTest { - - private CDAPBaseAppConfigImp cdapBaseAppConfigImp = null; - - @Before - public void before() { - cdapBaseAppConfigImp = new CDAPBaseAppConfigImp(); - } - - @Test - public void testGetAppName() throws Exception { - assertThat("Common Default Name must match", - cdapBaseAppConfigImp.getAppName(), - CoreMatchers.is(CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_NAME_APP)); - } - - @Test - public void testGetAppDescription() throws Exception { - assertThat("Default App Description must match", - cdapBaseAppConfigImp.getAppDescription(), - is(CDAPComponentsConstants.COMMON_DEFAULT_DCAE_CDAP_DESCRIPTION_APP)); - } - -} diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java deleted file mode 100644 index 9a52e41..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/DMaaPMRUtilsTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.utils; - -import co.cask.cdap.api.metrics.Metrics; -import com.google.common.collect.ImmutableList; -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentMatchers; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; - -import java.util.Collections; - -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 2/6/2017. - */ -public class DMaaPMRUtilsTest extends BaseAnalyticsCDAPCommonUnitTest { - - private DMaaPMRSubscriber subscriber; - private Metrics metrics; - - - @Before - public void before() throws Exception { - metrics = mock(Metrics.class); - doNothing().when(metrics).count(anyString(), anyInt()); - subscriber = mock(DMaaPMRSubscriber.class); - } - - @Test - public void testGetSubscriberMessagesWhenMessagesAreFound() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(200); - when(subscriberResponse.getResponseMessage()).thenReturn("testMessage"); - when(subscriberResponse.getFetchedMessages()).thenReturn(ImmutableList.of("testMessage1", "testMessage1")); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); - verify(metrics, Mockito.times(1)).count(ArgumentMatchers.eq(CDAPMetricsConstants - .DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC), eq(2)); - } - - @Test - public void testSubscriberMessagesWhenSubscriberResponseCodeIsNull() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(null); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); - } - - @Test - public void testSubscriberMessagesWhenNoMessagesFound() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(200); - when(subscriberResponse.getResponseMessage()).thenReturn("no messages"); - when(subscriberResponse.getFetchedMessages()).thenReturn(Collections.emptyList()); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); - verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants - .DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC), eq(1)); - } - - - @Test - public void testWhenSubscriberReturnNonSuccessfulReturnCode() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(500); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); - verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants - .DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC), eq(1)); - } - - @Test - public void testWhenSubscriberThrowsException() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(500); - when(subscriber.fetchMessages()).thenThrow(DCAEAnalyticsRuntimeException.class); - DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); - } - -} diff --git a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java b/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java deleted file mode 100644 index 5344ca5..0000000 --- a/dcae-analytics-cdap-common/src/test/java/org/openecomp/dcae/apod/analytics/cdap/common/utils/ValidationUtilsTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.common.utils; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.BaseAnalyticsCDAPCommonUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class ValidationUtilsTest extends BaseAnalyticsCDAPCommonUnitTest { - - @Test - public void testIsEmptyWhenStringIsNull() throws Exception { - assertTrue(ValidationUtils.isEmpty(null)); - } - - @Test - public void testIsEmptyWhenStringIsEmpty() throws Exception { - String emptyString = ""; - assertTrue(ValidationUtils.isEmpty(emptyString)); - } - - @Test - public void testIsEmptyWhenStringIsEmptyWithBlanks() throws Exception { - String blankString = " "; - assertTrue(ValidationUtils.isEmpty(blankString)); - } - - - @Test - public void testIsNotPresent() throws Exception { - assertFalse(ValidationUtils.isPresent(null)); - String emptyString = ""; - assertFalse(ValidationUtils.isPresent(emptyString)); - String blankString = " "; - assertFalse(ValidationUtils.isPresent(blankString)); - String validString = "SomeValue"; - assertTrue(ValidationUtils.isPresent(validString)); - } - - @Test - public void testValidateSettingsWhenValidationPasses() throws Exception { - CDAPTestAppSettings cdapTestAppSettings = new CDAPTestAppSettings(); - cdapTestAppSettings.setSettingsField("testValue"); - ValidationUtils.validateSettings(cdapTestAppSettings, new CDAPTestAppSettingsValidator()); - } - - @Test(expected = CDAPSettingsException.class) - public void testValidateSettingsWhenValidationFails() throws Exception { - - CDAPTestAppSettings cdapTestAppSettings = new CDAPTestAppSettings(); - cdapTestAppSettings.setSettingsField(""); - ValidationUtils.validateSettings(cdapTestAppSettings, new CDAPTestAppSettingsValidator()); - } - -} - diff --git a/dcae-analytics-cdap-common/src/test/resources/logback-test.xml b/dcae-analytics-cdap-common/src/test/resources/logback-test.xml index 9e40f24..fb02c74 100644 --- a/dcae-analytics-cdap-common/src/test/resources/logback-test.xml +++ b/dcae-analytics-cdap-common/src/test/resources/logback-test.xml @@ -1,55 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + + + + + + + + + + diff --git a/dcae-analytics-cdap-plugins/pom.xml b/dcae-analytics-cdap-plugins/pom.xml index b936d8c..76b119b 100644 --- a/dcae-analytics-cdap-plugins/pom.xml +++ b/dcae-analytics-cdap-plugins/pom.xml @@ -1,316 +1,316 @@ - - - - - - 4.0.0 - - - dcae-analytics - org.onap.dcaegen2.analytics.tca - 2.1.0-SNAPSHOT - - - dcae-analytics-cdap-plugins - jar - - - DCAE Analytics CDAP Plugins - DCAE Analytics CDAP Plugins to build CDAP Pipelines - - - ${project.parent.basedir} - ${project.basedir} - widgets - docs - - system:cdap-etl-batch[4.0.0,4.2.0-SNAPSHOT),system:cdap-etl-realtime[4.0.0,4.2.0-SNAPSHOT),system:cdap-data-pipeline[4.0.0,4.2.0-SNAPSHOT),system:cdap-data-streams[4.0.0,4.2.0-SNAPSHOT) - - - - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-cdap-common - 2.1.0-SNAPSHOT - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-tca - 2.1.0-SNAPSHOT - - - - - - co.cask.cdap - cdap-api - - - - co.cask.cdap - cdap-etl-api - - - - co.cask.cdap - cdap-etl-api-spark - - - - co.cask.cdap - cdap-etl-realtime - - - - co.cask.cdap - cdap-data-pipeline - - - - co.cask.cdap - cdap-data-streams - - - - org.apache.spark - spark-streaming_2.10 - - - - - co.cask.http - netty-http - - - co.cask.common - common-http - - - - - org.apache.hadoop - hadoop-mapreduce-client-core - - - org.apache.hadoop - hadoop-common - - - - - org.apache.spark - spark-core_2.10 - - - - - org.slf4j - slf4j-api - - - - ch.qos.logback - logback-core - - - - ch.qos.logback - logback-classic - - - - - com.google.code.findbugs - jsr305 - ${findbugs.jsr305.version} - provided - - - - com.google.code.findbugs - annotations - ${findbugs.annotations.version} - provided - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-test - 2.1.0-SNAPSHOT - test - - - - co.cask.cdap - hydrator-test - - - - co.cask.cdap - cdap-unit-test - - - org.apache.httpcomponents - httpcore - - - - - - - - - - - - org.apache.felix - maven-bundle-plugin - - - - <_exportcontents> - org.openecomp.dcae.apod.analytics.dmaap.domain.response.*, - org.openecomp.dcae.apod.analytics.dmaap.domain.config.*; - org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.*; - org.openecomp.dcae.apod.analytics.dmaap.service.*; - org.openecomp.dcae.apod.analytics.cdap.common.settings.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.common.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.sparkcompute.tca.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap.*; - org.openecomp.dcae.apod.analytics.cdap.plugins.transform.filter.*; - com.google.common.base.*; - com.google.inject.*; - org.apache.http.*; - org.aopalliance.*; - javax.inject.*; - org.apache.commons.* - - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - - create-artifact-config - prepare-package - - - - - - - run - - - - - - - - - - + + + + + + 4.0.0 + + + dcae-analytics + org.onap.dcaegen2.analytics.tca + 2.1.0-SNAPSHOT + + + dcae-analytics-cdap-plugins + jar + + + DCAE Analytics CDAP Plugins + DCAE Analytics CDAP Plugins to build CDAP Pipelines + + + ${project.parent.basedir} + ${project.basedir} + widgets + docs + + system:cdap-etl-batch[4.0.0,4.2.0-SNAPSHOT),system:cdap-etl-realtime[4.0.0,4.2.0-SNAPSHOT),system:cdap-data-pipeline[4.0.0,4.2.0-SNAPSHOT),system:cdap-data-streams[4.0.0,4.2.0-SNAPSHOT) + + + + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-cdap-common + 2.1.0-SNAPSHOT + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-tca + 2.1.0-SNAPSHOT + + + + + + co.cask.cdap + cdap-api + + + + co.cask.cdap + cdap-etl-api + + + + co.cask.cdap + cdap-etl-api-spark + + + + co.cask.cdap + cdap-etl-realtime + + + + co.cask.cdap + cdap-data-pipeline + + + + co.cask.cdap + cdap-data-streams + + + + org.apache.spark + spark-streaming_2.10 + + + + + co.cask.http + netty-http + + + co.cask.common + common-http + + + + + org.apache.hadoop + hadoop-mapreduce-client-core + + + org.apache.hadoop + hadoop-common + + + + + org.apache.spark + spark-core_2.10 + + + + + org.slf4j + slf4j-api + + + + ch.qos.logback + logback-core + + + + ch.qos.logback + logback-classic + + + + + com.google.code.findbugs + jsr305 + ${findbugs.jsr305.version} + provided + + + + com.google.code.findbugs + annotations + ${findbugs.annotations.version} + provided + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-test + 2.1.0-SNAPSHOT + test + + + + co.cask.cdap + hydrator-test + + + + co.cask.cdap + cdap-unit-test + + + org.apache.httpcomponents + httpcore + + + + + + + + + + + + org.apache.felix + maven-bundle-plugin + + + + <_exportcontents> + org.onap.dcae.apod.analytics.dmaap.domain.response.*, + org.onap.dcae.apod.analytics.dmaap.domain.config.*; + org.onap.dcae.apod.analytics.dmaap.service.subscriber.*; + org.onap.dcae.apod.analytics.dmaap.service.*; + org.onap.dcae.apod.analytics.cdap.common.settings.*; + org.onap.dcae.apod.analytics.cdap.plugins.common.*; + org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap.*; + org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.*; + org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter.*; + org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.*; + org.onap.dcae.apod.analytics.cdap.plugins.sparkcompute.tca.*; + org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap.*; + org.onap.dcae.apod.analytics.cdap.plugins.transform.filter.*; + com.google.common.base.*; + com.google.inject.*; + org.apache.http.*; + org.aopalliance.*; + javax.inject.*; + org.apache.commons.* + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + create-artifact-config + prepare-package + + + + + + + run + + + + + + + + + + diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java new file mode 100644 index 0000000..d627fb0 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java @@ -0,0 +1,94 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.io.NullWritable; +import org.apache.hadoop.mapreduce.JobContext; +import org.apache.hadoop.mapreduce.OutputCommitter; +import org.apache.hadoop.mapreduce.OutputFormat; +import org.apache.hadoop.mapreduce.RecordWriter; +import org.apache.hadoop.mapreduce.TaskAttemptContext; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.DMaaPSinkConfigMapper; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; + +import java.io.IOException; + +/** + * DMaaP MR Output format used by DMaaP MR Sink Plugin to create a MR Publisher and pass to custom {@link + * DMaaPMRRecordWriter} + *

+ * @author Rajiv Singla . Creation Date: 1/27/2017. + */ +public class DMaaPMROutputFormat extends OutputFormat { + + @Override + public RecordWriter getRecordWriter(TaskAttemptContext context) throws IOException, + InterruptedException { + final Configuration configuration = context.getConfiguration(); + final DMaaPMRPublisherConfig publisherConfig = DMaaPSinkConfigMapper.map(configuration); + final DMaaPMRPublisher publisher = DMaaPMRFactory.create().createPublisher(publisherConfig); + return new DMaaPMRRecordWriter(publisher); + } + + @Override + public void checkOutputSpecs(JobContext context) throws IOException, InterruptedException { + // do nothing + } + + @Override + public OutputCommitter getOutputCommitter(TaskAttemptContext context) throws IOException, InterruptedException { + return new NoOpOutputCommitter(); + } + + /** + * A dummy implementation for {@link OutputCommitter} that does nothing. + */ + protected static class NoOpOutputCommitter extends OutputCommitter { + + @Override + public void setupJob(JobContext jobContext) throws IOException { + // no op + } + + @Override + public void setupTask(TaskAttemptContext taskContext) throws IOException { + // no op + } + + @Override + public boolean needsTaskCommit(TaskAttemptContext taskContext) throws IOException { + return false; + } + + @Override + public void commitTask(TaskAttemptContext taskContext) throws IOException { + // no op + } + + @Override + public void abortTask(TaskAttemptContext taskContext) throws IOException { + // no op + } + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java new file mode 100644 index 0000000..bc6780b --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java @@ -0,0 +1,116 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import co.cask.cdap.api.data.batch.OutputFormatProvider; +import org.onap.dcae.apod.analytics.cdap.common.CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * DMaaP MR Output Format Provider used to create Batch Sink Plugin + *

+ * @author Rajiv Singla . Creation Date: 1/27/2017. + */ +public class DMaaPMROutputFormatProvider implements OutputFormatProvider { + + private final Map sinkConfig; + + + public DMaaPMROutputFormatProvider(DMaaPMRSinkPluginConfig sinkPluginConfig) { + + // initialize Sink Config - with DMaaP MR Publisher config values + sinkConfig = new LinkedHashMap<>(); + + // Required fields for sink config + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.HOST_NAME, sinkPluginConfig.getHostName()); + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.TOPIC_NAME, sinkPluginConfig.getTopicName()); + + final Integer configPortNumber = sinkPluginConfig.getPortNumber(); + if (configPortNumber != null) { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER, configPortNumber.toString()); + } else { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER, + AnalyticsConstants.DEFAULT_PORT_NUMBER.toString()); + } + + final String configProtocol = sinkPluginConfig.getProtocol(); + if (ValidationUtils.isPresent(configProtocol)) { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PROTOCOL, configProtocol); + } else { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PROTOCOL, AnalyticsConstants.DEFAULT_PROTOCOL); + } + + + final String configUserName = sinkPluginConfig.getUserName(); + if (ValidationUtils.isPresent(configUserName)) { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_NAME, configUserName); + } else { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_NAME, AnalyticsConstants.DEFAULT_USER_NAME); + } + + final String configUserPass = sinkPluginConfig.getUserPassword(); + if (ValidationUtils.isPresent(configUserPass)) { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_PASS, configUserPass); + } else { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_PASS, AnalyticsConstants.DEFAULT_USER_PASSWORD); + } + + final String configContentType = sinkPluginConfig.getContentType(); + if (ValidationUtils.isPresent(configContentType)) { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE, configContentType); + } else { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE, AnalyticsConstants.DEFAULT_CONTENT_TYPE); + } + + + final Integer configMaxBatchSize = sinkPluginConfig.getMaxBatchSize(); + if (configMaxBatchSize != null) { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE, configMaxBatchSize.toString()); + } else { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE, + String.valueOf(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_BATCH_SIZE)); + } + + final Integer configMaxRecoveryQueueSize = sinkPluginConfig.getMaxRecoveryQueueSize(); + if (configMaxRecoveryQueueSize != null) { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE, configMaxRecoveryQueueSize.toString()); + } else { + sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE, + String.valueOf(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE)); + } + + } + + @Override + public String getOutputFormatClassName() { + return DMaaPMROutputFormat.class.getName(); + } + + @Override + public Map getOutputFormatConfiguration() { + return sinkConfig; + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java new file mode 100644 index 0000000..a123edd --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java @@ -0,0 +1,58 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import org.apache.hadoop.io.NullWritable; +import org.apache.hadoop.mapreduce.RecordWriter; +import org.apache.hadoop.mapreduce.TaskAttemptContext; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Arrays; + +/** + * A simple implementation of {@link RecordWriter} which writes messages to DMaaP MR topic + *

+ * @author Rajiv Singla . Creation Date: 1/27/2017. + */ +public class DMaaPMRRecordWriter extends RecordWriter { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRRecordWriter.class); + + private final DMaaPMRPublisher dMaaPMRPublisher; + + public DMaaPMRRecordWriter(DMaaPMRPublisher dMaaPMRPublisher) { + this.dMaaPMRPublisher = dMaaPMRPublisher; + } + + @Override + public void write(String message, NullWritable value) throws IOException, InterruptedException { + LOG.debug("Writing message to DMaaP MR Topic: {}", message); + dMaaPMRPublisher.publish(Arrays.asList(message)); + } + + @Override + public void close(TaskAttemptContext context) throws IOException, InterruptedException { + dMaaPMRPublisher.flush(); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java new file mode 100644 index 0000000..4003e4a --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java @@ -0,0 +1,90 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Name; +import co.cask.cdap.api.annotation.Plugin; +import co.cask.cdap.api.data.batch.Output; +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.api.dataset.lib.KeyValue; +import co.cask.cdap.etl.api.Emitter; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.batch.BatchSink; +import co.cask.cdap.etl.api.batch.BatchSinkContext; +import org.apache.hadoop.io.NullWritable; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.validator.DMaaPMRSinkPluginConfigValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Rajiv Singla . Creation Date: 1/26/2017. + */ +@Plugin(type = BatchSink.PLUGIN_TYPE) +@Name("DMaaPMRSink") +@Description("A batch sink Plugin that publishes messages to DMaaP MR Topic.") +public class DMaaPMRSink extends BatchSink { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSink.class); + + private final DMaaPMRSinkPluginConfig pluginConfig; + + public DMaaPMRSink(final DMaaPMRSinkPluginConfig pluginConfig) { + LOG.debug("Creating DMaaP MR Sink Plugin with plugin Config: {}", pluginConfig); + this.pluginConfig = pluginConfig; + } + + @Override + public void configurePipeline(final PipelineConfigurer pipelineConfigurer) { + super.configurePipeline(pipelineConfigurer); + ValidationUtils.validateSettings(pluginConfig, new DMaaPMRSinkPluginConfigValidator()); + // validates that input schema contains the field provided in Sink Message Column Name property + final Schema inputSchema = pipelineConfigurer.getStageConfigurer().getInputSchema(); + CDAPPluginUtils.validateSchemaContainsFields(inputSchema, pluginConfig.getMessageColumnName()); + } + + + @Override + public void prepareRun(BatchSinkContext context) throws Exception { + context.addOutput(Output.of(pluginConfig.getReferenceName(), new DMaaPMROutputFormatProvider(pluginConfig))); + } + + @Override + public void transform(StructuredRecord structuredRecord, + Emitter> emitter) throws Exception { + // get incoming message from structured record + final String incomingMessage = structuredRecord.get(pluginConfig.getMessageColumnName()); + + // if incoming messages does not have message column name log warning as it should not happen + if (incomingMessage == null) { + LOG.warn("Column Name: {}, contains no message.Skipped for DMaaP MR Publishing....", + pluginConfig.getMessageColumnName()); + } else { + + // emit the messages as key + emitter.emit(new KeyValue(incomingMessage, null)); + } + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java new file mode 100644 index 0000000..076478c --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java @@ -0,0 +1,37 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.common; + +/** + * Contract interface for all DCAE Analytics Plugin Schemas + * + * @author Rajiv Singla . Creation Date: 1/25/2017. + */ +public interface PluginSchema { + + /** + * Provides column name that will be used in Schema Definition + * + * @return Column name that will be used in Schema Definition + */ + String getSchemaColumnName(); + +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java new file mode 100644 index 0000000..276c9a1 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java @@ -0,0 +1,159 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Macro; +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPBasePluginConfig; + +import javax.annotation.Nullable; + +/** + * Base class for all DMaaP MR Configs + *

+ * @author Rajiv Singla . Creation Date: 1/17/2017. + */ +public abstract class BaseDMaaPMRPluginConfig extends CDAPBasePluginConfig { + + @Description("DMaaP Message Router HostName") + @Macro + protected String hostName; + + @Description("DMaaP Message Router Host Port number. Defaults to Port 80") + @Nullable + @Macro + protected Integer portNumber; + + @Description("DMaaP Message Router Topic Name") + @Macro + protected String topicName; + + @Description("DMaaP Message Router HTTP Protocol e.g. HTTP or HTTPS. Defaults to HTTPS") + @Nullable + @Macro + protected String protocol; + + @Description("DMaaP Message Router User Name used for AAF Authentication. Defaults to no authentication") + @Nullable + @Macro + protected String userName; + + @Description("DMaaP Message Router User Password used for AAF Authentication. Defaults to no authentication") + @Nullable + @Macro + protected String userPassword; + + @Description("DMaaP Message Router Content Type. Defaults to 'application/json'") + @Nullable + @Macro + protected String contentType; + + + public BaseDMaaPMRPluginConfig(final String referenceName, final String hostName, final String topicName) { + this.referenceName = referenceName; + this.hostName = hostName; + this.topicName = topicName; + } + + /** + * Host Name for DMaaP MR Publisher or Subscriber + * + * @return host name + */ + public String getHostName() { + return hostName; + } + + /** + * Port Number for DMaaP MR Publisher or Subscriber + * + * @return port number + */ + @Nullable + public Integer getPortNumber() { + return portNumber; + } + + /** + * DMaaP MR Topic Name for Subscriber or Publisher + * + * @return topic name + */ + public String getTopicName() { + return topicName; + } + + + /** + * DMaaP MR HTTP or HTTPS protocol + * + * @return http or https protocol + */ + @Nullable + public String getProtocol() { + return protocol; + } + + /** + * User name used for DMaaP MR AAF Authentication + * + * @return User name for DMaaP MR AAF Authentication + */ + @Nullable + public String getUserName() { + return userName; + } + + /** + * User password used for DMaaP MR AAF Authentication + * + * @return User password used for DMaaP MR AAF Authentication + */ + @Nullable + public String getUserPassword() { + return userPassword; + } + + /** + * Content type used for DMaaP MR Topic e.g. 'application/json' + * + * @return content type for DMaaP MR Topic + */ + @Nullable + public String getContentType() { + return contentType; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("referenceName", referenceName) + .add("hostName", hostName) + .add("portNumber", portNumber) + .add("topicName", topicName) + .add("protocol", protocol) + .add("userName", userName) + .add("userPassword", "xxxx") + .add("contentType", contentType) + .toString(); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java new file mode 100644 index 0000000..5b03644 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java @@ -0,0 +1,101 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Macro; +import com.google.common.base.Objects; + +import javax.annotation.Nullable; + +/** + * DMaaP MR Publisher Config + *

+ * @author Rajiv Singla . Creation Date: 1/17/2017. + */ +public class DMaaPMRSinkPluginConfig extends BaseDMaaPMRPluginConfig { + + private static final long serialVersionUID = 1L; + + @Description("Column name of input schema which contains the message that needs to be written to DMaaP MR Topic") + @Macro + protected String messageColumnName; + + @Description("DMaaP MR Publisher Max Batch Size. Defaults to no Batch") + @Nullable + @Macro + protected Integer maxBatchSize; + + @Description("DMaaP MR Publisher Recovery Queue Size. Default to 1000K messages which can be buffered in memory " + + "in case DMaaP MR Publisher is temporarily unavailable") + @Nullable + @Macro + protected Integer maxRecoveryQueueSize; + + // Required No Arg constructor + public DMaaPMRSinkPluginConfig() { + this(null, null, null, null); + } + + public DMaaPMRSinkPluginConfig(String referenceName, String hostName, String topicName, String messageColumnName) { + super(referenceName, hostName, topicName); + this.messageColumnName = messageColumnName; + } + + /** + * Column name of incoming Schema field that contains the message that needs to published to DMaaP MR Topic + * + * @return Column name of incoming schema which contains message that needs to published to DMaaP MR Topic + */ + public String getMessageColumnName() { + return messageColumnName; + } + + /** + * DMaaP MR Publisher Max Batch Size. + * + * @return DMaaP MR Publisher Max Batch Size + */ + @Nullable + public Integer getMaxBatchSize() { + return maxBatchSize; + } + + /** + * DMaaP MR Publisher Max Recovery Queue Size + * + * @return DMaaP MR Publisher Max Recovery Queue Size + */ + @Nullable + public Integer getMaxRecoveryQueueSize() { + return maxRecoveryQueueSize; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("super", super.toString()) + .add("messageColumnName", messageColumnName) + .add("maxBatchSize", maxBatchSize) + .add("maxRecoveryQueueSize", maxRecoveryQueueSize) + .toString(); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java new file mode 100644 index 0000000..b1aa3dc --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java @@ -0,0 +1,134 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Macro; +import com.google.common.base.Objects; + +import javax.annotation.Nullable; + +/** + * DMaaP MR Subscriber Config + *

+ * @author Rajiv Singla . Creation Date: 1/17/2017. + */ +public class DMaaPMRSourcePluginConfig extends BaseDMaaPMRPluginConfig { + + private static final long serialVersionUID = 1L; + + @Description("DMaaP MR Polling Interval in MS") + @Macro + protected Integer pollingInterval; + + @Description("DMaaP Message Router Subscriber Consumer ID. Defaults to some randomly created userID") + @Nullable + @Macro + protected String consumerId; + + @Description("DMaaP Message Router Subscriber Consumer Group. Defaults to some randomly created user Group") + @Nullable + @Macro + protected String consumerGroup; + + @Description("DMaaP Message Router Subscriber Timeout in MS. Defaults to no timeout") + @Nullable + @Macro + protected Integer timeoutMS; + + @Description("DMaaP Message Router Subscriber Message Limit. Defaults to no message limit") + @Nullable + @Macro + protected Integer messageLimit; + + // Required No Arg constructor + public DMaaPMRSourcePluginConfig() { + this(null, null, null, 0); + } + + public DMaaPMRSourcePluginConfig(String referenceName, String hostName, String topicName, Integer pollingInterval) { + super(referenceName, hostName, topicName); + this.pollingInterval = pollingInterval; + } + + /** + * DMaaP MR Subscriber Polling interval + * + * @return DMaaP MR Subscriber Polling interval + */ + public Integer getPollingInterval() { + return pollingInterval; + } + + /** + * DMaaP MR Subscriber Consumer ID + * + * @return DMaaP MR Subscriber Consumer ID + */ + @Nullable + public String getConsumerId() { + return consumerId; + } + + /** + * DMaaP MR Subscriber Consumer Group + * + * @return DMaaP MR Subscriber Consumer Group + */ + @Nullable + public String getConsumerGroup() { + return consumerGroup; + } + + /** + * DMaaP MR Subscriber Timeout in MS + * + * @return DMaaP MR Subscriber Timeout in MS + */ + @Nullable + public Integer getTimeoutMS() { + return timeoutMS; + } + + /** + * DMaaP MR Subscriber message limit + * + * @return DMaaP MR Subscriber Message limit + */ + @Nullable + public Integer getMessageLimit() { + return messageLimit; + } + + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("super", super.toString()) + .add("pollingInterval", pollingInterval) + .add("consumerId", consumerId) + .add("consumerGroup", consumerGroup) + .add("timeoutMS", timeoutMS) + .add("messageLimit", messageLimit) + .toString(); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java new file mode 100644 index 0000000..bffb403 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java @@ -0,0 +1,125 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Macro; +import co.cask.cdap.api.annotation.Name; +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPBasePluginConfig; + +/** + * Configuration for Json Path Filter Plugin + * + * @author Rajiv Singla . Creation Date: 3/2/2017. + */ +public class JsonPathFilterPluginConfig extends CDAPBasePluginConfig { + + private static final long serialVersionUID = 1L; + + @Name("incomingJsonFieldName") + @Description("Input schema field name that contain JSON used for filtering") + @Macro + protected String incomingJsonFieldName; + + + @Name("outputSchemaFieldName") + @Description("Name of the nullable boolean schema field name that will contain result of the filter matching") + @Macro + protected String outputSchemaFieldName; + + + @Name("jsonFilterMappings") + @Macro + @Description("Filters incoming JSON based on given filter mappings - in terms of JSON path and expected values." + + "Right hand side contains JSON path. Left hand side contains semicolon (';') separated expected values " + + "for that JSON Path. If all provided JSON Path mappings and corresponding values matches - " + + "output schema field will be marked as true") + protected String jsonFilterMappings; + + + @Name("schema") + @Description("Output Schema") + protected String schema; + + + public JsonPathFilterPluginConfig(final String referenceName, final String incomingJsonFieldName, + final String outputSchemaFieldName, final String jsonFilterMappings, + final String schema) { + this.referenceName = referenceName; + this.incomingJsonFieldName = incomingJsonFieldName; + this.outputSchemaFieldName = outputSchemaFieldName; + this.jsonFilterMappings = jsonFilterMappings; + this.schema = schema; + } + + /** + * Provides incoming plugin schema field name which contains json used to apply filter + * + * @return name of incoming schema field containing JSON to be filtered + */ + public String getIncomingJsonFieldName() { + return incomingJsonFieldName; + } + + /** + * Provides plugin output schema filed name that will contain result of filter application + * It must be nullable and boolean type + * + * @return name of outgoing schema filed name that will contain filtering result + */ + public String getOutputSchemaFieldName() { + return outputSchemaFieldName; + } + + /** + * Provides JSON filter mappings. LHS contains JSON path value and RHS contains expected + * values separated by semicolon + * + * + * @return String for JSON filter mappings + */ + public String getJsonFilterMappings() { + return jsonFilterMappings; + } + + /** + * Output Schema + * + * @return output schema string + */ + public String getSchema() { + return schema; + } + + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("referenceName", referenceName) + .add("incomingJsonFieldName", incomingJsonFieldName) + .add("outputSchemaFieldName", outputSchemaFieldName) + .add("jsonFilterMappings", jsonFilterMappings) + .add("schema", schema) + .toString(); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java new file mode 100644 index 0000000..dda3b54 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java @@ -0,0 +1,154 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Macro; +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPBasePluginConfig; + +import javax.annotation.Nullable; + +/** + * Simple TCA Plugin Configuration + *

+ * @author Rajiv Singla . Creation Date: 2/13/2017. + */ +public class SimpleTCAPluginConfig extends CDAPBasePluginConfig { + + private static final long serialVersionUID = 1L; + + @Description("Field name containing VES Message") + @Macro + protected String vesMessageFieldName; + + @Description("Policy JSON that need to be applied to VES Message") + @Macro + protected String policyJson; + + @Description("Name of the output field that will contain the alert") + @Macro + protected String alertFieldName; + + @Description("Name of the output field that will contain message type: INAPPLICABLE, COMPLIANT, NON_COMPLIANT") + @Macro + protected String messageTypeFieldName; + + @Description("Specifies the output schema") + protected String schema; + + @Description("Enables") + @Nullable + @Macro + protected Boolean enableAlertCEFFormat; + + + /** + * Creates an instance of TCA Plugin Configs + * + * @param vesMessageFieldName Ves message field name from incoming plugin schema + * @param policyJson TCA Policy Json String + * @param alertFieldName Alert field name that will be added in TCA plugin output schema + * @param messageTypeFieldName Message type field name that will be added in TCA plugin output schema + * @param schema TCA Plugin output schema + * @param enableAlertCEFFormat enables alert message to be formatted in VES format + */ + public SimpleTCAPluginConfig(final String vesMessageFieldName, final String policyJson, + final String alertFieldName, final String messageTypeFieldName, + final String schema, final Boolean enableAlertCEFFormat) { + this.vesMessageFieldName = vesMessageFieldName; + this.policyJson = policyJson; + this.alertFieldName = alertFieldName; + this.messageTypeFieldName = messageTypeFieldName; + this.schema = schema; + this.enableAlertCEFFormat = enableAlertCEFFormat; + } + + /** + * Name of the field containing VES Message + * + * @return VES Message field name + */ + public String getVesMessageFieldName() { + return vesMessageFieldName; + } + + /** + * Policy Json String + * + * @return Policy Json String + */ + public String getPolicyJson() { + return policyJson; + } + + + /** + * Alert Field name in outgoing schema + * + * @return alert field name in outgoing schema + */ + public String getAlertFieldName() { + return alertFieldName; + } + + /** + * Returns output schema string + * + * @return output schema string + */ + public String getSchema() { + return schema; + } + + /** + * Return TCA message type - INAPPLICABLE, COMPLIANT, NON_COMPLIANT + * + * @return tca message type + */ + public String getMessageTypeFieldName() { + return messageTypeFieldName; + } + + + /** + * Returns if Alert output in Common Event format + * + * @return true if alert output is in common event format + */ + @Nullable + public Boolean getEnableAlertCEFFormat() { + return enableAlertCEFFormat; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("referenceName", referenceName) + .add("vesMessageFieldName", vesMessageFieldName) + .add("policyJson", policyJson) + .add("alertFieldName", alertFieldName) + .add("messageTypeFieldName", messageTypeFieldName) + .add("schema", schema) + .add("enableAlertCEFFormat", true) + .toString(); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java new file mode 100644 index 0000000..183425b --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java @@ -0,0 +1,59 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap; + +import co.cask.cdap.api.data.schema.Schema; +import org.onap.dcae.apod.analytics.cdap.plugins.common.PluginSchema; + +/** + * Output Schema for DMaaP MR Source Plugin + * + * @author Rajiv Singla . Creation Date: 1/25/2017. + */ +public enum DMaaPSourceOutputSchema implements PluginSchema { + + TIMESTAMP("ts"), + RESPONSE_CODE("responseCode"), + RESPONSE_MESSAGE("responseMessage"), + FETCHED_MESSAGE("message"); + + private String schemaColumnName; + + DMaaPSourceOutputSchema(String schemaColumnName) { + this.schemaColumnName = schemaColumnName; + } + + @Override + public String getSchemaColumnName() { + return schemaColumnName; + } + + public static Schema getSchema() { + return Schema.recordOf( + "DMaaPMRSourcePluginResponse", + Schema.Field.of(TIMESTAMP.getSchemaColumnName(), Schema.of(Schema.Type.LONG)), + Schema.Field.of(RESPONSE_CODE.getSchemaColumnName(), Schema.of(Schema.Type.INT)), + Schema.Field.of(RESPONSE_MESSAGE.getSchemaColumnName(), Schema.of(Schema.Type.STRING)), + Schema.Field.of(FETCHED_MESSAGE.getSchemaColumnName(), Schema.of(Schema.Type.STRING)) + ); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java new file mode 100644 index 0000000..d2dd742 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java @@ -0,0 +1,175 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.sparkcompute.tca; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Name; +import co.cask.cdap.api.annotation.Plugin; +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.format.StructuredRecord.Builder; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.StageMetrics; +import co.cask.cdap.etl.api.batch.SparkCompute; +import co.cask.cdap.etl.api.batch.SparkExecutionPluginContext; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.function.Function; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.validator.SimpleTCAPluginConfigValidator; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Rajiv Singla . Creation Date: 2/13/2017. + */ + +@Plugin(type = SparkCompute.PLUGIN_TYPE) +@Name("SimpleTCAPlugin") +@Description("Used to create TCA (Threshold Crossing Alert) based on given Policy") +@SuppressFBWarnings("SE_INNER_CLASS") +public class SimpleTCAPlugin extends SparkCompute { + + private static final Logger LOG = LoggerFactory.getLogger(SimpleTCAPlugin.class); + private static final long serialVersionUID = 1L; + + private final SimpleTCAPluginConfig pluginConfig; + + /** + * Create an instance of Simple TCA Plugin with give Simple TCA Plugin Config + * + * @param pluginConfig Simple TCA Plugin Config + */ + public SimpleTCAPlugin(SimpleTCAPluginConfig pluginConfig) { + this.pluginConfig = pluginConfig; + LOG.info("Creating instance of Simple TCA Plugin with plugin config: {}", pluginConfig); + } + + @Override + public void configurePipeline(PipelineConfigurer pipelineConfigurer) { + super.configurePipeline(pipelineConfigurer); + ValidationUtils.validateSettings(pluginConfig, new SimpleTCAPluginConfigValidator()); + final Schema inputSchema = pipelineConfigurer.getStageConfigurer().getInputSchema(); + CDAPPluginUtils.validateSchemaContainsFields(inputSchema, pluginConfig.getVesMessageFieldName()); + CDAPPluginUtils.setOutputSchema(pipelineConfigurer, pluginConfig.getSchema()); + } + + @Override + public JavaRDD transform(final SparkExecutionPluginContext context, + final JavaRDD input) throws Exception { + final StageMetrics metrics = context.getMetrics(); + + LOG.debug("Invoking Spark Transform for Simple TCA Plugin"); + return input.map(new Function() { + + @Override + public StructuredRecord call(StructuredRecord inputStructuredRecord) throws Exception { + TCACalculatorMessageType calculatorMessageType; + String alertMessage = null; + + // Get input structured record + final String cefMessage = inputStructuredRecord.get(pluginConfig.getVesMessageFieldName()); + + // Get TCA Policy + final TCAPolicy tcaPolicy = CDAPPluginUtils.readValue(pluginConfig.getPolicyJson(), TCAPolicy.class); + + // create initial processor context + final TCACEFProcessorContext initialProcessorContext = + new TCACEFProcessorContext(cefMessage, tcaPolicy); + + final TCACEFJsonProcessor jsonProcessor = new TCACEFJsonProcessor(); + final TCACEFProcessorContext jsonProcessorContext = + jsonProcessor.processMessage(initialProcessorContext); + + if (jsonProcessorContext.getCEFEventListener() != null) { + + LOG.debug("Json to CEF parsing successful. Parsed object {}", + jsonProcessorContext.getCEFEventListener()); + + // compute violations + final TCACEFProcessorContext processorContextWithViolations = + TCAUtils.computeThresholdViolations(jsonProcessorContext); + + // if violation are found then create alert message + if (processorContextWithViolations.canProcessingContinue()) { + + alertMessage = TCAUtils.createTCAAlertString(processorContextWithViolations, + pluginConfig.getReferenceName(), pluginConfig.getEnableAlertCEFFormat()); + calculatorMessageType = TCACalculatorMessageType.NON_COMPLIANT; + + LOG.debug("VES Threshold Violation Detected.An alert message is be generated: {}", + alertMessage); + + final MetricsPerEventName metricsPerEventName = + processorContextWithViolations.getMetricsPerEventName(); + if (metricsPerEventName != null + && metricsPerEventName.getThresholds() != null + && metricsPerEventName.getThresholds().get(0) != null) { + final Threshold violatedThreshold = metricsPerEventName.getThresholds().get(0); + LOG.debug("CEF Message: {}, Violated Threshold: {}", cefMessage, violatedThreshold); + } + + metrics.count(CDAPMetricsConstants.TCA_VES_NON_COMPLIANT_MESSAGES_METRIC, 1); + + } else { + LOG.debug("No Threshold Violation Detected. No alert will be generated."); + calculatorMessageType = TCACalculatorMessageType.COMPLIANT; + metrics.count(CDAPMetricsConstants.TCA_VES_COMPLIANT_MESSAGES_METRIC, 1); + } + + } else { + LOG.info("Unable to parse provided json message to CEF format. Invalid message: {}", cefMessage); + calculatorMessageType = TCACalculatorMessageType.INAPPLICABLE; + } + + LOG.debug("Calculator message type: {} for message: {}", calculatorMessageType, cefMessage); + + final Schema outputSchema = Schema.parseJson(pluginConfig.getSchema()); + + // create new output record builder and copy any input record values to output record builder + final Builder outputRecordBuilder = + CDAPPluginUtils.createOutputStructuredRecordBuilder(outputSchema, inputStructuredRecord); + + // add alert field + final Builder outputRecordBuilderWithAlertField = + CDAPPluginUtils.addFieldValueToStructuredRecordBuilder(outputRecordBuilder, + outputSchema, pluginConfig.getAlertFieldName(), alertMessage); + + // add message field type + final Builder outRecordBuilderWithMessageTypeField = + CDAPPluginUtils.addFieldValueToStructuredRecordBuilder(outputRecordBuilderWithAlertField, + outputSchema, pluginConfig.getMessageTypeFieldName(), calculatorMessageType.toString()); + + return outRecordBuilderWithMessageTypeField.build(); + } + }); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java new file mode 100644 index 0000000..593d5d1 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java @@ -0,0 +1,118 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.metrics.Metrics; +import com.google.common.base.Optional; +import org.apache.spark.storage.StorageLevel; +import org.apache.spark.streaming.receiver.Receiver; +import org.onap.dcae.apod.analytics.cdap.common.utils.DMaaPMRUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.DMaaPSourceConfigMapper; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * DMaaP MR Receiver which calls DMaaP MR Topic and stores structured records + *

+ * @author Rajiv Singla . Creation Date: 1/19/2017. + */ +public class DMaaPMRReceiver extends Receiver { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRReceiver.class); + private static final long serialVersionUID = 1L; + + private final DMaaPMRSourcePluginConfig pluginConfig; + private final transient Metrics metrics; + + public DMaaPMRReceiver(final StorageLevel storageLevel, final DMaaPMRSourcePluginConfig pluginConfig, + final Metrics metrics) { + super(storageLevel); + this.pluginConfig = pluginConfig; + this.metrics = metrics; + LOG.debug("Created DMaaP MR Receiver instance with plugin Config: {}", pluginConfig); + } + + @Override + public void onStart() { + + // create DMaaP MR Subscriber + final DMaaPMRSubscriber subscriber = + DMaaPMRFactory.create().createSubscriber(DMaaPSourceConfigMapper.map(pluginConfig)); + + // Start a new thread with indefinite loop until receiver is stopped + new Thread() { + @Override + public void run() { + while (!isStopped()) { + storeStructuredRecords(subscriber); + try { + final Integer pollingInterval = pluginConfig.getPollingInterval(); + LOG.debug("DMaaP MR Receiver sleeping for polling interval: {}", pollingInterval); + TimeUnit.MILLISECONDS.sleep(pollingInterval); + } catch (InterruptedException e) { + final String errorMessage = String.format( + "Interrupted Exception while DMaaP MR Receiver sleeping polling interval: %s", e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + } + }.start(); + + } + + @Override + public void onStop() { + LOG.debug("Stopping DMaaP MR Receiver with plugin config: {}", pluginConfig); + } + + /** + * Fetches records from DMaaP MR Subscriber and store them as structured records + * + * @param subscriber DMaaP MR Subscriber Instance + */ + public void storeStructuredRecords(final DMaaPMRSubscriber subscriber) { + + LOG.debug("DMaaP MR Receiver start fetching messages from DMaaP MR Topic"); + + // Fetch messages from DMaaP MR Topic + final Optional> subscriberMessagesOptional = + DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); + + // store records + if (subscriberMessagesOptional.isPresent()) { + final List messages = subscriberMessagesOptional.get(); + for (final String message : messages) { + store(CDAPPluginUtils.createDMaaPMRResponseStructuredRecord(message)); + } + LOG.debug("Stored DMaaP Subscriber messages as Structured Records. Message count {}", messages.size()); + } + } + +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java new file mode 100644 index 0000000..b85f653 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java @@ -0,0 +1,70 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Name; +import co.cask.cdap.api.annotation.Plugin; +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.streaming.StreamingContext; +import co.cask.cdap.etl.api.streaming.StreamingSource; +import org.apache.spark.storage.StorageLevel; +import org.apache.spark.streaming.api.java.JavaDStream; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap.DMaaPSourceOutputSchema; +import org.onap.dcae.apod.analytics.cdap.plugins.validator.DMaaPMRSourcePluginConfigValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * DMaaP MR Source Plugin which polls DMaaP MR topic at frequent intervals + *

+ * @author Rajiv Singla . Creation Date: 1/18/2017. + */ +@Plugin(type = StreamingSource.PLUGIN_TYPE) +@Name("DMaaPMRSource") +@Description("Fetches DMaaP MR Messages at regular intervals") +public class DMaaPMRSource extends StreamingSource { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSource.class); + private static final long serialVersionUID = 1L; + + private final DMaaPMRSourcePluginConfig pluginConfig; + + public DMaaPMRSource(final DMaaPMRSourcePluginConfig pluginConfig) { + LOG.debug("Creating DMaaP MR Source plugin with plugin Config: {}", pluginConfig); + this.pluginConfig = pluginConfig; + } + + @Override + public void configurePipeline(PipelineConfigurer pipelineConfigurer) { + ValidationUtils.validateSettings(pluginConfig, new DMaaPMRSourcePluginConfigValidator()); + pipelineConfigurer.getStageConfigurer().setOutputSchema(DMaaPSourceOutputSchema.getSchema()); + } + + @Override + public JavaDStream getStream(final StreamingContext streamingContext) throws Exception { + return streamingContext.getSparkStreamingContext().receiverStream( + new DMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), pluginConfig, streamingContext.getMetrics())); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java new file mode 100644 index 0000000..f4f781a --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java @@ -0,0 +1,132 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.data.format.StructuredRecord; +import com.fasterxml.jackson.core.type.TypeReference; +import org.apache.spark.storage.StorageLevel; +import org.apache.spark.streaming.receiver.Receiver; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.DMaaPSourceConfigMapper; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static org.onap.dcae.apod.analytics.model.util.AnalyticsModelJsonUtils.readValue; +import static org.onap.dcae.apod.analytics.model.util.AnalyticsModelJsonUtils.writeValueAsString; + +/** + * DMaaP MR Receiver which calls DMaaP MR Topic and stores structured records + *

+ * @author Rajiv Singla . Creation Date: 1/19/2017. + */ +public class MockDMaaPMRReceiver extends Receiver { + + private static final Logger LOG = LoggerFactory.getLogger(MockDMaaPMRReceiver.class); + private static final long serialVersionUID = 1L; + + private static final String MOCK_MESSAGE_FILE_LOCATION = "ves_mock_messages.json"; + private static final TypeReference> EVENT_LISTENER_TYPE_REFERENCE = + new TypeReference>() { + }; + + private final DMaaPMRSourcePluginConfig pluginConfig; + + public MockDMaaPMRReceiver(final StorageLevel storageLevel, final DMaaPMRSourcePluginConfig pluginConfig) { + super(storageLevel); + this.pluginConfig = pluginConfig; + LOG.debug("Created DMaaP MR Receiver instance with plugin Config: {}", pluginConfig); + } + + @Override + public void onStart() { + + // create DMaaP MR Subscriber + final DMaaPMRSubscriber subscriber = + DMaaPMRFactory.create().createSubscriber(DMaaPSourceConfigMapper.map(pluginConfig)); + storeStructuredRecords(subscriber); + + } + + @Override + public void onStop() { + LOG.debug("Stopping DMaaP MR Receiver with plugin config: {}", pluginConfig); + } + + /** + * Fetches records from DMaaP MR Subscriber and store them as structured records + * + * @param subscriber DMaaP MR Subscriber Instance + */ + public void storeStructuredRecords(final DMaaPMRSubscriber subscriber) { + + LOG.debug("DMaaP MR Receiver start fetching messages from DMaaP MR Topic"); + + try (InputStream resourceAsStream = + Thread.currentThread().getContextClassLoader().getResourceAsStream(MOCK_MESSAGE_FILE_LOCATION)) { + + if (resourceAsStream == null) { + LOG.error("Unable to find file at location: {}", MOCK_MESSAGE_FILE_LOCATION); + throw new DCAEAnalyticsRuntimeException("Unable to find file", LOG, new FileNotFoundException()); + } + + List eventListeners = readValue(resourceAsStream, EVENT_LISTENER_TYPE_REFERENCE); + + final int totalMessageCount = eventListeners.size(); + LOG.debug("Mock message count to be written to cdap stream: ()", totalMessageCount); + + int i = 1; + for (EventListener eventListener : eventListeners) { + if (isStopped()) { + return; + } + final String eventListenerString = writeValueAsString(eventListener); + LOG.debug("=======>> Writing message to cdap stream no: {} of {}", i, totalMessageCount); + store(CDAPPluginUtils.createDMaaPMRResponseStructuredRecord(eventListenerString)); + i++; + try { + TimeUnit.MILLISECONDS.sleep(pluginConfig.getPollingInterval()); + } catch (InterruptedException e) { + LOG.error("Error while sleeping"); + throw new DCAEAnalyticsRuntimeException("Error while sleeping", LOG, e); + } + + } + + LOG.debug("Finished writing mock messages to CDAP Stream"); + + } catch (IOException e) { + LOG.error("Error while parsing json file"); + throw new DCAEAnalyticsRuntimeException("Error while parsing mock json file", LOG, e); + } + } + +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java new file mode 100644 index 0000000..53b63e0 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java @@ -0,0 +1,73 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Name; +import co.cask.cdap.api.annotation.Plugin; +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.streaming.StreamingContext; +import co.cask.cdap.etl.api.streaming.StreamingSource; +import org.apache.spark.storage.StorageLevel; +import org.apache.spark.streaming.api.java.JavaDStream; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A mock implementation of DMaaP MR Receiver which sends mock ves messages + *

+ * @author Rajiv Singla . Creation Date: 2/15/2017. + */ +@Plugin(type = StreamingSource.PLUGIN_TYPE) +@Name("MockDMaaPMRSource") +@Description("Fetches DMaaP MR Messages at regular intervals") +public class MockDMaaPMRSource extends StreamingSource { + + private static final Logger LOG = LoggerFactory.getLogger(MockDMaaPMRSource.class); + private static final long serialVersionUID = 1L; + + private final DMaaPMRSourcePluginConfig pluginConfig; + + public MockDMaaPMRSource(final DMaaPMRSourcePluginConfig pluginConfig) { + LOG.debug("Creating DMaaP MR Source plugin with plugin Config: {}", pluginConfig); + this.pluginConfig = pluginConfig; + } + + @Override + public void configurePipeline(PipelineConfigurer pipelineConfigurer) { + final Integer pollingInterval = pluginConfig.getPollingInterval(); + if (pollingInterval == null) { + final String errorMessage = "Polling Interval field must be present"; + throw new CDAPSettingsException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); + } else { + LOG.info("Mock Message will be send every ms: {}", pollingInterval); + } + } + + @Override + public JavaDStream getStream(final StreamingContext streamingContext) throws Exception { + return streamingContext.getSparkStreamingContext().receiverStream( + new MockDMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), pluginConfig)); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java new file mode 100644 index 0000000..49c1ca4 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java @@ -0,0 +1,134 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.transform.filter; + +import co.cask.cdap.api.annotation.Description; +import co.cask.cdap.api.annotation.Name; +import co.cask.cdap.api.annotation.Plugin; +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.Emitter; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.Transform; +import co.cask.cdap.etl.api.TransformContext; +import com.google.common.base.Splitter; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter.JsonPathFilterPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.validator.JsonPathFilterPluginConfigValidator; +import org.onap.dcae.apod.analytics.common.service.filter.JsonMessageFilterProcessorContext; +import org.onap.dcae.apod.analytics.common.utils.MessageProcessorUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; +import java.util.Set; + +/** + * Json Path filter Plugin filters incoming schema field based of given json path expected values + *

+ * @author Rajiv Singla . Creation Date: 3/2/2017. + */ + +@Plugin(type = Transform.PLUGIN_TYPE) +@Name("JsonPathFilter") +@Description("Filters incoming schema field based of given json path expected values") +public class JsonPathFilter extends Transform { + + private static final Logger LOG = LoggerFactory.getLogger(JsonPathFilter.class); + + private final JsonPathFilterPluginConfig pluginConfig; + private final Map> jsonFilterPathMappings; + + public JsonPathFilter(final JsonPathFilterPluginConfig pluginConfig) { + this.pluginConfig = pluginConfig; + jsonFilterPathMappings = Maps.newHashMap(); + LOG.info("Created instance of Json Path Filter Plugin with plugin config: {}", pluginConfig); + } + + + @Override + public void initialize(final TransformContext context) throws Exception { + super.initialize(context); + populateJsonFilterMapping(); + } + + @Override + public void configurePipeline(final PipelineConfigurer pipelineConfigurer) { + super.configurePipeline(pipelineConfigurer); + ValidationUtils.validateSettings(pluginConfig, new JsonPathFilterPluginConfigValidator()); + final Schema inputSchema = pipelineConfigurer.getStageConfigurer().getInputSchema(); + CDAPPluginUtils.validateSchemaContainsFields(inputSchema, pluginConfig.getIncomingJsonFieldName()); + populateJsonFilterMapping(); + CDAPPluginUtils.setOutputSchema(pipelineConfigurer, pluginConfig.getSchema()); + } + + @Override + public void transform(final StructuredRecord inputStructuredRecord, final Emitter emitter) + throws Exception { + + // get input json message + final String jsonMessage = inputStructuredRecord.get(pluginConfig.getIncomingJsonFieldName()); + + // process Json Filter Mappings + final JsonMessageFilterProcessorContext jsonMessageFilterProcessorContext = + MessageProcessorUtils.processJsonFilterMappings(jsonMessage, jsonFilterPathMappings); + + // create new output record builder and copy any input Structured record values to output record builder + final Schema outputSchema = Schema.parseJson(pluginConfig.getSchema()); + final StructuredRecord.Builder outputRecordBuilder = + CDAPPluginUtils.createOutputStructuredRecordBuilder(outputSchema, inputStructuredRecord); + + // add json filter matched field + final StructuredRecord.Builder outputRecordBuilderWithMatchedField = + CDAPPluginUtils.addFieldValueToStructuredRecordBuilder(outputRecordBuilder, + outputSchema, pluginConfig.getOutputSchemaFieldName(), + jsonMessageFilterProcessorContext.getMatched()); + + // emit structured record with filtering matched field + final StructuredRecord outputStructuredRecord = outputRecordBuilderWithMatchedField.build(); + + LOG.debug("Incoming Json Message: {}.Json Path Filter Output Matched Field: {}", jsonMessage, + outputStructuredRecord.get(pluginConfig.getOutputSchemaFieldName())); + + emitter.emit(outputStructuredRecord); + + } + + /** + * Populates Json Filter Mapping + */ + private void populateJsonFilterMapping() { + final Map fieldMappings = + CDAPPluginUtils.extractFieldMappings(pluginConfig.getJsonFilterMappings()); + if (fieldMappings.isEmpty()) { + throw new IllegalArgumentException("No Field Mapping found. Invalid Filter mapping configuration"); + } + final Splitter semiColonSplitter = Splitter.on(";"); + for (Map.Entry fieldMappingEntry : fieldMappings.entrySet()) { + jsonFilterPathMappings.put(fieldMappingEntry.getKey(), + Sets.newLinkedHashSet(semiColonSplitter.split(fieldMappingEntry.getValue()))); + } + LOG.info("Input Json Filter Mappings: {}", jsonFilterPathMappings); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java new file mode 100644 index 0000000..5f622cd --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java @@ -0,0 +1,295 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.utils; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.PipelineConfigurer; +import com.google.common.base.Function; +import com.google.common.base.Splitter; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.apache.commons.lang3.StringUtils; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap.DMaaPSourceOutputSchema; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.model.util.AnalyticsModelJsonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +/** + * @author Rajiv Singla . Creation Date: 1/26/2017. + */ +public abstract class CDAPPluginUtils extends AnalyticsModelJsonUtils { + + private static final Logger LOG = LoggerFactory.getLogger(CDAPPluginUtils.class); + + public static final Function SCHEMA_TO_TYPE_FUNCTION = new Function() { + @Override + public Schema.Type apply(@Nonnull Schema schema) { + return schema.getType(); + } + }; + + + + private CDAPPluginUtils() { + // private constructor + } + + /** + * Validates if CDAP Schema contains expected fields + * + * @param schema schema that need to be validated + * @param expectedFields fields that are expected to be in the schema + */ + + public static void validateSchemaContainsFields(@Nullable final Schema schema, final String... expectedFields) { + + LOG.debug("Validating schema:{} contains expected fields:{}", schema, Arrays.toString(expectedFields)); + + if (schema == null) { + // If input schema is null then no validation possible + LOG.warn("Input Schema is null. No validation possible"); + } else { + // Check if expected fields are indeed present in the schema + for (String expectedField : expectedFields) { + final Schema.Field schemaField = schema.getField(expectedField); + if (schemaField == null) { + final String errorMessage = String.format( + "Unable to find expected field: %s, in schema: %s", expectedField, schema); + throw new CDAPSettingsException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); + } + } + LOG.debug("Successfully validated schema:{}, contains expected fields:{}", schema, + Arrays.toString(expectedFields)); + } + } + + + /** + * Creates a new Structured Record containing DMaaP MR fetched message + * + * @param message DMaaP MR fetch message + * + * @return Structured record containing DMaaP MR Message + */ + public static StructuredRecord createDMaaPMRResponseStructuredRecord(final String message) { + StructuredRecord.Builder recordBuilder = StructuredRecord.builder(DMaaPSourceOutputSchema.getSchema()); + recordBuilder + .set(DMaaPSourceOutputSchema.TIMESTAMP.getSchemaColumnName(), System.nanoTime()) + .set(DMaaPSourceOutputSchema.RESPONSE_CODE.getSchemaColumnName(), 200) + .set(DMaaPSourceOutputSchema.RESPONSE_MESSAGE.getSchemaColumnName(), "OK") + .set(DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName(), message); + return recordBuilder.build(); + } + + + /** + * Creates output StructuredRecord Builder which has copied values from input StructuredRecord + * + * @param outputSchema output Schema + * @param inputStructuredRecord input Structured Record + * + * @return output Structured Record builder with pre populated values from input structured record + */ + public static StructuredRecord.Builder createOutputStructuredRecordBuilder( + @Nonnull final Schema outputSchema, + @Nonnull final StructuredRecord inputStructuredRecord) { + + // Get input structured Record Schema + final Schema inputSchema = inputStructuredRecord.getSchema(); + // Create new instance of output Structured Record Builder from output Schema + final StructuredRecord.Builder outputStructuredRecordBuilder = StructuredRecord.builder(outputSchema); + + // iterate over input fields and if output schema has field with same name copy the value to out record builder + for (Schema.Field inputField : inputSchema.getFields()) { + final String inputFieldName = inputField.getName(); + if (outputSchema.getField(inputFieldName) != null) { + outputStructuredRecordBuilder.set(inputFieldName, inputStructuredRecord.get(inputFieldName)); + } + } + + return outputStructuredRecordBuilder; + } + + + /** + * Adds Field value to StructuredRecord Builder if schema contains that field Name + * + * @param structuredRecordBuilder structured record builder + * @param structuredRecordSchema schema for structured record builder + * @param fieldName field name + * @param fieldValue field value + * + * @return structured record builder with populated field name and value if schema contains field name + */ + public static StructuredRecord.Builder addFieldValueToStructuredRecordBuilder( + @Nonnull final StructuredRecord.Builder structuredRecordBuilder, + @Nonnull final Schema structuredRecordSchema, + @Nonnull final String fieldName, + final Object fieldValue) { + + // check if schema contains field Name + if (structuredRecordSchema.getField(fieldName) != null) { + structuredRecordBuilder.set(fieldName, fieldValue); + } else { + LOG.info("Unable to populate value for field Name: {} with field value: {}. " + + "Schema Fields: {} does not contain field name: {}", + fieldName, fieldValue, structuredRecordSchema.getFields(), fieldName); + } + + return structuredRecordBuilder; + } + + + /** + * Validates that given schema String has fieldName of expected type. If field does not exist in given schema + * then validation will pass with warning. If field does exist in given schema then this validation will return + * true if field type is same as expected type else false + * + * @param schemaString CDAP Plugin output or input schema string + * @param fieldName field name + * @param expectedFieldType expected schema field type + * + * @return true if field type matches expected field type else false. If field does not exist in + * give schema validation will pass but will generate a warning message + */ + public static boolean validateSchemaFieldType(@Nonnull final String schemaString, + @Nonnull final String fieldName, + @Nonnull final Schema.Type expectedFieldType) { + + try { + // parse given schema String + final Schema outputSchema = Schema.parseJson(schemaString); + final Schema.Field schemaField = outputSchema.getField(fieldName); + + // if given schema does contain field then validated fieldName type + if (schemaField != null) { + + final List schemas = new LinkedList<>(); + + // if it is a union type then grab all union schemas + if (outputSchema.getField(fieldName).getSchema().getType() == Schema.Type.UNION) { + final List unionFieldSchemas = + outputSchema.getField(fieldName).getSchema().getUnionSchemas(); + schemas.addAll(unionFieldSchemas); + } else { + // if not union type the just get the field schema + final Schema fieldSchema = outputSchema.getField(fieldName).getSchema(); + schemas.add(fieldSchema); + } + + // get all schema types + final List fieldTypes = + Lists.transform(schemas, CDAPPluginUtils.SCHEMA_TO_TYPE_FUNCTION); + + // if all schema types does not contain expected field type then return false + if (!fieldTypes.contains(expectedFieldType)) { + LOG.error("Validation failed for fieldName: {} is NOT of expected Type: {} in schema: {}", + fieldName, expectedFieldType, outputSchema); + return false; + } + + // field type validation passed + LOG.debug("Successfully validated fieldName: {} is of expected Type: {}", + fieldName, expectedFieldType); + + return true; + + } else { + + // if field does not exist then the validation will pass but will generate warning message + LOG.warn("Validation of field type not possible. Field name: {} does not exist in schema: {}", + fieldName, outputSchema); + return true; + } + + } catch (IOException e) { + final String errorMessage = + String.format("Unable to parse schema: %s for field type validation. " + + "Field Name: %s, Expected Field Type: %s Exception: %s", + schemaString, fieldName, expectedFieldType, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + } + + + /** + * Parses provided schema String as Schema object and set it as output Schema format + * + * @param pipelineConfigurer plugin pipeline configurer + * @param schemaString schema String to be set as output schema + */ + public static void setOutputSchema(final PipelineConfigurer pipelineConfigurer, final String schemaString) { + try { + final Schema outputSchema = Schema.parseJson(schemaString); + pipelineConfigurer.getStageConfigurer().setOutputSchema(outputSchema); + } catch (IOException e) { + final String errorMessage = String.format( + "Schema specified is not a valid JSON. Schema String: %s, Exception: %s", schemaString, e); + throw new CDAPSettingsException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); + } + } + + + /** + * Parses incoming plugin config mapping to key value map. If any of the key value map is blank an Illegal Argument + * exception will be thrown + * + * @param mappingFieldString field Mapping String + * + * @return map containing mapping key values + */ + public static Map extractFieldMappings(final String mappingFieldString) { + final Map fieldMappings = Maps.newHashMap(); + if (StringUtils.isNotBlank(mappingFieldString)) { + final Splitter commaSplitter = Splitter.on(","); + for (String fieldMapping : commaSplitter.split(mappingFieldString)) { + final String[] keyValueMappings = fieldMapping.split(":"); + if (keyValueMappings.length != 2 || + StringUtils.isBlank(keyValueMappings[0]) || + StringUtils.isBlank(keyValueMappings[1])) { + final String errorMessage = "Field Mapping key or value is Blank. All field mappings must " + + "be present in mappings: " + mappingFieldString; + throw new DCAEAnalyticsRuntimeException( + errorMessage, LOG, new IllegalArgumentException(errorMessage)); + } + fieldMappings.put(keyValueMappings[0].trim(), keyValueMappings[1].trim()); + } + } + return fieldMappings; + } + + + + +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java new file mode 100644 index 0000000..d5aa2c0 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java @@ -0,0 +1,112 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.utils; + +import com.google.common.base.Function; +import org.apache.hadoop.conf.Configuration; +import org.onap.dcae.apod.analytics.cdap.common.CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; + +import javax.annotation.Nonnull; + +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; + +/** + * Function that converts {@link Configuration} to {@link DMaaPMRPublisherConfig} + *

+ * @author Rajiv Singla . Creation Date: 1/26/2017. + */ +public class DMaaPSinkConfigMapper implements Function { + + /** + * Static method to map {@link Configuration} to {@link DMaaPMRPublisherConfig} + * + * @param sinkPluginConfig DMaaP Sink Plugin Config + * + * @return DMaaP MR Publisher Config + */ + public static DMaaPMRPublisherConfig map(final Configuration sinkPluginConfig) { + return new DMaaPSinkConfigMapper().apply(sinkPluginConfig); + } + + /** + * Converts {@link Configuration} to {@link DMaaPMRPublisherConfig} + * + * @param configuration Hadoop Configuration containing DMaaP MR Sink field values + * + * @return DMaaP MR Publisher Config + */ + @Nonnull + @Override + public DMaaPMRPublisherConfig apply(@Nonnull Configuration configuration) { + + // Create a new publisher settings builder + final String hostName = configuration.get(DMaaPMRSinkHadoopConfigFields.HOST_NAME); + final String topicName = configuration.get(DMaaPMRSinkHadoopConfigFields.TOPIC_NAME); + + if (isEmpty(hostName) || isEmpty(topicName)) { + throw new IllegalStateException("DMaaP MR Sink Host Name and Topic Name must be present"); + } + + final DMaaPMRPublisherConfig.Builder publisherConfigBuilder = + new DMaaPMRPublisherConfig.Builder(hostName, topicName); + + // Setup up any optional publisher parameters if they are present + final String portNumber = configuration.get(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER); + if (portNumber != null) { + publisherConfigBuilder.setPortNumber(Integer.parseInt(portNumber)); + } + + final String protocol = configuration.get(DMaaPMRSinkHadoopConfigFields.PROTOCOL); + if (isPresent(protocol)) { + publisherConfigBuilder.setProtocol(protocol); + } + + final String userName = configuration.get(DMaaPMRSinkHadoopConfigFields.USER_NAME); + if (isPresent(userName)) { + publisherConfigBuilder.setUserName(userName); + } + + final String userPassword = configuration.get(DMaaPMRSinkHadoopConfigFields.USER_PASS); + if (isPresent(userPassword)) { + publisherConfigBuilder.setUserPassword(userPassword); + } + + final String contentType = configuration.get(DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE); + if (isPresent(contentType)) { + publisherConfigBuilder.setContentType(contentType); + } + + final String maxBatchSize = configuration.get(DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE); + if (maxBatchSize != null) { + publisherConfigBuilder.setMaxBatchSize(Integer.parseInt(maxBatchSize)); + } + + final String maxRecoveryQueueSize = configuration.get(DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE); + if (maxRecoveryQueueSize != null) { + publisherConfigBuilder.setMaxRecoveryQueueSize(Integer.parseInt(maxRecoveryQueueSize)); + } + + return publisherConfigBuilder.build(); + + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java new file mode 100644 index 0000000..c492b2d --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java @@ -0,0 +1,118 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.utils; + +import com.google.common.base.Function; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; + +import javax.annotation.Nonnull; + +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; + +/** + * Function that converts {@link DMaaPMRSourcePluginConfig} to {@link DMaaPMRSubscriberConfig} + *

+ * @author Rajiv Singla . Creation Date: 1/18/2017. + */ +public class DMaaPSourceConfigMapper implements Function { + + /** + * Static factory method to map {@link DMaaPMRSourcePluginConfig} to {@link DMaaPMRSubscriberConfig} + * + * @param pluginConfig DMaaP MR Souce Plugin Config + * + * @return DMaaP MR Subscriber Config + */ + public static DMaaPMRSubscriberConfig map(final DMaaPMRSourcePluginConfig pluginConfig) { + return new DMaaPSourceConfigMapper().apply(pluginConfig); + } + + /** + * Converts {@link DMaaPMRSourcePluginConfig} to {@link DMaaPMRSubscriberConfig} object + * + * @param sourcePluginConfig DMaaP MR Source Plugin Config + * + * @return DMaaP MR Subscriber Config + */ + @Nonnull + @Override + public DMaaPMRSubscriberConfig apply(@Nonnull DMaaPMRSourcePluginConfig sourcePluginConfig) { + + // Create a new subscriber settings builder + final String hostName = sourcePluginConfig.getHostName(); + final String topicName = sourcePluginConfig.getTopicName(); + if (isEmpty(hostName) || isEmpty(topicName)) { + throw new IllegalStateException("DMaaP MR Source Host Name and Topic Name must be present"); + } + final DMaaPMRSubscriberConfig.Builder subscriberConfigBuilder = new DMaaPMRSubscriberConfig.Builder( + hostName, topicName); + + // Setup up any optional subscriber parameters if they are present + final Integer subscriberHostPortNumber = sourcePluginConfig.getPortNumber(); + if (subscriberHostPortNumber != null) { + subscriberConfigBuilder.setPortNumber(subscriberHostPortNumber); + } + + final String subscriberProtocol = sourcePluginConfig.getProtocol(); + if (isPresent(subscriberProtocol)) { + subscriberConfigBuilder.setProtocol(subscriberProtocol); + } + + final String subscriberUserName = sourcePluginConfig.getUserName(); + if (isPresent(subscriberUserName)) { + subscriberConfigBuilder.setUserName(subscriberUserName); + } + + final String subscriberUserPassword = sourcePluginConfig.getUserPassword(); + if (isPresent(subscriberUserPassword)) { + subscriberConfigBuilder.setUserPassword(subscriberUserPassword); + } + + final String subscriberContentType = sourcePluginConfig.getContentType(); + if (isPresent(subscriberContentType)) { + subscriberConfigBuilder.setContentType(subscriberContentType); + } + + final String subscriberConsumerId = sourcePluginConfig.getConsumerId(); + if (isPresent(subscriberConsumerId)) { + subscriberConfigBuilder.setConsumerId(subscriberConsumerId); + } + + final String subscriberConsumerGroup = sourcePluginConfig.getConsumerGroup(); + if (isPresent(subscriberConsumerGroup)) { + subscriberConfigBuilder.setConsumerGroup(subscriberConsumerGroup); + } + + final Integer subscriberTimeoutMS = sourcePluginConfig.getTimeoutMS(); + if (subscriberTimeoutMS != null) { + subscriberConfigBuilder.setTimeoutMS(subscriberTimeoutMS); + } + final Integer subscriberMessageLimit = sourcePluginConfig.getMessageLimit(); + if (subscriberMessageLimit != null) { + subscriberConfigBuilder.setMessageLimit(subscriberMessageLimit); + } + + // return Subscriber config + return subscriberConfigBuilder.build(); + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java new file mode 100644 index 0000000..8ebc8e6 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java @@ -0,0 +1,72 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.BaseDMaaPMRPluginConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +/** + * Validates plugin config values which are common in DMaaP MR Configs - {@link BaseDMaaPMRPluginConfig} + *

+ * @author Rajiv Singla . Creation Date: 1/23/2017. + * + * @param {@link BaseDMaaPMRPluginConfig} Sub classes + */ +public abstract class BaseDMaaPMRPluginConfigValidator implements + CDAPAppSettingsValidator> { + + private static final long serialVersionUID = 1L; + + /** + * Validates the {@link BaseDMaaPMRPluginConfig} parameters + * + * @param baseDMaaPMRPluginConfig DMaaP MR Plugin Config + * + * @return Validation Response containing validation errors if any + */ + @Override + public GenericValidationResponse validateAppSettings(final T baseDMaaPMRPluginConfig) { + + final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); + + if (ValidationUtils.isEmpty(baseDMaaPMRPluginConfig.getHostName())) { + validationResponse.addErrorMessage( + "hostName", + "DMaaPMRPluginConfig - hostname field is undefined: " + baseDMaaPMRPluginConfig); + } + + if (baseDMaaPMRPluginConfig.getPortNumber() == null) { + validationResponse.addErrorMessage( + "port Number", + "DMaaPMRPluginConfig - host port number field is undefined: " + baseDMaaPMRPluginConfig); + } + + if (ValidationUtils.isEmpty(baseDMaaPMRPluginConfig.getTopicName())) { + validationResponse.addErrorMessage( + "topic Name", + "DMaaPMRSourcePluginConfig - topic name field is undefined: " + baseDMaaPMRPluginConfig); + } + + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java new file mode 100644 index 0000000..ab9dd30 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java @@ -0,0 +1,58 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +/** + * Validates plugin config values in {@link DMaaPMRSinkPluginConfig} + *

+ * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMRSinkPluginConfigValidator extends BaseDMaaPMRPluginConfigValidator { + + private static final long serialVersionUID = 1L; + + /** + * Validates plugin config values in {@link DMaaPMRSinkPluginConfig} + * + * @param sinkPluginConfig Sink Plugin Config + * + * @return Validation response containing validation errors if any + */ + @Override + public GenericValidationResponse validateAppSettings( + final DMaaPMRSinkPluginConfig sinkPluginConfig) { + + // validate settings in BaseDMaaPMRPluginConfig + final GenericValidationResponse validationResponse = + super.validateAppSettings(sinkPluginConfig); + + if (ValidationUtils.isEmpty(sinkPluginConfig.getMessageColumnName())) { + validationResponse.addErrorMessage("messageColumn Name", + "DMaaPMRSinkPluginConfig - message column name field is undefined: " + sinkPluginConfig); + } + + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java new file mode 100644 index 0000000..d57cf67 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java @@ -0,0 +1,58 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +/** + * Validates plugin config values in {@link DMaaPMRSourcePluginConfig} + *

+ * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMRSourcePluginConfigValidator extends BaseDMaaPMRPluginConfigValidator { + + private static final long serialVersionUID = 1L; + + /** + * Validates plugin config values in {@link DMaaPMRSourcePluginConfig} + * + * @param sourcePluginConfig Source Plugin Config + * + * @return Validation response containing validation errors if any + */ + @Override + public GenericValidationResponse validateAppSettings( + final DMaaPMRSourcePluginConfig sourcePluginConfig) { + + // validate settings in BaseDMaaPMRPluginConfig + final GenericValidationResponse validationResponse = + super.validateAppSettings(sourcePluginConfig); + + if (sourcePluginConfig.getPollingInterval() == null) { + validationResponse.addErrorMessage( + "port Number", + "DMaaPMRSourcePluginConfig - polling interval is undefined: " + sourcePluginConfig); + } + + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java new file mode 100644 index 0000000..e41fec6 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java @@ -0,0 +1,83 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import co.cask.cdap.api.data.schema.Schema; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter.JsonPathFilterPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +/** + * Validator to validate {@link JsonPathFilterPluginConfig} + *

+ * @author Rajiv Singla . Creation Date: 3/2/2017. + */ +public class JsonPathFilterPluginConfigValidator implements CDAPAppSettingsValidator> { + + private static final long serialVersionUID = 1L; + + @Override + public GenericValidationResponse validateAppSettings( + final JsonPathFilterPluginConfig jsonPathFilterPluginConfig) { + + final GenericValidationResponse validationResponse = + new GenericValidationResponse<>(); + + final String jsonFilterMappings = jsonPathFilterPluginConfig.getJsonFilterMappings(); + if (ValidationUtils.isEmpty(jsonFilterMappings)) { + + validationResponse.addErrorMessage("JsonFilterMappings", "Json Filter Mappings must be present"); + } + + + final String matchedField = jsonPathFilterPluginConfig.getOutputSchemaFieldName(); + final String outputSchemaJson = jsonPathFilterPluginConfig.getSchema(); + + if (ValidationUtils.isEmpty(outputSchemaJson)) { + + validationResponse.addErrorMessage("output schema", "Output schema is not present"); + + } else { + + // validate matched output field type is boolean + if (matchedField != null && + !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, matchedField, Schema.Type.BOOLEAN)) { + validationResponse.addErrorMessage("OutputSchemaFieldName", + String.format( + "OutputSchemaFieldName: %s must be marked as boolean type", matchedField)); + } + + // validate matched output field type is nullable + if (matchedField != null && + !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, matchedField, Schema.Type.NULL)) { + validationResponse.addErrorMessage("OutputSchemaFieldName", + String.format( + "OutputSchemaFieldName: %s must be marked as nullable type", matchedField)); + } + + } + + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java new file mode 100644 index 0000000..425aab6 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/main/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java @@ -0,0 +1,91 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import co.cask.cdap.api.data.schema.Schema; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +/** + * Validator that validate {@link SimpleTCAPluginConfig} + *

+ * @author Rajiv Singla . Creation Date: 2/21/2017. + */ +public class SimpleTCAPluginConfigValidator implements CDAPAppSettingsValidator> { + + private static final long serialVersionUID = 1L; + + @Override + public GenericValidationResponse validateAppSettings( + final SimpleTCAPluginConfig tcaPluginConfig) { + + final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); + + if (ValidationUtils.isEmpty(tcaPluginConfig.getVesMessageFieldName())) { + validationResponse.addErrorMessage("vesMessageFieldName", + "Missing VES Message Field Name from plugin incoming schema"); + } + + if (ValidationUtils.isEmpty(tcaPluginConfig.getPolicyJson())) { + validationResponse.addErrorMessage("policyJson", + "Missing tca Policy Json"); + } + + final String alertFieldValue = tcaPluginConfig.getAlertFieldName(); + final String alertFieldName = "alertFieldName"; + if (ValidationUtils.isEmpty(alertFieldValue)) { + validationResponse.addErrorMessage(alertFieldName, + "Missing alert Field Name that will be placed in plugin outgoing schema"); + } + + if (ValidationUtils.isEmpty(tcaPluginConfig.getMessageTypeFieldName())) { + validationResponse.addErrorMessage("messageTypeField", + "Missing message Type Field Name that will be placed in plugin outgoing schema"); + } + + + final String outputSchemaJson = tcaPluginConfig.getSchema(); + if (ValidationUtils.isEmpty(outputSchemaJson)) { + validationResponse.addErrorMessage("output schema", "Output schema is not present"); + } else { + // validate output schema - alert field name is of type string + if (alertFieldValue != null && + !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, alertFieldValue, Schema.Type.STRING)) { + validationResponse.addErrorMessage(alertFieldName, + String.format( + "Alert Field Name: %s must be String type", alertFieldValue)); + } + // validate output schema - alert field name is nullable + if (alertFieldValue != null && + !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, alertFieldValue, Schema.Type.NULL)) { + validationResponse.addErrorMessage(alertFieldName, + String.format( + "Alert Field Name: %s must be marked as nullable type", alertFieldValue)); + } + } + + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java deleted file mode 100644 index fdb7975..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormat.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.io.NullWritable; -import org.apache.hadoop.mapreduce.JobContext; -import org.apache.hadoop.mapreduce.OutputCommitter; -import org.apache.hadoop.mapreduce.OutputFormat; -import org.apache.hadoop.mapreduce.RecordWriter; -import org.apache.hadoop.mapreduce.TaskAttemptContext; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.DMaaPSinkConfigMapper; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; - -import java.io.IOException; - -/** - * DMaaP MR Output format used by DMaaP MR Sink Plugin to create a MR Publisher and pass to custom {@link - * DMaaPMRRecordWriter} - *

- * @author Rajiv Singla . Creation Date: 1/27/2017. - */ -public class DMaaPMROutputFormat extends OutputFormat { - - @Override - public RecordWriter getRecordWriter(TaskAttemptContext context) throws IOException, - InterruptedException { - final Configuration configuration = context.getConfiguration(); - final DMaaPMRPublisherConfig publisherConfig = DMaaPSinkConfigMapper.map(configuration); - final DMaaPMRPublisher publisher = DMaaPMRFactory.create().createPublisher(publisherConfig); - return new DMaaPMRRecordWriter(publisher); - } - - @Override - public void checkOutputSpecs(JobContext context) throws IOException, InterruptedException { - // do nothing - } - - @Override - public OutputCommitter getOutputCommitter(TaskAttemptContext context) throws IOException, InterruptedException { - return new NoOpOutputCommitter(); - } - - /** - * A dummy implementation for {@link OutputCommitter} that does nothing. - */ - protected static class NoOpOutputCommitter extends OutputCommitter { - - @Override - public void setupJob(JobContext jobContext) throws IOException { - // no op - } - - @Override - public void setupTask(TaskAttemptContext taskContext) throws IOException { - // no op - } - - @Override - public boolean needsTaskCommit(TaskAttemptContext taskContext) throws IOException { - return false; - } - - @Override - public void commitTask(TaskAttemptContext taskContext) throws IOException { - // no op - } - - @Override - public void abortTask(TaskAttemptContext taskContext) throws IOException { - // no op - } - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java deleted file mode 100644 index bec04b3..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProvider.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import co.cask.cdap.api.data.batch.OutputFormatProvider; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * DMaaP MR Output Format Provider used to create Batch Sink Plugin - *

- * @author Rajiv Singla . Creation Date: 1/27/2017. - */ -public class DMaaPMROutputFormatProvider implements OutputFormatProvider { - - private final Map sinkConfig; - - - public DMaaPMROutputFormatProvider(DMaaPMRSinkPluginConfig sinkPluginConfig) { - - // initialize Sink Config - with DMaaP MR Publisher config values - sinkConfig = new LinkedHashMap<>(); - - // Required fields for sink config - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.HOST_NAME, sinkPluginConfig.getHostName()); - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.TOPIC_NAME, sinkPluginConfig.getTopicName()); - - final Integer configPortNumber = sinkPluginConfig.getPortNumber(); - if (configPortNumber != null) { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER, configPortNumber.toString()); - } else { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER, - AnalyticsConstants.DEFAULT_PORT_NUMBER.toString()); - } - - final String configProtocol = sinkPluginConfig.getProtocol(); - if (ValidationUtils.isPresent(configProtocol)) { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PROTOCOL, configProtocol); - } else { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.PROTOCOL, AnalyticsConstants.DEFAULT_PROTOCOL); - } - - - final String configUserName = sinkPluginConfig.getUserName(); - if (ValidationUtils.isPresent(configUserName)) { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_NAME, configUserName); - } else { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_NAME, AnalyticsConstants.DEFAULT_USER_NAME); - } - - final String configUserPass = sinkPluginConfig.getUserPassword(); - if (ValidationUtils.isPresent(configUserPass)) { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_PASS, configUserPass); - } else { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.USER_PASS, AnalyticsConstants.DEFAULT_USER_PASSWORD); - } - - final String configContentType = sinkPluginConfig.getContentType(); - if (ValidationUtils.isPresent(configContentType)) { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE, configContentType); - } else { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE, AnalyticsConstants.DEFAULT_CONTENT_TYPE); - } - - - final Integer configMaxBatchSize = sinkPluginConfig.getMaxBatchSize(); - if (configMaxBatchSize != null) { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE, configMaxBatchSize.toString()); - } else { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE, - String.valueOf(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_BATCH_SIZE)); - } - - final Integer configMaxRecoveryQueueSize = sinkPluginConfig.getMaxRecoveryQueueSize(); - if (configMaxRecoveryQueueSize != null) { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE, configMaxRecoveryQueueSize.toString()); - } else { - sinkConfig.put(DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE, - String.valueOf(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE)); - } - - } - - @Override - public String getOutputFormatClassName() { - return DMaaPMROutputFormat.class.getName(); - } - - @Override - public Map getOutputFormatConfiguration() { - return sinkConfig; - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java deleted file mode 100644 index f9c99e2..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriter.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import org.apache.hadoop.io.NullWritable; -import org.apache.hadoop.mapreduce.RecordWriter; -import org.apache.hadoop.mapreduce.TaskAttemptContext; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Arrays; - -/** - * A simple implementation of {@link RecordWriter} which writes messages to DMaaP MR topic - *

- * @author Rajiv Singla . Creation Date: 1/27/2017. - */ -public class DMaaPMRRecordWriter extends RecordWriter { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRRecordWriter.class); - - private final DMaaPMRPublisher dMaaPMRPublisher; - - public DMaaPMRRecordWriter(DMaaPMRPublisher dMaaPMRPublisher) { - this.dMaaPMRPublisher = dMaaPMRPublisher; - } - - @Override - public void write(String message, NullWritable value) throws IOException, InterruptedException { - LOG.debug("Writing message to DMaaP MR Topic: {}", message); - dMaaPMRPublisher.publish(Arrays.asList(message)); - } - - @Override - public void close(TaskAttemptContext context) throws IOException, InterruptedException { - dMaaPMRPublisher.flush(); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java deleted file mode 100644 index b92ecba..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSink.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Name; -import co.cask.cdap.api.annotation.Plugin; -import co.cask.cdap.api.data.batch.Output; -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.api.dataset.lib.KeyValue; -import co.cask.cdap.etl.api.Emitter; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.batch.BatchSink; -import co.cask.cdap.etl.api.batch.BatchSinkContext; -import org.apache.hadoop.io.NullWritable; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.validator.DMaaPMRSinkPluginConfigValidator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Rajiv Singla . Creation Date: 1/26/2017. - */ -@Plugin(type = BatchSink.PLUGIN_TYPE) -@Name("DMaaPMRSink") -@Description("A batch sink Plugin that publishes messages to DMaaP MR Topic.") -public class DMaaPMRSink extends BatchSink { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSink.class); - - private final DMaaPMRSinkPluginConfig pluginConfig; - - public DMaaPMRSink(final DMaaPMRSinkPluginConfig pluginConfig) { - LOG.debug("Creating DMaaP MR Sink Plugin with plugin Config: {}", pluginConfig); - this.pluginConfig = pluginConfig; - } - - @Override - public void configurePipeline(final PipelineConfigurer pipelineConfigurer) { - super.configurePipeline(pipelineConfigurer); - ValidationUtils.validateSettings(pluginConfig, new DMaaPMRSinkPluginConfigValidator()); - // validates that input schema contains the field provided in Sink Message Column Name property - final Schema inputSchema = pipelineConfigurer.getStageConfigurer().getInputSchema(); - CDAPPluginUtils.validateSchemaContainsFields(inputSchema, pluginConfig.getMessageColumnName()); - } - - - @Override - public void prepareRun(BatchSinkContext context) throws Exception { - context.addOutput(Output.of(pluginConfig.getReferenceName(), new DMaaPMROutputFormatProvider(pluginConfig))); - } - - @Override - public void transform(StructuredRecord structuredRecord, - Emitter> emitter) throws Exception { - // get incoming message from structured record - final String incomingMessage = structuredRecord.get(pluginConfig.getMessageColumnName()); - - // if incoming messages does not have message column name log warning as it should not happen - if (incomingMessage == null) { - LOG.warn("Column Name: {}, contains no message.Skipped for DMaaP MR Publishing....", - pluginConfig.getMessageColumnName()); - } else { - - // emit the messages as key - emitter.emit(new KeyValue(incomingMessage, null)); - } - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java deleted file mode 100644 index e9afde9..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/common/PluginSchema.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.common; - -/** - * Contract interface for all DCAE Analytics Plugin Schemas - * - * @author Rajiv Singla . Creation Date: 1/25/2017. - */ -public interface PluginSchema { - - /** - * Provides column name that will be used in Schema Definition - * - * @return Column name that will be used in Schema Definition - */ - String getSchemaColumnName(); - -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java deleted file mode 100644 index b63375c..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/BaseDMaaPMRPluginConfig.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Macro; -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPBasePluginConfig; - -import javax.annotation.Nullable; - -/** - * Base class for all DMaaP MR Configs - *

- * @author Rajiv Singla . Creation Date: 1/17/2017. - */ -public abstract class BaseDMaaPMRPluginConfig extends CDAPBasePluginConfig { - - @Description("DMaaP Message Router HostName") - @Macro - protected String hostName; - - @Description("DMaaP Message Router Host Port number. Defaults to Port 80") - @Nullable - @Macro - protected Integer portNumber; - - @Description("DMaaP Message Router Topic Name") - @Macro - protected String topicName; - - @Description("DMaaP Message Router HTTP Protocol e.g. HTTP or HTTPS. Defaults to HTTPS") - @Nullable - @Macro - protected String protocol; - - @Description("DMaaP Message Router User Name used for AAF Authentication. Defaults to no authentication") - @Nullable - @Macro - protected String userName; - - @Description("DMaaP Message Router User Password used for AAF Authentication. Defaults to no authentication") - @Nullable - @Macro - protected String userPassword; - - @Description("DMaaP Message Router Content Type. Defaults to 'application/json'") - @Nullable - @Macro - protected String contentType; - - - public BaseDMaaPMRPluginConfig(final String referenceName, final String hostName, final String topicName) { - this.referenceName = referenceName; - this.hostName = hostName; - this.topicName = topicName; - } - - /** - * Host Name for DMaaP MR Publisher or Subscriber - * - * @return host name - */ - public String getHostName() { - return hostName; - } - - /** - * Port Number for DMaaP MR Publisher or Subscriber - * - * @return port number - */ - @Nullable - public Integer getPortNumber() { - return portNumber; - } - - /** - * DMaaP MR Topic Name for Subscriber or Publisher - * - * @return topic name - */ - public String getTopicName() { - return topicName; - } - - - /** - * DMaaP MR HTTP or HTTPS protocol - * - * @return http or https protocol - */ - @Nullable - public String getProtocol() { - return protocol; - } - - /** - * User name used for DMaaP MR AAF Authentication - * - * @return User name for DMaaP MR AAF Authentication - */ - @Nullable - public String getUserName() { - return userName; - } - - /** - * User password used for DMaaP MR AAF Authentication - * - * @return User password used for DMaaP MR AAF Authentication - */ - @Nullable - public String getUserPassword() { - return userPassword; - } - - /** - * Content type used for DMaaP MR Topic e.g. 'application/json' - * - * @return content type for DMaaP MR Topic - */ - @Nullable - public String getContentType() { - return contentType; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("referenceName", referenceName) - .add("hostName", hostName) - .add("portNumber", portNumber) - .add("topicName", topicName) - .add("protocol", protocol) - .add("userName", userName) - .add("userPassword", "xxxx") - .add("contentType", contentType) - .toString(); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java deleted file mode 100644 index 454f384..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfig.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Macro; -import com.google.common.base.Objects; - -import javax.annotation.Nullable; - -/** - * DMaaP MR Publisher Config - *

- * @author Rajiv Singla . Creation Date: 1/17/2017. - */ -public class DMaaPMRSinkPluginConfig extends BaseDMaaPMRPluginConfig { - - private static final long serialVersionUID = 1L; - - @Description("Column name of input schema which contains the message that needs to be written to DMaaP MR Topic") - @Macro - protected String messageColumnName; - - @Description("DMaaP MR Publisher Max Batch Size. Defaults to no Batch") - @Nullable - @Macro - protected Integer maxBatchSize; - - @Description("DMaaP MR Publisher Recovery Queue Size. Default to 1000K messages which can be buffered in memory " + - "in case DMaaP MR Publisher is temporarily unavailable") - @Nullable - @Macro - protected Integer maxRecoveryQueueSize; - - // Required No Arg constructor - public DMaaPMRSinkPluginConfig() { - this(null, null, null, null); - } - - public DMaaPMRSinkPluginConfig(String referenceName, String hostName, String topicName, String messageColumnName) { - super(referenceName, hostName, topicName); - this.messageColumnName = messageColumnName; - } - - /** - * Column name of incoming Schema field that contains the message that needs to published to DMaaP MR Topic - * - * @return Column name of incoming schema which contains message that needs to published to DMaaP MR Topic - */ - public String getMessageColumnName() { - return messageColumnName; - } - - /** - * DMaaP MR Publisher Max Batch Size. - * - * @return DMaaP MR Publisher Max Batch Size - */ - @Nullable - public Integer getMaxBatchSize() { - return maxBatchSize; - } - - /** - * DMaaP MR Publisher Max Recovery Queue Size - * - * @return DMaaP MR Publisher Max Recovery Queue Size - */ - @Nullable - public Integer getMaxRecoveryQueueSize() { - return maxRecoveryQueueSize; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("super", super.toString()) - .add("messageColumnName", messageColumnName) - .add("maxBatchSize", maxBatchSize) - .add("maxRecoveryQueueSize", maxRecoveryQueueSize) - .toString(); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java deleted file mode 100644 index d3e966b..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfig.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Macro; -import com.google.common.base.Objects; - -import javax.annotation.Nullable; - -/** - * DMaaP MR Subscriber Config - *

- * @author Rajiv Singla . Creation Date: 1/17/2017. - */ -public class DMaaPMRSourcePluginConfig extends BaseDMaaPMRPluginConfig { - - private static final long serialVersionUID = 1L; - - @Description("DMaaP MR Polling Interval in MS") - @Macro - protected Integer pollingInterval; - - @Description("DMaaP Message Router Subscriber Consumer ID. Defaults to some randomly created userID") - @Nullable - @Macro - protected String consumerId; - - @Description("DMaaP Message Router Subscriber Consumer Group. Defaults to some randomly created user Group") - @Nullable - @Macro - protected String consumerGroup; - - @Description("DMaaP Message Router Subscriber Timeout in MS. Defaults to no timeout") - @Nullable - @Macro - protected Integer timeoutMS; - - @Description("DMaaP Message Router Subscriber Message Limit. Defaults to no message limit") - @Nullable - @Macro - protected Integer messageLimit; - - // Required No Arg constructor - public DMaaPMRSourcePluginConfig() { - this(null, null, null, 0); - } - - public DMaaPMRSourcePluginConfig(String referenceName, String hostName, String topicName, Integer pollingInterval) { - super(referenceName, hostName, topicName); - this.pollingInterval = pollingInterval; - } - - /** - * DMaaP MR Subscriber Polling interval - * - * @return DMaaP MR Subscriber Polling interval - */ - public Integer getPollingInterval() { - return pollingInterval; - } - - /** - * DMaaP MR Subscriber Consumer ID - * - * @return DMaaP MR Subscriber Consumer ID - */ - @Nullable - public String getConsumerId() { - return consumerId; - } - - /** - * DMaaP MR Subscriber Consumer Group - * - * @return DMaaP MR Subscriber Consumer Group - */ - @Nullable - public String getConsumerGroup() { - return consumerGroup; - } - - /** - * DMaaP MR Subscriber Timeout in MS - * - * @return DMaaP MR Subscriber Timeout in MS - */ - @Nullable - public Integer getTimeoutMS() { - return timeoutMS; - } - - /** - * DMaaP MR Subscriber message limit - * - * @return DMaaP MR Subscriber Message limit - */ - @Nullable - public Integer getMessageLimit() { - return messageLimit; - } - - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("super", super.toString()) - .add("pollingInterval", pollingInterval) - .add("consumerId", consumerId) - .add("consumerGroup", consumerGroup) - .add("timeoutMS", timeoutMS) - .add("messageLimit", messageLimit) - .toString(); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java deleted file mode 100644 index d8a224d..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/JsonPathFilterPluginConfig.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Macro; -import co.cask.cdap.api.annotation.Name; -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPBasePluginConfig; - -/** - * Configuration for Json Path Filter Plugin - * - * @author Rajiv Singla . Creation Date: 3/2/2017. - */ -public class JsonPathFilterPluginConfig extends CDAPBasePluginConfig { - - private static final long serialVersionUID = 1L; - - @Name("incomingJsonFieldName") - @Description("Input schema field name that contain JSON used for filtering") - @Macro - protected String incomingJsonFieldName; - - - @Name("outputSchemaFieldName") - @Description("Name of the nullable boolean schema field name that will contain result of the filter matching") - @Macro - protected String outputSchemaFieldName; - - - @Name("jsonFilterMappings") - @Macro - @Description("Filters incoming JSON based on given filter mappings - in terms of JSON path and expected values." + - "Right hand side contains JSON path. Left hand side contains semicolon (';') separated expected values " + - "for that JSON Path. If all provided JSON Path mappings and corresponding values matches - " + - "output schema field will be marked as true") - protected String jsonFilterMappings; - - - @Name("schema") - @Description("Output Schema") - protected String schema; - - - public JsonPathFilterPluginConfig(final String referenceName, final String incomingJsonFieldName, - final String outputSchemaFieldName, final String jsonFilterMappings, - final String schema) { - this.referenceName = referenceName; - this.incomingJsonFieldName = incomingJsonFieldName; - this.outputSchemaFieldName = outputSchemaFieldName; - this.jsonFilterMappings = jsonFilterMappings; - this.schema = schema; - } - - /** - * Provides incoming plugin schema field name which contains json used to apply filter - * - * @return name of incoming schema field containing JSON to be filtered - */ - public String getIncomingJsonFieldName() { - return incomingJsonFieldName; - } - - /** - * Provides plugin output schema filed name that will contain result of filter application - * It must be nullable and boolean type - * - * @return name of outgoing schema filed name that will contain filtering result - */ - public String getOutputSchemaFieldName() { - return outputSchemaFieldName; - } - - /** - * Provides JSON filter mappings. LHS contains JSON path value and RHS contains expected - * values separated by semicolon - * - * - * @return String for JSON filter mappings - */ - public String getJsonFilterMappings() { - return jsonFilterMappings; - } - - /** - * Output Schema - * - * @return output schema string - */ - public String getSchema() { - return schema; - } - - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("referenceName", referenceName) - .add("incomingJsonFieldName", incomingJsonFieldName) - .add("outputSchemaFieldName", outputSchemaFieldName) - .add("jsonFilterMappings", jsonFilterMappings) - .add("schema", schema) - .toString(); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java deleted file mode 100644 index 4cdba6a..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/SimpleTCAPluginConfig.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Macro; -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPBasePluginConfig; - -import javax.annotation.Nullable; - -/** - * Simple TCA Plugin Configuration - *

- * @author Rajiv Singla . Creation Date: 2/13/2017. - */ -public class SimpleTCAPluginConfig extends CDAPBasePluginConfig { - - private static final long serialVersionUID = 1L; - - @Description("Field name containing VES Message") - @Macro - protected String vesMessageFieldName; - - @Description("Policy JSON that need to be applied to VES Message") - @Macro - protected String policyJson; - - @Description("Name of the output field that will contain the alert") - @Macro - protected String alertFieldName; - - @Description("Name of the output field that will contain message type: INAPPLICABLE, COMPLIANT, NON_COMPLIANT") - @Macro - protected String messageTypeFieldName; - - @Description("Specifies the output schema") - protected String schema; - - @Description("Enables") - @Nullable - @Macro - protected Boolean enableAlertCEFFormat; - - - /** - * Creates an instance of TCA Plugin Configs - * - * @param vesMessageFieldName Ves message field name from incoming plugin schema - * @param policyJson TCA Policy Json String - * @param alertFieldName Alert field name that will be added in TCA plugin output schema - * @param messageTypeFieldName Message type field name that will be added in TCA plugin output schema - * @param schema TCA Plugin output schema - * @param enableAlertCEFFormat enables alert message to be formatted in VES format - */ - public SimpleTCAPluginConfig(final String vesMessageFieldName, final String policyJson, - final String alertFieldName, final String messageTypeFieldName, - final String schema, final Boolean enableAlertCEFFormat) { - this.vesMessageFieldName = vesMessageFieldName; - this.policyJson = policyJson; - this.alertFieldName = alertFieldName; - this.messageTypeFieldName = messageTypeFieldName; - this.schema = schema; - this.enableAlertCEFFormat = enableAlertCEFFormat; - } - - /** - * Name of the field containing VES Message - * - * @return VES Message field name - */ - public String getVesMessageFieldName() { - return vesMessageFieldName; - } - - /** - * Policy Json String - * - * @return Policy Json String - */ - public String getPolicyJson() { - return policyJson; - } - - - /** - * Alert Field name in outgoing schema - * - * @return alert field name in outgoing schema - */ - public String getAlertFieldName() { - return alertFieldName; - } - - /** - * Returns output schema string - * - * @return output schema string - */ - public String getSchema() { - return schema; - } - - /** - * Return TCA message type - INAPPLICABLE, COMPLIANT, NON_COMPLIANT - * - * @return tca message type - */ - public String getMessageTypeFieldName() { - return messageTypeFieldName; - } - - - /** - * Returns if Alert output in Common Event format - * - * @return true if alert output is in common event format - */ - @Nullable - public Boolean getEnableAlertCEFFormat() { - return enableAlertCEFFormat; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("referenceName", referenceName) - .add("vesMessageFieldName", vesMessageFieldName) - .add("policyJson", policyJson) - .add("alertFieldName", alertFieldName) - .add("messageTypeFieldName", messageTypeFieldName) - .add("schema", schema) - .add("enableAlertCEFFormat", true) - .toString(); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java deleted file mode 100644 index a3234c0..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchema.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap; - -import co.cask.cdap.api.data.schema.Schema; -import org.openecomp.dcae.apod.analytics.cdap.plugins.common.PluginSchema; - -/** - * Output Schema for DMaaP MR Source Plugin - * - * @author Rajiv Singla . Creation Date: 1/25/2017. - */ -public enum DMaaPSourceOutputSchema implements PluginSchema { - - TIMESTAMP("ts"), - RESPONSE_CODE("responseCode"), - RESPONSE_MESSAGE("responseMessage"), - FETCHED_MESSAGE("message"); - - private String schemaColumnName; - - DMaaPSourceOutputSchema(String schemaColumnName) { - this.schemaColumnName = schemaColumnName; - } - - @Override - public String getSchemaColumnName() { - return schemaColumnName; - } - - public static Schema getSchema() { - return Schema.recordOf( - "DMaaPMRSourcePluginResponse", - Schema.Field.of(TIMESTAMP.getSchemaColumnName(), Schema.of(Schema.Type.LONG)), - Schema.Field.of(RESPONSE_CODE.getSchemaColumnName(), Schema.of(Schema.Type.INT)), - Schema.Field.of(RESPONSE_MESSAGE.getSchemaColumnName(), Schema.of(Schema.Type.STRING)), - Schema.Field.of(FETCHED_MESSAGE.getSchemaColumnName(), Schema.of(Schema.Type.STRING)) - ); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java deleted file mode 100644 index fb5fef5..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPlugin.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.sparkcompute.tca; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Name; -import co.cask.cdap.api.annotation.Plugin; -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.format.StructuredRecord.Builder; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.StageMetrics; -import co.cask.cdap.etl.api.batch.SparkCompute; -import co.cask.cdap.etl.api.batch.SparkExecutionPluginContext; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.api.java.function.Function; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.validator.SimpleTCAPluginConfigValidator; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Rajiv Singla . Creation Date: 2/13/2017. - */ - -@Plugin(type = SparkCompute.PLUGIN_TYPE) -@Name("SimpleTCAPlugin") -@Description("Used to create TCA (Threshold Crossing Alert) based on given Policy") -@SuppressFBWarnings("SE_INNER_CLASS") -public class SimpleTCAPlugin extends SparkCompute { - - private static final Logger LOG = LoggerFactory.getLogger(SimpleTCAPlugin.class); - private static final long serialVersionUID = 1L; - - private final SimpleTCAPluginConfig pluginConfig; - - /** - * Create an instance of Simple TCA Plugin with give Simple TCA Plugin Config - * - * @param pluginConfig Simple TCA Plugin Config - */ - public SimpleTCAPlugin(SimpleTCAPluginConfig pluginConfig) { - this.pluginConfig = pluginConfig; - LOG.info("Creating instance of Simple TCA Plugin with plugin config: {}", pluginConfig); - } - - @Override - public void configurePipeline(PipelineConfigurer pipelineConfigurer) { - super.configurePipeline(pipelineConfigurer); - ValidationUtils.validateSettings(pluginConfig, new SimpleTCAPluginConfigValidator()); - final Schema inputSchema = pipelineConfigurer.getStageConfigurer().getInputSchema(); - CDAPPluginUtils.validateSchemaContainsFields(inputSchema, pluginConfig.getVesMessageFieldName()); - CDAPPluginUtils.setOutputSchema(pipelineConfigurer, pluginConfig.getSchema()); - } - - @Override - public JavaRDD transform(final SparkExecutionPluginContext context, - final JavaRDD input) throws Exception { - final StageMetrics metrics = context.getMetrics(); - - LOG.debug("Invoking Spark Transform for Simple TCA Plugin"); - return input.map(new Function() { - - @Override - public StructuredRecord call(StructuredRecord inputStructuredRecord) throws Exception { - TCACalculatorMessageType calculatorMessageType; - String alertMessage = null; - - // Get input structured record - final String cefMessage = inputStructuredRecord.get(pluginConfig.getVesMessageFieldName()); - - // Get TCA Policy - final TCAPolicy tcaPolicy = CDAPPluginUtils.readValue(pluginConfig.getPolicyJson(), TCAPolicy.class); - - // create initial processor context - final TCACEFProcessorContext initialProcessorContext = - new TCACEFProcessorContext(cefMessage, tcaPolicy); - - final TCACEFJsonProcessor jsonProcessor = new TCACEFJsonProcessor(); - final TCACEFProcessorContext jsonProcessorContext = - jsonProcessor.processMessage(initialProcessorContext); - - if (jsonProcessorContext.getCEFEventListener() != null) { - - LOG.debug("Json to CEF parsing successful. Parsed object {}", - jsonProcessorContext.getCEFEventListener()); - - // compute violations - final TCACEFProcessorContext processorContextWithViolations = - TCAUtils.computeThresholdViolations(jsonProcessorContext); - - // if violation are found then create alert message - if (processorContextWithViolations.canProcessingContinue()) { - - alertMessage = TCAUtils.createTCAAlertString(processorContextWithViolations, - pluginConfig.getReferenceName(), pluginConfig.getEnableAlertCEFFormat()); - calculatorMessageType = TCACalculatorMessageType.NON_COMPLIANT; - - LOG.debug("VES Threshold Violation Detected.An alert message is be generated: {}", - alertMessage); - - final MetricsPerEventName metricsPerEventName = - processorContextWithViolations.getMetricsPerEventName(); - if (metricsPerEventName != null - && metricsPerEventName.getThresholds() != null - && metricsPerEventName.getThresholds().get(0) != null) { - final Threshold violatedThreshold = metricsPerEventName.getThresholds().get(0); - LOG.debug("CEF Message: {}, Violated Threshold: {}", cefMessage, violatedThreshold); - } - - metrics.count(CDAPMetricsConstants.TCA_VES_NON_COMPLIANT_MESSAGES_METRIC, 1); - - } else { - LOG.debug("No Threshold Violation Detected. No alert will be generated."); - calculatorMessageType = TCACalculatorMessageType.COMPLIANT; - metrics.count(CDAPMetricsConstants.TCA_VES_COMPLIANT_MESSAGES_METRIC, 1); - } - - } else { - LOG.info("Unable to parse provided json message to CEF format. Invalid message: {}", cefMessage); - calculatorMessageType = TCACalculatorMessageType.INAPPLICABLE; - } - - LOG.debug("Calculator message type: {} for message: {}", calculatorMessageType, cefMessage); - - final Schema outputSchema = Schema.parseJson(pluginConfig.getSchema()); - - // create new output record builder and copy any input record values to output record builder - final Builder outputRecordBuilder = - CDAPPluginUtils.createOutputStructuredRecordBuilder(outputSchema, inputStructuredRecord); - - // add alert field - final Builder outputRecordBuilderWithAlertField = - CDAPPluginUtils.addFieldValueToStructuredRecordBuilder(outputRecordBuilder, - outputSchema, pluginConfig.getAlertFieldName(), alertMessage); - - // add message field type - final Builder outRecordBuilderWithMessageTypeField = - CDAPPluginUtils.addFieldValueToStructuredRecordBuilder(outputRecordBuilderWithAlertField, - outputSchema, pluginConfig.getMessageTypeFieldName(), calculatorMessageType.toString()); - - return outRecordBuilderWithMessageTypeField.build(); - } - }); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java deleted file mode 100644 index 9822768..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiver.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.metrics.Metrics; -import com.google.common.base.Optional; -import org.apache.spark.storage.StorageLevel; -import org.apache.spark.streaming.receiver.Receiver; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.DMaaPMRUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.DMaaPSourceConfigMapper; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * DMaaP MR Receiver which calls DMaaP MR Topic and stores structured records - *

- * @author Rajiv Singla . Creation Date: 1/19/2017. - */ -public class DMaaPMRReceiver extends Receiver { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRReceiver.class); - private static final long serialVersionUID = 1L; - - private final DMaaPMRSourcePluginConfig pluginConfig; - private final transient Metrics metrics; - - public DMaaPMRReceiver(final StorageLevel storageLevel, final DMaaPMRSourcePluginConfig pluginConfig, - final Metrics metrics) { - super(storageLevel); - this.pluginConfig = pluginConfig; - this.metrics = metrics; - LOG.debug("Created DMaaP MR Receiver instance with plugin Config: {}", pluginConfig); - } - - @Override - public void onStart() { - - // create DMaaP MR Subscriber - final DMaaPMRSubscriber subscriber = - DMaaPMRFactory.create().createSubscriber(DMaaPSourceConfigMapper.map(pluginConfig)); - - // Start a new thread with indefinite loop until receiver is stopped - new Thread() { - @Override - public void run() { - while (!isStopped()) { - storeStructuredRecords(subscriber); - try { - final Integer pollingInterval = pluginConfig.getPollingInterval(); - LOG.debug("DMaaP MR Receiver sleeping for polling interval: {}", pollingInterval); - TimeUnit.MILLISECONDS.sleep(pollingInterval); - } catch (InterruptedException e) { - final String errorMessage = String.format( - "Interrupted Exception while DMaaP MR Receiver sleeping polling interval: %s", e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - } - }.start(); - - } - - @Override - public void onStop() { - LOG.debug("Stopping DMaaP MR Receiver with plugin config: {}", pluginConfig); - } - - /** - * Fetches records from DMaaP MR Subscriber and store them as structured records - * - * @param subscriber DMaaP MR Subscriber Instance - */ - public void storeStructuredRecords(final DMaaPMRSubscriber subscriber) { - - LOG.debug("DMaaP MR Receiver start fetching messages from DMaaP MR Topic"); - - // Fetch messages from DMaaP MR Topic - final Optional> subscriberMessagesOptional = - DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); - - // store records - if (subscriberMessagesOptional.isPresent()) { - final List messages = subscriberMessagesOptional.get(); - for (final String message : messages) { - store(CDAPPluginUtils.createDMaaPMRResponseStructuredRecord(message)); - } - LOG.debug("Stored DMaaP Subscriber messages as Structured Records. Message count {}", messages.size()); - } - } - -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java deleted file mode 100644 index 117c76e..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSource.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Name; -import co.cask.cdap.api.annotation.Plugin; -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.streaming.StreamingContext; -import co.cask.cdap.etl.api.streaming.StreamingSource; -import org.apache.spark.storage.StorageLevel; -import org.apache.spark.streaming.api.java.JavaDStream; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap.DMaaPSourceOutputSchema; -import org.openecomp.dcae.apod.analytics.cdap.plugins.validator.DMaaPMRSourcePluginConfigValidator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * DMaaP MR Source Plugin which polls DMaaP MR topic at frequent intervals - *

- * @author Rajiv Singla . Creation Date: 1/18/2017. - */ -@Plugin(type = StreamingSource.PLUGIN_TYPE) -@Name("DMaaPMRSource") -@Description("Fetches DMaaP MR Messages at regular intervals") -public class DMaaPMRSource extends StreamingSource { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSource.class); - private static final long serialVersionUID = 1L; - - private final DMaaPMRSourcePluginConfig pluginConfig; - - public DMaaPMRSource(final DMaaPMRSourcePluginConfig pluginConfig) { - LOG.debug("Creating DMaaP MR Source plugin with plugin Config: {}", pluginConfig); - this.pluginConfig = pluginConfig; - } - - @Override - public void configurePipeline(PipelineConfigurer pipelineConfigurer) { - ValidationUtils.validateSettings(pluginConfig, new DMaaPMRSourcePluginConfigValidator()); - pipelineConfigurer.getStageConfigurer().setOutputSchema(DMaaPSourceOutputSchema.getSchema()); - } - - @Override - public JavaDStream getStream(final StreamingContext streamingContext) throws Exception { - return streamingContext.getSparkStreamingContext().receiverStream( - new DMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), pluginConfig, streamingContext.getMetrics())); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java deleted file mode 100644 index dc24ca0..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiver.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.data.format.StructuredRecord; -import com.fasterxml.jackson.core.type.TypeReference; -import org.apache.spark.storage.StorageLevel; -import org.apache.spark.streaming.receiver.Receiver; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.DMaaPSourceConfigMapper; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import static org.openecomp.dcae.apod.analytics.model.util.AnalyticsModelJsonUtils.readValue; -import static org.openecomp.dcae.apod.analytics.model.util.AnalyticsModelJsonUtils.writeValueAsString; - -/** - * DMaaP MR Receiver which calls DMaaP MR Topic and stores structured records - *

- * @author Rajiv Singla . Creation Date: 1/19/2017. - */ -public class MockDMaaPMRReceiver extends Receiver { - - private static final Logger LOG = LoggerFactory.getLogger(MockDMaaPMRReceiver.class); - private static final long serialVersionUID = 1L; - - private static final String MOCK_MESSAGE_FILE_LOCATION = "ves_mock_messages.json"; - private static final TypeReference> EVENT_LISTENER_TYPE_REFERENCE = - new TypeReference>() { - }; - - private final DMaaPMRSourcePluginConfig pluginConfig; - - public MockDMaaPMRReceiver(final StorageLevel storageLevel, final DMaaPMRSourcePluginConfig pluginConfig) { - super(storageLevel); - this.pluginConfig = pluginConfig; - LOG.debug("Created DMaaP MR Receiver instance with plugin Config: {}", pluginConfig); - } - - @Override - public void onStart() { - - // create DMaaP MR Subscriber - final DMaaPMRSubscriber subscriber = - DMaaPMRFactory.create().createSubscriber(DMaaPSourceConfigMapper.map(pluginConfig)); - storeStructuredRecords(subscriber); - - } - - @Override - public void onStop() { - LOG.debug("Stopping DMaaP MR Receiver with plugin config: {}", pluginConfig); - } - - /** - * Fetches records from DMaaP MR Subscriber and store them as structured records - * - * @param subscriber DMaaP MR Subscriber Instance - */ - public void storeStructuredRecords(final DMaaPMRSubscriber subscriber) { - - LOG.debug("DMaaP MR Receiver start fetching messages from DMaaP MR Topic"); - - try (InputStream resourceAsStream = - Thread.currentThread().getContextClassLoader().getResourceAsStream(MOCK_MESSAGE_FILE_LOCATION)) { - - if (resourceAsStream == null) { - LOG.error("Unable to find file at location: {}", MOCK_MESSAGE_FILE_LOCATION); - throw new DCAEAnalyticsRuntimeException("Unable to find file", LOG, new FileNotFoundException()); - } - - List eventListeners = readValue(resourceAsStream, EVENT_LISTENER_TYPE_REFERENCE); - - final int totalMessageCount = eventListeners.size(); - LOG.debug("Mock message count to be written to cdap stream: ()", totalMessageCount); - - int i = 1; - for (EventListener eventListener : eventListeners) { - if (isStopped()) { - return; - } - final String eventListenerString = writeValueAsString(eventListener); - LOG.debug("=======>> Writing message to cdap stream no: {} of {}", i, totalMessageCount); - store(CDAPPluginUtils.createDMaaPMRResponseStructuredRecord(eventListenerString)); - i++; - try { - TimeUnit.MILLISECONDS.sleep(pluginConfig.getPollingInterval()); - } catch (InterruptedException e) { - LOG.error("Error while sleeping"); - throw new DCAEAnalyticsRuntimeException("Error while sleeping", LOG, e); - } - - } - - LOG.debug("Finished writing mock messages to CDAP Stream"); - - } catch (IOException e) { - LOG.error("Error while parsing json file"); - throw new DCAEAnalyticsRuntimeException("Error while parsing mock json file", LOG, e); - } - } - -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java deleted file mode 100644 index e058fab..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSource.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Name; -import co.cask.cdap.api.annotation.Plugin; -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.streaming.StreamingContext; -import co.cask.cdap.etl.api.streaming.StreamingSource; -import org.apache.spark.storage.StorageLevel; -import org.apache.spark.streaming.api.java.JavaDStream; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A mock implementation of DMaaP MR Receiver which sends mock ves messages - *

- * @author Rajiv Singla . Creation Date: 2/15/2017. - */ -@Plugin(type = StreamingSource.PLUGIN_TYPE) -@Name("MockDMaaPMRSource") -@Description("Fetches DMaaP MR Messages at regular intervals") -public class MockDMaaPMRSource extends StreamingSource { - - private static final Logger LOG = LoggerFactory.getLogger(MockDMaaPMRSource.class); - private static final long serialVersionUID = 1L; - - private final DMaaPMRSourcePluginConfig pluginConfig; - - public MockDMaaPMRSource(final DMaaPMRSourcePluginConfig pluginConfig) { - LOG.debug("Creating DMaaP MR Source plugin with plugin Config: {}", pluginConfig); - this.pluginConfig = pluginConfig; - } - - @Override - public void configurePipeline(PipelineConfigurer pipelineConfigurer) { - final Integer pollingInterval = pluginConfig.getPollingInterval(); - if (pollingInterval == null) { - final String errorMessage = "Polling Interval field must be present"; - throw new CDAPSettingsException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); - } else { - LOG.info("Mock Message will be send every ms: {}", pollingInterval); - } - } - - @Override - public JavaDStream getStream(final StreamingContext streamingContext) throws Exception { - return streamingContext.getSparkStreamingContext().receiverStream( - new MockDMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), pluginConfig)); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java deleted file mode 100644 index 135a6c2..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilter.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.transform.filter; - -import co.cask.cdap.api.annotation.Description; -import co.cask.cdap.api.annotation.Name; -import co.cask.cdap.api.annotation.Plugin; -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.Emitter; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.Transform; -import co.cask.cdap.etl.api.TransformContext; -import com.google.common.base.Splitter; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter.JsonPathFilterPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.validator.JsonPathFilterPluginConfigValidator; -import org.openecomp.dcae.apod.analytics.common.service.filter.JsonMessageFilterProcessorContext; -import org.openecomp.dcae.apod.analytics.common.utils.MessageProcessorUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Map; -import java.util.Set; - -/** - * Json Path filter Plugin filters incoming schema field based of given json path expected values - *

- * @author Rajiv Singla . Creation Date: 3/2/2017. - */ - -@Plugin(type = Transform.PLUGIN_TYPE) -@Name("JsonPathFilter") -@Description("Filters incoming schema field based of given json path expected values") -public class JsonPathFilter extends Transform { - - private static final Logger LOG = LoggerFactory.getLogger(JsonPathFilter.class); - - private final JsonPathFilterPluginConfig pluginConfig; - private final Map> jsonFilterPathMappings; - - public JsonPathFilter(final JsonPathFilterPluginConfig pluginConfig) { - this.pluginConfig = pluginConfig; - jsonFilterPathMappings = Maps.newHashMap(); - LOG.info("Created instance of Json Path Filter Plugin with plugin config: {}", pluginConfig); - } - - - @Override - public void initialize(final TransformContext context) throws Exception { - super.initialize(context); - populateJsonFilterMapping(); - } - - @Override - public void configurePipeline(final PipelineConfigurer pipelineConfigurer) { - super.configurePipeline(pipelineConfigurer); - ValidationUtils.validateSettings(pluginConfig, new JsonPathFilterPluginConfigValidator()); - final Schema inputSchema = pipelineConfigurer.getStageConfigurer().getInputSchema(); - CDAPPluginUtils.validateSchemaContainsFields(inputSchema, pluginConfig.getIncomingJsonFieldName()); - populateJsonFilterMapping(); - CDAPPluginUtils.setOutputSchema(pipelineConfigurer, pluginConfig.getSchema()); - } - - @Override - public void transform(final StructuredRecord inputStructuredRecord, final Emitter emitter) - throws Exception { - - // get input json message - final String jsonMessage = inputStructuredRecord.get(pluginConfig.getIncomingJsonFieldName()); - - // process Json Filter Mappings - final JsonMessageFilterProcessorContext jsonMessageFilterProcessorContext = - MessageProcessorUtils.processJsonFilterMappings(jsonMessage, jsonFilterPathMappings); - - // create new output record builder and copy any input Structured record values to output record builder - final Schema outputSchema = Schema.parseJson(pluginConfig.getSchema()); - final StructuredRecord.Builder outputRecordBuilder = - CDAPPluginUtils.createOutputStructuredRecordBuilder(outputSchema, inputStructuredRecord); - - // add json filter matched field - final StructuredRecord.Builder outputRecordBuilderWithMatchedField = - CDAPPluginUtils.addFieldValueToStructuredRecordBuilder(outputRecordBuilder, - outputSchema, pluginConfig.getOutputSchemaFieldName(), - jsonMessageFilterProcessorContext.getMatched()); - - // emit structured record with filtering matched field - final StructuredRecord outputStructuredRecord = outputRecordBuilderWithMatchedField.build(); - - LOG.debug("Incoming Json Message: {}.Json Path Filter Output Matched Field: {}", jsonMessage, - outputStructuredRecord.get(pluginConfig.getOutputSchemaFieldName())); - - emitter.emit(outputStructuredRecord); - - } - - /** - * Populates Json Filter Mapping - */ - private void populateJsonFilterMapping() { - final Map fieldMappings = - CDAPPluginUtils.extractFieldMappings(pluginConfig.getJsonFilterMappings()); - if (fieldMappings.isEmpty()) { - throw new IllegalArgumentException("No Field Mapping found. Invalid Filter mapping configuration"); - } - final Splitter semiColonSplitter = Splitter.on(";"); - for (Map.Entry fieldMappingEntry : fieldMappings.entrySet()) { - jsonFilterPathMappings.put(fieldMappingEntry.getKey(), - Sets.newLinkedHashSet(semiColonSplitter.split(fieldMappingEntry.getValue()))); - } - LOG.info("Input Json Filter Mappings: {}", jsonFilterPathMappings); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java deleted file mode 100644 index 3ae1560..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtils.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.utils; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.PipelineConfigurer; -import com.google.common.base.Function; -import com.google.common.base.Splitter; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.apache.commons.lang3.StringUtils; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap.DMaaPSourceOutputSchema; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.model.util.AnalyticsModelJsonUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * @author Rajiv Singla . Creation Date: 1/26/2017. - */ -public abstract class CDAPPluginUtils extends AnalyticsModelJsonUtils { - - private static final Logger LOG = LoggerFactory.getLogger(CDAPPluginUtils.class); - - public static final Function SCHEMA_TO_TYPE_FUNCTION = new Function() { - @Override - public Schema.Type apply(@Nonnull Schema schema) { - return schema.getType(); - } - }; - - - - private CDAPPluginUtils() { - // private constructor - } - - /** - * Validates if CDAP Schema contains expected fields - * - * @param schema schema that need to be validated - * @param expectedFields fields that are expected to be in the schema - */ - - public static void validateSchemaContainsFields(@Nullable final Schema schema, final String... expectedFields) { - - LOG.debug("Validating schema:{} contains expected fields:{}", schema, Arrays.toString(expectedFields)); - - if (schema == null) { - // If input schema is null then no validation possible - LOG.warn("Input Schema is null. No validation possible"); - } else { - // Check if expected fields are indeed present in the schema - for (String expectedField : expectedFields) { - final Schema.Field schemaField = schema.getField(expectedField); - if (schemaField == null) { - final String errorMessage = String.format( - "Unable to find expected field: %s, in schema: %s", expectedField, schema); - throw new CDAPSettingsException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); - } - } - LOG.debug("Successfully validated schema:{}, contains expected fields:{}", schema, - Arrays.toString(expectedFields)); - } - } - - - /** - * Creates a new Structured Record containing DMaaP MR fetched message - * - * @param message DMaaP MR fetch message - * - * @return Structured record containing DMaaP MR Message - */ - public static StructuredRecord createDMaaPMRResponseStructuredRecord(final String message) { - StructuredRecord.Builder recordBuilder = StructuredRecord.builder(DMaaPSourceOutputSchema.getSchema()); - recordBuilder - .set(DMaaPSourceOutputSchema.TIMESTAMP.getSchemaColumnName(), System.nanoTime()) - .set(DMaaPSourceOutputSchema.RESPONSE_CODE.getSchemaColumnName(), 200) - .set(DMaaPSourceOutputSchema.RESPONSE_MESSAGE.getSchemaColumnName(), "OK") - .set(DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName(), message); - return recordBuilder.build(); - } - - - /** - * Creates output StructuredRecord Builder which has copied values from input StructuredRecord - * - * @param outputSchema output Schema - * @param inputStructuredRecord input Structured Record - * - * @return output Structured Record builder with pre populated values from input structured record - */ - public static StructuredRecord.Builder createOutputStructuredRecordBuilder( - @Nonnull final Schema outputSchema, - @Nonnull final StructuredRecord inputStructuredRecord) { - - // Get input structured Record Schema - final Schema inputSchema = inputStructuredRecord.getSchema(); - // Create new instance of output Structured Record Builder from output Schema - final StructuredRecord.Builder outputStructuredRecordBuilder = StructuredRecord.builder(outputSchema); - - // iterate over input fields and if output schema has field with same name copy the value to out record builder - for (Schema.Field inputField : inputSchema.getFields()) { - final String inputFieldName = inputField.getName(); - if (outputSchema.getField(inputFieldName) != null) { - outputStructuredRecordBuilder.set(inputFieldName, inputStructuredRecord.get(inputFieldName)); - } - } - - return outputStructuredRecordBuilder; - } - - - /** - * Adds Field value to StructuredRecord Builder if schema contains that field Name - * - * @param structuredRecordBuilder structured record builder - * @param structuredRecordSchema schema for structured record builder - * @param fieldName field name - * @param fieldValue field value - * - * @return structured record builder with populated field name and value if schema contains field name - */ - public static StructuredRecord.Builder addFieldValueToStructuredRecordBuilder( - @Nonnull final StructuredRecord.Builder structuredRecordBuilder, - @Nonnull final Schema structuredRecordSchema, - @Nonnull final String fieldName, - final Object fieldValue) { - - // check if schema contains field Name - if (structuredRecordSchema.getField(fieldName) != null) { - structuredRecordBuilder.set(fieldName, fieldValue); - } else { - LOG.info("Unable to populate value for field Name: {} with field value: {}. " + - "Schema Fields: {} does not contain field name: {}", - fieldName, fieldValue, structuredRecordSchema.getFields(), fieldName); - } - - return structuredRecordBuilder; - } - - - /** - * Validates that given schema String has fieldName of expected type. If field does not exist in given schema - * then validation will pass with warning. If field does exist in given schema then this validation will return - * true if field type is same as expected type else false - * - * @param schemaString CDAP Plugin output or input schema string - * @param fieldName field name - * @param expectedFieldType expected schema field type - * - * @return true if field type matches expected field type else false. If field does not exist in - * give schema validation will pass but will generate a warning message - */ - public static boolean validateSchemaFieldType(@Nonnull final String schemaString, - @Nonnull final String fieldName, - @Nonnull final Schema.Type expectedFieldType) { - - try { - // parse given schema String - final Schema outputSchema = Schema.parseJson(schemaString); - final Schema.Field schemaField = outputSchema.getField(fieldName); - - // if given schema does contain field then validated fieldName type - if (schemaField != null) { - - final List schemas = new LinkedList<>(); - - // if it is a union type then grab all union schemas - if (outputSchema.getField(fieldName).getSchema().getType() == Schema.Type.UNION) { - final List unionFieldSchemas = - outputSchema.getField(fieldName).getSchema().getUnionSchemas(); - schemas.addAll(unionFieldSchemas); - } else { - // if not union type the just get the field schema - final Schema fieldSchema = outputSchema.getField(fieldName).getSchema(); - schemas.add(fieldSchema); - } - - // get all schema types - final List fieldTypes = - Lists.transform(schemas, CDAPPluginUtils.SCHEMA_TO_TYPE_FUNCTION); - - // if all schema types does not contain expected field type then return false - if (!fieldTypes.contains(expectedFieldType)) { - LOG.error("Validation failed for fieldName: {} is NOT of expected Type: {} in schema: {}", - fieldName, expectedFieldType, outputSchema); - return false; - } - - // field type validation passed - LOG.debug("Successfully validated fieldName: {} is of expected Type: {}", - fieldName, expectedFieldType); - - return true; - - } else { - - // if field does not exist then the validation will pass but will generate warning message - LOG.warn("Validation of field type not possible. Field name: {} does not exist in schema: {}", - fieldName, outputSchema); - return true; - } - - } catch (IOException e) { - final String errorMessage = - String.format("Unable to parse schema: %s for field type validation. " + - "Field Name: %s, Expected Field Type: %s Exception: %s", - schemaString, fieldName, expectedFieldType, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - } - - - /** - * Parses provided schema String as Schema object and set it as output Schema format - * - * @param pipelineConfigurer plugin pipeline configurer - * @param schemaString schema String to be set as output schema - */ - public static void setOutputSchema(final PipelineConfigurer pipelineConfigurer, final String schemaString) { - try { - final Schema outputSchema = Schema.parseJson(schemaString); - pipelineConfigurer.getStageConfigurer().setOutputSchema(outputSchema); - } catch (IOException e) { - final String errorMessage = String.format( - "Schema specified is not a valid JSON. Schema String: %s, Exception: %s", schemaString, e); - throw new CDAPSettingsException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); - } - } - - - /** - * Parses incoming plugin config mapping to key value map. If any of the key value map is blank an Illegal Argument - * exception will be thrown - * - * @param mappingFieldString field Mapping String - * - * @return map containing mapping key values - */ - public static Map extractFieldMappings(final String mappingFieldString) { - final Map fieldMappings = Maps.newHashMap(); - if (StringUtils.isNotBlank(mappingFieldString)) { - final Splitter commaSplitter = Splitter.on(","); - for (String fieldMapping : commaSplitter.split(mappingFieldString)) { - final String[] keyValueMappings = fieldMapping.split(":"); - if (keyValueMappings.length != 2 || - StringUtils.isBlank(keyValueMappings[0]) || - StringUtils.isBlank(keyValueMappings[1])) { - final String errorMessage = "Field Mapping key or value is Blank. All field mappings must " + - "be present in mappings: " + mappingFieldString; - throw new DCAEAnalyticsRuntimeException( - errorMessage, LOG, new IllegalArgumentException(errorMessage)); - } - fieldMappings.put(keyValueMappings[0].trim(), keyValueMappings[1].trim()); - } - } - return fieldMappings; - } - - - - -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java deleted file mode 100644 index 01dad7e..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapper.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.utils; - -import com.google.common.base.Function; -import org.apache.hadoop.conf.Configuration; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; - -import javax.annotation.Nonnull; - -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; - -/** - * Function that converts {@link Configuration} to {@link DMaaPMRPublisherConfig} - *

- * @author Rajiv Singla . Creation Date: 1/26/2017. - */ -public class DMaaPSinkConfigMapper implements Function { - - /** - * Static method to map {@link Configuration} to {@link DMaaPMRPublisherConfig} - * - * @param sinkPluginConfig DMaaP Sink Plugin Config - * - * @return DMaaP MR Publisher Config - */ - public static DMaaPMRPublisherConfig map(final Configuration sinkPluginConfig) { - return new DMaaPSinkConfigMapper().apply(sinkPluginConfig); - } - - /** - * Converts {@link Configuration} to {@link DMaaPMRPublisherConfig} - * - * @param configuration Hadoop Configuration containing DMaaP MR Sink field values - * - * @return DMaaP MR Publisher Config - */ - @Nonnull - @Override - public DMaaPMRPublisherConfig apply(@Nonnull Configuration configuration) { - - // Create a new publisher settings builder - final String hostName = configuration.get(DMaaPMRSinkHadoopConfigFields.HOST_NAME); - final String topicName = configuration.get(DMaaPMRSinkHadoopConfigFields.TOPIC_NAME); - - if (isEmpty(hostName) || isEmpty(topicName)) { - throw new IllegalStateException("DMaaP MR Sink Host Name and Topic Name must be present"); - } - - final DMaaPMRPublisherConfig.Builder publisherConfigBuilder = - new DMaaPMRPublisherConfig.Builder(hostName, topicName); - - // Setup up any optional publisher parameters if they are present - final String portNumber = configuration.get(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER); - if (portNumber != null) { - publisherConfigBuilder.setPortNumber(Integer.parseInt(portNumber)); - } - - final String protocol = configuration.get(DMaaPMRSinkHadoopConfigFields.PROTOCOL); - if (isPresent(protocol)) { - publisherConfigBuilder.setProtocol(protocol); - } - - final String userName = configuration.get(DMaaPMRSinkHadoopConfigFields.USER_NAME); - if (isPresent(userName)) { - publisherConfigBuilder.setUserName(userName); - } - - final String userPassword = configuration.get(DMaaPMRSinkHadoopConfigFields.USER_PASS); - if (isPresent(userPassword)) { - publisherConfigBuilder.setUserPassword(userPassword); - } - - final String contentType = configuration.get(DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE); - if (isPresent(contentType)) { - publisherConfigBuilder.setContentType(contentType); - } - - final String maxBatchSize = configuration.get(DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE); - if (maxBatchSize != null) { - publisherConfigBuilder.setMaxBatchSize(Integer.parseInt(maxBatchSize)); - } - - final String maxRecoveryQueueSize = configuration.get(DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE); - if (maxRecoveryQueueSize != null) { - publisherConfigBuilder.setMaxRecoveryQueueSize(Integer.parseInt(maxRecoveryQueueSize)); - } - - return publisherConfigBuilder.build(); - - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java deleted file mode 100644 index 2ae09be..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapper.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.utils; - -import com.google.common.base.Function; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; - -import javax.annotation.Nonnull; - -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; - -/** - * Function that converts {@link DMaaPMRSourcePluginConfig} to {@link DMaaPMRSubscriberConfig} - *

- * @author Rajiv Singla . Creation Date: 1/18/2017. - */ -public class DMaaPSourceConfigMapper implements Function { - - /** - * Static factory method to map {@link DMaaPMRSourcePluginConfig} to {@link DMaaPMRSubscriberConfig} - * - * @param pluginConfig DMaaP MR Souce Plugin Config - * - * @return DMaaP MR Subscriber Config - */ - public static DMaaPMRSubscriberConfig map(final DMaaPMRSourcePluginConfig pluginConfig) { - return new DMaaPSourceConfigMapper().apply(pluginConfig); - } - - /** - * Converts {@link DMaaPMRSourcePluginConfig} to {@link DMaaPMRSubscriberConfig} object - * - * @param sourcePluginConfig DMaaP MR Source Plugin Config - * - * @return DMaaP MR Subscriber Config - */ - @Nonnull - @Override - public DMaaPMRSubscriberConfig apply(@Nonnull DMaaPMRSourcePluginConfig sourcePluginConfig) { - - // Create a new subscriber settings builder - final String hostName = sourcePluginConfig.getHostName(); - final String topicName = sourcePluginConfig.getTopicName(); - if (isEmpty(hostName) || isEmpty(topicName)) { - throw new IllegalStateException("DMaaP MR Source Host Name and Topic Name must be present"); - } - final DMaaPMRSubscriberConfig.Builder subscriberConfigBuilder = new DMaaPMRSubscriberConfig.Builder( - hostName, topicName); - - // Setup up any optional subscriber parameters if they are present - final Integer subscriberHostPortNumber = sourcePluginConfig.getPortNumber(); - if (subscriberHostPortNumber != null) { - subscriberConfigBuilder.setPortNumber(subscriberHostPortNumber); - } - - final String subscriberProtocol = sourcePluginConfig.getProtocol(); - if (isPresent(subscriberProtocol)) { - subscriberConfigBuilder.setProtocol(subscriberProtocol); - } - - final String subscriberUserName = sourcePluginConfig.getUserName(); - if (isPresent(subscriberUserName)) { - subscriberConfigBuilder.setUserName(subscriberUserName); - } - - final String subscriberUserPassword = sourcePluginConfig.getUserPassword(); - if (isPresent(subscriberUserPassword)) { - subscriberConfigBuilder.setUserPassword(subscriberUserPassword); - } - - final String subscriberContentType = sourcePluginConfig.getContentType(); - if (isPresent(subscriberContentType)) { - subscriberConfigBuilder.setContentType(subscriberContentType); - } - - final String subscriberConsumerId = sourcePluginConfig.getConsumerId(); - if (isPresent(subscriberConsumerId)) { - subscriberConfigBuilder.setConsumerId(subscriberConsumerId); - } - - final String subscriberConsumerGroup = sourcePluginConfig.getConsumerGroup(); - if (isPresent(subscriberConsumerGroup)) { - subscriberConfigBuilder.setConsumerGroup(subscriberConsumerGroup); - } - - final Integer subscriberTimeoutMS = sourcePluginConfig.getTimeoutMS(); - if (subscriberTimeoutMS != null) { - subscriberConfigBuilder.setTimeoutMS(subscriberTimeoutMS); - } - final Integer subscriberMessageLimit = sourcePluginConfig.getMessageLimit(); - if (subscriberMessageLimit != null) { - subscriberConfigBuilder.setMessageLimit(subscriberMessageLimit); - } - - // return Subscriber config - return subscriberConfigBuilder.build(); - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java deleted file mode 100644 index 8cc818f..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/BaseDMaaPMRPluginConfigValidator.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.BaseDMaaPMRPluginConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -/** - * Validates plugin config values which are common in DMaaP MR Configs - {@link BaseDMaaPMRPluginConfig} - *

- * @author Rajiv Singla . Creation Date: 1/23/2017. - * - * @param {@link BaseDMaaPMRPluginConfig} Sub classes - */ -public abstract class BaseDMaaPMRPluginConfigValidator implements - CDAPAppSettingsValidator> { - - private static final long serialVersionUID = 1L; - - /** - * Validates the {@link BaseDMaaPMRPluginConfig} parameters - * - * @param baseDMaaPMRPluginConfig DMaaP MR Plugin Config - * - * @return Validation Response containing validation errors if any - */ - @Override - public GenericValidationResponse validateAppSettings(final T baseDMaaPMRPluginConfig) { - - final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); - - if (ValidationUtils.isEmpty(baseDMaaPMRPluginConfig.getHostName())) { - validationResponse.addErrorMessage( - "hostName", - "DMaaPMRPluginConfig - hostname field is undefined: " + baseDMaaPMRPluginConfig); - } - - if (baseDMaaPMRPluginConfig.getPortNumber() == null) { - validationResponse.addErrorMessage( - "port Number", - "DMaaPMRPluginConfig - host port number field is undefined: " + baseDMaaPMRPluginConfig); - } - - if (ValidationUtils.isEmpty(baseDMaaPMRPluginConfig.getTopicName())) { - validationResponse.addErrorMessage( - "topic Name", - "DMaaPMRSourcePluginConfig - topic name field is undefined: " + baseDMaaPMRPluginConfig); - } - - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java deleted file mode 100644 index c9b1df6..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidator.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -/** - * Validates plugin config values in {@link DMaaPMRSinkPluginConfig} - *

- * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMRSinkPluginConfigValidator extends BaseDMaaPMRPluginConfigValidator { - - private static final long serialVersionUID = 1L; - - /** - * Validates plugin config values in {@link DMaaPMRSinkPluginConfig} - * - * @param sinkPluginConfig Sink Plugin Config - * - * @return Validation response containing validation errors if any - */ - @Override - public GenericValidationResponse validateAppSettings( - final DMaaPMRSinkPluginConfig sinkPluginConfig) { - - // validate settings in BaseDMaaPMRPluginConfig - final GenericValidationResponse validationResponse = - super.validateAppSettings(sinkPluginConfig); - - if (ValidationUtils.isEmpty(sinkPluginConfig.getMessageColumnName())) { - validationResponse.addErrorMessage("messageColumn Name", - "DMaaPMRSinkPluginConfig - message column name field is undefined: " + sinkPluginConfig); - } - - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java deleted file mode 100644 index 15a7583..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidator.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -/** - * Validates plugin config values in {@link DMaaPMRSourcePluginConfig} - *

- * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMRSourcePluginConfigValidator extends BaseDMaaPMRPluginConfigValidator { - - private static final long serialVersionUID = 1L; - - /** - * Validates plugin config values in {@link DMaaPMRSourcePluginConfig} - * - * @param sourcePluginConfig Source Plugin Config - * - * @return Validation response containing validation errors if any - */ - @Override - public GenericValidationResponse validateAppSettings( - final DMaaPMRSourcePluginConfig sourcePluginConfig) { - - // validate settings in BaseDMaaPMRPluginConfig - final GenericValidationResponse validationResponse = - super.validateAppSettings(sourcePluginConfig); - - if (sourcePluginConfig.getPollingInterval() == null) { - validationResponse.addErrorMessage( - "port Number", - "DMaaPMRSourcePluginConfig - polling interval is undefined: " + sourcePluginConfig); - } - - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java deleted file mode 100644 index 428fedb..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidator.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import co.cask.cdap.api.data.schema.Schema; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter.JsonPathFilterPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -/** - * Validator to validate {@link JsonPathFilterPluginConfig} - *

- * @author Rajiv Singla . Creation Date: 3/2/2017. - */ -public class JsonPathFilterPluginConfigValidator implements CDAPAppSettingsValidator> { - - private static final long serialVersionUID = 1L; - - @Override - public GenericValidationResponse validateAppSettings( - final JsonPathFilterPluginConfig jsonPathFilterPluginConfig) { - - final GenericValidationResponse validationResponse = - new GenericValidationResponse<>(); - - final String jsonFilterMappings = jsonPathFilterPluginConfig.getJsonFilterMappings(); - if (ValidationUtils.isEmpty(jsonFilterMappings)) { - - validationResponse.addErrorMessage("JsonFilterMappings", "Json Filter Mappings must be present"); - } - - - final String matchedField = jsonPathFilterPluginConfig.getOutputSchemaFieldName(); - final String outputSchemaJson = jsonPathFilterPluginConfig.getSchema(); - - if (ValidationUtils.isEmpty(outputSchemaJson)) { - - validationResponse.addErrorMessage("output schema", "Output schema is not present"); - - } else { - - // validate matched output field type is boolean - if (matchedField != null && - !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, matchedField, Schema.Type.BOOLEAN)) { - validationResponse.addErrorMessage("OutputSchemaFieldName", - String.format( - "OutputSchemaFieldName: %s must be marked as boolean type", matchedField)); - } - - // validate matched output field type is nullable - if (matchedField != null && - !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, matchedField, Schema.Type.NULL)) { - validationResponse.addErrorMessage("OutputSchemaFieldName", - String.format( - "OutputSchemaFieldName: %s must be marked as nullable type", matchedField)); - } - - } - - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java b/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java deleted file mode 100644 index 97f3f24..0000000 --- a/dcae-analytics-cdap-plugins/src/main/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidator.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import co.cask.cdap.api.data.schema.Schema; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.utils.CDAPPluginUtils; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -/** - * Validator that validate {@link SimpleTCAPluginConfig} - *

- * @author Rajiv Singla . Creation Date: 2/21/2017. - */ -public class SimpleTCAPluginConfigValidator implements CDAPAppSettingsValidator> { - - private static final long serialVersionUID = 1L; - - @Override - public GenericValidationResponse validateAppSettings( - final SimpleTCAPluginConfig tcaPluginConfig) { - - final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); - - if (ValidationUtils.isEmpty(tcaPluginConfig.getVesMessageFieldName())) { - validationResponse.addErrorMessage("vesMessageFieldName", - "Missing VES Message Field Name from plugin incoming schema"); - } - - if (ValidationUtils.isEmpty(tcaPluginConfig.getPolicyJson())) { - validationResponse.addErrorMessage("policyJson", - "Missing tca Policy Json"); - } - - final String alertFieldValue = tcaPluginConfig.getAlertFieldName(); - final String alertFieldName = "alertFieldName"; - if (ValidationUtils.isEmpty(alertFieldValue)) { - validationResponse.addErrorMessage(alertFieldName, - "Missing alert Field Name that will be placed in plugin outgoing schema"); - } - - if (ValidationUtils.isEmpty(tcaPluginConfig.getMessageTypeFieldName())) { - validationResponse.addErrorMessage("messageTypeField", - "Missing message Type Field Name that will be placed in plugin outgoing schema"); - } - - - final String outputSchemaJson = tcaPluginConfig.getSchema(); - if (ValidationUtils.isEmpty(outputSchemaJson)) { - validationResponse.addErrorMessage("output schema", "Output schema is not present"); - } else { - // validate output schema - alert field name is of type string - if (alertFieldValue != null && - !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, alertFieldValue, Schema.Type.STRING)) { - validationResponse.addErrorMessage(alertFieldName, - String.format( - "Alert Field Name: %s must be String type", alertFieldValue)); - } - // validate output schema - alert field name is nullable - if (alertFieldValue != null && - !CDAPPluginUtils.validateSchemaFieldType(outputSchemaJson, alertFieldValue, Schema.Type.NULL)) { - validationResponse.addErrorMessage(alertFieldName, - String.format( - "Alert Field Name: %s must be marked as nullable type", alertFieldValue)); - } - } - - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java new file mode 100644 index 0000000..e9b4e6f --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java @@ -0,0 +1,238 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins; + +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.StageMetrics; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Suppliers; +import org.apache.hadoop.conf.Configuration; +import org.onap.dcae.apod.analytics.cdap.common.CDAPPluginConstants; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSinkPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter.TestJsonPathFilterPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.TestSimpleTCAPluginConfig; +import org.onap.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; + +import java.io.IOException; +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author Rajiv Singla . Creation Date: 1/23/2017. + */ +public abstract class BaseAnalyticsCDAPPluginsUnitTest extends BaseDCAEAnalyticsUnitTest { + + protected static final ObjectMapper ANALYTICS_MODEL_OBJECT_MAPPER = + Suppliers.memoize(new AnalyticsModelObjectMapperSupplier()).get(); + + protected static final String TCA_POLICY_JSON_FILE_LOCATION = "data/json/policy/tca_policy.json"; + protected static final String CEF_MESSAGE_JSON_FILE_LOCATION = "data/json/cef/cef_message.json"; + protected static final String CEF_NON_COMPLIANT_MESSAGE_JSON_FILE_LOCATION = + "data/json/cef/cef_message_with_threshold_violation.json"; + + + protected static final String DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME = "testDMaaPMRSource"; + protected static final String DMAAP_MR_SOURCE_PLUGIN_HOST_NAME = "dcae-msrt-mtl1-ftl.homer.com"; + protected static final Integer DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER = 3905; + protected static final String DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME = "com.dcae.dmaap.FTL.DcaeTestVESSub"; + protected static final Integer DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL = 1000; + protected static final String DMAAP_MR_SOURCE_PLUGIN_PROTOCOL = "https"; + protected static final String DMAAP_MR_SOURCE_PLUGIN_USERNAME = "username"; + protected static final String DMAAP_MR_SOURCE_PLUGIN_PASSWORD = "password"; + protected static final String DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE = "application/json"; + protected static final String DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP = "G1"; + protected static final String DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID = "C1"; + protected static final Integer DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT = 100; + protected static final Integer DMAAP_MR_SOURCE_PLUGIN_TIMEOUT = 10000; + + + protected static final String DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME = "testDMaaPMRSINK"; + protected static final String DMAAP_MR_SINK_PLUGIN_HOST_NAME = "dcae-msrt-mtl1-ftl.homer.com"; + protected static final Integer DMAAP_MR_SINK_PLUGIN_PORT_NUMBER = 3905; + protected static final String DMAAP_MR_SINK_PLUGIN_TOPIC_NAME = "com.dcae.dmaap.FTL.DcaeTestVESPub"; + protected static final String DMAAP_MR_SINK_PLUGIN_PROTOCOL = "https"; + protected static final String DMAAP_MR_SINK_PLUGIN_USERNAME = "username"; + protected static final String DMAAP_MR_SINK_PLUGIN_PASSWORD = "password"; + protected static final String DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE = "application/json"; + protected static final String DMAAP_MR_SINK_MESSAGE_COLUMN_NAME = "message"; + protected static final Integer DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE = 10; + protected static final Integer DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE = 100; + + protected static final String VES_MESSAGE_FIELD_NAME = "message"; + protected static final String TCA_PLUGIN_ALERT_FIELD_NAME = "alert"; + protected static final String TCA_PLUGIN_MESSAGE_TYPE_FIELD_NAME = "tcaMessageType"; + + + protected static final String JSON_PATH_FILTER_PLUGIN_REFERENCE_NAME = "JsonPathFilter"; + protected static final String JSON_PATH_FILTER_PLUGIN_INCOMING_JSON_FIELD_NAME = "message"; + protected static final String JSON_PATH_FILTER_PLUGIN_OUTPUT_SCHEMA_FILED_NAME = "filterMatched"; + protected static final String JSON_PATH_FILTER_PLUGIN_JSON_FILTER_MAPPINGS = + "$.event.commonEventHeader.domain:measurementsForVfScaling," + + "$.event.commonEventHeader.eventName:vLoadBalancer;vFirewall"; + protected static final String JSON_PATH_FILTER_PLUGIN_JSON_FILTER_OUTPUT_SCHEMA = + "{\"type\":\"record\"," + + "\"name\":\"etlSchemaBody\",\"fields\":" + + "[" + + "{\"name\":\"ts\",\"type\":\"long\"}," + + "{\"name\":\"filterMatched\",\"type\":[\"boolean\",\"null\"]}," + + "{\"name\":\"responseCode\",\"type\":\"int\"}," + + "{\"name\":\"responseMessage\",\"type\":\"string\"}," + + "{\"name\":\"message\",\"type\":\"string\"}" + + "]" + + "}"; + + protected static class MockStageMetrics implements StageMetrics, Serializable { + + @Override + public void count(String metricName, int delta) { + LOG.debug("Mocking metric count, MetricName: {}, Delta: {}", metricName, delta); + } + + @Override + public void gauge(String metricName, long value) { + LOG.debug("Mocking metric guage, MetricName: {}, Value: {}", metricName, value); + } + + @Override + public void pipelineCount(String metricName, int delta) { + LOG.debug("Mocking metric pipelineCount, MetricName: {}, Delta: {}", metricName, delta); + } + + @Override + public void pipelineGauge(String metricName, long value) { + LOG.debug("Mocking metric guage, pipelineGauge: {}, Value: {}", metricName, value); + } + } + + protected static TestDMaaPMRSourcePluginConfig getTestDMaaPMRSourcePluginConfig() { + final TestDMaaPMRSourcePluginConfig sourcePluginConfig = new TestDMaaPMRSourcePluginConfig(); + sourcePluginConfig.setReferenceName(DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME); + sourcePluginConfig.setHostName(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME); + sourcePluginConfig.setPortNumber(DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER); + sourcePluginConfig.setTopicName(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME); + sourcePluginConfig.setPollingInterval(DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL); + sourcePluginConfig.setProtocol(DMAAP_MR_SOURCE_PLUGIN_PROTOCOL); + sourcePluginConfig.setUserName(DMAAP_MR_SOURCE_PLUGIN_USERNAME); + sourcePluginConfig.setUserPassword(DMAAP_MR_SOURCE_PLUGIN_PASSWORD); + sourcePluginConfig.setContentType(DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE); + sourcePluginConfig.setConsumerGroup(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP); + sourcePluginConfig.setConsumerId(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID); + sourcePluginConfig.setMessageLimit(DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT); + sourcePluginConfig.setTimeoutMS(DMAAP_MR_SOURCE_PLUGIN_TIMEOUT); + return sourcePluginConfig; + } + + protected static TestDMaaPMRSinkPluginConfig getTestDMaaPMRSinkPluginConfig() { + final TestDMaaPMRSinkPluginConfig sinkPluginConfig = new TestDMaaPMRSinkPluginConfig(); + sinkPluginConfig.setReferenceName(DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME); + sinkPluginConfig.setHostName(DMAAP_MR_SINK_PLUGIN_HOST_NAME); + sinkPluginConfig.setPortNumber(DMAAP_MR_SINK_PLUGIN_PORT_NUMBER); + sinkPluginConfig.setTopicName(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME); + sinkPluginConfig.setProtocol(DMAAP_MR_SINK_PLUGIN_PROTOCOL); + sinkPluginConfig.setUserName(DMAAP_MR_SINK_PLUGIN_USERNAME); + sinkPluginConfig.setUserPassword(DMAAP_MR_SINK_PLUGIN_PASSWORD); + sinkPluginConfig.setContentType(DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE); + sinkPluginConfig.setMessageColumnName(DMAAP_MR_SINK_MESSAGE_COLUMN_NAME); + sinkPluginConfig.setMaxBatchSize(DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE); + sinkPluginConfig.setMaxRecoveryQueueSize(DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE); + return sinkPluginConfig; + } + + + protected static Configuration getTestConfiguration() { + final Configuration configuration = new Configuration(); + final Map sinkConfigurationMap = createSinkConfigurationMap(); + for (Map.Entry property : sinkConfigurationMap.entrySet()) { + configuration.set(property.getKey(), property.getValue()); + } + return configuration; + } + + protected static Map createSinkConfigurationMap() { + + Map sinkConfig = new LinkedHashMap<>(); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.HOST_NAME, DMAAP_MR_SINK_PLUGIN_HOST_NAME); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.TOPIC_NAME, DMAAP_MR_SINK_PLUGIN_TOPIC_NAME); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.PORT_NUMBER, + DMAAP_MR_SINK_PLUGIN_PORT_NUMBER.toString()); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.PROTOCOL, DMAAP_MR_SINK_PLUGIN_PROTOCOL); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.USER_NAME, DMAAP_MR_SINK_PLUGIN_USERNAME); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.USER_PASS, DMAAP_MR_SINK_PLUGIN_PASSWORD); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE, + DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE, + DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE.toString()); + sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE, + DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE.toString()); + return sinkConfig; + } + + protected static Schema getDMaaPMRSinkTestSchema() { + return Schema.recordOf( + "DMaaPMRSinkTestSchema", + Schema.Field.of("message", Schema.of(Schema.Type.STRING)), + Schema.Field.of("field1", Schema.of(Schema.Type.STRING)) + ); + } + + + protected static TestSimpleTCAPluginConfig getTestSimpleTCAPluginConfig() { + final String policyJson; + try { + policyJson = fromStream(TCA_POLICY_JSON_FILE_LOCATION); + } catch (IOException e) { + throw new RuntimeException("Error while parsing policy", e); + } + return new TestSimpleTCAPluginConfig(VES_MESSAGE_FIELD_NAME, policyJson, TCA_PLUGIN_ALERT_FIELD_NAME, + TCA_PLUGIN_MESSAGE_TYPE_FIELD_NAME, getSimpleTCAPluginInputSchema().toString(), false); + } + + protected static Schema getSimpleTCAPluginInputSchema() { + return Schema.recordOf( + "TestSimpleTCAPluginInputSchema", + Schema.Field.of("message", Schema.of(Schema.Type.STRING)), + Schema.Field.of("inputField1", Schema.nullableOf(Schema.of(Schema.Type.STRING))), + Schema.Field.of("inputField2", Schema.nullableOf(Schema.of(Schema.Type.STRING))) + ); + } + + protected static Schema getJsonFilterPluginInputSchema() { + return Schema.recordOf( + "TestJsonFilterInputSchema", + Schema.Field.of("ts", Schema.of(Schema.Type.LONG)), + Schema.Field.of("responseCode", Schema.of(Schema.Type.INT)), + Schema.Field.of("responseMessage", Schema.of(Schema.Type.STRING)), + Schema.Field.of("message", Schema.of(Schema.Type.STRING)) + ); + } + + protected static TestJsonPathFilterPluginConfig getJsonPathFilterPluginConfig() { + return new TestJsonPathFilterPluginConfig(JSON_PATH_FILTER_PLUGIN_REFERENCE_NAME, + JSON_PATH_FILTER_PLUGIN_INCOMING_JSON_FIELD_NAME, + JSON_PATH_FILTER_PLUGIN_OUTPUT_SCHEMA_FILED_NAME, + JSON_PATH_FILTER_PLUGIN_JSON_FILTER_MAPPINGS, + JSON_PATH_FILTER_PLUGIN_JSON_FILTER_OUTPUT_SCHEMA); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java new file mode 100644 index 0000000..79c7698 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java @@ -0,0 +1,77 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSinkPluginConfig; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + +import java.util.Map; + +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMROutputFormatProviderTest extends BaseAnalyticsCDAPPluginsUnitTest { + + + @Test + public void testDMaaPMROutputFormatProviderWhenConfigIsMissingNonRequiredValues() throws Exception { + final TestDMaaPMRSinkPluginConfig sinkPluginConfig = new TestDMaaPMRSinkPluginConfig(); + sinkPluginConfig.setHostName(DMAAP_MR_SINK_PLUGIN_HOST_NAME); + sinkPluginConfig.setTopicName(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME); + final DMaaPMROutputFormatProvider dMaaPMROutputFormatProvider = + new DMaaPMROutputFormatProvider(sinkPluginConfig); + final Map outputFormatConfiguration = + dMaaPMROutputFormatProvider.getOutputFormatConfiguration(); + final String hostName = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.HOST_NAME); + assertTrue(hostName.equals(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); + final String topicName = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.TOPIC_NAME); + assertTrue(topicName.equals(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); + final String portNumber = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER); + assertTrue(portNumber.equals(AnalyticsConstants.DEFAULT_PORT_NUMBER.toString())); + final String protocol = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.PROTOCOL); + assertTrue(protocol.equals(AnalyticsConstants.DEFAULT_PROTOCOL)); + } + + @Test + public void testGetOutputFormatClassName() throws Exception { + final DMaaPMROutputFormatProvider dMaaPMROutputFormatProvider = + new DMaaPMROutputFormatProvider(getTestDMaaPMRSinkPluginConfig()); + final String outputFormatClassName = dMaaPMROutputFormatProvider.getOutputFormatClassName(); + assertTrue(outputFormatClassName.equals(DMaaPMROutputFormat.class.getName())); + } + + @Test + public void testGetOutputFormatConfiguration() throws Exception { + final TestDMaaPMRSinkPluginConfig testDMaaPMRSinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); + final DMaaPMROutputFormatProvider dMaaPMROutputFormatProvider = + new DMaaPMROutputFormatProvider(testDMaaPMRSinkPluginConfig); + final Map outputFormatConfiguration = + dMaaPMROutputFormatProvider.getOutputFormatConfiguration(); + assertTrue(outputFormatConfiguration.size() == 9); + + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java new file mode 100644 index 0000000..4b111a3 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java @@ -0,0 +1,75 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import org.apache.hadoop.io.NullWritable; +import org.apache.hadoop.mapreduce.JobContext; +import org.apache.hadoop.mapreduce.OutputCommitter; +import org.apache.hadoop.mapreduce.RecordWriter; +import org.apache.hadoop.mapreduce.TaskAttemptContext; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMROutputFormatTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private DMaaPMROutputFormat dMaaPMROutputFormat; + + @Before + public void before() { + dMaaPMROutputFormat = new DMaaPMROutputFormat(); + } + + @Test + public void testGetRecordWriter() throws Exception { + final TaskAttemptContext taskAttemptContext = Mockito.mock(TaskAttemptContext.class); + when(taskAttemptContext.getConfiguration()).thenReturn(getTestConfiguration()); + final RecordWriter recordWriter = dMaaPMROutputFormat.getRecordWriter(taskAttemptContext); + assertNotNull(recordWriter); + final JobContext jobContext = Mockito.mock(JobContext.class); + dMaaPMROutputFormat.checkOutputSpecs(jobContext); + } + + @Test + public void testGetOutputCommitter() throws Exception { + final TaskAttemptContext taskAttemptContext = Mockito.mock(TaskAttemptContext.class); + final OutputCommitter outputCommitter = dMaaPMROutputFormat.getOutputCommitter(taskAttemptContext); + assertTrue(outputCommitter.getClass().equals(DMaaPMROutputFormat.NoOpOutputCommitter.class)); + final JobContext jobContext = Mockito.mock(JobContext.class); + outputCommitter.setupJob(jobContext); + outputCommitter.setupTask(taskAttemptContext); + assertFalse(outputCommitter.needsTaskCommit(taskAttemptContext)); + outputCommitter.commitJob(jobContext); + outputCommitter.commitTask(taskAttemptContext); + outputCommitter.abortTask(taskAttemptContext); + + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java new file mode 100644 index 0000000..3d79057 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import org.apache.hadoop.mapreduce.TaskAttemptContext; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; + +import java.util.Arrays; + +import static org.mockito.Mockito.times; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMRRecordWriterTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private DMaaPMRPublisher publisher; + private DMaaPMRRecordWriter dMaaPMRRecordWriter; + + @Before + public void before() { + publisher = Mockito.mock(DMaaPMRPublisher.class); + dMaaPMRRecordWriter = new DMaaPMRRecordWriter(publisher); + } + + @Test + public void testWrite() throws Exception { + final String testMessage = "test Message"; + dMaaPMRRecordWriter.write(testMessage, null); + Mockito.verify(publisher, times(1)).publish(Arrays.asList(testMessage)); + } + + @Test + public void testClose() throws Exception { + final TaskAttemptContext taskAttemptContext = Mockito.mock(TaskAttemptContext.class); + dMaaPMRRecordWriter.close(taskAttemptContext); + Mockito.verify(publisher, times(1)).flush(); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java new file mode 100644 index 0000000..d649e6e --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java @@ -0,0 +1,95 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.Emitter; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.StageConfigurer; +import co.cask.cdap.etl.api.batch.BatchSinkContext; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMRSinkTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private DMaaPMRSink dMaaPMRSink; + + @Before + public void before() { + dMaaPMRSink = new DMaaPMRSink(getTestDMaaPMRSinkPluginConfig()); + } + + @Test + public void testConfigurePipeline() throws Exception { + final PipelineConfigurer pipelineConfigurer = Mockito.mock(PipelineConfigurer.class); + final StageConfigurer stageConfigurer = Mockito.mock(StageConfigurer.class); + when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); + when(stageConfigurer.getInputSchema()).thenReturn(getDMaaPMRSinkTestSchema()); + dMaaPMRSink.configurePipeline(pipelineConfigurer); + verify(stageConfigurer, times(1)).getInputSchema(); + } + + @Test(expected = CDAPSettingsException.class) + public void testConfigurePipelineWithInvalidSchema() throws Exception { + final PipelineConfigurer pipelineConfigurer = Mockito.mock(PipelineConfigurer.class); + final StageConfigurer stageConfigurer = Mockito.mock(StageConfigurer.class); + when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); + when(stageConfigurer.getInputSchema()).thenReturn(Schema.recordOf( + "DMaaPMRSinkInvalidSchema", + Schema.Field.of("message1", Schema.of(Schema.Type.STRING)), + Schema.Field.of("field1", Schema.of(Schema.Type.STRING)) + )); + dMaaPMRSink.configurePipeline(pipelineConfigurer); + } + + @Test + public void testPrepareRun() throws Exception { + final BatchSinkContext batchSinkContext = Mockito.mock(BatchSinkContext.class); + dMaaPMRSink.prepareRun(batchSinkContext); + } + + @Test + @SuppressWarnings("unchecked") + public void testTransform() throws Exception { + final StructuredRecord structuredRecord = Mockito.mock(StructuredRecord.class); + final Emitter emitter = Mockito.mock(Emitter.class); + final String incomingTestMessage = "test message"; + when(structuredRecord.get( + eq(getTestDMaaPMRSinkPluginConfig().getMessageColumnName()))).thenReturn(incomingTestMessage); + doNothing().when(emitter).emit(any()); + dMaaPMRSink.transform(structuredRecord, emitter); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java new file mode 100644 index 0000000..5c80baa --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java @@ -0,0 +1,80 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 1/23/2017. + */ +public class DMaaPMRSinkPluginConfigTest extends BaseAnalyticsCDAPPluginsUnitTest { + + @Test + public void testDMaaPMRSinkPluginConfigDefaults() throws Exception { + final DMaaPMRSinkPluginConfig sinkPluginConfig = new DMaaPMRSinkPluginConfig + (DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME, DMAAP_MR_SINK_PLUGIN_HOST_NAME, + DMAAP_MR_SINK_PLUGIN_TOPIC_NAME, DMAAP_MR_SINK_MESSAGE_COLUMN_NAME); + + assertThat(sinkPluginConfig.getReferenceName(), is(DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME)); + assertThat(sinkPluginConfig.getHostName(), is(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); + assertThat(sinkPluginConfig.getTopicName(), is(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); + assertThat(sinkPluginConfig.getMessageColumnName(), is(DMAAP_MR_SINK_MESSAGE_COLUMN_NAME)); + assertNull(sinkPluginConfig.getPortNumber()); + assertNull(sinkPluginConfig.getProtocol()); + assertNull(sinkPluginConfig.getUserName()); + assertNull(sinkPluginConfig.getUserPassword()); + assertNull(sinkPluginConfig.getContentType()); + assertNull(sinkPluginConfig.getMaxBatchSize()); + assertNull(sinkPluginConfig.getMaxRecoveryQueueSize()); + } + + @Test + public void testDMaaPMRSinkPluginConfigCustom() throws Exception { + final DMaaPMRSinkPluginConfig sinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); + assertThat(sinkPluginConfig.getReferenceName(), is(DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME)); + assertThat(sinkPluginConfig.getHostName(), is(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); + assertThat(sinkPluginConfig.getTopicName(), is(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); + assertThat(sinkPluginConfig.getPortNumber(), is(DMAAP_MR_SINK_PLUGIN_PORT_NUMBER)); + assertThat(sinkPluginConfig.getProtocol(), is(DMAAP_MR_SINK_PLUGIN_PROTOCOL)); + assertThat(sinkPluginConfig.getUserName(), is(DMAAP_MR_SINK_PLUGIN_USERNAME)); + assertThat(sinkPluginConfig.getUserPassword(), is(DMAAP_MR_SINK_PLUGIN_PASSWORD)); + assertThat(sinkPluginConfig.getContentType(), is(DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE)); + assertThat(sinkPluginConfig.getMessageColumnName(), is(DMAAP_MR_SINK_MESSAGE_COLUMN_NAME)); + assertThat(sinkPluginConfig.getMaxBatchSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE)); + assertThat(sinkPluginConfig.getMaxRecoveryQueueSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE)); + } + + @Test + public void testValidToString() throws Exception { + final TestDMaaPMRSinkPluginConfig sinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); + assertNotNull(sinkPluginConfig.toString()); + assertTrue(sinkPluginConfig.toString().contains(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); + } + + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java new file mode 100644 index 0000000..bb4f7f6 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + + +/** + * @author Rajiv Singla . Creation Date: 1/23/2017. + */ +public class DMaaPMRSourcePluginConfigTest extends BaseAnalyticsCDAPPluginsUnitTest { + + @Test + public void testDMaaPMRSourcePluginConfigDefaults() throws Exception { + final DMaaPMRSourcePluginConfig sourcePluginConfig = new DMaaPMRSourcePluginConfig + (DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME, DMAAP_MR_SOURCE_PLUGIN_HOST_NAME, + DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME, DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL); + + assertThat(sourcePluginConfig.getReferenceName(), is(DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME)); + assertThat(sourcePluginConfig.getHostName(), is(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); + assertThat(sourcePluginConfig.getTopicName(), is(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME)); + assertThat(sourcePluginConfig.getPollingInterval(), is(DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL)); + assertNull(sourcePluginConfig.getPortNumber()); + assertNull(sourcePluginConfig.getProtocol()); + assertNull(sourcePluginConfig.getUserName()); + assertNull(sourcePluginConfig.getUserPassword()); + assertNull(sourcePluginConfig.getContentType()); + assertNull(sourcePluginConfig.getConsumerGroup()); + assertNull(sourcePluginConfig.getConsumerId()); + assertNull(sourcePluginConfig.getMessageLimit()); + assertNull(sourcePluginConfig.getTimeoutMS()); + } + + @Test + public void testDMaaPMRSourcePluginConfigCustom() throws Exception { + final TestDMaaPMRSourcePluginConfig sourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + assertThat(sourcePluginConfig.getReferenceName(), is(DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME)); + assertThat(sourcePluginConfig.getHostName(), is(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); + assertThat(sourcePluginConfig.getTopicName(), is(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME)); + assertThat(sourcePluginConfig.getPollingInterval(), is(DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL)); + assertThat(sourcePluginConfig.getPortNumber(), is(DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER)); + assertThat(sourcePluginConfig.getProtocol(), is(DMAAP_MR_SOURCE_PLUGIN_PROTOCOL)); + assertThat(sourcePluginConfig.getUserName(), is(DMAAP_MR_SOURCE_PLUGIN_USERNAME)); + assertThat(sourcePluginConfig.getUserPassword(), is(DMAAP_MR_SOURCE_PLUGIN_PASSWORD)); + assertThat(sourcePluginConfig.getContentType(), is(DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE)); + assertThat(sourcePluginConfig.getConsumerGroup(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP)); + assertThat(sourcePluginConfig.getConsumerId(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID)); + assertThat(sourcePluginConfig.getMessageLimit(), is(DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT)); + assertThat(sourcePluginConfig.getTimeoutMS(), is(DMAAP_MR_SOURCE_PLUGIN_TIMEOUT)); + } + + @Test + public void testValidToString() throws Exception { + final TestDMaaPMRSourcePluginConfig sourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + assertNotNull(sourcePluginConfig.toString()); + assertTrue(sourcePluginConfig.toString().contains(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java new file mode 100644 index 0000000..8cba5e1 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java @@ -0,0 +1,76 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; + +import javax.annotation.Nullable; + +/** + * Test {@link DMaaPMRSinkPluginConfig} for testing purposes only + *

+ * @author Rajiv Singla . Creation Date: 1/23/2017. + */ +public class TestDMaaPMRSinkPluginConfig extends DMaaPMRSinkPluginConfig { + + public void setReferenceName(String referenceName) { + this.referenceName = referenceName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public void setPortNumber(@Nullable Integer portNumber) { + this.portNumber = portNumber; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public void setProtocol(@Nullable String protocol) { + this.protocol = protocol; + } + + public void setUserName(@Nullable String userName) { + this.userName = userName; + } + + public void setUserPassword(@Nullable String userPassword) { + this.userPassword = userPassword; + } + + public void setContentType(@Nullable String contentType) { + this.contentType = contentType; + } + + public void setMaxBatchSize(@Nullable Integer maxBatchSize) { + this.maxBatchSize = maxBatchSize; + } + + public void setMaxRecoveryQueueSize(@Nullable Integer maxRecoveryQueueSize) { + this.maxRecoveryQueueSize = maxRecoveryQueueSize; + } + + public void setMessageColumnName(String messageColumnName) { + this.messageColumnName = messageColumnName; + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java new file mode 100644 index 0000000..c33f313 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; + +import javax.annotation.Nullable; + +/** + * Test {@link DMaaPMRSourcePluginConfig} for testing purposes only + *

+ * @author Rajiv Singla . Creation Date: 1/23/2017. + */ +public class TestDMaaPMRSourcePluginConfig extends DMaaPMRSourcePluginConfig { + + public void setReferenceName(String referenceName) { + this.referenceName = referenceName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public void setPortNumber(@Nullable Integer portNumber) { + this.portNumber = portNumber; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public void setPollingInterval(Integer pollingInterval) { + this.pollingInterval = pollingInterval; + } + + public void setProtocol(@Nullable String protocol) { + this.protocol = protocol; + } + + public void setUserName(@Nullable String userName) { + this.userName = userName; + } + + public void setUserPassword(@Nullable String userPassword) { + this.userPassword = userPassword; + } + + public void setContentType(@Nullable String contentType) { + this.contentType = contentType; + } + + public void setConsumerId(@Nullable String consumerId) { + this.consumerId = consumerId; + } + + public void setConsumerGroup(@Nullable String consumerGroup) { + this.consumerGroup = consumerGroup; + } + + public void setTimeoutMS(@Nullable Integer timeoutMS) { + this.timeoutMS = timeoutMS; + } + + public void setMessageLimit(@Nullable Integer messageLimit) { + this.messageLimit = messageLimit; + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java new file mode 100644 index 0000000..efdd7ae --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java @@ -0,0 +1,50 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter; + +/** + * @author Rajiv Singla . Creation Date: 3/3/2017. + */ +public class TestJsonPathFilterPluginConfig extends JsonPathFilterPluginConfig { + + public TestJsonPathFilterPluginConfig(final String referenceName, final String incomingJsonFieldName, + final String outputSchemaFieldName, final String jsonFilterMappings, + final String schema) { + super(referenceName, incomingJsonFieldName, outputSchemaFieldName, jsonFilterMappings, schema); + } + + + public void setIncomingJsonFieldName(String incomingJsonFieldName) { + this.incomingJsonFieldName = incomingJsonFieldName; + } + + public void setOutputSchemaFieldName(String outputSchemaFieldName) { + this.outputSchemaFieldName = outputSchemaFieldName; + } + + public void setJsonFilterMappings(String jsonFilterMappings) { + this.jsonFilterMappings = jsonFilterMappings; + } + + public void setSchema(String schema) { + this.schema = schema; + } +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java new file mode 100644 index 0000000..6bf3252 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java @@ -0,0 +1,56 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca; + +/** + * @author Rajiv Singla . Creation Date: 2/17/2017. + */ +public class TestSimpleTCAPluginConfig extends SimpleTCAPluginConfig { + + public TestSimpleTCAPluginConfig(String vesMessageFieldName, String policyJson, String alertFieldName, + String messageTypeFieldName, String schema, Boolean enableAlertCEFFormat) { + super(vesMessageFieldName, policyJson, alertFieldName, messageTypeFieldName, schema, enableAlertCEFFormat); + } + + public void setVesMessageFieldName(String vesMessageFieldName) { + this.vesMessageFieldName = vesMessageFieldName; + } + + public void setPolicyJson(String policyJson) { + this.policyJson = policyJson; + } + + public void setAlertFieldName(String alertFieldName) { + this.alertFieldName = alertFieldName; + } + + public void setMessageTypeFieldName(String messageTypeFieldName) { + this.messageTypeFieldName = messageTypeFieldName; + } + + public void setSchema(String schema) { + this.schema = schema; + } + + public void setEnableAlertCEFFormat(Boolean enableAlertCEFFormat) { + this.enableAlertCEFFormat = enableAlertCEFFormat; + } +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java new file mode 100644 index 0000000..d14e184 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java @@ -0,0 +1,63 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap; + +import co.cask.cdap.api.data.schema.Schema; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; + +import java.util.LinkedList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 1/25/2017. + */ +public class DMaaPSourceOutputSchemaTest extends BaseAnalyticsCDAPPluginsUnitTest { + + + @Test + public void testGetSchemaColumnName() throws Exception { + assertThat(DMaaPSourceOutputSchema.TIMESTAMP.getSchemaColumnName(), is("ts")); + assertThat(DMaaPSourceOutputSchema.RESPONSE_CODE.getSchemaColumnName(), is("responseCode")); + assertThat(DMaaPSourceOutputSchema.RESPONSE_MESSAGE.getSchemaColumnName(), is("responseMessage")); + assertThat(DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName(), is("message")); + } + + @Test + public void testGetSchema() throws Exception { + final Schema schema = DMaaPSourceOutputSchema.getSchema(); + final List fields = schema.getFields(); + final List fieldNames = new LinkedList<>(); + for (Schema.Field field : fields) { + fieldNames.add(field.getName()); + } + assertThat(fieldNames, hasItems( + DMaaPSourceOutputSchema.TIMESTAMP.getSchemaColumnName(), + DMaaPSourceOutputSchema.RESPONSE_CODE.getSchemaColumnName(), + DMaaPSourceOutputSchema.RESPONSE_MESSAGE.getSchemaColumnName(), + DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName())); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java new file mode 100644 index 0000000..762e65a --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java @@ -0,0 +1,229 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.it; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.api.dataset.table.Table; +import co.cask.cdap.api.plugin.PluginClass; +import co.cask.cdap.api.plugin.PluginPropertyField; +import co.cask.cdap.common.utils.Tasks; +import co.cask.cdap.datapipeline.DataPipelineApp; +import co.cask.cdap.datapipeline.SmartWorkflow; +import co.cask.cdap.etl.api.batch.SparkCompute; +import co.cask.cdap.etl.mock.batch.MockSink; +import co.cask.cdap.etl.mock.batch.MockSource; +import co.cask.cdap.etl.mock.test.HydratorTestBase; +import co.cask.cdap.etl.proto.v2.ETLBatchConfig; +import co.cask.cdap.etl.proto.v2.ETLPlugin; +import co.cask.cdap.etl.proto.v2.ETLStage; +import co.cask.cdap.proto.artifact.AppRequest; +import co.cask.cdap.proto.artifact.ArtifactSummary; +import co.cask.cdap.proto.id.ApplicationId; +import co.cask.cdap.proto.id.ArtifactId; +import co.cask.cdap.proto.id.NamespaceId; +import co.cask.cdap.test.ApplicationManager; +import co.cask.cdap.test.DataSetManager; +import co.cask.cdap.test.WorkflowManager; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.sparkcompute.tca.SimpleTCAPlugin; +import org.onap.dcae.apod.analytics.common.validation.DCAEValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URI; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +/** + * Integration Test which used CDAP Hydrator Test Base to Test Simple TCA Plugin + * + * @author Rajiv Singla . Creation Date: 2/17/2017. + */ +public class SimpleTCAPluginCDAPIT extends HydratorTestBase { + + private static final Logger LOG = LoggerFactory.getLogger(SimpleTCAPluginCDAPIT.class); + + private static final String CDAP_PLUGIN_VERSION = "3.0-SNAPSHOT"; + private static final String CDAP_PLUGIN_ARTIFACT_NAME = "dcae-analytics-cdap-plugins"; + + protected static final ArtifactId DATAPIPELINE_ARTIFACT_ID = NamespaceId.DEFAULT.artifact("data-pipeline", + "4.0.0"); + protected static final ArtifactSummary DATAPIPELINE_ARTIFACT = new ArtifactSummary("data-pipeline", "4.0.0"); + + private static Schema sourceSchema = Schema.recordOf("CEFMessageSourceSchema", + Schema.Field.of("message", Schema.of(Schema.Type.STRING)) + ); + + final Schema outputSchema = Schema.recordOf( + "outputSchema", + Schema.Field.of("message", Schema.of(Schema.Type.STRING)), + Schema.Field.of("alert", Schema.nullableOf(Schema.of(Schema.Type.STRING))), + Schema.Field.of("tcaMessageType", Schema.of(Schema.Type.STRING)) + ); + + @BeforeClass + public static void setupTest() throws Exception { + + setupBatchArtifacts(DATAPIPELINE_ARTIFACT_ID, DataPipelineApp.class); + + + // Enable the below code if you want to run the test in Intelli IDEA editor + // addPluginArtifact(NamespaceId.DEFAULT.artifact("spark-plugins", "1.0.0"), DATAPIPELINE_ARTIFACT_ID, + // SimpleTCAPlugin.class, SimpleTCAPluginConfig.class); + + // Enable the below code if you want to run the test via command line + ArtifactId dcaeAnalyticsCdapPluginsArtifact = NamespaceId.DEFAULT.artifact( + CDAP_PLUGIN_ARTIFACT_NAME, CDAP_PLUGIN_VERSION); + + addPluginArtifact(dcaeAnalyticsCdapPluginsArtifact, DATAPIPELINE_ARTIFACT_ID, + ImmutableSet.of(getSimpleTCAPluginClass()), SimpleTCAPlugin.class, SimpleTCAPluginConfig.class, + CDAPAppSettingsValidator.class, DCAEValidator.class); + } + + private static PluginClass getSimpleTCAPluginClass() { + final HashMap properties = new HashMap<>(); + properties.put("vesMessageFieldName", new PluginPropertyField("vesMessageFieldName", "", + "string", false, false)); + properties.put("referenceName", new PluginPropertyField("referenceName", "", + "string", false, false)); + properties.put("policyJson", new PluginPropertyField("policyJson", "", "string", false, false)); + properties.put("alertFieldName", new PluginPropertyField("alertFieldName", "", "string", false, false)); + properties.put("messageTypeFieldName", new PluginPropertyField( + "messageTypeFieldName", "", "string", false, false)); + properties.put("enableAlertCEFFormat", new PluginPropertyField( + "enableAlertCEFFormat", "", "string", false, false)); + properties.put("schema", new PluginPropertyField( + "schema", "", "string", false, false)); + + return new PluginClass("sparkcompute", "SimpleTCAPlugin", "", SimpleTCAPlugin.class.getName(), + "pluginConfig", properties); + } + + + @AfterClass + public static void cleanup() { + } + + @Test + @SuppressWarnings("deprecation") + public void testTransform() throws Exception { + + LOG.info("Starting Test Transform"); + + final String policyString = getFileContentAsString("/data/json/policy/tca_policy.json"); + final String cefMessage = getFileContentAsString("/data/json/cef/cef_message.json"); + + final Map tcaProperties = new ImmutableMap.Builder() + .put("vesMessageFieldName", "message") + .put("referenceName", "SimpleTcaPlugin") + .put("policyJson", policyString) + .put("alertFieldName", "alert") + .put("messageTypeFieldName", "tcaMessageType") + .put("enableAlertCEFFormat", "true") + .put("schema", outputSchema.toString()) + .build(); + + final ETLPlugin mockSourcePlugin = MockSource.getPlugin("messages", sourceSchema); + final ETLPlugin tcaPlugin = + new ETLPlugin("SimpleTCAPlugin", SparkCompute.PLUGIN_TYPE, tcaProperties, null); + final ETLPlugin mockSink = MockSink.getPlugin("tcaOutput"); + + final ETLBatchConfig etlBatchConfig = ETLBatchConfig.builder("* * * * *") + .addStage(new ETLStage("source", mockSourcePlugin)) + .addStage(new ETLStage("simpleTCAPlugin", tcaPlugin)) + .addStage(new ETLStage("sink", mockSink)) + .addConnection("source", "simpleTCAPlugin") + .addConnection("simpleTCAPlugin", "sink") + .build(); + + AppRequest appRequest = new AppRequest<>(DATAPIPELINE_ARTIFACT, etlBatchConfig); + ApplicationId appId = NamespaceId.DEFAULT.app("TestSimpleTCAPlugin"); + ApplicationManager appManager = deployApplication(appId.toId(), appRequest); + + List sourceMessages = new ArrayList<>(); + StructuredRecord.Builder builder = StructuredRecord.builder(sourceSchema); + builder.set("message", cefMessage); + sourceMessages.add(builder.build()); + + // write records to source + DataSetManager inputManager = getDataset(NamespaceId.DEFAULT.dataset("messages")); + MockSource.writeInput(inputManager, sourceMessages); + + // manually trigger the pipeline + WorkflowManager workflowManager = appManager.getWorkflowManager(SmartWorkflow.NAME); + workflowManager.start(); + workflowManager.waitForFinish(5, TimeUnit.MINUTES); + + final DataSetManager
outputManager = getDataset("tcaOutput"); + + Tasks.waitFor( + TCACalculatorMessageType.COMPLIANT.name(), + new Callable() { + @Override + public String call() throws Exception { + outputManager.flush(); + List tcaOutputMessageType = new LinkedList<>(); + for (StructuredRecord outputRecord : MockSink.readOutput(outputManager)) { + tcaOutputMessageType.add(outputRecord.get("tcaMessageType").toString()); + final List fields = outputRecord.getSchema().getFields(); + LOG.debug("====>> Printing output Structured Record Contents: {}", outputRecord); + for (Schema.Field field : fields) { + LOG.debug("Field Name: {} - Field Type: {} ---> Field Value: {}", + field.getName(), field.getSchema().getType(), + outputRecord.get(field.getName())); + } + + } + return tcaOutputMessageType.get(0); + } + }, + 4, + TimeUnit.MINUTES); + + } + + private static String getFileContentAsString(final String fileLocation) throws Exception { + final URI tcaPolicyURI = + SimpleTCAPluginCDAPIT.class.getResource(fileLocation).toURI(); + List lines = Files.readAllLines(Paths.get(tcaPolicyURI), Charset.defaultCharset()); + return Joiner.on("").join(lines); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java new file mode 100644 index 0000000..f7e379b --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java @@ -0,0 +1,119 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.sparkcompute.tca; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.StageConfigurer; +import co.cask.cdap.etl.api.batch.SparkExecutionPluginContext; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.JavaSparkContext; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.TestSimpleTCAPluginConfig; + +import java.util.LinkedList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 2/17/2017. + */ +public class SimpleTCAPluginTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private SimpleTCAPlugin simpleTCAPlugin; + + @Before + public void before() { + final TestSimpleTCAPluginConfig testSimpleTCAPluginConfig = getTestSimpleTCAPluginConfig(); + Schema outputSchema = Schema.recordOf( + "TestSimpleTCAPluginInputSchema", + Schema.Field.of("message", Schema.of(Schema.Type.STRING)), + Schema.Field.of("alert", Schema.nullableOf(Schema.of(Schema.Type.STRING))), + Schema.Field.of("tcaMessageType", Schema.of(Schema.Type.STRING)) + ); + testSimpleTCAPluginConfig.setSchema(outputSchema.toString()); + simpleTCAPlugin = new SimpleTCAPlugin(testSimpleTCAPluginConfig); + } + + @Test + public void testConfigurePipeline() throws Exception { + final PipelineConfigurer pipelineConfigurer = mock(PipelineConfigurer.class); + final StageConfigurer stageConfigurer = mock(StageConfigurer.class); + when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); + when(stageConfigurer.getInputSchema()).thenReturn(getSimpleTCAPluginInputSchema()); + simpleTCAPlugin.configurePipeline(pipelineConfigurer); + verify(stageConfigurer, times(1)).getInputSchema(); + } + + @Test + public void testTransform() throws Exception { + + JavaSparkContext javaSparkContext = new JavaSparkContext("local", "test"); + + Schema sourceSchema = Schema.recordOf("CEFMessageSourceSchema", + Schema.Field.of("message", Schema.of(Schema.Type.STRING)) + ); + + // Inapplicable Message Structured Record + final StructuredRecord inapplicableSR = + StructuredRecord.builder(sourceSchema).set("message", "test").build(); + // compliant + final StructuredRecord compliantSR = + StructuredRecord.builder(sourceSchema).set("message", + fromStream(CEF_MESSAGE_JSON_FILE_LOCATION)).build(); + // non compliant + final String nonCompliantCEF = fromStream(CEF_NON_COMPLIANT_MESSAGE_JSON_FILE_LOCATION); + final StructuredRecord nonCompliantSR = + StructuredRecord.builder(sourceSchema).set("message", nonCompliantCEF).build(); + + final List records = new LinkedList<>(); + records.add(inapplicableSR); + records.add(compliantSR); + records.add(nonCompliantSR); + + final JavaRDD input = + javaSparkContext.parallelize(records); + final SparkExecutionPluginContext context = Mockito.mock(SparkExecutionPluginContext.class); + final MockStageMetrics stageMetrics = Mockito.mock(MockStageMetrics.class); + when(context.getMetrics()).thenReturn(stageMetrics); + final List outputRecord = simpleTCAPlugin.transform(context, input).collect(); + assertNotNull(outputRecord); + assertThat(outputRecord.size(), is(3)); + + assertTrue(outputRecord.get(0).get("tcaMessageType").equals(TCACalculatorMessageType.INAPPLICABLE.toString())); + assertTrue(outputRecord.get(1).get("tcaMessageType").equals(TCACalculatorMessageType.COMPLIANT.toString())); + assertTrue(outputRecord.get(2).get("tcaMessageType").equals(TCACalculatorMessageType.NON_COMPLIANT.toString())); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java new file mode 100644 index 0000000..aca5581 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java @@ -0,0 +1,75 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import com.google.common.collect.ImmutableList; +import org.apache.spark.storage.StorageLevel; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 1/24/2017. + */ +public class DMaaPMRReceiverTest extends BaseAnalyticsCDAPPluginsUnitTest { + + + @Test + public void testStoreStructuredRecords() throws Exception { + + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + final TestDMaaPMRReceiver dMaaPMRReceiver = + new TestDMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), testDMaaPMRSourcePluginConfig); + + final DMaaPMRSubscriber dMaaPMRSubscriber = Mockito.mock(DMaaPMRSubscriber.class); + final DMaaPMRSubscriberResponse subscriberResponse = Mockito.mock(DMaaPMRSubscriberResponse.class); + when(dMaaPMRSubscriber.fetchMessages()).thenReturn(subscriberResponse); + when(subscriberResponse.getFetchedMessages()).thenReturn(ImmutableList.of("Test Message")); + when(subscriberResponse.getResponseCode()).thenReturn(200); + when(subscriberResponse.getResponseMessage()).thenReturn("OK"); + dMaaPMRReceiver.storeStructuredRecords(dMaaPMRSubscriber); + verify(dMaaPMRSubscriber, times(1)).fetchMessages(); + verify(subscriberResponse, times(1)).getFetchedMessages(); + } + + @Test + public void testStoreStructuredRecordsWhenSubscriberThrowsException() throws Exception { + + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + final TestDMaaPMRReceiver dMaaPMRReceiver = + new TestDMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), testDMaaPMRSourcePluginConfig); + + final DMaaPMRSubscriber dMaaPMRSubscriber = Mockito.mock(DMaaPMRSubscriber.class); + final DMaaPMRSubscriberResponse subscriberResponse = Mockito.mock(DMaaPMRSubscriberResponse.class); + when(dMaaPMRSubscriber.fetchMessages()).thenThrow(DCAEAnalyticsRuntimeException.class); + dMaaPMRReceiver.storeStructuredRecords(dMaaPMRSubscriber); + verify(dMaaPMRSubscriber, times(1)).fetchMessages(); + verify(subscriberResponse, times(0)).getFetchedMessages(); + } +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java new file mode 100644 index 0000000..7b1f876 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java @@ -0,0 +1,91 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.StageConfigurer; +import co.cask.cdap.etl.api.streaming.StreamingContext; +import org.apache.spark.streaming.api.java.JavaDStream; +import org.apache.spark.streaming.api.java.JavaReceiverInputDStream; +import org.apache.spark.streaming.api.java.JavaStreamingContext; +import org.apache.spark.streaming.receiver.Receiver; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 1/24/2017. + */ +public class DMaaPMRSourceTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private PipelineConfigurer pipelineConfigurer; + + @Before + public void before() { + pipelineConfigurer = Mockito.mock(PipelineConfigurer.class); + final StageConfigurer stageConfigurer = Mockito.mock(StageConfigurer.class); + when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); + doNothing().when(stageConfigurer).setOutputSchema(any(Schema.class)); + } + + @Test + public void testDMaaPMRSourceConfigurePipelineWithValidPluginSettings() throws Exception { + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + final DMaaPMRSource dMaaPMRSource = new DMaaPMRSource(testDMaaPMRSourcePluginConfig); + dMaaPMRSource.configurePipeline(pipelineConfigurer); + assertNotNull(dMaaPMRSource); + } + + @Test(expected = CDAPSettingsException.class) + public void testDMaaPMRSourceConfigurePipelineWithInvalidPluginSettings() throws Exception { + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + // blank out DMaaP MR Source Host + testDMaaPMRSourcePluginConfig.setHostName(null); + final DMaaPMRSource dMaaPMRSource = new DMaaPMRSource(testDMaaPMRSourcePluginConfig); + dMaaPMRSource.configurePipeline(pipelineConfigurer); + } + + + @Test + @SuppressWarnings("unchecked") + public void testGetStream() throws Exception { + final StreamingContext streamingContext = Mockito.mock(StreamingContext.class); + final JavaStreamingContext javaStreamingContext = Mockito.mock(JavaStreamingContext.class); + final JavaReceiverInputDStream dMaaPMRReceiver = Mockito.mock(JavaReceiverInputDStream.class); + when(streamingContext.getSparkStreamingContext()).thenReturn(javaStreamingContext); + when(javaStreamingContext.receiverStream(any(Receiver.class))).thenReturn(dMaaPMRReceiver); + + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + final DMaaPMRSource dMaaPMRSource = new DMaaPMRSource(testDMaaPMRSourcePluginConfig); + final JavaDStream stream = dMaaPMRSource.getStream(streamingContext); + assertNotNull(stream); + } +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java new file mode 100644 index 0000000..cd3e4bd --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java @@ -0,0 +1,81 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.data.format.StructuredRecord; +import org.apache.spark.storage.StorageLevel; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap.DMaaPSourceOutputSchema; + +import java.util.concurrent.TimeUnit; + +/** + * @author Rajiv Singla . Creation Date: 2/20/2017. + */ +public class MockDMaaPMRReceiverTest extends BaseAnalyticsCDAPPluginsUnitTest { + + protected class TestMockDMaaPMRReceiverTest extends MockDMaaPMRReceiver { + + private boolean canStop = false; + + public TestMockDMaaPMRReceiverTest(StorageLevel storageLevel, DMaaPMRSourcePluginConfig pluginConfig) { + super(storageLevel, pluginConfig); + } + + @Override + public boolean isStopped() { + return canStop; + } + + @Override + public void store(StructuredRecord dataItem) { + LOG.debug("Mocking storing dataItem - {}", + dataItem.get(DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName())); + } + + public void setCanStop(boolean canStop) { + this.canStop = canStop; + } + } + + @Test + public void testStoreStructuredRecords() throws Exception { + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + testDMaaPMRSourcePluginConfig.setPollingInterval(100); + final TestMockDMaaPMRReceiverTest mockDMaaPMRReceiver = new TestMockDMaaPMRReceiverTest(StorageLevel + .MEMORY_ONLY(), + testDMaaPMRSourcePluginConfig); + new Thread(new Runnable() { + @Override + public void run() { + mockDMaaPMRReceiver.storeStructuredRecords(null); + } + }).start(); + TimeUnit.MILLISECONDS.sleep(1000); + LOG.info("Killing Mock Subscriber after 1 ms"); + mockDMaaPMRReceiver.setCanStop(true); + + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java new file mode 100644 index 0000000..6a842d0 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java @@ -0,0 +1,74 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.etl.api.streaming.StreamingContext; +import org.apache.spark.streaming.api.java.JavaDStream; +import org.apache.spark.streaming.api.java.JavaReceiverInputDStream; +import org.apache.spark.streaming.api.java.JavaStreamingContext; +import org.apache.spark.streaming.receiver.Receiver; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 2/20/2017. + */ +@SuppressWarnings("unchecked") +public class MockDMaaPMRSourceTest extends BaseAnalyticsCDAPPluginsUnitTest { + + @Test + public void testGetStream() throws Exception { + final StreamingContext streamingContext = Mockito.mock(StreamingContext.class); + final JavaStreamingContext javaStreamingContext = Mockito.mock(JavaStreamingContext.class); + final JavaReceiverInputDStream dMaaPMRReceiver = Mockito.mock(JavaReceiverInputDStream.class); + when(streamingContext.getSparkStreamingContext()).thenReturn(javaStreamingContext); + when(javaStreamingContext.receiverStream(any(Receiver.class))).thenReturn(dMaaPMRReceiver); + + MockDMaaPMRSource mockDMaaPMRSource = new MockDMaaPMRSource(getTestDMaaPMRSourcePluginConfig()); + final JavaDStream stream = mockDMaaPMRSource.getStream(streamingContext); + assertNotNull(stream); + } + + @Test(expected = CDAPSettingsException.class) + public void testConfigurePipelineWhenPollingIntervalNotPresent() throws Exception { + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + testDMaaPMRSourcePluginConfig.setPollingInterval(null); + final MockDMaaPMRSource mockDMaaPMRSource = new MockDMaaPMRSource(testDMaaPMRSourcePluginConfig); + mockDMaaPMRSource.configurePipeline(null); + } + + @Test + public void testConfigurePipelineWhenPollingIntervalIsPresent() throws Exception { + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + final MockDMaaPMRSource mockDMaaPMRSource = new MockDMaaPMRSource(testDMaaPMRSourcePluginConfig); + mockDMaaPMRSource.configurePipeline(null); + assertNotNull(mockDMaaPMRSource); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java new file mode 100644 index 0000000..0d87496 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java @@ -0,0 +1,58 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.metrics.Metrics; +import org.apache.spark.storage.StorageLevel; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doNothing; + +/** + * Test implementation for {@link DMaaPMRReceiver} + *

+ * @author Rajiv Singla . Creation Date: 1/24/2017. + */ +public class TestDMaaPMRReceiver extends DMaaPMRReceiver { + + protected static Metrics metrics; + + static { + metrics = Mockito.mock(Metrics.class); + doNothing().when(metrics).count(anyString(), anyInt()); + doNothing().when(metrics).gauge(anyString(), anyInt()); + } + + + public TestDMaaPMRReceiver(StorageLevel storageLevel, DMaaPMRSourcePluginConfig pluginConfig) { + + super(storageLevel, pluginConfig, metrics); + } + + @Override + public void store(StructuredRecord dataItem) { + // do nothing + } +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java new file mode 100644 index 0000000..8bf91c8 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.transform.filter; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import co.cask.cdap.etl.api.Emitter; +import co.cask.cdap.etl.api.PipelineConfigurer; +import co.cask.cdap.etl.api.StageConfigurer; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; + +import java.util.Date; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 3/3/2017. + */ +public class JsonPathFilterTest extends BaseAnalyticsCDAPPluginsUnitTest { + + + @Test + public void testInitializeWhenFilterMappingIsValid() throws Exception { + final JsonPathFilter jsonPathFilter = new JsonPathFilter(getJsonPathFilterPluginConfig()); + jsonPathFilter.initialize(null); + } + + + @Test + public void configurePipeline() throws Exception { + final JsonPathFilter jsonPathFilter = new JsonPathFilter(getJsonPathFilterPluginConfig()); + final PipelineConfigurer pipelineConfigurer = mock(PipelineConfigurer.class); + final StageConfigurer stageConfigurer = mock(StageConfigurer.class); + when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); + when(stageConfigurer.getInputSchema()).thenReturn(getSimpleTCAPluginInputSchema()); + doNothing().when(stageConfigurer).setOutputSchema(any(Schema.class)); + jsonPathFilter.configurePipeline(pipelineConfigurer); + verify(stageConfigurer, times(1)).setOutputSchema(any(Schema.class)); + } + + @Test + public void testTransform() throws Exception { + final JsonPathFilter jsonPathFilter = new JsonPathFilter(getJsonPathFilterPluginConfig()); + jsonPathFilter.initialize(null); + final StructuredRecord inputSR = StructuredRecord.builder(getJsonFilterPluginInputSchema()) + .set("ts", new Date().getTime()) + .set("responseCode", 200) + .set("responseMessage", "OK") + .set("message", fromStream(CEF_MESSAGE_JSON_FILE_LOCATION)) + .build(); + + final Emitter emitter = Mockito.mock(Emitter.class); + doNothing().when(emitter).emit(ArgumentMatchers.any(StructuredRecord.class)); + jsonPathFilter.transform(inputSR, emitter); + verify(emitter, times(1)).emit(any(StructuredRecord.class)); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java new file mode 100644 index 0000000..2792e17 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java @@ -0,0 +1,171 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.utils; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.data.schema.Schema; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class CDAPPluginUtilsTest extends BaseAnalyticsCDAPPluginsUnitTest { + + + @Test + public void testValidateSchemaContainsFieldsWhenSchemaIsNotNull() throws Exception { + final Schema dMaaPMRSinkTestSchema = getDMaaPMRSinkTestSchema(); + CDAPPluginUtils.validateSchemaContainsFields(dMaaPMRSinkTestSchema, "message"); + } + + @Test + public void testValidateSchemaContainsFieldsWhenInputSchemaIsNull() throws Exception { + CDAPPluginUtils.validateSchemaContainsFields(null, "message"); + } + + @Test + public void testCreateStructuredRecord() throws Exception { + final StructuredRecord testMessage = CDAPPluginUtils.createDMaaPMRResponseStructuredRecord("testMessage"); + assertNotNull(testMessage); + } + + + @Test + public void testCreateOutputStructuredRecordBuilder() throws Exception { + + final String messageFieldName = "message"; + final String firstInputFieldName = "inputField1"; + final String secondInputFieldName = "inputField2"; + + + final Schema inputSchema = Schema.recordOf( + "inputSchema", + Schema.Field.of(messageFieldName, Schema.of(Schema.Type.STRING)), + Schema.Field.of(firstInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))), + Schema.Field.of(secondInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))) + ); + + final String addedFieldName = "addedField"; + final Schema outputSchema = Schema.recordOf( + "outputSchema", + Schema.Field.of(messageFieldName, Schema.of(Schema.Type.STRING)), + Schema.Field.of(firstInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))), + Schema.Field.of(addedFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))) // added field + // missing second Input Field + ); + + // input structured record + final String messageFieldValue = "Message String"; + final String firstFieldValue = "Input Field 1"; + final String secondFieldValue = "Input Field 2"; + final StructuredRecord inputSR = StructuredRecord.builder(inputSchema) + .set(messageFieldName, messageFieldValue) + .set(firstInputFieldName, firstFieldValue) + .set(secondInputFieldName, secondFieldValue) + .build(); + + final StructuredRecord.Builder outputStructuredRecordBuilder = + CDAPPluginUtils.createOutputStructuredRecordBuilder(outputSchema, inputSR); + + final String addedFieldValue = "Added Field Value"; + final StructuredRecord outputSR = outputStructuredRecordBuilder + .set(addedFieldName, addedFieldValue) + .build(); + + assertThat("Added Field field value copied correctly", + outputSR.get(addedFieldName).toString(), is(addedFieldValue)); + + assertThat("Output SR has message field copied correctly", + outputSR.get(messageFieldName).toString(), is(messageFieldValue)); + + assertThat("First Field value copied correctly", + outputSR.get(firstInputFieldName).toString(), is(firstFieldValue)); + + assertNull("Second Field value is null as output schema does not have the field", + outputSR.get(secondInputFieldName)); + + } + + + @Test + public void testAddFieldValueToStructuredRecordBuilder() throws Exception { + + final String messageFieldName = "message"; + final String firstInputFieldName = "inputField1"; + final String addedFieldName = "addedField"; + final String firstFieldValue = "Input Field 1"; + final String addedFieldValue = "Added Field Value"; + final Schema outputSchema = Schema.recordOf( + "outputSchema", + Schema.Field.of(messageFieldName, Schema.of(Schema.Type.STRING)), + Schema.Field.of(firstInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))), + Schema.Field.of(addedFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))) // added field + ); + + final StructuredRecord.Builder outputSRBuilder = StructuredRecord.builder(outputSchema) + .set(messageFieldName, "Some message") + .set(firstInputFieldName, firstFieldValue); + + final StructuredRecord.Builder addedFieldSRBuilder = CDAPPluginUtils.addFieldValueToStructuredRecordBuilder( + outputSRBuilder, outputSchema, addedFieldName, addedFieldValue); + + // Try adding field to output Structured record that is not in output schema + final String nonExistentFieldName = "fieldNotInOutputSchema"; + final String nonExistentFieldValue = "Some Value"; + final StructuredRecord outputSR = CDAPPluginUtils.addFieldValueToStructuredRecordBuilder( + addedFieldSRBuilder, outputSchema, nonExistentFieldName, nonExistentFieldValue).build(); + + assertThat("Output SR must contain added Field which is in output schema", + outputSR.get(addedFieldName).toString(), is(addedFieldValue)); + assertNull("Output SR must not contain field that is not in output schema", + outputSR.get(nonExistentFieldName)); + + } + + @Test(expected = DCAEAnalyticsRuntimeException.class) + public void testValidateSchemaFieldTypeWhenInputSchemaIsNotValidJson() throws Exception { + CDAPPluginUtils.validateSchemaFieldType("Invalid Schema", "field1", Schema.Type.STRING); + } + + @Test(expected = DCAEAnalyticsRuntimeException.class) + public void testSetOutputSchemaWhenOutputSchemaIsNotValidJson() throws Exception { + CDAPPluginUtils.setOutputSchema(null, "Invalid output Schema"); + } + + @Test(expected = DCAEAnalyticsRuntimeException.class) + public void testExtractFieldMappingsWhenFieldMappingValueIsEmpty() throws Exception { + CDAPPluginUtils.extractFieldMappings("path1:,path2:value2"); + } + + @Test(expected = DCAEAnalyticsRuntimeException.class) + public void testExtractFieldMappingsWhenFieldMappingAreBlank() throws Exception { + CDAPPluginUtils.extractFieldMappings("path1: ,path2:value2"); + } + + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java new file mode 100644 index 0000000..9b6f7f8 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java @@ -0,0 +1,57 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.utils; + +import org.apache.hadoop.conf.Configuration; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPSinkConfigMapperTest extends BaseAnalyticsCDAPPluginsUnitTest { + + + @Test + public void testMapToPublisherConfig() throws Exception { + + final Configuration testConfiguration = getTestConfiguration(); + final DMaaPMRPublisherConfig publisherConfig = DMaaPSinkConfigMapper.map(testConfiguration); + + assertNotNull(publisherConfig); + assertThat(publisherConfig.getHostName(), is(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); + assertThat(publisherConfig.getTopicName(), is(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); + assertThat(publisherConfig.getPortNumber(), is(DMAAP_MR_SINK_PLUGIN_PORT_NUMBER)); + assertThat(publisherConfig.getProtocol(), is(DMAAP_MR_SINK_PLUGIN_PROTOCOL)); + assertThat(publisherConfig.getUserName(), is(DMAAP_MR_SINK_PLUGIN_USERNAME)); + assertThat(publisherConfig.getUserPassword(), is(DMAAP_MR_SINK_PLUGIN_PASSWORD)); + assertThat(publisherConfig.getContentType(), is(DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE)); + assertThat(publisherConfig.getMaxBatchSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE)); + assertThat(publisherConfig.getMaxRecoveryQueueSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE)); + + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java new file mode 100644 index 0000000..6e79f47 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java @@ -0,0 +1,64 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.utils; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 1/24/2017. + */ +public class DMaaPSourceConfigMapperTest extends BaseAnalyticsCDAPPluginsUnitTest { + + @Test + public void testMapToSubscriberConfig() throws Exception { + + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + final DMaaPMRSubscriberConfig subscriberConfig = DMaaPSourceConfigMapper.map(testDMaaPMRSourcePluginConfig); + + assertNotNull(subscriberConfig); + assertThat(subscriberConfig.getHostName(), is(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); + assertThat(subscriberConfig.getTopicName(), is(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME)); + assertThat(subscriberConfig.getPortNumber(), is(DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER)); + assertThat(subscriberConfig.getProtocol(), is(DMAAP_MR_SOURCE_PLUGIN_PROTOCOL)); + assertThat(subscriberConfig.getUserName(), is(DMAAP_MR_SOURCE_PLUGIN_USERNAME)); + assertThat(subscriberConfig.getUserPassword(), is(DMAAP_MR_SOURCE_PLUGIN_PASSWORD)); + assertThat(subscriberConfig.getContentType(), is(DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE)); + assertThat(subscriberConfig.getConsumerGroup(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP)); + assertThat(subscriberConfig.getConsumerId(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID)); + assertThat(subscriberConfig.getMessageLimit(), is(DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT)); + assertThat(subscriberConfig.getTimeoutMS(), is(DMAAP_MR_SOURCE_PLUGIN_TIMEOUT)); + } + + @Test(expected = IllegalStateException.class) + public void testMapToSubscriberConfigWhenSubscriberHostNameIsEmpty() throws Exception { + final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + testDMaaPMRSourcePluginConfig.setHostName(null); + DMaaPSourceConfigMapper.map(testDMaaPMRSourcePluginConfig); + + } +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java new file mode 100644 index 0000000..904a74b --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java @@ -0,0 +1,86 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSinkPluginConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMRSinkPluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private TestDMaaPMRSinkPluginConfig sinkPluginConfig; + private DMaaPMRSinkPluginConfigValidator sinkPluginConfigValidator; + + @Before + public void before() { + sinkPluginConfigValidator = new DMaaPMRSinkPluginConfigValidator(); + sinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); + } + + @Test + public void validateAppSettingsWithValidDMaaPSinkConfig() throws Exception { + final GenericValidationResponse validationResponse = + sinkPluginConfigValidator.validateAppSettings(sinkPluginConfig); + assertFalse(validationResponse.hasErrors()); + } + + + @Test + public void validateAppSettingsWithValidDMaaPSinkConfigWhenHostNameIsNotPresent() throws Exception { + sinkPluginConfig.setHostName(null); + assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); + } + + @Test + public void validateAppSettingsWithValidDMaaPSinkConfigWhenHostPortIsNotPresent() throws Exception { + sinkPluginConfig.setPortNumber(null); + assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); + } + + @Test + public void validateAppSettingsWithValidDMaaPSinkConfigWhenTopicNameIsNotPresent() throws Exception { + sinkPluginConfig.setTopicName(null); + assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); + } + + @Test + public void validateAppSettingsWithValidDMaaPSinkConfigWhenColumnNameIsNotPresent() throws Exception { + sinkPluginConfig.setMessageColumnName(null); + assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); + } + + private static void assertResponseHasErrors(final TestDMaaPMRSinkPluginConfig sinkPluginConfig, + final DMaaPMRSinkPluginConfigValidator validator) { + final GenericValidationResponse validationResponse = validator.validateAppSettings(sinkPluginConfig); + assertTrue(validationResponse.hasErrors()); + } + + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java new file mode 100644 index 0000000..b4357e8 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java @@ -0,0 +1,85 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 1/30/2017. + */ +public class DMaaPMRSourcePluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private TestDMaaPMRSourcePluginConfig sourcePluginConfig; + private DMaaPMRSourcePluginConfigValidator sourcePluginConfigValidator; + + @Before + public void before() { + sourcePluginConfigValidator = new DMaaPMRSourcePluginConfigValidator(); + sourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); + } + + @Test + public void validateAppSettingsWithValidDMaaPSourceConfig() throws Exception { + final GenericValidationResponse validationResponse = + sourcePluginConfigValidator.validateAppSettings(sourcePluginConfig); + assertFalse(validationResponse.hasErrors()); + } + + + @Test + public void validateAppSettingsWithValidDMaaPSourceConfigWhenHostNameIsNotPresent() throws Exception { + sourcePluginConfig.setHostName(null); + assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); + } + + @Test + public void validateAppSettingsWithValidDMaaPSourceConfigWhenHostPortIsNotPresent() throws Exception { + sourcePluginConfig.setPortNumber(null); + assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); + } + + @Test + public void validateAppSettingsWithValidDMaaPSourceConfigWhenTopicNameIsNotPresent() throws Exception { + sourcePluginConfig.setTopicName(null); + assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); + } + + @Test + public void validateAppSettingsWithValidDMaaPSourcePollingIntervalIsNotPresent() throws Exception { + sourcePluginConfig.setPollingInterval(null); + assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); + } + + private static void assertResponseHasErrors(final TestDMaaPMRSourcePluginConfig sourcePluginConfig, + final DMaaPMRSourcePluginConfigValidator validator) { + final GenericValidationResponse validationResponse = validator.validateAppSettings(sourcePluginConfig); + assertTrue(validationResponse.hasErrors()); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java new file mode 100644 index 0000000..4eff03c --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java @@ -0,0 +1,107 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter.JsonPathFilterPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.filter.TestJsonPathFilterPluginConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 3/3/2017. + */ +public class JsonPathFilterPluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private TestJsonPathFilterPluginConfig jsonPathFilterPluginConfig; + private JsonPathFilterPluginConfigValidator jsonPathFilterPluginConfigValidator; + + @Before + public void before() { + jsonPathFilterPluginConfig = getJsonPathFilterPluginConfig(); + jsonPathFilterPluginConfigValidator = new JsonPathFilterPluginConfigValidator(); + } + + + @Test + public void testValidateAppSettingsWhenNoValidationErrors() throws Exception { + final GenericValidationResponse validationResponse = + jsonPathFilterPluginConfigValidator.validateAppSettings(jsonPathFilterPluginConfig); + assertFalse(validationResponse.hasErrors()); + } + + @Test + public void testValidateAppSettingsWhenFilterMappingsAreEmpty() throws Exception { + jsonPathFilterPluginConfig.setJsonFilterMappings(""); + assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenOutputSchemaIsNotPresent() throws Exception { + jsonPathFilterPluginConfig.setSchema(null); + assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenOutputSchemaFilterMatchedFieldIsNotBoolean() throws Exception { + final String outputSchemaWithMatchedFieldNotBoolean = + "{\"type\":\"record\"," + + "\"name\":\"etlSchemaBody\",\"fields\":" + + "[" + + "{\"name\":\"ts\",\"type\":\"long\"}," + + "{\"name\":\"filterMatched\",\"type\":[\"string\",\"null\"]}," + + "{\"name\":\"responseCode\",\"type\":\"int\"}," + + "{\"name\":\"responseMessage\",\"type\":\"string\"}," + + "{\"name\":\"message\",\"type\":\"string\"}" + + "]" + + "}"; + jsonPathFilterPluginConfig.setSchema(outputSchemaWithMatchedFieldNotBoolean); + assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenOutputSchemaFilterMatchedFieldIsNotNullable() throws Exception { + final String outputSchemaWithMatchedFieldNotNullable = + "{\"type\":\"record\"," + + "\"name\":\"etlSchemaBody\",\"fields\":" + + "[" + + "{\"name\":\"ts\",\"type\":\"long\"}," + + "{\"name\":\"filterMatched\",\"type\":\"boolean\"}," + + "{\"name\":\"responseCode\",\"type\":\"int\"}," + + "{\"name\":\"responseMessage\",\"type\":\"string\"}," + + "{\"name\":\"message\",\"type\":\"string\"}" + + "]" + + "}"; + jsonPathFilterPluginConfig.setSchema(outputSchemaWithMatchedFieldNotNullable); + assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); + } + + private static void assertResponseHasErrors(final TestJsonPathFilterPluginConfig jsonPluginConfig, + final JsonPathFilterPluginConfigValidator validator) { + final GenericValidationResponse validationResponse = validator.validateAppSettings(jsonPluginConfig); + assertTrue(validationResponse.hasErrors()); + } + +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java new file mode 100644 index 0000000..284bec3 --- /dev/null +++ b/dcae-analytics-cdap-plugins/src/test/java/org/onap/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java @@ -0,0 +1,157 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.plugins.validator; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.tca.TestSimpleTCAPluginConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 2/21/2017. + */ +public class SimpleTCAPluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { + + private TestSimpleTCAPluginConfig testSimpleTCAPluginConfig; + private SimpleTCAPluginConfigValidator simpleTCAPluginConfigValidator; + + @Before + public void before() { + testSimpleTCAPluginConfig = getTestSimpleTCAPluginConfig(); + simpleTCAPluginConfigValidator = new SimpleTCAPluginConfigValidator(); + } + + @Test + public void testValidateAppSettingsWhenAllSettingsAreValid() throws Exception { + final GenericValidationResponse validationResponse = + simpleTCAPluginConfigValidator.validateAppSettings(testSimpleTCAPluginConfig); + assertFalse(validationResponse.hasErrors()); + } + + @Test + public void testValidateAppSettingsWhenVESMessageFieldNameIsMissing() throws Exception { + testSimpleTCAPluginConfig.setVesMessageFieldName(null); + assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenPolicyJsonIsMissing() throws Exception { + testSimpleTCAPluginConfig.setPolicyJson(null); + assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenAlertFieldNameIsMissing() throws Exception { + testSimpleTCAPluginConfig.setAlertFieldName(null); + assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenOutputSchemaIsNull() throws Exception { + testSimpleTCAPluginConfig.setSchema(null); + assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenMessageTypeFieldNameIsMissing() throws Exception { + testSimpleTCAPluginConfig.setMessageTypeFieldName(null); + assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenAlertFieldIsNullableInOutputSchema() throws Exception { + testSimpleTCAPluginConfig.setSchema( + "{\"type\":\"record\"," + + "\"name\":\"etlSchemaBody\"," + + "\"fields\":[" + + "{\"name\":\"ts\",\"type\":\"long\"}," + + "{\"name\":\"responseCode\",\"type\":\"int\"}," + + "{\"name\":\"responseMessage\",\"type\":\"string\"}," + + "{\"name\":\"message\",\"type\":\"string\"}," + + "{\"name\":\"alert\",\"type\":[\"string\",\"null\"]}," + + "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); + final GenericValidationResponse validationResponse = + simpleTCAPluginConfigValidator.validateAppSettings(testSimpleTCAPluginConfig); + assertFalse(validationResponse.hasErrors()); + + } + + @Test + public void testValidateAppSettingsWhenAlertFieldIsNotPresentInOutputSchema() throws Exception { + testSimpleTCAPluginConfig.setSchema( + "{\"type\":\"record\"," + + "\"name\":\"etlSchemaBody\"," + + "\"fields\":[" + + "{\"name\":\"ts\",\"type\":\"long\"}," + + "{\"name\":\"responseCode\",\"type\":\"int\"}," + + "{\"name\":\"responseMessage\",\"type\":\"string\"}," + + "{\"name\":\"message\",\"type\":\"string\"}," + + "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); + final GenericValidationResponse validationResponse = + simpleTCAPluginConfigValidator.validateAppSettings(testSimpleTCAPluginConfig); + assertFalse(validationResponse.hasErrors()); + + } + + @Test + public void testValidateAppSettingsWhenAlertFieldIsNullableButNotStringTypeInOutputSchema() throws Exception { + testSimpleTCAPluginConfig.setSchema( + "{\"type\":\"record\"," + + "\"name\":\"etlSchemaBody\"," + + "\"fields\":[" + + "{\"name\":\"ts\",\"type\":\"long\"}," + + "{\"name\":\"responseCode\",\"type\":\"int\"}," + + "{\"name\":\"responseMessage\",\"type\":\"string\"}," + + "{\"name\":\"message\",\"type\":\"string\"}," + + "{\"name\":\"alert\",\"type\":[\"int\",\"null\"]}," + + "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); + assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); + } + + @Test + public void testValidateAppSettingsWhenAlertFieldNameIsNotNullableInOutputSchema() throws Exception { + testSimpleTCAPluginConfig.setSchema( + "{\"type\":\"record\"," + + "\"name\":\"etlSchemaBody\"," + + "\"fields\":[" + + "{\"name\":\"ts\",\"type\":\"long\"}," + + "{\"name\":\"responseCode\",\"type\":\"int\"}," + + "{\"name\":\"responseMessage\",\"type\":\"string\"}," + + "{\"name\":\"message\",\"type\":\"string\"}," + + "{\"name\":\"alert\",\"type\":\"string\"}," + + "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); + assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); + } + + + + private static void assertResponseHasErrors(final TestSimpleTCAPluginConfig pluginConfig, + final SimpleTCAPluginConfigValidator validator) { + final GenericValidationResponse validationResponse = validator.validateAppSettings(pluginConfig); + assertTrue(validationResponse.hasErrors()); + LOG.debug("Validation Error Message: {}", validationResponse.getAllErrorMessage()); + } +} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java deleted file mode 100644 index cba456b..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/BaseAnalyticsCDAPPluginsUnitTest.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins; - -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.StageMetrics; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Suppliers; -import org.apache.hadoop.conf.Configuration; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPPluginConstants; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSinkPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter.TestJsonPathFilterPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.TestSimpleTCAPluginConfig; -import org.openecomp.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; - -import java.io.IOException; -import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author Rajiv Singla . Creation Date: 1/23/2017. - */ -public abstract class BaseAnalyticsCDAPPluginsUnitTest extends BaseDCAEAnalyticsUnitTest { - - protected static final ObjectMapper ANALYTICS_MODEL_OBJECT_MAPPER = - Suppliers.memoize(new AnalyticsModelObjectMapperSupplier()).get(); - - protected static final String TCA_POLICY_JSON_FILE_LOCATION = "data/json/policy/tca_policy.json"; - protected static final String CEF_MESSAGE_JSON_FILE_LOCATION = "data/json/cef/cef_message.json"; - protected static final String CEF_NON_COMPLIANT_MESSAGE_JSON_FILE_LOCATION = - "data/json/cef/cef_message_with_threshold_violation.json"; - - - protected static final String DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME = "testDMaaPMRSource"; - protected static final String DMAAP_MR_SOURCE_PLUGIN_HOST_NAME = "dcae-msrt-mtl1-ftl.homer.com"; - protected static final Integer DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER = 3905; - protected static final String DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME = "com.dcae.dmaap.FTL.DcaeTestVESSub"; - protected static final Integer DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL = 1000; - protected static final String DMAAP_MR_SOURCE_PLUGIN_PROTOCOL = "https"; - protected static final String DMAAP_MR_SOURCE_PLUGIN_USERNAME = "username"; - protected static final String DMAAP_MR_SOURCE_PLUGIN_PASSWORD = "password"; - protected static final String DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE = "application/json"; - protected static final String DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP = "G1"; - protected static final String DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID = "C1"; - protected static final Integer DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT = 100; - protected static final Integer DMAAP_MR_SOURCE_PLUGIN_TIMEOUT = 10000; - - - protected static final String DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME = "testDMaaPMRSINK"; - protected static final String DMAAP_MR_SINK_PLUGIN_HOST_NAME = "dcae-msrt-mtl1-ftl.homer.com"; - protected static final Integer DMAAP_MR_SINK_PLUGIN_PORT_NUMBER = 3905; - protected static final String DMAAP_MR_SINK_PLUGIN_TOPIC_NAME = "com.dcae.dmaap.FTL.DcaeTestVESPub"; - protected static final String DMAAP_MR_SINK_PLUGIN_PROTOCOL = "https"; - protected static final String DMAAP_MR_SINK_PLUGIN_USERNAME = "username"; - protected static final String DMAAP_MR_SINK_PLUGIN_PASSWORD = "password"; - protected static final String DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE = "application/json"; - protected static final String DMAAP_MR_SINK_MESSAGE_COLUMN_NAME = "message"; - protected static final Integer DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE = 10; - protected static final Integer DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE = 100; - - protected static final String VES_MESSAGE_FIELD_NAME = "message"; - protected static final String TCA_PLUGIN_ALERT_FIELD_NAME = "alert"; - protected static final String TCA_PLUGIN_MESSAGE_TYPE_FIELD_NAME = "tcaMessageType"; - - - protected static final String JSON_PATH_FILTER_PLUGIN_REFERENCE_NAME = "JsonPathFilter"; - protected static final String JSON_PATH_FILTER_PLUGIN_INCOMING_JSON_FIELD_NAME = "message"; - protected static final String JSON_PATH_FILTER_PLUGIN_OUTPUT_SCHEMA_FILED_NAME = "filterMatched"; - protected static final String JSON_PATH_FILTER_PLUGIN_JSON_FILTER_MAPPINGS = - "$.event.commonEventHeader.domain:measurementsForVfScaling," + - "$.event.commonEventHeader.eventName:vLoadBalancer;vFirewall"; - protected static final String JSON_PATH_FILTER_PLUGIN_JSON_FILTER_OUTPUT_SCHEMA = - "{\"type\":\"record\"," + - "\"name\":\"etlSchemaBody\",\"fields\":" + - "[" + - "{\"name\":\"ts\",\"type\":\"long\"}," + - "{\"name\":\"filterMatched\",\"type\":[\"boolean\",\"null\"]}," + - "{\"name\":\"responseCode\",\"type\":\"int\"}," + - "{\"name\":\"responseMessage\",\"type\":\"string\"}," + - "{\"name\":\"message\",\"type\":\"string\"}" + - "]" + - "}"; - - protected static class MockStageMetrics implements StageMetrics, Serializable { - - @Override - public void count(String metricName, int delta) { - LOG.debug("Mocking metric count, MetricName: {}, Delta: {}", metricName, delta); - } - - @Override - public void gauge(String metricName, long value) { - LOG.debug("Mocking metric guage, MetricName: {}, Value: {}", metricName, value); - } - - @Override - public void pipelineCount(String metricName, int delta) { - LOG.debug("Mocking metric pipelineCount, MetricName: {}, Delta: {}", metricName, delta); - } - - @Override - public void pipelineGauge(String metricName, long value) { - LOG.debug("Mocking metric guage, pipelineGauge: {}, Value: {}", metricName, value); - } - } - - protected static TestDMaaPMRSourcePluginConfig getTestDMaaPMRSourcePluginConfig() { - final TestDMaaPMRSourcePluginConfig sourcePluginConfig = new TestDMaaPMRSourcePluginConfig(); - sourcePluginConfig.setReferenceName(DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME); - sourcePluginConfig.setHostName(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME); - sourcePluginConfig.setPortNumber(DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER); - sourcePluginConfig.setTopicName(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME); - sourcePluginConfig.setPollingInterval(DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL); - sourcePluginConfig.setProtocol(DMAAP_MR_SOURCE_PLUGIN_PROTOCOL); - sourcePluginConfig.setUserName(DMAAP_MR_SOURCE_PLUGIN_USERNAME); - sourcePluginConfig.setUserPassword(DMAAP_MR_SOURCE_PLUGIN_PASSWORD); - sourcePluginConfig.setContentType(DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE); - sourcePluginConfig.setConsumerGroup(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP); - sourcePluginConfig.setConsumerId(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID); - sourcePluginConfig.setMessageLimit(DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT); - sourcePluginConfig.setTimeoutMS(DMAAP_MR_SOURCE_PLUGIN_TIMEOUT); - return sourcePluginConfig; - } - - protected static TestDMaaPMRSinkPluginConfig getTestDMaaPMRSinkPluginConfig() { - final TestDMaaPMRSinkPluginConfig sinkPluginConfig = new TestDMaaPMRSinkPluginConfig(); - sinkPluginConfig.setReferenceName(DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME); - sinkPluginConfig.setHostName(DMAAP_MR_SINK_PLUGIN_HOST_NAME); - sinkPluginConfig.setPortNumber(DMAAP_MR_SINK_PLUGIN_PORT_NUMBER); - sinkPluginConfig.setTopicName(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME); - sinkPluginConfig.setProtocol(DMAAP_MR_SINK_PLUGIN_PROTOCOL); - sinkPluginConfig.setUserName(DMAAP_MR_SINK_PLUGIN_USERNAME); - sinkPluginConfig.setUserPassword(DMAAP_MR_SINK_PLUGIN_PASSWORD); - sinkPluginConfig.setContentType(DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE); - sinkPluginConfig.setMessageColumnName(DMAAP_MR_SINK_MESSAGE_COLUMN_NAME); - sinkPluginConfig.setMaxBatchSize(DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE); - sinkPluginConfig.setMaxRecoveryQueueSize(DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE); - return sinkPluginConfig; - } - - - protected static Configuration getTestConfiguration() { - final Configuration configuration = new Configuration(); - final Map sinkConfigurationMap = createSinkConfigurationMap(); - for (Map.Entry property : sinkConfigurationMap.entrySet()) { - configuration.set(property.getKey(), property.getValue()); - } - return configuration; - } - - protected static Map createSinkConfigurationMap() { - - Map sinkConfig = new LinkedHashMap<>(); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.HOST_NAME, DMAAP_MR_SINK_PLUGIN_HOST_NAME); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.TOPIC_NAME, DMAAP_MR_SINK_PLUGIN_TOPIC_NAME); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.PORT_NUMBER, - DMAAP_MR_SINK_PLUGIN_PORT_NUMBER.toString()); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.PROTOCOL, DMAAP_MR_SINK_PLUGIN_PROTOCOL); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.USER_NAME, DMAAP_MR_SINK_PLUGIN_USERNAME); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.USER_PASS, DMAAP_MR_SINK_PLUGIN_PASSWORD); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.CONTENT_TYPE, - DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.MAX_BATCH_SIZE, - DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE.toString()); - sinkConfig.put(CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields.MAX_RECOVER_QUEUE_SIZE, - DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE.toString()); - return sinkConfig; - } - - protected static Schema getDMaaPMRSinkTestSchema() { - return Schema.recordOf( - "DMaaPMRSinkTestSchema", - Schema.Field.of("message", Schema.of(Schema.Type.STRING)), - Schema.Field.of("field1", Schema.of(Schema.Type.STRING)) - ); - } - - - protected static TestSimpleTCAPluginConfig getTestSimpleTCAPluginConfig() { - final String policyJson; - try { - policyJson = fromStream(TCA_POLICY_JSON_FILE_LOCATION); - } catch (IOException e) { - throw new RuntimeException("Error while parsing policy", e); - } - return new TestSimpleTCAPluginConfig(VES_MESSAGE_FIELD_NAME, policyJson, TCA_PLUGIN_ALERT_FIELD_NAME, - TCA_PLUGIN_MESSAGE_TYPE_FIELD_NAME, getSimpleTCAPluginInputSchema().toString(), false); - } - - protected static Schema getSimpleTCAPluginInputSchema() { - return Schema.recordOf( - "TestSimpleTCAPluginInputSchema", - Schema.Field.of("message", Schema.of(Schema.Type.STRING)), - Schema.Field.of("inputField1", Schema.nullableOf(Schema.of(Schema.Type.STRING))), - Schema.Field.of("inputField2", Schema.nullableOf(Schema.of(Schema.Type.STRING))) - ); - } - - protected static Schema getJsonFilterPluginInputSchema() { - return Schema.recordOf( - "TestJsonFilterInputSchema", - Schema.Field.of("ts", Schema.of(Schema.Type.LONG)), - Schema.Field.of("responseCode", Schema.of(Schema.Type.INT)), - Schema.Field.of("responseMessage", Schema.of(Schema.Type.STRING)), - Schema.Field.of("message", Schema.of(Schema.Type.STRING)) - ); - } - - protected static TestJsonPathFilterPluginConfig getJsonPathFilterPluginConfig() { - return new TestJsonPathFilterPluginConfig(JSON_PATH_FILTER_PLUGIN_REFERENCE_NAME, - JSON_PATH_FILTER_PLUGIN_INCOMING_JSON_FIELD_NAME, - JSON_PATH_FILTER_PLUGIN_OUTPUT_SCHEMA_FILED_NAME, - JSON_PATH_FILTER_PLUGIN_JSON_FILTER_MAPPINGS, - JSON_PATH_FILTER_PLUGIN_JSON_FILTER_OUTPUT_SCHEMA); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java deleted file mode 100644 index beeb19b..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatProviderTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPPluginConstants.DMaaPMRSinkHadoopConfigFields; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSinkPluginConfig; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - -import java.util.Map; - -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMROutputFormatProviderTest extends BaseAnalyticsCDAPPluginsUnitTest { - - - @Test - public void testDMaaPMROutputFormatProviderWhenConfigIsMissingNonRequiredValues() throws Exception { - final TestDMaaPMRSinkPluginConfig sinkPluginConfig = new TestDMaaPMRSinkPluginConfig(); - sinkPluginConfig.setHostName(DMAAP_MR_SINK_PLUGIN_HOST_NAME); - sinkPluginConfig.setTopicName(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME); - final DMaaPMROutputFormatProvider dMaaPMROutputFormatProvider = - new DMaaPMROutputFormatProvider(sinkPluginConfig); - final Map outputFormatConfiguration = - dMaaPMROutputFormatProvider.getOutputFormatConfiguration(); - final String hostName = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.HOST_NAME); - assertTrue(hostName.equals(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); - final String topicName = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.TOPIC_NAME); - assertTrue(topicName.equals(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); - final String portNumber = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.PORT_NUMBER); - assertTrue(portNumber.equals(AnalyticsConstants.DEFAULT_PORT_NUMBER.toString())); - final String protocol = outputFormatConfiguration.get(DMaaPMRSinkHadoopConfigFields.PROTOCOL); - assertTrue(protocol.equals(AnalyticsConstants.DEFAULT_PROTOCOL)); - } - - @Test - public void testGetOutputFormatClassName() throws Exception { - final DMaaPMROutputFormatProvider dMaaPMROutputFormatProvider = - new DMaaPMROutputFormatProvider(getTestDMaaPMRSinkPluginConfig()); - final String outputFormatClassName = dMaaPMROutputFormatProvider.getOutputFormatClassName(); - assertTrue(outputFormatClassName.equals(DMaaPMROutputFormat.class.getName())); - } - - @Test - public void testGetOutputFormatConfiguration() throws Exception { - final TestDMaaPMRSinkPluginConfig testDMaaPMRSinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); - final DMaaPMROutputFormatProvider dMaaPMROutputFormatProvider = - new DMaaPMROutputFormatProvider(testDMaaPMRSinkPluginConfig); - final Map outputFormatConfiguration = - dMaaPMROutputFormatProvider.getOutputFormatConfiguration(); - assertTrue(outputFormatConfiguration.size() == 9); - - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java deleted file mode 100644 index 97e16c3..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMROutputFormatTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import org.apache.hadoop.io.NullWritable; -import org.apache.hadoop.mapreduce.JobContext; -import org.apache.hadoop.mapreduce.OutputCommitter; -import org.apache.hadoop.mapreduce.RecordWriter; -import org.apache.hadoop.mapreduce.TaskAttemptContext; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMROutputFormatTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private DMaaPMROutputFormat dMaaPMROutputFormat; - - @Before - public void before() { - dMaaPMROutputFormat = new DMaaPMROutputFormat(); - } - - @Test - public void testGetRecordWriter() throws Exception { - final TaskAttemptContext taskAttemptContext = Mockito.mock(TaskAttemptContext.class); - when(taskAttemptContext.getConfiguration()).thenReturn(getTestConfiguration()); - final RecordWriter recordWriter = dMaaPMROutputFormat.getRecordWriter(taskAttemptContext); - assertNotNull(recordWriter); - final JobContext jobContext = Mockito.mock(JobContext.class); - dMaaPMROutputFormat.checkOutputSpecs(jobContext); - } - - @Test - public void testGetOutputCommitter() throws Exception { - final TaskAttemptContext taskAttemptContext = Mockito.mock(TaskAttemptContext.class); - final OutputCommitter outputCommitter = dMaaPMROutputFormat.getOutputCommitter(taskAttemptContext); - assertTrue(outputCommitter.getClass().equals(DMaaPMROutputFormat.NoOpOutputCommitter.class)); - final JobContext jobContext = Mockito.mock(JobContext.class); - outputCommitter.setupJob(jobContext); - outputCommitter.setupTask(taskAttemptContext); - assertFalse(outputCommitter.needsTaskCommit(taskAttemptContext)); - outputCommitter.commitJob(jobContext); - outputCommitter.commitTask(taskAttemptContext); - outputCommitter.abortTask(taskAttemptContext); - - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java deleted file mode 100644 index 611392c..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRRecordWriterTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import org.apache.hadoop.mapreduce.TaskAttemptContext; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; - -import java.util.Arrays; - -import static org.mockito.Mockito.times; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMRRecordWriterTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private DMaaPMRPublisher publisher; - private DMaaPMRRecordWriter dMaaPMRRecordWriter; - - @Before - public void before() { - publisher = Mockito.mock(DMaaPMRPublisher.class); - dMaaPMRRecordWriter = new DMaaPMRRecordWriter(publisher); - } - - @Test - public void testWrite() throws Exception { - final String testMessage = "test Message"; - dMaaPMRRecordWriter.write(testMessage, null); - Mockito.verify(publisher, times(1)).publish(Arrays.asList(testMessage)); - } - - @Test - public void testClose() throws Exception { - final TaskAttemptContext taskAttemptContext = Mockito.mock(TaskAttemptContext.class); - dMaaPMRRecordWriter.close(taskAttemptContext); - Mockito.verify(publisher, times(1)).flush(); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java deleted file mode 100644 index 3ad16d9..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/batch/sink/dmaap/DMaaPMRSinkTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.batch.sink.dmaap; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.Emitter; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.StageConfigurer; -import co.cask.cdap.etl.api.batch.BatchSinkContext; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMRSinkTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private DMaaPMRSink dMaaPMRSink; - - @Before - public void before() { - dMaaPMRSink = new DMaaPMRSink(getTestDMaaPMRSinkPluginConfig()); - } - - @Test - public void testConfigurePipeline() throws Exception { - final PipelineConfigurer pipelineConfigurer = Mockito.mock(PipelineConfigurer.class); - final StageConfigurer stageConfigurer = Mockito.mock(StageConfigurer.class); - when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); - when(stageConfigurer.getInputSchema()).thenReturn(getDMaaPMRSinkTestSchema()); - dMaaPMRSink.configurePipeline(pipelineConfigurer); - verify(stageConfigurer, times(1)).getInputSchema(); - } - - @Test(expected = CDAPSettingsException.class) - public void testConfigurePipelineWithInvalidSchema() throws Exception { - final PipelineConfigurer pipelineConfigurer = Mockito.mock(PipelineConfigurer.class); - final StageConfigurer stageConfigurer = Mockito.mock(StageConfigurer.class); - when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); - when(stageConfigurer.getInputSchema()).thenReturn(Schema.recordOf( - "DMaaPMRSinkInvalidSchema", - Schema.Field.of("message1", Schema.of(Schema.Type.STRING)), - Schema.Field.of("field1", Schema.of(Schema.Type.STRING)) - )); - dMaaPMRSink.configurePipeline(pipelineConfigurer); - } - - @Test - public void testPrepareRun() throws Exception { - final BatchSinkContext batchSinkContext = Mockito.mock(BatchSinkContext.class); - dMaaPMRSink.prepareRun(batchSinkContext); - } - - @Test - @SuppressWarnings("unchecked") - public void testTransform() throws Exception { - final StructuredRecord structuredRecord = Mockito.mock(StructuredRecord.class); - final Emitter emitter = Mockito.mock(Emitter.class); - final String incomingTestMessage = "test message"; - when(structuredRecord.get( - eq(getTestDMaaPMRSinkPluginConfig().getMessageColumnName()))).thenReturn(incomingTestMessage); - doNothing().when(emitter).emit(any()); - dMaaPMRSink.transform(structuredRecord, emitter); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java deleted file mode 100644 index d1fffa3..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSinkPluginConfigTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 1/23/2017. - */ -public class DMaaPMRSinkPluginConfigTest extends BaseAnalyticsCDAPPluginsUnitTest { - - @Test - public void testDMaaPMRSinkPluginConfigDefaults() throws Exception { - final DMaaPMRSinkPluginConfig sinkPluginConfig = new DMaaPMRSinkPluginConfig - (DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME, DMAAP_MR_SINK_PLUGIN_HOST_NAME, - DMAAP_MR_SINK_PLUGIN_TOPIC_NAME, DMAAP_MR_SINK_MESSAGE_COLUMN_NAME); - - assertThat(sinkPluginConfig.getReferenceName(), is(DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME)); - assertThat(sinkPluginConfig.getHostName(), is(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); - assertThat(sinkPluginConfig.getTopicName(), is(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); - assertThat(sinkPluginConfig.getMessageColumnName(), is(DMAAP_MR_SINK_MESSAGE_COLUMN_NAME)); - assertNull(sinkPluginConfig.getPortNumber()); - assertNull(sinkPluginConfig.getProtocol()); - assertNull(sinkPluginConfig.getUserName()); - assertNull(sinkPluginConfig.getUserPassword()); - assertNull(sinkPluginConfig.getContentType()); - assertNull(sinkPluginConfig.getMaxBatchSize()); - assertNull(sinkPluginConfig.getMaxRecoveryQueueSize()); - } - - @Test - public void testDMaaPMRSinkPluginConfigCustom() throws Exception { - final DMaaPMRSinkPluginConfig sinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); - assertThat(sinkPluginConfig.getReferenceName(), is(DMAAP_MR_SINK_PLUGIN_REFERENCE_NAME)); - assertThat(sinkPluginConfig.getHostName(), is(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); - assertThat(sinkPluginConfig.getTopicName(), is(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); - assertThat(sinkPluginConfig.getPortNumber(), is(DMAAP_MR_SINK_PLUGIN_PORT_NUMBER)); - assertThat(sinkPluginConfig.getProtocol(), is(DMAAP_MR_SINK_PLUGIN_PROTOCOL)); - assertThat(sinkPluginConfig.getUserName(), is(DMAAP_MR_SINK_PLUGIN_USERNAME)); - assertThat(sinkPluginConfig.getUserPassword(), is(DMAAP_MR_SINK_PLUGIN_PASSWORD)); - assertThat(sinkPluginConfig.getContentType(), is(DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE)); - assertThat(sinkPluginConfig.getMessageColumnName(), is(DMAAP_MR_SINK_MESSAGE_COLUMN_NAME)); - assertThat(sinkPluginConfig.getMaxBatchSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE)); - assertThat(sinkPluginConfig.getMaxRecoveryQueueSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE)); - } - - @Test - public void testValidToString() throws Exception { - final TestDMaaPMRSinkPluginConfig sinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); - assertNotNull(sinkPluginConfig.toString()); - assertTrue(sinkPluginConfig.toString().contains(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); - } - - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java deleted file mode 100644 index 2302210..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/DMaaPMRSourcePluginConfigTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - - -/** - * @author Rajiv Singla . Creation Date: 1/23/2017. - */ -public class DMaaPMRSourcePluginConfigTest extends BaseAnalyticsCDAPPluginsUnitTest { - - @Test - public void testDMaaPMRSourcePluginConfigDefaults() throws Exception { - final DMaaPMRSourcePluginConfig sourcePluginConfig = new DMaaPMRSourcePluginConfig - (DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME, DMAAP_MR_SOURCE_PLUGIN_HOST_NAME, - DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME, DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL); - - assertThat(sourcePluginConfig.getReferenceName(), is(DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME)); - assertThat(sourcePluginConfig.getHostName(), is(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); - assertThat(sourcePluginConfig.getTopicName(), is(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME)); - assertThat(sourcePluginConfig.getPollingInterval(), is(DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL)); - assertNull(sourcePluginConfig.getPortNumber()); - assertNull(sourcePluginConfig.getProtocol()); - assertNull(sourcePluginConfig.getUserName()); - assertNull(sourcePluginConfig.getUserPassword()); - assertNull(sourcePluginConfig.getContentType()); - assertNull(sourcePluginConfig.getConsumerGroup()); - assertNull(sourcePluginConfig.getConsumerId()); - assertNull(sourcePluginConfig.getMessageLimit()); - assertNull(sourcePluginConfig.getTimeoutMS()); - } - - @Test - public void testDMaaPMRSourcePluginConfigCustom() throws Exception { - final TestDMaaPMRSourcePluginConfig sourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - assertThat(sourcePluginConfig.getReferenceName(), is(DMAAP_MR_SOURCE_PLUGIN_REFERENCE_NAME)); - assertThat(sourcePluginConfig.getHostName(), is(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); - assertThat(sourcePluginConfig.getTopicName(), is(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME)); - assertThat(sourcePluginConfig.getPollingInterval(), is(DMAAP_MR_SOURCE_PLUGIN_POLLING_INTERVAL)); - assertThat(sourcePluginConfig.getPortNumber(), is(DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER)); - assertThat(sourcePluginConfig.getProtocol(), is(DMAAP_MR_SOURCE_PLUGIN_PROTOCOL)); - assertThat(sourcePluginConfig.getUserName(), is(DMAAP_MR_SOURCE_PLUGIN_USERNAME)); - assertThat(sourcePluginConfig.getUserPassword(), is(DMAAP_MR_SOURCE_PLUGIN_PASSWORD)); - assertThat(sourcePluginConfig.getContentType(), is(DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE)); - assertThat(sourcePluginConfig.getConsumerGroup(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP)); - assertThat(sourcePluginConfig.getConsumerId(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID)); - assertThat(sourcePluginConfig.getMessageLimit(), is(DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT)); - assertThat(sourcePluginConfig.getTimeoutMS(), is(DMAAP_MR_SOURCE_PLUGIN_TIMEOUT)); - } - - @Test - public void testValidToString() throws Exception { - final TestDMaaPMRSourcePluginConfig sourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - assertNotNull(sourcePluginConfig.toString()); - assertTrue(sourcePluginConfig.toString().contains(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java deleted file mode 100644 index 47c832e..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSinkPluginConfig.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; - -import javax.annotation.Nullable; - -/** - * Test {@link DMaaPMRSinkPluginConfig} for testing purposes only - *

- * @author Rajiv Singla . Creation Date: 1/23/2017. - */ -public class TestDMaaPMRSinkPluginConfig extends DMaaPMRSinkPluginConfig { - - public void setReferenceName(String referenceName) { - this.referenceName = referenceName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - public void setPortNumber(@Nullable Integer portNumber) { - this.portNumber = portNumber; - } - - public void setTopicName(String topicName) { - this.topicName = topicName; - } - - public void setProtocol(@Nullable String protocol) { - this.protocol = protocol; - } - - public void setUserName(@Nullable String userName) { - this.userName = userName; - } - - public void setUserPassword(@Nullable String userPassword) { - this.userPassword = userPassword; - } - - public void setContentType(@Nullable String contentType) { - this.contentType = contentType; - } - - public void setMaxBatchSize(@Nullable Integer maxBatchSize) { - this.maxBatchSize = maxBatchSize; - } - - public void setMaxRecoveryQueueSize(@Nullable Integer maxRecoveryQueueSize) { - this.maxRecoveryQueueSize = maxRecoveryQueueSize; - } - - public void setMessageColumnName(String messageColumnName) { - this.messageColumnName = messageColumnName; - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java deleted file mode 100644 index 68cd470..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/dmaap/TestDMaaPMRSourcePluginConfig.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap; - -import javax.annotation.Nullable; - -/** - * Test {@link DMaaPMRSourcePluginConfig} for testing purposes only - *

- * @author Rajiv Singla . Creation Date: 1/23/2017. - */ -public class TestDMaaPMRSourcePluginConfig extends DMaaPMRSourcePluginConfig { - - public void setReferenceName(String referenceName) { - this.referenceName = referenceName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - public void setPortNumber(@Nullable Integer portNumber) { - this.portNumber = portNumber; - } - - public void setTopicName(String topicName) { - this.topicName = topicName; - } - - public void setPollingInterval(Integer pollingInterval) { - this.pollingInterval = pollingInterval; - } - - public void setProtocol(@Nullable String protocol) { - this.protocol = protocol; - } - - public void setUserName(@Nullable String userName) { - this.userName = userName; - } - - public void setUserPassword(@Nullable String userPassword) { - this.userPassword = userPassword; - } - - public void setContentType(@Nullable String contentType) { - this.contentType = contentType; - } - - public void setConsumerId(@Nullable String consumerId) { - this.consumerId = consumerId; - } - - public void setConsumerGroup(@Nullable String consumerGroup) { - this.consumerGroup = consumerGroup; - } - - public void setTimeoutMS(@Nullable Integer timeoutMS) { - this.timeoutMS = timeoutMS; - } - - public void setMessageLimit(@Nullable Integer messageLimit) { - this.messageLimit = messageLimit; - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java deleted file mode 100644 index d503c7e..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/filter/TestJsonPathFilterPluginConfig.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter; - -/** - * @author Rajiv Singla . Creation Date: 3/3/2017. - */ -public class TestJsonPathFilterPluginConfig extends JsonPathFilterPluginConfig { - - public TestJsonPathFilterPluginConfig(final String referenceName, final String incomingJsonFieldName, - final String outputSchemaFieldName, final String jsonFilterMappings, - final String schema) { - super(referenceName, incomingJsonFieldName, outputSchemaFieldName, jsonFilterMappings, schema); - } - - - public void setIncomingJsonFieldName(String incomingJsonFieldName) { - this.incomingJsonFieldName = incomingJsonFieldName; - } - - public void setOutputSchemaFieldName(String outputSchemaFieldName) { - this.outputSchemaFieldName = outputSchemaFieldName; - } - - public void setJsonFilterMappings(String jsonFilterMappings) { - this.jsonFilterMappings = jsonFilterMappings; - } - - public void setSchema(String schema) { - this.schema = schema; - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java deleted file mode 100644 index f06dcf0..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/config/tca/TestSimpleTCAPluginConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca; - -/** - * @author Rajiv Singla . Creation Date: 2/17/2017. - */ -public class TestSimpleTCAPluginConfig extends SimpleTCAPluginConfig { - - public TestSimpleTCAPluginConfig(String vesMessageFieldName, String policyJson, String alertFieldName, - String messageTypeFieldName, String schema, Boolean enableAlertCEFFormat) { - super(vesMessageFieldName, policyJson, alertFieldName, messageTypeFieldName, schema, enableAlertCEFFormat); - } - - public void setVesMessageFieldName(String vesMessageFieldName) { - this.vesMessageFieldName = vesMessageFieldName; - } - - public void setPolicyJson(String policyJson) { - this.policyJson = policyJson; - } - - public void setAlertFieldName(String alertFieldName) { - this.alertFieldName = alertFieldName; - } - - public void setMessageTypeFieldName(String messageTypeFieldName) { - this.messageTypeFieldName = messageTypeFieldName; - } - - public void setSchema(String schema) { - this.schema = schema; - } - - public void setEnableAlertCEFFormat(Boolean enableAlertCEFFormat) { - this.enableAlertCEFFormat = enableAlertCEFFormat; - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java deleted file mode 100644 index 2f902b1..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/domain/schema/dmaap/DMaaPSourceOutputSchemaTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap; - -import co.cask.cdap.api.data.schema.Schema; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; - -import java.util.LinkedList; -import java.util.List; - -import static org.hamcrest.CoreMatchers.hasItems; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 1/25/2017. - */ -public class DMaaPSourceOutputSchemaTest extends BaseAnalyticsCDAPPluginsUnitTest { - - - @Test - public void testGetSchemaColumnName() throws Exception { - assertThat(DMaaPSourceOutputSchema.TIMESTAMP.getSchemaColumnName(), is("ts")); - assertThat(DMaaPSourceOutputSchema.RESPONSE_CODE.getSchemaColumnName(), is("responseCode")); - assertThat(DMaaPSourceOutputSchema.RESPONSE_MESSAGE.getSchemaColumnName(), is("responseMessage")); - assertThat(DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName(), is("message")); - } - - @Test - public void testGetSchema() throws Exception { - final Schema schema = DMaaPSourceOutputSchema.getSchema(); - final List fields = schema.getFields(); - final List fieldNames = new LinkedList<>(); - for (Schema.Field field : fields) { - fieldNames.add(field.getName()); - } - assertThat(fieldNames, hasItems( - DMaaPSourceOutputSchema.TIMESTAMP.getSchemaColumnName(), - DMaaPSourceOutputSchema.RESPONSE_CODE.getSchemaColumnName(), - DMaaPSourceOutputSchema.RESPONSE_MESSAGE.getSchemaColumnName(), - DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName())); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java deleted file mode 100644 index f43a3df..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/it/SimpleTCAPluginCDAPIT.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.it; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.api.dataset.table.Table; -import co.cask.cdap.api.plugin.PluginClass; -import co.cask.cdap.api.plugin.PluginPropertyField; -import co.cask.cdap.common.utils.Tasks; -import co.cask.cdap.datapipeline.DataPipelineApp; -import co.cask.cdap.datapipeline.SmartWorkflow; -import co.cask.cdap.etl.api.batch.SparkCompute; -import co.cask.cdap.etl.mock.batch.MockSink; -import co.cask.cdap.etl.mock.batch.MockSource; -import co.cask.cdap.etl.mock.test.HydratorTestBase; -import co.cask.cdap.etl.proto.v2.ETLBatchConfig; -import co.cask.cdap.etl.proto.v2.ETLPlugin; -import co.cask.cdap.etl.proto.v2.ETLStage; -import co.cask.cdap.proto.artifact.AppRequest; -import co.cask.cdap.proto.artifact.ArtifactSummary; -import co.cask.cdap.proto.id.ApplicationId; -import co.cask.cdap.proto.id.ArtifactId; -import co.cask.cdap.proto.id.NamespaceId; -import co.cask.cdap.test.ApplicationManager; -import co.cask.cdap.test.DataSetManager; -import co.cask.cdap.test.WorkflowManager; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.sparkcompute.tca.SimpleTCAPlugin; -import org.openecomp.dcae.apod.analytics.common.validation.DCAEValidator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.net.URI; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; - -/** - * Integration Test which used CDAP Hydrator Test Base to Test Simple TCA Plugin - * - * @author Rajiv Singla . Creation Date: 2/17/2017. - */ -public class SimpleTCAPluginCDAPIT extends HydratorTestBase { - - private static final Logger LOG = LoggerFactory.getLogger(SimpleTCAPluginCDAPIT.class); - - private static final String CDAP_PLUGIN_VERSION = "3.0-SNAPSHOT"; - private static final String CDAP_PLUGIN_ARTIFACT_NAME = "dcae-analytics-cdap-plugins"; - - protected static final ArtifactId DATAPIPELINE_ARTIFACT_ID = NamespaceId.DEFAULT.artifact("data-pipeline", - "4.0.0"); - protected static final ArtifactSummary DATAPIPELINE_ARTIFACT = new ArtifactSummary("data-pipeline", "4.0.0"); - - private static Schema sourceSchema = Schema.recordOf("CEFMessageSourceSchema", - Schema.Field.of("message", Schema.of(Schema.Type.STRING)) - ); - - final Schema outputSchema = Schema.recordOf( - "outputSchema", - Schema.Field.of("message", Schema.of(Schema.Type.STRING)), - Schema.Field.of("alert", Schema.nullableOf(Schema.of(Schema.Type.STRING))), - Schema.Field.of("tcaMessageType", Schema.of(Schema.Type.STRING)) - ); - - @BeforeClass - public static void setupTest() throws Exception { - - setupBatchArtifacts(DATAPIPELINE_ARTIFACT_ID, DataPipelineApp.class); - - - // Enable the below code if you want to run the test in Intelli IDEA editor - // addPluginArtifact(NamespaceId.DEFAULT.artifact("spark-plugins", "1.0.0"), DATAPIPELINE_ARTIFACT_ID, - // SimpleTCAPlugin.class, SimpleTCAPluginConfig.class); - - // Enable the below code if you want to run the test via command line - ArtifactId dcaeAnalyticsCdapPluginsArtifact = NamespaceId.DEFAULT.artifact( - CDAP_PLUGIN_ARTIFACT_NAME, CDAP_PLUGIN_VERSION); - - addPluginArtifact(dcaeAnalyticsCdapPluginsArtifact, DATAPIPELINE_ARTIFACT_ID, - ImmutableSet.of(getSimpleTCAPluginClass()), SimpleTCAPlugin.class, SimpleTCAPluginConfig.class, - CDAPAppSettingsValidator.class, DCAEValidator.class); - } - - private static PluginClass getSimpleTCAPluginClass() { - final HashMap properties = new HashMap<>(); - properties.put("vesMessageFieldName", new PluginPropertyField("vesMessageFieldName", "", - "string", false, false)); - properties.put("referenceName", new PluginPropertyField("referenceName", "", - "string", false, false)); - properties.put("policyJson", new PluginPropertyField("policyJson", "", "string", false, false)); - properties.put("alertFieldName", new PluginPropertyField("alertFieldName", "", "string", false, false)); - properties.put("messageTypeFieldName", new PluginPropertyField( - "messageTypeFieldName", "", "string", false, false)); - properties.put("enableAlertCEFFormat", new PluginPropertyField( - "enableAlertCEFFormat", "", "string", false, false)); - properties.put("schema", new PluginPropertyField( - "schema", "", "string", false, false)); - - return new PluginClass("sparkcompute", "SimpleTCAPlugin", "", SimpleTCAPlugin.class.getName(), - "pluginConfig", properties); - } - - - @AfterClass - public static void cleanup() { - } - - @Test - @SuppressWarnings("deprecation") - public void testTransform() throws Exception { - - LOG.info("Starting Test Transform"); - - final String policyString = getFileContentAsString("/data/json/policy/tca_policy.json"); - final String cefMessage = getFileContentAsString("/data/json/cef/cef_message.json"); - - final Map tcaProperties = new ImmutableMap.Builder() - .put("vesMessageFieldName", "message") - .put("referenceName", "SimpleTcaPlugin") - .put("policyJson", policyString) - .put("alertFieldName", "alert") - .put("messageTypeFieldName", "tcaMessageType") - .put("enableAlertCEFFormat", "true") - .put("schema", outputSchema.toString()) - .build(); - - final ETLPlugin mockSourcePlugin = MockSource.getPlugin("messages", sourceSchema); - final ETLPlugin tcaPlugin = - new ETLPlugin("SimpleTCAPlugin", SparkCompute.PLUGIN_TYPE, tcaProperties, null); - final ETLPlugin mockSink = MockSink.getPlugin("tcaOutput"); - - final ETLBatchConfig etlBatchConfig = ETLBatchConfig.builder("* * * * *") - .addStage(new ETLStage("source", mockSourcePlugin)) - .addStage(new ETLStage("simpleTCAPlugin", tcaPlugin)) - .addStage(new ETLStage("sink", mockSink)) - .addConnection("source", "simpleTCAPlugin") - .addConnection("simpleTCAPlugin", "sink") - .build(); - - AppRequest appRequest = new AppRequest<>(DATAPIPELINE_ARTIFACT, etlBatchConfig); - ApplicationId appId = NamespaceId.DEFAULT.app("TestSimpleTCAPlugin"); - ApplicationManager appManager = deployApplication(appId.toId(), appRequest); - - List sourceMessages = new ArrayList<>(); - StructuredRecord.Builder builder = StructuredRecord.builder(sourceSchema); - builder.set("message", cefMessage); - sourceMessages.add(builder.build()); - - // write records to source - DataSetManager

inputManager = getDataset(NamespaceId.DEFAULT.dataset("messages")); - MockSource.writeInput(inputManager, sourceMessages); - - // manually trigger the pipeline - WorkflowManager workflowManager = appManager.getWorkflowManager(SmartWorkflow.NAME); - workflowManager.start(); - workflowManager.waitForFinish(5, TimeUnit.MINUTES); - - final DataSetManager
outputManager = getDataset("tcaOutput"); - - Tasks.waitFor( - TCACalculatorMessageType.COMPLIANT.name(), - new Callable() { - @Override - public String call() throws Exception { - outputManager.flush(); - List tcaOutputMessageType = new LinkedList<>(); - for (StructuredRecord outputRecord : MockSink.readOutput(outputManager)) { - tcaOutputMessageType.add(outputRecord.get("tcaMessageType").toString()); - final List fields = outputRecord.getSchema().getFields(); - LOG.debug("====>> Printing output Structured Record Contents: {}", outputRecord); - for (Schema.Field field : fields) { - LOG.debug("Field Name: {} - Field Type: {} ---> Field Value: {}", - field.getName(), field.getSchema().getType(), - outputRecord.get(field.getName())); - } - - } - return tcaOutputMessageType.get(0); - } - }, - 4, - TimeUnit.MINUTES); - - } - - private static String getFileContentAsString(final String fileLocation) throws Exception { - final URI tcaPolicyURI = - SimpleTCAPluginCDAPIT.class.getResource(fileLocation).toURI(); - List lines = Files.readAllLines(Paths.get(tcaPolicyURI), Charset.defaultCharset()); - return Joiner.on("").join(lines); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java deleted file mode 100644 index a588eb4..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/sparkcompute/tca/SimpleTCAPluginTest.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.sparkcompute.tca; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.StageConfigurer; -import co.cask.cdap.etl.api.batch.SparkExecutionPluginContext; -import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.api.java.JavaSparkContext; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.TestSimpleTCAPluginConfig; - -import java.util.LinkedList; -import java.util.List; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 2/17/2017. - */ -public class SimpleTCAPluginTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private SimpleTCAPlugin simpleTCAPlugin; - - @Before - public void before() { - final TestSimpleTCAPluginConfig testSimpleTCAPluginConfig = getTestSimpleTCAPluginConfig(); - Schema outputSchema = Schema.recordOf( - "TestSimpleTCAPluginInputSchema", - Schema.Field.of("message", Schema.of(Schema.Type.STRING)), - Schema.Field.of("alert", Schema.nullableOf(Schema.of(Schema.Type.STRING))), - Schema.Field.of("tcaMessageType", Schema.of(Schema.Type.STRING)) - ); - testSimpleTCAPluginConfig.setSchema(outputSchema.toString()); - simpleTCAPlugin = new SimpleTCAPlugin(testSimpleTCAPluginConfig); - } - - @Test - public void testConfigurePipeline() throws Exception { - final PipelineConfigurer pipelineConfigurer = mock(PipelineConfigurer.class); - final StageConfigurer stageConfigurer = mock(StageConfigurer.class); - when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); - when(stageConfigurer.getInputSchema()).thenReturn(getSimpleTCAPluginInputSchema()); - simpleTCAPlugin.configurePipeline(pipelineConfigurer); - verify(stageConfigurer, times(1)).getInputSchema(); - } - - @Test - public void testTransform() throws Exception { - - JavaSparkContext javaSparkContext = new JavaSparkContext("local", "test"); - - Schema sourceSchema = Schema.recordOf("CEFMessageSourceSchema", - Schema.Field.of("message", Schema.of(Schema.Type.STRING)) - ); - - // Inapplicable Message Structured Record - final StructuredRecord inapplicableSR = - StructuredRecord.builder(sourceSchema).set("message", "test").build(); - // compliant - final StructuredRecord compliantSR = - StructuredRecord.builder(sourceSchema).set("message", - fromStream(CEF_MESSAGE_JSON_FILE_LOCATION)).build(); - // non compliant - final String nonCompliantCEF = fromStream(CEF_NON_COMPLIANT_MESSAGE_JSON_FILE_LOCATION); - final StructuredRecord nonCompliantSR = - StructuredRecord.builder(sourceSchema).set("message", nonCompliantCEF).build(); - - final List records = new LinkedList<>(); - records.add(inapplicableSR); - records.add(compliantSR); - records.add(nonCompliantSR); - - final JavaRDD input = - javaSparkContext.parallelize(records); - final SparkExecutionPluginContext context = Mockito.mock(SparkExecutionPluginContext.class); - final MockStageMetrics stageMetrics = Mockito.mock(MockStageMetrics.class); - when(context.getMetrics()).thenReturn(stageMetrics); - final List outputRecord = simpleTCAPlugin.transform(context, input).collect(); - assertNotNull(outputRecord); - assertThat(outputRecord.size(), is(3)); - - assertTrue(outputRecord.get(0).get("tcaMessageType").equals(TCACalculatorMessageType.INAPPLICABLE.toString())); - assertTrue(outputRecord.get(1).get("tcaMessageType").equals(TCACalculatorMessageType.COMPLIANT.toString())); - assertTrue(outputRecord.get(2).get("tcaMessageType").equals(TCACalculatorMessageType.NON_COMPLIANT.toString())); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java deleted file mode 100644 index 40fadcc..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRReceiverTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import com.google.common.collect.ImmutableList; -import org.apache.spark.storage.StorageLevel; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; - -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 1/24/2017. - */ -public class DMaaPMRReceiverTest extends BaseAnalyticsCDAPPluginsUnitTest { - - - @Test - public void testStoreStructuredRecords() throws Exception { - - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - final TestDMaaPMRReceiver dMaaPMRReceiver = - new TestDMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), testDMaaPMRSourcePluginConfig); - - final DMaaPMRSubscriber dMaaPMRSubscriber = Mockito.mock(DMaaPMRSubscriber.class); - final DMaaPMRSubscriberResponse subscriberResponse = Mockito.mock(DMaaPMRSubscriberResponse.class); - when(dMaaPMRSubscriber.fetchMessages()).thenReturn(subscriberResponse); - when(subscriberResponse.getFetchedMessages()).thenReturn(ImmutableList.of("Test Message")); - when(subscriberResponse.getResponseCode()).thenReturn(200); - when(subscriberResponse.getResponseMessage()).thenReturn("OK"); - dMaaPMRReceiver.storeStructuredRecords(dMaaPMRSubscriber); - verify(dMaaPMRSubscriber, times(1)).fetchMessages(); - verify(subscriberResponse, times(1)).getFetchedMessages(); - } - - @Test - public void testStoreStructuredRecordsWhenSubscriberThrowsException() throws Exception { - - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - final TestDMaaPMRReceiver dMaaPMRReceiver = - new TestDMaaPMRReceiver(StorageLevel.MEMORY_ONLY(), testDMaaPMRSourcePluginConfig); - - final DMaaPMRSubscriber dMaaPMRSubscriber = Mockito.mock(DMaaPMRSubscriber.class); - final DMaaPMRSubscriberResponse subscriberResponse = Mockito.mock(DMaaPMRSubscriberResponse.class); - when(dMaaPMRSubscriber.fetchMessages()).thenThrow(DCAEAnalyticsRuntimeException.class); - dMaaPMRReceiver.storeStructuredRecords(dMaaPMRSubscriber); - verify(dMaaPMRSubscriber, times(1)).fetchMessages(); - verify(subscriberResponse, times(0)).getFetchedMessages(); - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java deleted file mode 100644 index 0b5ac87..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/DMaaPMRSourceTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.StageConfigurer; -import co.cask.cdap.etl.api.streaming.StreamingContext; -import org.apache.spark.streaming.api.java.JavaDStream; -import org.apache.spark.streaming.api.java.JavaReceiverInputDStream; -import org.apache.spark.streaming.api.java.JavaStreamingContext; -import org.apache.spark.streaming.receiver.Receiver; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; - -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 1/24/2017. - */ -public class DMaaPMRSourceTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private PipelineConfigurer pipelineConfigurer; - - @Before - public void before() { - pipelineConfigurer = Mockito.mock(PipelineConfigurer.class); - final StageConfigurer stageConfigurer = Mockito.mock(StageConfigurer.class); - when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); - doNothing().when(stageConfigurer).setOutputSchema(any(Schema.class)); - } - - @Test - public void testDMaaPMRSourceConfigurePipelineWithValidPluginSettings() throws Exception { - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - final DMaaPMRSource dMaaPMRSource = new DMaaPMRSource(testDMaaPMRSourcePluginConfig); - dMaaPMRSource.configurePipeline(pipelineConfigurer); - assertNotNull(dMaaPMRSource); - } - - @Test(expected = CDAPSettingsException.class) - public void testDMaaPMRSourceConfigurePipelineWithInvalidPluginSettings() throws Exception { - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - // blank out DMaaP MR Source Host - testDMaaPMRSourcePluginConfig.setHostName(null); - final DMaaPMRSource dMaaPMRSource = new DMaaPMRSource(testDMaaPMRSourcePluginConfig); - dMaaPMRSource.configurePipeline(pipelineConfigurer); - } - - - @Test - @SuppressWarnings("unchecked") - public void testGetStream() throws Exception { - final StreamingContext streamingContext = Mockito.mock(StreamingContext.class); - final JavaStreamingContext javaStreamingContext = Mockito.mock(JavaStreamingContext.class); - final JavaReceiverInputDStream dMaaPMRReceiver = Mockito.mock(JavaReceiverInputDStream.class); - when(streamingContext.getSparkStreamingContext()).thenReturn(javaStreamingContext); - when(javaStreamingContext.receiverStream(any(Receiver.class))).thenReturn(dMaaPMRReceiver); - - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - final DMaaPMRSource dMaaPMRSource = new DMaaPMRSource(testDMaaPMRSourcePluginConfig); - final JavaDStream stream = dMaaPMRSource.getStream(streamingContext); - assertNotNull(stream); - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java deleted file mode 100644 index d2221ea..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRReceiverTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.data.format.StructuredRecord; -import org.apache.spark.storage.StorageLevel; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.schema.dmaap.DMaaPSourceOutputSchema; - -import java.util.concurrent.TimeUnit; - -/** - * @author Rajiv Singla . Creation Date: 2/20/2017. - */ -public class MockDMaaPMRReceiverTest extends BaseAnalyticsCDAPPluginsUnitTest { - - protected class TestMockDMaaPMRReceiverTest extends MockDMaaPMRReceiver { - - private boolean canStop = false; - - public TestMockDMaaPMRReceiverTest(StorageLevel storageLevel, DMaaPMRSourcePluginConfig pluginConfig) { - super(storageLevel, pluginConfig); - } - - @Override - public boolean isStopped() { - return canStop; - } - - @Override - public void store(StructuredRecord dataItem) { - LOG.debug("Mocking storing dataItem - {}", - dataItem.get(DMaaPSourceOutputSchema.FETCHED_MESSAGE.getSchemaColumnName())); - } - - public void setCanStop(boolean canStop) { - this.canStop = canStop; - } - } - - @Test - public void testStoreStructuredRecords() throws Exception { - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - testDMaaPMRSourcePluginConfig.setPollingInterval(100); - final TestMockDMaaPMRReceiverTest mockDMaaPMRReceiver = new TestMockDMaaPMRReceiverTest(StorageLevel - .MEMORY_ONLY(), - testDMaaPMRSourcePluginConfig); - new Thread(new Runnable() { - @Override - public void run() { - mockDMaaPMRReceiver.storeStructuredRecords(null); - } - }).start(); - TimeUnit.MILLISECONDS.sleep(1000); - LOG.info("Killing Mock Subscriber after 1 ms"); - mockDMaaPMRReceiver.setCanStop(true); - - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java deleted file mode 100644 index 7888d59..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/MockDMaaPMRSourceTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.etl.api.streaming.StreamingContext; -import org.apache.spark.streaming.api.java.JavaDStream; -import org.apache.spark.streaming.api.java.JavaReceiverInputDStream; -import org.apache.spark.streaming.api.java.JavaStreamingContext; -import org.apache.spark.streaming.receiver.Receiver; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; - -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 2/20/2017. - */ -@SuppressWarnings("unchecked") -public class MockDMaaPMRSourceTest extends BaseAnalyticsCDAPPluginsUnitTest { - - @Test - public void testGetStream() throws Exception { - final StreamingContext streamingContext = Mockito.mock(StreamingContext.class); - final JavaStreamingContext javaStreamingContext = Mockito.mock(JavaStreamingContext.class); - final JavaReceiverInputDStream dMaaPMRReceiver = Mockito.mock(JavaReceiverInputDStream.class); - when(streamingContext.getSparkStreamingContext()).thenReturn(javaStreamingContext); - when(javaStreamingContext.receiverStream(any(Receiver.class))).thenReturn(dMaaPMRReceiver); - - MockDMaaPMRSource mockDMaaPMRSource = new MockDMaaPMRSource(getTestDMaaPMRSourcePluginConfig()); - final JavaDStream stream = mockDMaaPMRSource.getStream(streamingContext); - assertNotNull(stream); - } - - @Test(expected = CDAPSettingsException.class) - public void testConfigurePipelineWhenPollingIntervalNotPresent() throws Exception { - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - testDMaaPMRSourcePluginConfig.setPollingInterval(null); - final MockDMaaPMRSource mockDMaaPMRSource = new MockDMaaPMRSource(testDMaaPMRSourcePluginConfig); - mockDMaaPMRSource.configurePipeline(null); - } - - @Test - public void testConfigurePipelineWhenPollingIntervalIsPresent() throws Exception { - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - final MockDMaaPMRSource mockDMaaPMRSource = new MockDMaaPMRSource(testDMaaPMRSourcePluginConfig); - mockDMaaPMRSource.configurePipeline(null); - assertNotNull(mockDMaaPMRSource); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java deleted file mode 100644 index 2eab27b..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/streaming/dmaap/TestDMaaPMRReceiver.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.metrics.Metrics; -import org.apache.spark.storage.StorageLevel; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; - -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doNothing; - -/** - * Test implementation for {@link DMaaPMRReceiver} - *

- * @author Rajiv Singla . Creation Date: 1/24/2017. - */ -public class TestDMaaPMRReceiver extends DMaaPMRReceiver { - - protected static Metrics metrics; - - static { - metrics = Mockito.mock(Metrics.class); - doNothing().when(metrics).count(anyString(), anyInt()); - doNothing().when(metrics).gauge(anyString(), anyInt()); - } - - - public TestDMaaPMRReceiver(StorageLevel storageLevel, DMaaPMRSourcePluginConfig pluginConfig) { - - super(storageLevel, pluginConfig, metrics); - } - - @Override - public void store(StructuredRecord dataItem) { - // do nothing - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java deleted file mode 100644 index a0feb99..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/transform/filter/JsonPathFilterTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.transform.filter; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import co.cask.cdap.etl.api.Emitter; -import co.cask.cdap.etl.api.PipelineConfigurer; -import co.cask.cdap.etl.api.StageConfigurer; -import org.junit.Test; -import org.mockito.ArgumentMatchers; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; - -import java.util.Date; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 3/3/2017. - */ -public class JsonPathFilterTest extends BaseAnalyticsCDAPPluginsUnitTest { - - - @Test - public void testInitializeWhenFilterMappingIsValid() throws Exception { - final JsonPathFilter jsonPathFilter = new JsonPathFilter(getJsonPathFilterPluginConfig()); - jsonPathFilter.initialize(null); - } - - - @Test - public void configurePipeline() throws Exception { - final JsonPathFilter jsonPathFilter = new JsonPathFilter(getJsonPathFilterPluginConfig()); - final PipelineConfigurer pipelineConfigurer = mock(PipelineConfigurer.class); - final StageConfigurer stageConfigurer = mock(StageConfigurer.class); - when(pipelineConfigurer.getStageConfigurer()).thenReturn(stageConfigurer); - when(stageConfigurer.getInputSchema()).thenReturn(getSimpleTCAPluginInputSchema()); - doNothing().when(stageConfigurer).setOutputSchema(any(Schema.class)); - jsonPathFilter.configurePipeline(pipelineConfigurer); - verify(stageConfigurer, times(1)).setOutputSchema(any(Schema.class)); - } - - @Test - public void testTransform() throws Exception { - final JsonPathFilter jsonPathFilter = new JsonPathFilter(getJsonPathFilterPluginConfig()); - jsonPathFilter.initialize(null); - final StructuredRecord inputSR = StructuredRecord.builder(getJsonFilterPluginInputSchema()) - .set("ts", new Date().getTime()) - .set("responseCode", 200) - .set("responseMessage", "OK") - .set("message", fromStream(CEF_MESSAGE_JSON_FILE_LOCATION)) - .build(); - - final Emitter emitter = Mockito.mock(Emitter.class); - doNothing().when(emitter).emit(ArgumentMatchers.any(StructuredRecord.class)); - jsonPathFilter.transform(inputSR, emitter); - verify(emitter, times(1)).emit(any(StructuredRecord.class)); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java deleted file mode 100644 index fbecb81..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/CDAPPluginUtilsTest.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.utils; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.data.schema.Schema; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class CDAPPluginUtilsTest extends BaseAnalyticsCDAPPluginsUnitTest { - - - @Test - public void testValidateSchemaContainsFieldsWhenSchemaIsNotNull() throws Exception { - final Schema dMaaPMRSinkTestSchema = getDMaaPMRSinkTestSchema(); - CDAPPluginUtils.validateSchemaContainsFields(dMaaPMRSinkTestSchema, "message"); - } - - @Test - public void testValidateSchemaContainsFieldsWhenInputSchemaIsNull() throws Exception { - CDAPPluginUtils.validateSchemaContainsFields(null, "message"); - } - - @Test - public void testCreateStructuredRecord() throws Exception { - final StructuredRecord testMessage = CDAPPluginUtils.createDMaaPMRResponseStructuredRecord("testMessage"); - assertNotNull(testMessage); - } - - - @Test - public void testCreateOutputStructuredRecordBuilder() throws Exception { - - final String messageFieldName = "message"; - final String firstInputFieldName = "inputField1"; - final String secondInputFieldName = "inputField2"; - - - final Schema inputSchema = Schema.recordOf( - "inputSchema", - Schema.Field.of(messageFieldName, Schema.of(Schema.Type.STRING)), - Schema.Field.of(firstInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))), - Schema.Field.of(secondInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))) - ); - - final String addedFieldName = "addedField"; - final Schema outputSchema = Schema.recordOf( - "outputSchema", - Schema.Field.of(messageFieldName, Schema.of(Schema.Type.STRING)), - Schema.Field.of(firstInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))), - Schema.Field.of(addedFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))) // added field - // missing second Input Field - ); - - // input structured record - final String messageFieldValue = "Message String"; - final String firstFieldValue = "Input Field 1"; - final String secondFieldValue = "Input Field 2"; - final StructuredRecord inputSR = StructuredRecord.builder(inputSchema) - .set(messageFieldName, messageFieldValue) - .set(firstInputFieldName, firstFieldValue) - .set(secondInputFieldName, secondFieldValue) - .build(); - - final StructuredRecord.Builder outputStructuredRecordBuilder = - CDAPPluginUtils.createOutputStructuredRecordBuilder(outputSchema, inputSR); - - final String addedFieldValue = "Added Field Value"; - final StructuredRecord outputSR = outputStructuredRecordBuilder - .set(addedFieldName, addedFieldValue) - .build(); - - assertThat("Added Field field value copied correctly", - outputSR.get(addedFieldName).toString(), is(addedFieldValue)); - - assertThat("Output SR has message field copied correctly", - outputSR.get(messageFieldName).toString(), is(messageFieldValue)); - - assertThat("First Field value copied correctly", - outputSR.get(firstInputFieldName).toString(), is(firstFieldValue)); - - assertNull("Second Field value is null as output schema does not have the field", - outputSR.get(secondInputFieldName)); - - } - - - @Test - public void testAddFieldValueToStructuredRecordBuilder() throws Exception { - - final String messageFieldName = "message"; - final String firstInputFieldName = "inputField1"; - final String addedFieldName = "addedField"; - final String firstFieldValue = "Input Field 1"; - final String addedFieldValue = "Added Field Value"; - final Schema outputSchema = Schema.recordOf( - "outputSchema", - Schema.Field.of(messageFieldName, Schema.of(Schema.Type.STRING)), - Schema.Field.of(firstInputFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))), - Schema.Field.of(addedFieldName, Schema.nullableOf(Schema.of(Schema.Type.STRING))) // added field - ); - - final StructuredRecord.Builder outputSRBuilder = StructuredRecord.builder(outputSchema) - .set(messageFieldName, "Some message") - .set(firstInputFieldName, firstFieldValue); - - final StructuredRecord.Builder addedFieldSRBuilder = CDAPPluginUtils.addFieldValueToStructuredRecordBuilder( - outputSRBuilder, outputSchema, addedFieldName, addedFieldValue); - - // Try adding field to output Structured record that is not in output schema - final String nonExistentFieldName = "fieldNotInOutputSchema"; - final String nonExistentFieldValue = "Some Value"; - final StructuredRecord outputSR = CDAPPluginUtils.addFieldValueToStructuredRecordBuilder( - addedFieldSRBuilder, outputSchema, nonExistentFieldName, nonExistentFieldValue).build(); - - assertThat("Output SR must contain added Field which is in output schema", - outputSR.get(addedFieldName).toString(), is(addedFieldValue)); - assertNull("Output SR must not contain field that is not in output schema", - outputSR.get(nonExistentFieldName)); - - } - - @Test(expected = DCAEAnalyticsRuntimeException.class) - public void testValidateSchemaFieldTypeWhenInputSchemaIsNotValidJson() throws Exception { - CDAPPluginUtils.validateSchemaFieldType("Invalid Schema", "field1", Schema.Type.STRING); - } - - @Test(expected = DCAEAnalyticsRuntimeException.class) - public void testSetOutputSchemaWhenOutputSchemaIsNotValidJson() throws Exception { - CDAPPluginUtils.setOutputSchema(null, "Invalid output Schema"); - } - - @Test(expected = DCAEAnalyticsRuntimeException.class) - public void testExtractFieldMappingsWhenFieldMappingValueIsEmpty() throws Exception { - CDAPPluginUtils.extractFieldMappings("path1:,path2:value2"); - } - - @Test(expected = DCAEAnalyticsRuntimeException.class) - public void testExtractFieldMappingsWhenFieldMappingAreBlank() throws Exception { - CDAPPluginUtils.extractFieldMappings("path1: ,path2:value2"); - } - - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java deleted file mode 100644 index b05a5d2..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSinkConfigMapperTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.utils; - -import org.apache.hadoop.conf.Configuration; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPSinkConfigMapperTest extends BaseAnalyticsCDAPPluginsUnitTest { - - - @Test - public void testMapToPublisherConfig() throws Exception { - - final Configuration testConfiguration = getTestConfiguration(); - final DMaaPMRPublisherConfig publisherConfig = DMaaPSinkConfigMapper.map(testConfiguration); - - assertNotNull(publisherConfig); - assertThat(publisherConfig.getHostName(), is(DMAAP_MR_SINK_PLUGIN_HOST_NAME)); - assertThat(publisherConfig.getTopicName(), is(DMAAP_MR_SINK_PLUGIN_TOPIC_NAME)); - assertThat(publisherConfig.getPortNumber(), is(DMAAP_MR_SINK_PLUGIN_PORT_NUMBER)); - assertThat(publisherConfig.getProtocol(), is(DMAAP_MR_SINK_PLUGIN_PROTOCOL)); - assertThat(publisherConfig.getUserName(), is(DMAAP_MR_SINK_PLUGIN_USERNAME)); - assertThat(publisherConfig.getUserPassword(), is(DMAAP_MR_SINK_PLUGIN_PASSWORD)); - assertThat(publisherConfig.getContentType(), is(DMAAP_MR_SINK_PLUGIN_CONTENT_TYPE)); - assertThat(publisherConfig.getMaxBatchSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_BATCH_SIZE)); - assertThat(publisherConfig.getMaxRecoveryQueueSize(), is(DMAAP_MR_SINK_PLUGIN_MAX_RECOVERY_QUEUE_SIZE)); - - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java deleted file mode 100644 index e84194f..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/utils/DMaaPSourceConfigMapperTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.utils; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 1/24/2017. - */ -public class DMaaPSourceConfigMapperTest extends BaseAnalyticsCDAPPluginsUnitTest { - - @Test - public void testMapToSubscriberConfig() throws Exception { - - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - final DMaaPMRSubscriberConfig subscriberConfig = DMaaPSourceConfigMapper.map(testDMaaPMRSourcePluginConfig); - - assertNotNull(subscriberConfig); - assertThat(subscriberConfig.getHostName(), is(DMAAP_MR_SOURCE_PLUGIN_HOST_NAME)); - assertThat(subscriberConfig.getTopicName(), is(DMAAP_MR_SOURCE_PLUGIN_TOPIC_NAME)); - assertThat(subscriberConfig.getPortNumber(), is(DMAAP_MR_SOURCE_PLUGIN_PORT_NUMBER)); - assertThat(subscriberConfig.getProtocol(), is(DMAAP_MR_SOURCE_PLUGIN_PROTOCOL)); - assertThat(subscriberConfig.getUserName(), is(DMAAP_MR_SOURCE_PLUGIN_USERNAME)); - assertThat(subscriberConfig.getUserPassword(), is(DMAAP_MR_SOURCE_PLUGIN_PASSWORD)); - assertThat(subscriberConfig.getContentType(), is(DMAAP_MR_SOURCE_PLUGIN_CONTENT_TYPE)); - assertThat(subscriberConfig.getConsumerGroup(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_GROUP)); - assertThat(subscriberConfig.getConsumerId(), is(DMAAP_MR_SOURCE_PLUGIN_CONSUMER_ID)); - assertThat(subscriberConfig.getMessageLimit(), is(DMAAP_MR_SOURCE_PLUGIN_MESSAGE_LIMIT)); - assertThat(subscriberConfig.getTimeoutMS(), is(DMAAP_MR_SOURCE_PLUGIN_TIMEOUT)); - } - - @Test(expected = IllegalStateException.class) - public void testMapToSubscriberConfigWhenSubscriberHostNameIsEmpty() throws Exception { - final TestDMaaPMRSourcePluginConfig testDMaaPMRSourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - testDMaaPMRSourcePluginConfig.setHostName(null); - DMaaPSourceConfigMapper.map(testDMaaPMRSourcePluginConfig); - - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java deleted file mode 100644 index 05c0ddd..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSinkPluginConfigValidatorTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSinkPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSinkPluginConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMRSinkPluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private TestDMaaPMRSinkPluginConfig sinkPluginConfig; - private DMaaPMRSinkPluginConfigValidator sinkPluginConfigValidator; - - @Before - public void before() { - sinkPluginConfigValidator = new DMaaPMRSinkPluginConfigValidator(); - sinkPluginConfig = getTestDMaaPMRSinkPluginConfig(); - } - - @Test - public void validateAppSettingsWithValidDMaaPSinkConfig() throws Exception { - final GenericValidationResponse validationResponse = - sinkPluginConfigValidator.validateAppSettings(sinkPluginConfig); - assertFalse(validationResponse.hasErrors()); - } - - - @Test - public void validateAppSettingsWithValidDMaaPSinkConfigWhenHostNameIsNotPresent() throws Exception { - sinkPluginConfig.setHostName(null); - assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); - } - - @Test - public void validateAppSettingsWithValidDMaaPSinkConfigWhenHostPortIsNotPresent() throws Exception { - sinkPluginConfig.setPortNumber(null); - assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); - } - - @Test - public void validateAppSettingsWithValidDMaaPSinkConfigWhenTopicNameIsNotPresent() throws Exception { - sinkPluginConfig.setTopicName(null); - assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); - } - - @Test - public void validateAppSettingsWithValidDMaaPSinkConfigWhenColumnNameIsNotPresent() throws Exception { - sinkPluginConfig.setMessageColumnName(null); - assertResponseHasErrors(sinkPluginConfig, sinkPluginConfigValidator); - } - - private static void assertResponseHasErrors(final TestDMaaPMRSinkPluginConfig sinkPluginConfig, - final DMaaPMRSinkPluginConfigValidator validator) { - final GenericValidationResponse validationResponse = validator.validateAppSettings(sinkPluginConfig); - assertTrue(validationResponse.hasErrors()); - } - - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java deleted file mode 100644 index 0401bb7..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/DMaaPMRSourcePluginConfigValidatorTest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.TestDMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 1/30/2017. - */ -public class DMaaPMRSourcePluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private TestDMaaPMRSourcePluginConfig sourcePluginConfig; - private DMaaPMRSourcePluginConfigValidator sourcePluginConfigValidator; - - @Before - public void before() { - sourcePluginConfigValidator = new DMaaPMRSourcePluginConfigValidator(); - sourcePluginConfig = getTestDMaaPMRSourcePluginConfig(); - } - - @Test - public void validateAppSettingsWithValidDMaaPSourceConfig() throws Exception { - final GenericValidationResponse validationResponse = - sourcePluginConfigValidator.validateAppSettings(sourcePluginConfig); - assertFalse(validationResponse.hasErrors()); - } - - - @Test - public void validateAppSettingsWithValidDMaaPSourceConfigWhenHostNameIsNotPresent() throws Exception { - sourcePluginConfig.setHostName(null); - assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); - } - - @Test - public void validateAppSettingsWithValidDMaaPSourceConfigWhenHostPortIsNotPresent() throws Exception { - sourcePluginConfig.setPortNumber(null); - assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); - } - - @Test - public void validateAppSettingsWithValidDMaaPSourceConfigWhenTopicNameIsNotPresent() throws Exception { - sourcePluginConfig.setTopicName(null); - assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); - } - - @Test - public void validateAppSettingsWithValidDMaaPSourcePollingIntervalIsNotPresent() throws Exception { - sourcePluginConfig.setPollingInterval(null); - assertResponseHasErrors(sourcePluginConfig, sourcePluginConfigValidator); - } - - private static void assertResponseHasErrors(final TestDMaaPMRSourcePluginConfig sourcePluginConfig, - final DMaaPMRSourcePluginConfigValidator validator) { - final GenericValidationResponse validationResponse = validator.validateAppSettings(sourcePluginConfig); - assertTrue(validationResponse.hasErrors()); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java deleted file mode 100644 index 7708dcd..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/JsonPathFilterPluginConfigValidatorTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter.JsonPathFilterPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.filter.TestJsonPathFilterPluginConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 3/3/2017. - */ -public class JsonPathFilterPluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private TestJsonPathFilterPluginConfig jsonPathFilterPluginConfig; - private JsonPathFilterPluginConfigValidator jsonPathFilterPluginConfigValidator; - - @Before - public void before() { - jsonPathFilterPluginConfig = getJsonPathFilterPluginConfig(); - jsonPathFilterPluginConfigValidator = new JsonPathFilterPluginConfigValidator(); - } - - - @Test - public void testValidateAppSettingsWhenNoValidationErrors() throws Exception { - final GenericValidationResponse validationResponse = - jsonPathFilterPluginConfigValidator.validateAppSettings(jsonPathFilterPluginConfig); - assertFalse(validationResponse.hasErrors()); - } - - @Test - public void testValidateAppSettingsWhenFilterMappingsAreEmpty() throws Exception { - jsonPathFilterPluginConfig.setJsonFilterMappings(""); - assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenOutputSchemaIsNotPresent() throws Exception { - jsonPathFilterPluginConfig.setSchema(null); - assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenOutputSchemaFilterMatchedFieldIsNotBoolean() throws Exception { - final String outputSchemaWithMatchedFieldNotBoolean = - "{\"type\":\"record\"," + - "\"name\":\"etlSchemaBody\",\"fields\":" + - "[" + - "{\"name\":\"ts\",\"type\":\"long\"}," + - "{\"name\":\"filterMatched\",\"type\":[\"string\",\"null\"]}," + - "{\"name\":\"responseCode\",\"type\":\"int\"}," + - "{\"name\":\"responseMessage\",\"type\":\"string\"}," + - "{\"name\":\"message\",\"type\":\"string\"}" + - "]" + - "}"; - jsonPathFilterPluginConfig.setSchema(outputSchemaWithMatchedFieldNotBoolean); - assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenOutputSchemaFilterMatchedFieldIsNotNullable() throws Exception { - final String outputSchemaWithMatchedFieldNotNullable = - "{\"type\":\"record\"," + - "\"name\":\"etlSchemaBody\",\"fields\":" + - "[" + - "{\"name\":\"ts\",\"type\":\"long\"}," + - "{\"name\":\"filterMatched\",\"type\":\"boolean\"}," + - "{\"name\":\"responseCode\",\"type\":\"int\"}," + - "{\"name\":\"responseMessage\",\"type\":\"string\"}," + - "{\"name\":\"message\",\"type\":\"string\"}" + - "]" + - "}"; - jsonPathFilterPluginConfig.setSchema(outputSchemaWithMatchedFieldNotNullable); - assertResponseHasErrors(jsonPathFilterPluginConfig, jsonPathFilterPluginConfigValidator); - } - - private static void assertResponseHasErrors(final TestJsonPathFilterPluginConfig jsonPluginConfig, - final JsonPathFilterPluginConfigValidator validator) { - final GenericValidationResponse validationResponse = validator.validateAppSettings(jsonPluginConfig); - assertTrue(validationResponse.hasErrors()); - } - -} diff --git a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java b/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java deleted file mode 100644 index 3641c79..0000000 --- a/dcae-analytics-cdap-plugins/src/test/java/org/openecomp/dcae/apod/analytics/cdap/plugins/validator/SimpleTCAPluginConfigValidatorTest.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.plugins.validator; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.BaseAnalyticsCDAPPluginsUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.SimpleTCAPluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.tca.TestSimpleTCAPluginConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 2/21/2017. - */ -public class SimpleTCAPluginConfigValidatorTest extends BaseAnalyticsCDAPPluginsUnitTest { - - private TestSimpleTCAPluginConfig testSimpleTCAPluginConfig; - private SimpleTCAPluginConfigValidator simpleTCAPluginConfigValidator; - - @Before - public void before() { - testSimpleTCAPluginConfig = getTestSimpleTCAPluginConfig(); - simpleTCAPluginConfigValidator = new SimpleTCAPluginConfigValidator(); - } - - @Test - public void testValidateAppSettingsWhenAllSettingsAreValid() throws Exception { - final GenericValidationResponse validationResponse = - simpleTCAPluginConfigValidator.validateAppSettings(testSimpleTCAPluginConfig); - assertFalse(validationResponse.hasErrors()); - } - - @Test - public void testValidateAppSettingsWhenVESMessageFieldNameIsMissing() throws Exception { - testSimpleTCAPluginConfig.setVesMessageFieldName(null); - assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenPolicyJsonIsMissing() throws Exception { - testSimpleTCAPluginConfig.setPolicyJson(null); - assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenAlertFieldNameIsMissing() throws Exception { - testSimpleTCAPluginConfig.setAlertFieldName(null); - assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenOutputSchemaIsNull() throws Exception { - testSimpleTCAPluginConfig.setSchema(null); - assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenMessageTypeFieldNameIsMissing() throws Exception { - testSimpleTCAPluginConfig.setMessageTypeFieldName(null); - assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenAlertFieldIsNullableInOutputSchema() throws Exception { - testSimpleTCAPluginConfig.setSchema( - "{\"type\":\"record\"," + - "\"name\":\"etlSchemaBody\"," + - "\"fields\":[" + - "{\"name\":\"ts\",\"type\":\"long\"}," + - "{\"name\":\"responseCode\",\"type\":\"int\"}," + - "{\"name\":\"responseMessage\",\"type\":\"string\"}," + - "{\"name\":\"message\",\"type\":\"string\"}," + - "{\"name\":\"alert\",\"type\":[\"string\",\"null\"]}," + - "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); - final GenericValidationResponse validationResponse = - simpleTCAPluginConfigValidator.validateAppSettings(testSimpleTCAPluginConfig); - assertFalse(validationResponse.hasErrors()); - - } - - @Test - public void testValidateAppSettingsWhenAlertFieldIsNotPresentInOutputSchema() throws Exception { - testSimpleTCAPluginConfig.setSchema( - "{\"type\":\"record\"," + - "\"name\":\"etlSchemaBody\"," + - "\"fields\":[" + - "{\"name\":\"ts\",\"type\":\"long\"}," + - "{\"name\":\"responseCode\",\"type\":\"int\"}," + - "{\"name\":\"responseMessage\",\"type\":\"string\"}," + - "{\"name\":\"message\",\"type\":\"string\"}," + - "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); - final GenericValidationResponse validationResponse = - simpleTCAPluginConfigValidator.validateAppSettings(testSimpleTCAPluginConfig); - assertFalse(validationResponse.hasErrors()); - - } - - @Test - public void testValidateAppSettingsWhenAlertFieldIsNullableButNotStringTypeInOutputSchema() throws Exception { - testSimpleTCAPluginConfig.setSchema( - "{\"type\":\"record\"," + - "\"name\":\"etlSchemaBody\"," + - "\"fields\":[" + - "{\"name\":\"ts\",\"type\":\"long\"}," + - "{\"name\":\"responseCode\",\"type\":\"int\"}," + - "{\"name\":\"responseMessage\",\"type\":\"string\"}," + - "{\"name\":\"message\",\"type\":\"string\"}," + - "{\"name\":\"alert\",\"type\":[\"int\",\"null\"]}," + - "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); - assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); - } - - @Test - public void testValidateAppSettingsWhenAlertFieldNameIsNotNullableInOutputSchema() throws Exception { - testSimpleTCAPluginConfig.setSchema( - "{\"type\":\"record\"," + - "\"name\":\"etlSchemaBody\"," + - "\"fields\":[" + - "{\"name\":\"ts\",\"type\":\"long\"}," + - "{\"name\":\"responseCode\",\"type\":\"int\"}," + - "{\"name\":\"responseMessage\",\"type\":\"string\"}," + - "{\"name\":\"message\",\"type\":\"string\"}," + - "{\"name\":\"alert\",\"type\":\"string\"}," + - "{\"name\":\"tcaMessageType\",\"type\":\"string\"}]}"); - assertResponseHasErrors(testSimpleTCAPluginConfig, simpleTCAPluginConfigValidator); - } - - - - private static void assertResponseHasErrors(final TestSimpleTCAPluginConfig pluginConfig, - final SimpleTCAPluginConfigValidator validator) { - final GenericValidationResponse validationResponse = validator.validateAppSettings(pluginConfig); - assertTrue(validationResponse.hasErrors()); - LOG.debug("Validation Error Message: {}", validationResponse.getAllErrorMessage()); - } -} diff --git a/dcae-analytics-cdap-plugins/src/test/resources/logback-test.xml b/dcae-analytics-cdap-plugins/src/test/resources/logback-test.xml index 4857522..78cbdfa 100644 --- a/dcae-analytics-cdap-plugins/src/test/resources/logback-test.xml +++ b/dcae-analytics-cdap-plugins/src/test/resources/logback-test.xml @@ -1,55 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + + + + + + + + + + diff --git a/dcae-analytics-cdap-tca/pom.xml b/dcae-analytics-cdap-tca/pom.xml index 2a65ef1..dbdd58b 100644 --- a/dcae-analytics-cdap-tca/pom.xml +++ b/dcae-analytics-cdap-tca/pom.xml @@ -1,145 +1,145 @@ - - - - - - 4.0.0 - - - dcae-analytics - org.onap.dcaegen2.analytics.tca - 2.1.0-SNAPSHOT - - - dcae-analytics-cdap-tca - jar - - - DCAE Analytics TCA Flowlets - DCAE Analytics TCA (THRESHOLD CROSSING ALERT) implemented as CDAP Flowlets - - - ${project.parent.basedir} - org.openecomp.dcae.apod.analytics.cdap.tca.TCAAnalyticsApplication - - - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-cdap-common - 2.1.0-SNAPSHOT - - - - - co.cask.cdap - cdap-api - - - - - co.cask.http - netty-http - - - co.cask.common - common-http - - - - - org.slf4j - slf4j-api - - - - ch.qos.logback - logback-core - - - - ch.qos.logback - logback-classic - - - - - com.google.code.findbugs - jsr305 - ${findbugs.jsr305.version} - provided - - - - com.google.code.findbugs - annotations - ${findbugs.annotations.version} - provided - - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-test - 2.1.0-SNAPSHOT - test - - - - co.cask.cdap - cdap-unit-test - - - org.apache.httpcomponents - httpcore - - - - - - - - - - org.apache.felix - maven-bundle-plugin - - - <_exportcontents> - com.fasterxml.jackson.core.* - - - - - ${app.main.class} - - - - - - - - + + + + + + 4.0.0 + + + dcae-analytics + org.onap.dcaegen2.analytics.tca + 2.1.0-SNAPSHOT + + + dcae-analytics-cdap-tca + jar + + + DCAE Analytics TCA Flowlets + DCAE Analytics TCA (THRESHOLD CROSSING ALERT) implemented as CDAP Flowlets + + + ${project.parent.basedir} + org.onap.dcae.apod.analytics.cdap.tca.TCAAnalyticsApplication + + + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-cdap-common + 2.1.0-SNAPSHOT + + + + + co.cask.cdap + cdap-api + + + + + co.cask.http + netty-http + + + co.cask.common + common-http + + + + + org.slf4j + slf4j-api + + + + ch.qos.logback + logback-core + + + + ch.qos.logback + logback-classic + + + + + com.google.code.findbugs + jsr305 + ${findbugs.jsr305.version} + provided + + + + com.google.code.findbugs + annotations + ${findbugs.annotations.version} + provided + + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-test + 2.1.0-SNAPSHOT + test + + + + co.cask.cdap + cdap-unit-test + + + org.apache.httpcomponents + httpcore + + + + + + + + + + org.apache.felix + maven-bundle-plugin + + + <_exportcontents> + com.fasterxml.jackson.core.* + + + + + ${app.main.class} + + + + + + + + diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java new file mode 100644 index 0000000..19d284a --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java @@ -0,0 +1,116 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca; + +import co.cask.cdap.api.app.AbstractApplication; +import co.cask.cdap.api.data.stream.Stream; +import co.cask.cdap.api.dataset.DatasetProperties; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementPersister; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusPersister; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertsPersister; +import org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils; +import org.onap.dcae.apod.analytics.cdap.tca.flow.TCAVESCollectorFlow; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; +import org.onap.dcae.apod.analytics.cdap.tca.validator.TCAAppConfigValidator; +import org.onap.dcae.apod.analytics.cdap.tca.worker.TCADMaaPMockSubscriberWorker; +import org.onap.dcae.apod.analytics.cdap.tca.worker.TCADMaaPPublisherWorker; +import org.onap.dcae.apod.analytics.cdap.tca.worker.TCADMaaPSubscriberWorker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Rajiv Singla . Creation Date: 10/21/2016. + */ +public class TCAAnalyticsApplication extends AbstractApplication { + + private static final Logger LOG = LoggerFactory.getLogger(TCAAnalyticsApplication.class); + + @Override + @SuppressWarnings("unchecked") + public void configure() { + + + // ========= Application configuration Setup ============== // + final TCAAppConfig tcaAppConfig = getConfig(); + + LOG.info("Configuring TCA Application with startup application configuration: {}", tcaAppConfig); + + // Validate application configuration + ValidationUtils.validateSettings(tcaAppConfig, new TCAAppConfigValidator()); + + // App Setup + setName(tcaAppConfig.getAppName()); + setDescription(tcaAppConfig.getAppDescription()); + + // ========== Streams Setup ============== // + // Create DMaaP MR Subscriber CDAP output stream + final String tcaSubscriberOutputStreamName = tcaAppConfig.getTcaSubscriberOutputStreamName(); + LOG.info("Creating TCA VES Output Stream: {}", tcaSubscriberOutputStreamName); + final Stream subscriberOutputStream = new Stream(tcaSubscriberOutputStreamName, + CDAPComponentsConstants.TCA_FIXED_SUBSCRIBER_OUTPUT_DESCRIPTION_STREAM); + addStream(subscriberOutputStream); + + + // ============ Datasets Setup ======== // + // Create TCA Message Status Table + final String tcaVESMessageStatusTableName = tcaAppConfig.getTcaVESMessageStatusTableName(); + final Integer messageStatusTableTTLSeconds = tcaAppConfig.getTcaVESMessageStatusTableTTLSeconds(); + LOG.info("Creating TCA Message Status Table: {} with TTL: {}", + tcaVESMessageStatusTableName, messageStatusTableTTLSeconds); + final DatasetProperties messageStatusTableProperties = + TCAMessageStatusPersister.getDatasetProperties(messageStatusTableTTLSeconds); + createDataset(tcaVESMessageStatusTableName, ObjectMappedTable.class, messageStatusTableProperties); + + + // Create TCA Alerts Abatement Table + final String tcaAlertsAbatementTableName = tcaAppConfig.getTcaAlertsAbatementTableName(); + final Integer tcaAlertsAbatementTableTTLSeconds = tcaAppConfig.getTcaAlertsAbatementTableTTLSeconds(); + LOG.info("Creating Alerts Abatement Table: {} with TTL: {}", + tcaAlertsAbatementTableName, tcaAlertsAbatementTableTTLSeconds); + final DatasetProperties alertsAbatementTableProperties = + TCAAlertsAbatementPersister.getDatasetProperties(tcaAlertsAbatementTableTTLSeconds); + createDataset(tcaAlertsAbatementTableName, ObjectMappedTable.class, alertsAbatementTableProperties); + + // Create TCA VES Alerts Table + final String tcaVESAlertsTableName = tcaAppConfig.getTcaVESAlertsTableName(); + final Integer alertsTableTTLSeconds = tcaAppConfig.getTcaVESAlertsTableTTLSeconds(); + LOG.info("Creating TCA Alerts Table: {} with TTL: {}", + tcaVESAlertsTableName, alertsTableTTLSeconds); + final DatasetProperties alertTableProperties = + TCAVESAlertsPersister.getDatasetProperties(alertsTableTTLSeconds); + createDataset(tcaVESAlertsTableName, ObjectMappedTable.class, alertTableProperties); + + // =========== Flow Setup ============= // + addFlow(new TCAVESCollectorFlow(tcaAppConfig)); + + // ========== Workers Setup =========== // + LOG.info("Creating TCA DMaaP Subscriber Worker"); + addWorker(new TCADMaaPSubscriberWorker(tcaAppConfig.getTcaSubscriberOutputStreamName())); + LOG.info("Creating TCA DMaaP Publisher Worker"); + addWorker(new TCADMaaPPublisherWorker(tcaAppConfig.getTcaVESAlertsTableName())); + // TODO: Remove this before going to production + addWorker(new TCADMaaPMockSubscriberWorker(tcaAppConfig.getTcaSubscriberOutputStreamName())); + } + + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java new file mode 100644 index 0000000..adefbe0 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java @@ -0,0 +1,82 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flow; + +import co.cask.cdap.api.flow.AbstractFlow; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.tca.flowlet.TCAVESAAIEnrichmentFlowlet; +import org.onap.dcae.apod.analytics.cdap.tca.flowlet.TCAVESAlertsAbatementFlowlet; +import org.onap.dcae.apod.analytics.cdap.tca.flowlet.TCAVESAlertsSinkFlowlet; +import org.onap.dcae.apod.analytics.cdap.tca.flowlet.TCAVESMessageRouterFlowlet; +import org.onap.dcae.apod.analytics.cdap.tca.flowlet.TCAVESThresholdViolationCalculatorFlowlet; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; + +/** + * TCA Flow for VES (Virtual Event Streaming) Collector Flow + * + * @author Rajiv Singla . Creation Date: 11/3/2016. + */ +public class TCAVESCollectorFlow extends AbstractFlow { + + private final TCAAppConfig tcaAppConfig; + + public TCAVESCollectorFlow(TCAAppConfig tcaAppConfig) { + this.tcaAppConfig = tcaAppConfig; + } + + @Override + protected void configure() { + + setName(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_NAME_FLOW); + setDescription(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_DESCRIPTION_FLOW); + + final TCAVESMessageRouterFlowlet messageRouterFlowlet = new TCAVESMessageRouterFlowlet(); + addFlowlet(messageRouterFlowlet); + + final TCAVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = + new TCAVESThresholdViolationCalculatorFlowlet(tcaAppConfig.getTcaVESMessageStatusTableName()); + addFlowlet(thresholdViolationCalculatorFlowlet, tcaAppConfig.getThresholdCalculatorFlowletInstances()); + + final TCAVESAlertsAbatementFlowlet tcavesAlertsAbatementFlowlet = + new TCAVESAlertsAbatementFlowlet(tcaAppConfig.getTcaAlertsAbatementTableName()); + addFlowlet(tcavesAlertsAbatementFlowlet); + + final TCAVESAAIEnrichmentFlowlet tcavesaaiEnrichmentFlowlet = new TCAVESAAIEnrichmentFlowlet(); + addFlowlet(tcavesaaiEnrichmentFlowlet); + + final TCAVESAlertsSinkFlowlet alertsSinkFlowlet = + new TCAVESAlertsSinkFlowlet(tcaAppConfig.getTcaVESAlertsTableName()); + addFlowlet(alertsSinkFlowlet); + + + // connect DMaaP MR VES Subscriber output stream to VES Message Router Flowlet + connectStream(tcaAppConfig.getTcaSubscriberOutputStreamName(), messageRouterFlowlet); + // connect message router to VES threshold calculator + connect(messageRouterFlowlet, thresholdViolationCalculatorFlowlet); + // connect VES threshold calculator flowlet to Alerts Abatement Flowlet + connect(thresholdViolationCalculatorFlowlet, tcavesAlertsAbatementFlowlet); + // connect Alerts Abatement flowlet to AAI Enrichment Flowlet + connect(tcavesAlertsAbatementFlowlet, tcavesaaiEnrichmentFlowlet); + // connect A&AI Enrichment flowlet to Alerts Sink Flowlet + connect(tcavesaaiEnrichmentFlowlet, alertsSinkFlowlet); + + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java new file mode 100644 index 0000000..0a557e1 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java @@ -0,0 +1,128 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.annotation.Output; +import co.cask.cdap.api.annotation.ProcessInput; +import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import co.cask.cdap.api.flow.flowlet.OutputEmitter; +import org.onap.dcae.apod.analytics.aai.AAIClientFactory; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import org.onap.dcae.apod.analytics.aai.service.AAIEnrichmentClient; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.ControlLoopSchemaType; +import org.onap.dcae.apod.analytics.model.facade.tca.TCAVESResponse; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +/** + * Flowlet responsible for doing A&AI Enrichment + * + * @author Rajiv Singla . Creation Date: 9/20/2017. + */ +public class TCAVESAAIEnrichmentFlowlet extends AbstractFlowlet { + + private static final Logger LOG = LoggerFactory.getLogger(TCAVESAAIEnrichmentFlowlet.class); + + @Output(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_OUTPUT) + protected OutputEmitter aaiEnrichmentOutputEmitter; + + private TCAAppPreferences tcaAppPreferences; + private AAIEnrichmentClient aaiEnrichmentClient; + + @Override + public void configure() { + setName(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_FLOWLET); + setDescription(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_DESCRIPTION_FLOWLET); + } + + @Override + public void initialize(FlowletContext flowletContext) throws Exception { + super.initialize(flowletContext); + tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(flowletContext); + if (tcaAppPreferences.getEnableAAIEnrichment()) { + final AAIHttpClientConfig aaiHttpClientConfig = + CDAPTCAUtils.createAAIEnrichmentClientConfig(tcaAppPreferences); + aaiEnrichmentClient = AAIClientFactory.create().getEnrichmentClient(aaiHttpClientConfig); + } + } + + @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_OUTPUT) + public void performAAIEnrichment(final String alertMessageString) throws IOException { + + // if A&AI enrichment is disabled - no A&AI lookups are required + if (!tcaAppPreferences.getEnableAAIEnrichment()) { + + LOG.debug("A&AI Enrichment is disabled. Skip A&AI Enrichment for alert: {}", alertMessageString); + aaiEnrichmentOutputEmitter.emit(alertMessageString); + + } else { + + // determine closed Loop Event Status + final TCAVESResponse tcavesResponse = TCAUtils.readValue(alertMessageString, TCAVESResponse.class); + final ClosedLoopEventStatus closedLoopEventStatus = + ClosedLoopEventStatus.valueOf(tcavesResponse.getClosedLoopEventStatus()); + + if (closedLoopEventStatus == ClosedLoopEventStatus.ONSET) { + LOG.debug("Performing A&AI Enrichment of ONSET Alert: {}", alertMessageString); + final ControlLoopSchemaType controlLoopSchemaType = + TCAUtils.determineControlLoopSchemaType(tcavesResponse); + final String sourceName = TCAUtils.determineSourceName(tcavesResponse); + LOG.debug("A&AI Source Name: {}, Control Loop Schema Type: {} for ONSET Alert: {}", + sourceName, controlLoopSchemaType, alertMessageString); + + if (controlLoopSchemaType == ControlLoopSchemaType.VM) { + final String aaiVMEnrichmentAPIPath = tcaAppPreferences.getAaiVMEnrichmentAPIPath(); + TCAUtils.doAAIVMEnrichment(tcavesResponse, aaiEnrichmentClient, aaiVMEnrichmentAPIPath, + alertMessageString, sourceName); + } else { + final String aaiVNFEnrichmentAPIPath = tcaAppPreferences.getAaiVNFEnrichmentAPIPath(); + TCAUtils.doAAIVNFEnrichment(tcavesResponse, aaiEnrichmentClient, aaiVNFEnrichmentAPIPath, + alertMessageString, sourceName); + } + + final String aaiEnrichedAlert = TCAUtils.writeValueAsString(tcavesResponse); + LOG.debug("Emitting Alert after A&AI Enrichment: {}", aaiEnrichedAlert); + aaiEnrichmentOutputEmitter.emit(aaiEnrichedAlert); + + // skip A&AI Enrichment of alerts with closed Loop Event Status - ABATED + } else if (closedLoopEventStatus == ClosedLoopEventStatus.ABATED) { + LOG.debug("Skipping Enrichment of Abated Alert: {}", alertMessageString); + aaiEnrichmentOutputEmitter.emit(alertMessageString); + + } else { + // unsupported closed loop event status + final String errorMessage = String.format( + "Unexpected ClosedLoopEventStatus: %s. Only ONSET and ABATED are supported." + + "Ignoring alert: %s", closedLoopEventStatus, alertMessageString); + throw new CDAPSettingsException(errorMessage, LOG, new IllegalStateException(errorMessage)); + } + } + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java new file mode 100644 index 0000000..759c3d5 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java @@ -0,0 +1,169 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.annotation.Output; +import co.cask.cdap.api.annotation.ProcessInput; +import co.cask.cdap.api.annotation.Property; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import co.cask.cdap.api.flow.flowlet.OutputEmitter; +import org.apache.commons.lang3.StringUtils; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementEntity; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementPersister; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.model.facade.tca.TCAVESResponse; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Date; + +/** + * Flowlet responsible to sending out abatement alerts + * + * @author Rajiv Singla . Creation Date: 9/11/2017. + */ +public class TCAVESAlertsAbatementFlowlet extends AbstractFlowlet { + + private static final Logger LOG = LoggerFactory.getLogger(TCAVESAlertsAbatementFlowlet.class); + + @Property + private final String tcaAlertsAbatementTableName; + + @Output(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_OUTPUT) + protected OutputEmitter alertsAbatementOutputEmitter; + + private ObjectMappedTable tcaAlertsAbatementTable; + + public TCAVESAlertsAbatementFlowlet(final String tcaAlertsAbatementTableName) { + this.tcaAlertsAbatementTableName = tcaAlertsAbatementTableName; + } + + @Override + public void configure() { + setName(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET); + setDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET); + } + + @Override + public void initialize(FlowletContext flowletContext) throws Exception { + super.initialize(flowletContext); + tcaAlertsAbatementTable = getContext().getDataset(tcaAlertsAbatementTableName); + } + + @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_TCA_CALCULATOR_NAME_OUTPUT) + public void determineAbatementAlerts(final ThresholdCalculatorOutput thresholdCalculatorOutput) throws IOException { + + final String cefMessage = thresholdCalculatorOutput.getCefMessage(); + final String alertMessageString = thresholdCalculatorOutput.getAlertMessage(); + final String violatedMetricsPerEventNameString = thresholdCalculatorOutput.getViolatedMetricsPerEventName(); + + // alerts must have violated metrics per event name present + if (StringUtils.isBlank(violatedMetricsPerEventNameString)) { + final String errorMessage = String.format( + "No violated metricsPerEventName found for VES Message: %s." + + "Ignored alert message: %s", cefMessage, alertMessageString); + throw new CDAPSettingsException(errorMessage, LOG, new IllegalStateException(errorMessage)); + } + + final MetricsPerEventName violatedMetricsPerEventName = + TCAUtils.readValue(violatedMetricsPerEventNameString, MetricsPerEventName.class); + final EventListener eventListener = TCAUtils.readValue(cefMessage, EventListener.class); + final TCAVESResponse tcavesResponse = TCAUtils.readValue(alertMessageString, TCAVESResponse.class); + final Threshold violatedThreshold = violatedMetricsPerEventName.getThresholds().get(0); + final ClosedLoopEventStatus closedLoopEventStatus = violatedThreshold.getClosedLoopEventStatus(); + + switch (closedLoopEventStatus) { + + case ONSET: + + LOG.debug("Saving information for ONSET event for cefMessage: {}", cefMessage); + TCAAlertsAbatementPersister.persist(eventListener, violatedMetricsPerEventName, tcavesResponse, + null, tcaAlertsAbatementTable); + LOG.debug("Emitting ONSET alert: {}", alertMessageString); + alertsAbatementOutputEmitter.emit(alertMessageString); + break; + + case ABATED: + + LOG.debug("Looking up previous sent alert for abated threshold: {}", violatedThreshold); + final TCAAlertsAbatementEntity previousAlertsAbatementEntry = + TCAAlertsAbatementPersister.lookUpByKey(eventListener, violatedMetricsPerEventName, + tcaAlertsAbatementTable); + + if (previousAlertsAbatementEntry != null) { + + LOG.debug("Found previous AlertsAbatementEntity: {}", previousAlertsAbatementEntry); + + final String abatementSentTS = previousAlertsAbatementEntry.getAbatementSentTS(); + if (abatementSentTS != null) { + LOG.debug("Abatement alert was already sent at timestamp: {}. " + + "Skip resending this abatement alert again", abatementSentTS); + } else { + + final long newAbatementSentTS = new Date().getTime(); + LOG.debug( + "No abatement alert was sent before." + + "Sending abatement alert:{} for the first time at:{}", + alertMessageString, newAbatementSentTS); + + // save new Abatement alert sent timestamp in table + TCAAlertsAbatementPersister.persist(eventListener, violatedMetricsPerEventName, tcavesResponse, + Long.toString(newAbatementSentTS), tcaAlertsAbatementTable); + + // Set request id to be same as previous ONSET event request ID + tcavesResponse.setRequestID(previousAlertsAbatementEntry.getRequestId()); + final String abatedAlertString = TCAUtils.writeValueAsString(tcavesResponse); + + LOG.info("Emitting ABATED alert: {}", abatedAlertString); + alertsAbatementOutputEmitter.emit(abatedAlertString); + + } + + } else { + LOG.info("No previous ONSET alert was found for this ABATED alert: {}.Skip sending abated alert.", + alertMessageString); + } + + break; + + default: + + final String errorMessage = String.format( + "Unexpected ClosedLoopEventStatus: %s. Only ONSET and ABATED are supported." + + "Ignoring alert: %s", closedLoopEventStatus, alertMessageString); + throw new CDAPSettingsException(errorMessage, LOG, new IllegalStateException(errorMessage)); + + } + + + } + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java new file mode 100644 index 0000000..7df0d49 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java @@ -0,0 +1,71 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.annotation.ProcessInput; +import co.cask.cdap.api.annotation.Property; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertsPersister; + +/** + * Saves TCA VES Alert Messages in a Time series Table + * + * @author Rajiv Singla . Creation Date: 11/15/2016. + */ +public class TCAVESAlertsSinkFlowlet extends AbstractFlowlet { + + @Property + private final String tcaVESAlertsTableName; + + private ObjectMappedTable tcaVESAlertsTable; + + public TCAVESAlertsSinkFlowlet(String tcaVESAlertsTableName) { + this.tcaVESAlertsTableName = tcaVESAlertsTableName; + } + + @Override + public void configure() { + setName(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET); + setDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_DESCRIPTION_FLOWLET); + } + + @Override + public void initialize(FlowletContext flowletContext) throws Exception { + super.initialize(flowletContext); + tcaVESAlertsTable = getContext().getDataset(tcaVESAlertsTableName); + } + + /** + * Saves messages to Alerts table + * + * @param alertMessage alert message + */ + @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_OUTPUT) + public void saveAlerts(String alertMessage) { + // Saves alert message in alerts table + TCAVESAlertsPersister.persist(alertMessage, tcaVESAlertsTable); + } + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java new file mode 100644 index 0000000..776a7e0 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java @@ -0,0 +1,59 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.annotation.Output; +import co.cask.cdap.api.annotation.ProcessInput; +import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; +import co.cask.cdap.api.flow.flowlet.OutputEmitter; +import co.cask.cdap.api.flow.flowlet.StreamEvent; +import com.google.common.base.Charsets; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + + +/** + * TCA Message Router Flowlet emits VES Message to {@link TCAVESThresholdViolationCalculatorFlowlet} instances + * + * @author Rajiv Singla . Creation Date: 11/14/2016. + */ +public class TCAVESMessageRouterFlowlet extends AbstractFlowlet { + + /** + * Emits ves message to TCA Calculator Instances + */ + @Output(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_OUTPUT) + protected OutputEmitter vesMessageEmitter; + + + @Override + public void configure() { + setName(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET); + setDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_DESCRIPTION_FLOWLET); + } + + @ProcessInput + public void routeVESMessage(StreamEvent vesMessageStreamEvent) { + final String vesMessage = Charsets.UTF_8.decode(vesMessageStreamEvent.getBody()).toString(); + vesMessageEmitter.emit( + vesMessage, AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY, vesMessage.hashCode()); + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java new file mode 100644 index 0000000..b639ff7 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java @@ -0,0 +1,156 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.annotation.HashPartition; +import co.cask.cdap.api.annotation.Output; +import co.cask.cdap.api.annotation.ProcessInput; +import co.cask.cdap.api.annotation.Property; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import co.cask.cdap.api.flow.flowlet.OutputEmitter; +import co.cask.cdap.api.metrics.Metrics; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusEntity; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; +import org.onap.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusPersister.persist; + +/** + * TCA VES Message Filter filters out messages which are not applicable for TCA as per TCA Policy + * + * @author Rajiv Singla . Creation Date: 11/3/2016. + */ +public class TCAVESThresholdViolationCalculatorFlowlet extends AbstractFlowlet { + + private static final Logger LOG = LoggerFactory.getLogger(TCAVESThresholdViolationCalculatorFlowlet.class); + + @Output(CDAPComponentsConstants.TCA_FIXED_VES_TCA_CALCULATOR_NAME_OUTPUT) + protected OutputEmitter tcaAlertOutputEmitter; + protected Metrics metrics; + private ObjectMappedTable vesMessageStatusTable; + + @Property + private final String messageStatusTableName; + private Boolean enableAlertCEFFormat; + + private TCAPolicy tcaPolicy; + + /** + * Creates an instance of TCA VES Threshold violation calculator flowlet with give message status table name + * + * @param messageStatusTableName message status table name + */ + public TCAVESThresholdViolationCalculatorFlowlet(String messageStatusTableName) { + this.messageStatusTableName = messageStatusTableName; + } + + @Override + public void configure() { + setName(CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET); + setDescription(CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_DESCRIPTION_FLOWLET); + } + + + @Override + public void initialize(FlowletContext flowletContext) throws Exception { + super.initialize(flowletContext); + + // parse Runtime Arguments to tca policy preferences + tcaPolicy = CDAPTCAUtils.getValidatedTCAPolicyPreferences(flowletContext); + // Parse runtime arguments + final TCAAppPreferences tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(flowletContext); + enableAlertCEFFormat = tcaAppPreferences.getEnableAlertCEFFormat(); + vesMessageStatusTable = getContext().getDataset(messageStatusTableName); + + } + + /** + * Filters VES Messages that violates TCA Policy + * + * @param vesMessage VES Message + * @throws JsonProcessingException if alert message cannot be parsed into JSON object + */ + @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_OUTPUT) + @HashPartition(AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY) + public void filterVESMessages(String vesMessage) throws JsonProcessingException { + + TCACalculatorMessageType calculatorMessageType = TCACalculatorMessageType.INAPPLICABLE; + String alertMessage = null; + + // Step 1: Filter incoming messages + final TCACEFProcessorContext processorContext = TCAUtils.filterCEFMessage(vesMessage, tcaPolicy); + + if (processorContext.canProcessingContinue()) { + + // Step 2: Check if CEF Message violate any thresholds + final TCACEFProcessorContext processorContextWithViolations = + TCAUtils.computeThresholdViolations(processorContext); + + if (processorContextWithViolations.canProcessingContinue()) { + + // Step 3: Create Alert Message + final String tcaAppName = getContext().getApplicationSpecification().getName(); + alertMessage = + TCAUtils.createTCAAlertString(processorContextWithViolations, tcaAppName, enableAlertCEFFormat); + calculatorMessageType = TCACalculatorMessageType.NON_COMPLIANT; + LOG.debug("VES Threshold Violation Detected. An alert message is be generated. {}", alertMessage); + + metrics.count(CDAPMetricsConstants.TCA_VES_NON_COMPLIANT_MESSAGES_METRIC, 1); + + // Step 4: Emit message to Alert Sink Flowlet + final ThresholdCalculatorOutput thresholdCalculatorOutput = + new ThresholdCalculatorOutput(processorContext.getMessage(), + TCAUtils.writeValueAsString(processorContext.getTCAPolicy()), + TCAUtils.writeValueAsString(processorContextWithViolations.getMetricsPerEventName()), + alertMessage); + tcaAlertOutputEmitter.emit(thresholdCalculatorOutput); + + } else { + + calculatorMessageType = TCACalculatorMessageType.COMPLIANT; + metrics.count(CDAPMetricsConstants.TCA_VES_COMPLIANT_MESSAGES_METRIC, 1); + } + + } else { + + metrics.count(CDAPMetricsConstants.TCA_VES_INAPPLICABLE_MESSAGES_METRIC, 1); + } + + // save message to message status table + final int instanceId = getContext().getInstanceId(); + persist(processorContext, instanceId, calculatorMessageType, vesMessageStatusTable, alertMessage); + } + + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java new file mode 100644 index 0000000..21145b0 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java @@ -0,0 +1,110 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.settings; + +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPBaseAppConfig; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + + +/** + * Contains CDAP App Config Settings for TCA Application + * + * @author Rajiv Singla . Creation Date: 11/2/2016. + */ +public class TCAAppConfig extends CDAPBaseAppConfig { + + + private static final long serialVersionUID = 1L; + + protected String tcaSubscriberOutputStreamName; + protected Integer thresholdCalculatorFlowletInstances; + + protected String tcaVESMessageStatusTableName; + protected Integer tcaVESMessageStatusTableTTLSeconds; + protected String tcaVESAlertsTableName; + protected Integer tcaVESAlertsTableTTLSeconds; + protected String tcaAlertsAbatementTableName; + protected Integer tcaAlertsAbatementTableTTLSeconds; + + + public TCAAppConfig() { + appName = CDAPComponentsConstants.TCA_DEFAULT_NAME_APP; + appDescription = CDAPComponentsConstants.TCA_DEFAULT_DESCRIPTION_APP; + tcaSubscriberOutputStreamName = CDAPComponentsConstants.TCA_DEFAULT_SUBSCRIBER_OUTPUT_NAME_STREAM; + thresholdCalculatorFlowletInstances = AnalyticsConstants.TCA_DEFAULT_THRESHOLD_CALCULATOR_FLOWLET_INSTANCES; + tcaVESMessageStatusTableName = CDAPComponentsConstants.TCA_DEFAULT_VES_MESSAGE_STATUS_NAME_TABLE; + tcaVESMessageStatusTableTTLSeconds = AnalyticsConstants.TCA_DEFAULT_VES_MESSAGE_STATUS_TTL_TABLE; + tcaVESAlertsTableName = CDAPComponentsConstants.TCA_DEFAULT_VES_ALERTS_NAME_TABLE; + tcaVESAlertsTableTTLSeconds = AnalyticsConstants.TCA_DEFAULT_VES_ALERTS_TTL_TABLE; + tcaAlertsAbatementTableName = CDAPComponentsConstants.TCA_DEFAULT_ALERTS_ABATEMENT_NAME_TABLE; + tcaAlertsAbatementTableTTLSeconds = AnalyticsConstants.TCA_DEFAULT_ALERTS_ABATEMENT_TTL_TABLE; + } + + public String getTcaSubscriberOutputStreamName() { + return tcaSubscriberOutputStreamName; + } + + public String getTcaVESMessageStatusTableName() { + return tcaVESMessageStatusTableName; + } + + public Integer getTcaVESMessageStatusTableTTLSeconds() { + return tcaVESMessageStatusTableTTLSeconds; + } + + public String getTcaVESAlertsTableName() { + return tcaVESAlertsTableName; + } + + public Integer getTcaVESAlertsTableTTLSeconds() { + return tcaVESAlertsTableTTLSeconds; + } + + public Integer getThresholdCalculatorFlowletInstances() { + return thresholdCalculatorFlowletInstances; + } + + public String getTcaAlertsAbatementTableName() { + return tcaAlertsAbatementTableName; + } + + public Integer getTcaAlertsAbatementTableTTLSeconds() { + return tcaAlertsAbatementTableTTLSeconds; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("appName", appName) + .add("appDescription", appDescription) + .add("tcaSubscriberOutputStreamName", tcaSubscriberOutputStreamName) + .add("thresholdCalculatorFlowletInstances", thresholdCalculatorFlowletInstances) + .add("tcaVESMessageStatusTableName", tcaVESMessageStatusTableName) + .add("tcaVESMessageStatusTableTTLSeconds", tcaVESMessageStatusTableTTLSeconds) + .add("tcaVESAlertsTableName", tcaVESAlertsTableName) + .add("tcaVESAlertsTableTTLSeconds", tcaVESAlertsTableTTLSeconds) + .add("tcaAlertsAbatementTableName", tcaAlertsAbatementTableName) + .add("tcaAlertsAbatementTableTTLSeconds", tcaAlertsAbatementTableTTLSeconds) + .toString(); + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java new file mode 100644 index 0000000..b55ab4f --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java @@ -0,0 +1,349 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.settings; + +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPAppPreferences; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + +/** + *

+ * App Preferences for Analytics TCA (Threshold Crossing Alert) App + *

+ * @author Rajiv Singla . Creation Date: 10/4/2016. + */ +public class TCAAppPreferences implements CDAPAppPreferences { + + private static final long serialVersionUID = 1L; + + // subscriber preferences + protected String subscriberHostName; + + protected Integer subscriberHostPort; + + protected String subscriberTopicName; + + protected String subscriberProtocol; + + protected String subscriberUserName; + + protected String subscriberUserPassword; + + protected String subscriberContentType; + + protected String subscriberConsumerId; + + protected String subscriberConsumerGroup; + + protected Integer subscriberTimeoutMS; + + protected Integer subscriberMessageLimit; + + protected Integer subscriberPollingInterval; + + // publisher preferences + protected String publisherHostName; + + protected Integer publisherHostPort; + + protected String publisherTopicName; + + protected String publisherProtocol; + + protected String publisherUserName; + + protected String publisherUserPassword; + + protected String publisherContentType; + + protected Integer publisherMaxBatchSize; + + protected Integer publisherMaxRecoveryQueueSize; + + protected Integer publisherPollingInterval; + + protected Boolean enableAlertCEFFormat; + + + // A&AI Enrichment + + protected Boolean enableAAIEnrichment; + + protected String aaiEnrichmentHost; + + protected Integer aaiEnrichmentPortNumber; + + protected String aaiEnrichmentProtocol; + + protected String aaiEnrichmentUserName; + + protected String aaiEnrichmentUserPassword; + + protected Boolean aaiEnrichmentIgnoreSSLCertificateErrors; + + protected String aaiVNFEnrichmentAPIPath; + + protected String aaiVMEnrichmentAPIPath; + + + // A&AI Enrichment Proxy + + protected String aaiEnrichmentProxyURL; + + /** + * Default constructor to setup default values for TCA App Preferences + */ + public TCAAppPreferences() { + + // subscriber defaults + subscriberPollingInterval = AnalyticsConstants.TCA_DEFAULT_SUBSCRIBER_POLLING_INTERVAL_MS; + + // publisher defaults + publisherMaxBatchSize = AnalyticsConstants.TCA_DEFAULT_PUBLISHER_MAX_BATCH_QUEUE_SIZE; + publisherMaxRecoveryQueueSize = AnalyticsConstants.TCA_DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE; + publisherPollingInterval = AnalyticsConstants.TCA_DEFAULT_PUBLISHER_POLLING_INTERVAL_MS; + + enableAlertCEFFormat = AnalyticsConstants.TCA_DEFAULT_ENABLE_CEF_FORMATTED_ALERT; + + enableAAIEnrichment = AnalyticsConstants.TCA_DEFAULT_ENABLE_AAI_ENRICHMENT; + aaiEnrichmentIgnoreSSLCertificateErrors = + AnalyticsConstants.TCA_DEFAULT_AAI_ENRICHMENT_IGNORE_SSL_CERTIFICATE_ERRORS; + aaiEnrichmentProxyURL = AnalyticsConstants.TCA_DEFAULT_AAI_ENRICHMENT_PROXY_URL; + + } + + public String getSubscriberHostName() { + return subscriberHostName; + } + + public Integer getSubscriberHostPort() { + return subscriberHostPort; + } + + public String getSubscriberTopicName() { + return subscriberTopicName; + } + + public String getSubscriberProtocol() { + return subscriberProtocol; + } + + public String getSubscriberUserName() { + return subscriberUserName; + } + + public String getSubscriberUserPassword() { + return subscriberUserPassword; + } + + public String getSubscriberContentType() { + return subscriberContentType; + } + + public String getSubscriberConsumerId() { + return subscriberConsumerId; + } + + public String getSubscriberConsumerGroup() { + return subscriberConsumerGroup; + } + + public Integer getSubscriberTimeoutMS() { + return subscriberTimeoutMS; + } + + public Integer getSubscriberMessageLimit() { + return subscriberMessageLimit; + } + + public Integer getSubscriberPollingInterval() { + return subscriberPollingInterval; + } + + public String getPublisherHostName() { + return publisherHostName; + } + + public Integer getPublisherHostPort() { + return publisherHostPort; + } + + public String getPublisherTopicName() { + return publisherTopicName; + } + + public String getPublisherProtocol() { + return publisherProtocol; + } + + public String getPublisherUserName() { + return publisherUserName; + } + + public String getPublisherUserPassword() { + return publisherUserPassword; + } + + public String getPublisherContentType() { + return publisherContentType; + } + + public Integer getPublisherMaxBatchSize() { + return publisherMaxBatchSize; + } + + public Integer getPublisherMaxRecoveryQueueSize() { + return publisherMaxRecoveryQueueSize; + } + + public Integer getPublisherPollingInterval() { + return publisherPollingInterval; + } + + public Boolean getEnableAlertCEFFormat() { + return enableAlertCEFFormat; + } + + + public void setSubscriberHostName(String subscriberHostName) { + this.subscriberHostName = subscriberHostName; + } + + public void setSubscriberHostPort(Integer subscriberHostPort) { + this.subscriberHostPort = subscriberHostPort; + } + + public void setSubscriberTopicName(String subscriberTopicName) { + this.subscriberTopicName = subscriberTopicName; + } + + public void setSubscriberProtocol(String subscriberProtocol) { + this.subscriberProtocol = subscriberProtocol; + } + + public void setSubscriberUserName(String subscriberUserName) { + this.subscriberUserName = subscriberUserName; + } + + public void setSubscriberUserPassword(String subscriberUserPassword) { + this.subscriberUserPassword = subscriberUserPassword; + } + + public void setPublisherHostName(String publisherHostName) { + this.publisherHostName = publisherHostName; + } + + public void setPublisherHostPort(Integer publisherHostPort) { + this.publisherHostPort = publisherHostPort; + } + + public void setPublisherTopicName(String publisherTopicName) { + this.publisherTopicName = publisherTopicName; + } + + public void setPublisherProtocol(String publisherProtocol) { + this.publisherProtocol = publisherProtocol; + } + + public void setPublisherUserName(String publisherUserName) { + this.publisherUserName = publisherUserName; + } + + public void setPublisherUserPassword(String publisherUserPassword) { + this.publisherUserPassword = publisherUserPassword; + } + + public Boolean getEnableAAIEnrichment() { + return enableAAIEnrichment; + } + + public String getAaiEnrichmentHost() { + return aaiEnrichmentHost; + } + + public Integer getAaiEnrichmentPortNumber() { + return aaiEnrichmentPortNumber; + } + + public String getAaiEnrichmentProtocol() { + return aaiEnrichmentProtocol; + } + + public String getAaiEnrichmentUserName() { + return aaiEnrichmentUserName; + } + + public String getAaiEnrichmentUserPassword() { + return aaiEnrichmentUserPassword; + } + + public Boolean getAaiEnrichmentIgnoreSSLCertificateErrors() { + return aaiEnrichmentIgnoreSSLCertificateErrors; + } + + public String getAaiVNFEnrichmentAPIPath() { + return aaiVNFEnrichmentAPIPath; + } + + public String getAaiVMEnrichmentAPIPath() { + return aaiVMEnrichmentAPIPath; + } + + public String getAaiEnrichmentProxyURL() { + return aaiEnrichmentProxyURL; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("subscriberHostName", subscriberHostName) + .add("subscriberHostPort", subscriberHostPort) + .add("subscriberTopicName", subscriberTopicName) + .add("subscriberProtocol", subscriberProtocol) + .add("subscriberUserName", subscriberUserName) + .add("subscriberContentType", subscriberContentType) + .add("subscriberConsumerId", subscriberConsumerId) + .add("subscriberConsumerGroup", subscriberConsumerGroup) + .add("subscriberTimeoutMS", subscriberTimeoutMS) + .add("subscriberMessageLimit", subscriberMessageLimit) + .add("subscriberPollingInterval", subscriberPollingInterval) + .add("publisherHostName", publisherHostName) + .add("publisherHostPort", publisherHostPort) + .add("publisherTopicName", publisherTopicName) + .add("publisherProtocol", publisherProtocol) + .add("publisherUserName", publisherUserName) + .add("publisherContentType", publisherContentType) + .add("publisherMaxBatchSize", publisherMaxBatchSize) + .add("publisherMaxRecoveryQueueSize", publisherMaxRecoveryQueueSize) + .add("publisherPollingInterval", publisherPollingInterval) + .add("enableAlertCEFFormat", enableAlertCEFFormat) + .add("enableAAIEnrichment", enableAAIEnrichment) + .add("aaiEnrichmentHost", aaiEnrichmentHost) + .add("aaiEnrichmentPortNumber", aaiEnrichmentPortNumber) + .add("aaiEnrichmentProtocol", aaiEnrichmentProtocol) + .add("aaiEnrichmentUserName", aaiEnrichmentUserName) + .add("aaiEnrichmentIgnoreSSLCertificateErrors", aaiEnrichmentIgnoreSSLCertificateErrors) + .add("aaiVNFEnrichmentAPIPath", aaiVNFEnrichmentAPIPath) + .add("aaiVMEnrichmentAPIPath", aaiVMEnrichmentAPIPath) + .add("aaiEnrichmentProxyEnabled", aaiEnrichmentProxyURL == null ? "false" : "true") + .toString(); + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java new file mode 100644 index 0000000..5d86cfc --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java @@ -0,0 +1,36 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.settings; + +import org.onap.dcae.apod.analytics.cdap.common.settings.CDAPAppPreferences; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; + +/** + * A wrapper over {@link TCAPolicy} to act as app Preferences as TCA Policy is passed + * by controller as runtime arguments from CDAP app preferences + *

+ * @author Rajiv Singla . Creation Date: 11/29/2016. + */ +public class TCAPolicyPreferences extends TCAPolicy implements CDAPAppPreferences { + + private static final long serialVersionUID = 1L; + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java new file mode 100644 index 0000000..b987848 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java @@ -0,0 +1,97 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.utils; + +import com.google.common.base.Function; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; + +import javax.annotation.Nonnull; + +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; + + +/** + * Function which translates {@link TCAAppPreferences} to {@link DMaaPMRPublisherConfig} + *

+ * @author Rajiv Singla . Creation Date: 11/17/2016. + */ +public class AppPreferencesToPublisherConfigMapper implements Function { + + /** + * Factory method to convert {@link TCAAppPreferences} to {@link DMaaPMRPublisherConfig} object + * + * @param tcaAppPreferences tca App Preferences + * + * @return publisher config object + */ + public static DMaaPMRPublisherConfig map(final TCAAppPreferences tcaAppPreferences) { + return new AppPreferencesToPublisherConfigMapper().apply(tcaAppPreferences); + } + + /** + * Implementation to convert {@link TCAAppPreferences} to {@link DMaaPMRPublisherConfig} object + * + * @param tcaAppPreferences tca App Preferences + * + * @return publisher config object + */ + @Nonnull + @Override + public DMaaPMRPublisherConfig apply(@Nonnull TCAAppPreferences tcaAppPreferences) { + + // Create a new publisher settings builder + final DMaaPMRPublisherConfig.Builder publisherConfigBuilder = new DMaaPMRPublisherConfig.Builder( + tcaAppPreferences.getPublisherHostName(), tcaAppPreferences.getPublisherTopicName()); + + // Setup up any optional publisher parameters if they are present + final Integer publisherHostPort = tcaAppPreferences.getPublisherHostPort(); + if (publisherHostPort != null) { + publisherConfigBuilder.setPortNumber(publisherHostPort); + } + final String publisherProtocol = tcaAppPreferences.getPublisherProtocol(); + if (isPresent(publisherProtocol)) { + publisherConfigBuilder.setProtocol(publisherProtocol); + } + final String publisherUserName = tcaAppPreferences.getPublisherUserName(); + if (isPresent(publisherUserName)) { + publisherConfigBuilder.setUserName(publisherUserName); + } + final String publisherUserPassword = tcaAppPreferences.getPublisherUserPassword(); + if (isPresent(publisherUserPassword)) { + publisherConfigBuilder.setUserPassword(publisherUserPassword); + } + final String publisherContentType = tcaAppPreferences.getPublisherContentType(); + if (isPresent(publisherContentType)) { + publisherConfigBuilder.setContentType(publisherContentType); + } + final Integer publisherMaxBatchSize = tcaAppPreferences.getPublisherMaxBatchSize(); + if (publisherMaxBatchSize != null) { + publisherConfigBuilder.setMaxBatchSize(publisherMaxBatchSize); + } + final Integer publisherMaxRecoveryQueueSize = tcaAppPreferences.getPublisherMaxRecoveryQueueSize(); + if (publisherMaxRecoveryQueueSize != null) { + publisherConfigBuilder.setMaxRecoveryQueueSize(publisherMaxRecoveryQueueSize); + } + + return publisherConfigBuilder.build(); + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java new file mode 100644 index 0000000..650410c --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java @@ -0,0 +1,113 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.utils; + +import com.google.common.base.Function; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; + +import javax.annotation.Nonnull; + +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; + + +/** + * Function which translates {@link TCAAppPreferences} to {@link DMaaPMRSubscriberConfig} + * + * @author Rajiv Singla . Creation Date: 11/17/2016. + */ +public class AppPreferencesToSubscriberConfigMapper implements Function { + + /** + * Factory Method to converts {@link TCAAppPreferences} to {@link DMaaPMRSubscriberConfig} object + * + * @param tcaAppPreferences tca app preferences + * @return DMaaP Subscriber Config + */ + public static DMaaPMRSubscriberConfig map(final TCAAppPreferences tcaAppPreferences) { + return new AppPreferencesToSubscriberConfigMapper().apply(tcaAppPreferences); + } + + /** + * Implementation to convert {@link TCAAppPreferences} to {@link DMaaPMRSubscriberConfig} object + * + * @param tcaAppPreferences tca app preferences + * + * @return DMaaP Subscriber Config + */ + @Nonnull + @Override + public DMaaPMRSubscriberConfig apply(@Nonnull TCAAppPreferences tcaAppPreferences) { + + // Create a new subscriber settings builder + final DMaaPMRSubscriberConfig.Builder subscriberConfigBuilder = new DMaaPMRSubscriberConfig.Builder( + tcaAppPreferences.getSubscriberHostName(), tcaAppPreferences.getSubscriberTopicName()); + + // Setup up any optional subscriber parameters if they are present + final Integer subscriberHostPortNumber = tcaAppPreferences.getSubscriberHostPort(); + if (subscriberHostPortNumber != null) { + subscriberConfigBuilder.setPortNumber(subscriberHostPortNumber); + } + + final String subscriberProtocol = tcaAppPreferences.getSubscriberProtocol(); + if (isPresent(subscriberProtocol)) { + subscriberConfigBuilder.setProtocol(subscriberProtocol); + } + + final String subscriberUserName = tcaAppPreferences.getSubscriberUserName(); + if (isPresent(subscriberUserName)) { + subscriberConfigBuilder.setUserName(subscriberUserName); + } + + final String subscriberUserPassword = tcaAppPreferences.getSubscriberUserPassword(); + if (isPresent(subscriberUserPassword)) { + subscriberConfigBuilder.setUserPassword(subscriberUserPassword); + } + + final String subscriberContentType = tcaAppPreferences.getSubscriberContentType(); + if (isPresent(subscriberContentType)) { + subscriberConfigBuilder.setContentType(subscriberContentType); + } + + final String subscriberConsumerId = tcaAppPreferences.getSubscriberConsumerId(); + if (isPresent(subscriberConsumerId)) { + subscriberConfigBuilder.setConsumerId(subscriberConsumerId); + } + + final String subscriberConsumerGroup = tcaAppPreferences.getSubscriberConsumerGroup(); + if (isPresent(subscriberConsumerGroup)) { + subscriberConfigBuilder.setConsumerGroup(subscriberConsumerGroup); + } + + final Integer subscriberTimeoutMS = tcaAppPreferences.getSubscriberTimeoutMS(); + if (subscriberTimeoutMS != null) { + subscriberConfigBuilder.setTimeoutMS(subscriberTimeoutMS); + } + final Integer subscriberMessageLimit = tcaAppPreferences.getSubscriberMessageLimit(); + if (subscriberMessageLimit != null) { + subscriberConfigBuilder.setMessageLimit(subscriberMessageLimit); + } + + // return Subscriber settings + return subscriberConfigBuilder.build(); + + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java new file mode 100644 index 0000000..38f19aa --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java @@ -0,0 +1,321 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.utils; + +import co.cask.cdap.api.RuntimeContext; +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import org.apache.commons.lang3.StringUtils; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; +import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfigBuilder; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.validator.TCAPolicyPreferencesValidator; +import org.onap.dcae.apod.analytics.cdap.tca.validator.TCAPreferencesValidator; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.model.config.tca.DMAAPInfo; +import org.onap.dcae.apod.analytics.model.config.tca.TCAControllerAppConfig; +import org.onap.dcae.apod.analytics.model.config.tca.TCAHandleIn; +import org.onap.dcae.apod.analytics.model.config.tca.TCAHandleOut; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import static com.google.common.collect.Lists.newArrayList; +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.validateSettings; +import static org.onap.dcae.apod.analytics.common.AnalyticsConstants.TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH; + +/** + * Utility Helper methods for CDAP TCA sub module. + * + *

+ * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public abstract class CDAPTCAUtils extends TCAUtils { + + private static final Logger LOG = LoggerFactory.getLogger(CDAPTCAUtils.class); + + /** + * Function that extracts alert message string from {@link TCAVESAlertEntity} + */ + public static final Function MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION = + new Function() { + @Override + public String apply(TCAVESAlertEntity alertEntity) { + return alertEntity == null ? null : alertEntity.getAlertMessage(); + } + }; + + + /** + * Parses and validates Runtime Arguments to {@link TCAAppPreferences} object + * + * @param runtimeContext Runtime Context + * + * @return validated runtime arguments as {@link TCAAppPreferences} object + */ + public static TCAAppPreferences getValidatedTCAAppPreferences(final RuntimeContext runtimeContext) { + // Parse runtime arguments + final Map runtimeArguments = runtimeContext.getRuntimeArguments(); + final TCAAppPreferences tcaAppPreferences = + ANALYTICS_MODEL_OBJECT_MAPPER.convertValue(runtimeArguments, TCAAppPreferences.class); + + final String appConfigString = runtimeContext.getApplicationSpecification().getConfiguration(); + + // populate DMaaP Information from App Config String + populateDMaaPInfoFromAppConfiguration(appConfigString, tcaAppPreferences); + + // Validate runtime arguments + validateSettings(tcaAppPreferences, new TCAPreferencesValidator()); + + return tcaAppPreferences; + } + + /** + * Creates an A&AI Http Client config from give {@link TCAAppPreferences} + * + * @param tcaAppPreferences TCA App Preferences + * + * @return A&AI Http Client config + */ + public static AAIHttpClientConfig createAAIEnrichmentClientConfig(final TCAAppPreferences tcaAppPreferences) { + final String aaiEnrichmentProxyURLString = tcaAppPreferences.getAaiEnrichmentProxyURL(); + URL aaiEnrichmentProxyURL = null; + if (StringUtils.isNotBlank(aaiEnrichmentProxyURLString)) { + aaiEnrichmentProxyURL = parseURL(aaiEnrichmentProxyURLString); + } + + return new AAIHttpClientConfigBuilder(tcaAppPreferences.getAaiEnrichmentHost()) + .setAaiProtocol(tcaAppPreferences.getAaiEnrichmentProtocol()) + .setAaiHostPortNumber(tcaAppPreferences.getAaiEnrichmentPortNumber()) + .setAaiUserName(tcaAppPreferences.getAaiEnrichmentUserName()) + .setAaiUserPassword(tcaAppPreferences.getAaiEnrichmentUserPassword()) + .setAaiProxyURL(aaiEnrichmentProxyURL) + .setAaiIgnoreSSLCertificateErrors(tcaAppPreferences.getAaiEnrichmentIgnoreSSLCertificateErrors()) + .build(); + } + + /** + * Populated App Preferences DMaaP Information from Application Config String + * + * @param appConfigString CDAP Application config String + * @param tcaAppPreferences TCA App Preferences + */ + private static void populateDMaaPInfoFromAppConfiguration(final String appConfigString, + final TCAAppPreferences tcaAppPreferences) { + + if (null != tcaAppPreferences.getSubscriberHostName() || null != tcaAppPreferences.getPublisherHostName()) { + LOG.info("DMaaP Information is set from runtime preferences. Skipping getting DMaaP info from App Config"); + return; + } + + LOG.info("Fetching DMaaP information from App Configuration String: {}", appConfigString); + + try { + final TCAControllerAppConfig tcaControllerAppConfig = + readValue(appConfigString, TCAControllerAppConfig.class); + + // Parse Subscriber DMaaP information from App Config String + if (tcaControllerAppConfig.getStreamsSubscribes() != null && + tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn() != null && + tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo() != null) { + + final DMAAPInfo subscriberDmaapInfo = + tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo(); + LOG.debug("App Config Subscriber Host URL: {}", subscriberDmaapInfo.getTopicUrl()); + final URL subscriberUrl = parseURL(subscriberDmaapInfo.getTopicUrl()); + tcaAppPreferences.setSubscriberProtocol(subscriberUrl.getProtocol()); + tcaAppPreferences.setSubscriberHostName(subscriberUrl.getHost()); + final int subscriberUrlPort = subscriberUrl.getPort() != -1 ? + subscriberUrl.getPort() : getDefaultDMaaPPort(subscriberUrl.getProtocol()); + tcaAppPreferences.setSubscriberHostPort(subscriberUrlPort); + tcaAppPreferences.setSubscriberTopicName(subscriberUrl.getPath().substring(8)); + + final TCAHandleIn tcaHandleIn = tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn(); + tcaAppPreferences.setSubscriberUserName(tcaHandleIn.getAafUserName()); + tcaAppPreferences.setSubscriberUserPassword(tcaHandleIn.getAafPassword()); + } else { + LOG.warn("Unable to populate Subscriber DMaaP Information from App Config String: {}", appConfigString); + } + + + // Parse Publisher DMaaP information from App Config String + if (tcaControllerAppConfig.getStreamsPublishes() != null && + tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut() != null && + tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo() != null) { + + final DMAAPInfo publisherDmaapInfo = + tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo(); + LOG.debug("App Config Publisher Host URL: {}", publisherDmaapInfo.getTopicUrl()); + final URL publisherUrl = parseURL(publisherDmaapInfo.getTopicUrl()); + tcaAppPreferences.setPublisherProtocol(publisherUrl.getProtocol()); + tcaAppPreferences.setPublisherHostName(publisherUrl.getHost()); + final int publisherUrlPort = publisherUrl.getPort() != -1 ? + publisherUrl.getPort() : getDefaultDMaaPPort(publisherUrl.getProtocol()); + tcaAppPreferences.setPublisherHostPort(publisherUrlPort); + tcaAppPreferences.setPublisherTopicName(publisherUrl.getPath().substring(8)); + + final TCAHandleOut tcaHandleOut = tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut(); + tcaAppPreferences.setPublisherUserName(tcaHandleOut.getAafUserName()); + tcaAppPreferences.setPublisherUserPassword(tcaHandleOut.getAafPassword()); + } else { + LOG.warn("Unable to populate Publisher DMaaP Information from App Config String: {}", appConfigString); + } + + + } catch (IOException e) { + throw new CDAPSettingsException( + "Unable to parse App Config to Json Object.Invalid App Config String: " + appConfigString, LOG, e); + } + } + + /** + * Parses provided DMaaP MR URL string to {@link URL} object + * + * @param urlString url string + * + * @return url object + */ + private static URL parseURL(final String urlString) { + try { + return new URL(urlString); + } catch (MalformedURLException e) { + final String errorMessage = String.format("Invalid URL format: %s", urlString); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + + /** + * Sets up default DMaaP Port if not provided with DMaaP URL + * + * @param protocol protocol e.g. http or https + * + * @return default DMaaP MR port number + */ + private static int getDefaultDMaaPPort(final String protocol) { + if ("http".equals(protocol)) { + return 3904; + } else if ("https".equals(protocol)) { + return 3905; + } else { + return 80; + } + } + + + /** + * Extracts alert message strings from {@link TCAVESAlertEntity} + * + * @param alertEntities collection of alert entities + * + * @return List of alert message strings + */ + public static List extractAlertFromAlertEntities(final Collection alertEntities) { + return Lists.transform(newArrayList(alertEntities), MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION); + } + + + /** + * Converts Runtime Arguments to {@link TCAPolicyPreferences} object + * + * @param runtimeContext CDAP Runtime Arguments + * + * @return TCA Policy Preferences + */ + public static TCAPolicy getValidatedTCAPolicyPreferences(final RuntimeContext runtimeContext) { + + final Map runtimeArguments = runtimeContext.getRuntimeArguments(); + final TreeMap sortedRuntimeArguments = new TreeMap<>(runtimeArguments); + + LOG.debug("Printing all Received Runtime Arguments:"); + for (Map.Entry runtimeArgsEntry : sortedRuntimeArguments.entrySet()) { + LOG.debug("{}:{}", runtimeArgsEntry.getKey(), runtimeArgsEntry.getValue()); + } + + TCAPolicyPreferences tcaPolicyPreferences = new TCAPolicyPreferences(); + + final String tcaPolicyJsonString = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_JSON_KEY); + + if (StringUtils.isNotBlank(tcaPolicyJsonString)) { + + LOG.info("TcaPolicy will be set from input argument name: {} as JSON String with value: {}", + AnalyticsConstants.TCA_POLICY_JSON_KEY, tcaPolicyJsonString); + + // initialize unquotedTCAPolicy + String unquotedTCAPolicy = tcaPolicyJsonString.trim(); + + //remove starting and ending quote from passed tca policy Json string if present + if (tcaPolicyJsonString.trim().startsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER) && + tcaPolicyJsonString.trim().endsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER)) { + unquotedTCAPolicy = tcaPolicyJsonString.trim().substring(1, tcaPolicyJsonString.trim().length() - 1); + } + + try { + tcaPolicyPreferences = readValue(unquotedTCAPolicy , TCAPolicyPreferences.class); + } catch (IOException e) { + throw new CDAPSettingsException( + "Input tca_policy string format is not correct. tca_policy: " + tcaPolicyJsonString, LOG, e); + } + + } else { // classical controller is being used. Validate preferences as received from classical controller + + LOG.info("TcaPolicy is being parsed as key value pair from classical controller"); + + // extract TCA Policy Domain from Runtime Arguments + final String policyDomain = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_DOMAIN_PATH); + + // create new TCA Policy object + tcaPolicyPreferences.setDomain(policyDomain); + + // filter out other non relevant fields which are not related to tca policy + final Map tcaPolicyMap = filterMapByKeyNamePrefix(sortedRuntimeArguments, + TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH); + + // determine functional Roles + final Map> functionalRolesMap = + extractSubTree(tcaPolicyMap, 2, 3, AnalyticsConstants.TCA_POLICY_DELIMITER); + + // create metrics per functional role list + tcaPolicyPreferences.setMetricsPerEventName( + createTCAPolicyMetricsPerEventNameList(functionalRolesMap)); + + } + + // validate tca Policy Preferences + validateSettings(tcaPolicyPreferences, new TCAPolicyPreferencesValidator()); + + LOG.info("Printing Effective TCA Policy: {}", tcaPolicyPreferences); + + return tcaPolicyPreferences; + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java new file mode 100644 index 0000000..068119d --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.validator; + +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; + +/** + *

+ * TCA App Config Validator validates any TCA App Config parameter values + *

+ * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public class TCAAppConfigValidator implements CDAPAppSettingsValidator> { + + private static final long serialVersionUID = 1L; + + @Override + public GenericValidationResponse validateAppSettings(TCAAppConfig tcaAppConfig) { + + final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); + + if (isEmpty(tcaAppConfig.getTcaSubscriberOutputStreamName())) { + validationResponse.addErrorMessage("tcaSubscriberOutputStreamName", + "tcaSubscriberOutputStreamName must be present"); + } + + if (isEmpty(tcaAppConfig.getTcaVESMessageStatusTableName())) { + validationResponse.addErrorMessage("tcaVESMessageStatusTableName", + "tcaVESMessageStatusTableName must be present"); + } + if (isEmpty(tcaAppConfig.getTcaVESAlertsTableName())) { + validationResponse.addErrorMessage("tcaVESAlertsTableName", + "tcaVESAlertsTableName must be present"); + } + + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java new file mode 100644 index 0000000..118b852 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java @@ -0,0 +1,115 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.validator; + +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; +import org.onap.dcae.apod.analytics.model.domain.cef.EventSeverity; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.ControlLoopSchemaType; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Direction; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; + +import java.util.List; + +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; + +/** + * Validates TCA Policy Preferences + *

+ * + * @author Rajiv Singla . Creation Date: 11/29/2016. + */ +public class TCAPolicyPreferencesValidator implements CDAPAppSettingsValidator> { + + private static final long serialVersionUID = 1L; + + @Override + public GenericValidationResponse validateAppSettings( + final TCAPolicyPreferences tcaPolicyPreferences) { + + final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); + + // validate TCA Policy must domain present + final String domain = tcaPolicyPreferences.getDomain(); + if (isEmpty(domain)) { + validationResponse.addErrorMessage("domain", "TCA Policy must have only one domain present"); + } + + // validate TCA Policy must have at least one event name + final List policyEventNames = TCAUtils.getPolicyEventNames(tcaPolicyPreferences); + if (policyEventNames.isEmpty()) { + validationResponse.addErrorMessage("metricsPerEventNames", + "TCA Policy must have at least one or more event names"); + } + + final List metricsPerEventNames = + tcaPolicyPreferences.getMetricsPerEventName(); + + // validate Metrics Per Event Name + for (MetricsPerEventName metricsPerEventName : metricsPerEventNames) { + + // event name must be present + final String eventName = metricsPerEventName.getEventName(); + if (isEmpty(eventName)) { + validationResponse.addErrorMessage("eventName", + "TCA Policy eventName is not present for metricsPerEventName:" + metricsPerEventName); + } + + // control Loop Schema type must be present + final ControlLoopSchemaType controlLoopSchemaType = metricsPerEventName.getControlLoopSchemaType(); + if (controlLoopSchemaType == null) { + validationResponse.addErrorMessage("controlLoopEventType", + "TCA Policy controlLoopSchemaType is not present for metricsPerEventName:" + + metricsPerEventName); + } + + // must have at least 1 threshold defined + if (metricsPerEventName.getThresholds() == null || metricsPerEventName.getThresholds().isEmpty()) { + validationResponse.addErrorMessage("thresholds", + "TCA Policy event Name must have at least one threshold. " + + "Event Name causing this validation error:" + metricsPerEventName); + } else { + // validate each threshold must have non null - fieldPath, thresholdValue, direction and severity + final List eventNameThresholds = metricsPerEventName.getThresholds(); + for (Threshold eventNameThreshold : eventNameThresholds) { + final String fieldPath = eventNameThreshold.getFieldPath(); + final Long thresholdValue = eventNameThreshold.getThresholdValue(); + final Direction direction = eventNameThreshold.getDirection(); + final EventSeverity severity = eventNameThreshold.getSeverity(); + final ClosedLoopEventStatus closedLoopEventStatus = eventNameThreshold.getClosedLoopEventStatus(); + if (isEmpty(fieldPath) || thresholdValue == null || direction == null || severity == null || + closedLoopEventStatus == null) { + validationResponse.addErrorMessage("threshold", + "TCA Policy threshold must have fieldPath,thresholdValue,direction, " + + "closedLoopEventStatus and severity defined." + + "Threshold causing this validation error:" + eventNameThreshold); + } + } + } + } + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java new file mode 100644 index 0000000..261b74d --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.validator; + +import org.onap.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; + +/** + * + * @author Rajiv Singla . Creation Date: 11/3/2016. + */ +public class TCAPreferencesValidator implements CDAPAppSettingsValidator> { + + private static final long serialVersionUID = 1L; + + @Override + public GenericValidationResponse validateAppSettings(TCAAppPreferences appPreferences) { + + final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); + + // subscriber validations + final String subscriberHostName = appPreferences.getSubscriberHostName(); + if (isEmpty(subscriberHostName)) { + validationResponse.addErrorMessage("subscriberHostName", "Subscriber host name must be present"); + } + final String subscriberTopicName = appPreferences.getSubscriberTopicName(); + if (isEmpty(subscriberTopicName)) { + validationResponse.addErrorMessage("subscriberTopicName", "Subscriber topic name must be present"); + } + + // publisher validations + final String publisherHostName = appPreferences.getPublisherHostName(); + if (isEmpty(publisherHostName)) { + validationResponse.addErrorMessage("publisherHostName", "Publisher host name must be present"); + } + final String publisherTopicName = appPreferences.getPublisherTopicName(); + if (isEmpty(publisherTopicName)) { + validationResponse.addErrorMessage("publisherTopicName", "Publisher topic name must be present"); + } + + final Boolean enableAAIEnrichment = appPreferences.getEnableAAIEnrichment(); + + // if aai enrichment is enabled then do some aai validations + if (enableAAIEnrichment) { + final String aaiEnrichmentHost = appPreferences.getAaiEnrichmentHost(); + if (isEmpty(aaiEnrichmentHost)) { + validationResponse.addErrorMessage("aaiEnrichmentHost", "AAI Enrichment Host must be present"); + } + final String aaiVMEnrichmentAPIPath = appPreferences.getAaiVMEnrichmentAPIPath(); + if (isEmpty(aaiVMEnrichmentAPIPath)) { + validationResponse.addErrorMessage("aaiVMEnrichmentAPIPath", "AAI VM Enrichment path must be present"); + } + final String aaiVNFEnrichmentAPIPath = appPreferences.getAaiVNFEnrichmentAPIPath(); + if (isEmpty(aaiVNFEnrichmentAPIPath)) { + validationResponse.addErrorMessage("aaiVNFEnrichmentAPIPath", "AAI VNF Enrichment path must be " + + "present"); + } + } + + return validationResponse; + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java new file mode 100644 index 0000000..f9deac8 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java @@ -0,0 +1,116 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.worker.AbstractWorker; +import com.google.common.base.Preconditions; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.atomic.AtomicBoolean; + +import static java.lang.String.format; + +/** + * Base logic for DMaaP Workers which uses scheduler to poll DMaaP MR topics at frequent intervals + *

+ * @author Rajiv Singla . Creation Date: 12/19/2016. + */ +public abstract class BaseTCADMaaPMRWorker extends AbstractWorker { + + private static final Logger LOG = LoggerFactory.getLogger(BaseTCADMaaPMRWorker.class); + + /** + * Quartz Scheduler + */ + protected Scheduler scheduler; + /** + * Determines if scheduler is shutdown + */ + protected AtomicBoolean isSchedulerShutdown; + + + @Override + public void run() { + + Preconditions.checkNotNull(scheduler, "Scheduler must not be null"); + String schedulerName = ""; + + // Start scheduler + try { + schedulerName = scheduler.getSchedulerName(); + scheduler.start(); + isSchedulerShutdown.getAndSet(false); + + } catch (SchedulerException e) { + final String errorMessage = + format("Error while starting TCA DMaaP MR scheduler name: %s, error: %s", schedulerName, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + LOG.info("Successfully started DMaaP MR Scheduler: {}", schedulerName); + + // indefinite loop which wakes up and confirms scheduler is indeed running + while (!isSchedulerShutdown.get()) { + try { + + Thread.sleep(AnalyticsConstants.TCA_DEFAULT_WORKER_SHUTDOWN_CHECK_INTERVAL_MS); + + } catch (InterruptedException e) { + + final String errorMessage = + format("Error while checking TCA DMaaP MR Scheduler worker status name: %s, error: %s", + schedulerName, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + + LOG.info("Finished execution of TCA DMaaP MR worker thread: {}", schedulerName); + + } + + @Override + public void stop() { + + Preconditions.checkNotNull(scheduler, "Scheduler must not be null"); + String schedulerName = ""; + + // Stop Scheduler + try { + schedulerName = scheduler.getSchedulerName(); + LOG.info("Shutting TCA DMaaP MR Scheduler: {}", schedulerName); + scheduler.shutdown(); + isSchedulerShutdown.getAndSet(true); + + } catch (SchedulerException e) { + + final String errorMessage = + format("Error while shutting down TCA DMaaP MR Scheduler: name: %s, error: %s", schedulerName, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java new file mode 100644 index 0000000..2114c8c --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java @@ -0,0 +1,200 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.TxRunnable; +import co.cask.cdap.api.common.Bytes; +import co.cask.cdap.api.data.DatasetContext; +import co.cask.cdap.api.dataset.lib.CloseableIterator; +import co.cask.cdap.api.dataset.lib.KeyValue; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.metrics.Metrics; +import co.cask.cdap.api.worker.WorkerContext; +import com.google.common.base.Joiner; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.apache.tephra.TransactionFailureException; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertsPersister; +import org.onap.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.common.utils.HTTPUtils; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.PersistJobDataAfterExecution; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.onap.dcae.apod.analytics.common.AnalyticsConstants.CDAP_ALERTS_TABLE_VARIABLE_NAME; +import static org.onap.dcae.apod.analytics.common.AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME; +import static org.onap.dcae.apod.analytics.common.AnalyticsConstants.DMAAP_PUBLISHER_VARIABLE_NAME; +import static org.onap.dcae.apod.analytics.common.AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME; + +/** + * Quartz Job that will monitor any new alert messages in given TCA Alerts table and if any found publish them to + * DMaaP MR topic + *

+ * @author Rajiv Singla . Creation Date: 11/17/2016. + */ +@DisallowConcurrentExecution +@PersistJobDataAfterExecution +@SuppressFBWarnings("SIC_INNER_SHOULD_BE_STATIC_ANON") +public class TCADMaaPMRPublisherJob implements Job { + + private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPMRPublisherJob.class); + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + LOG.debug("Starting DMaaP MR Topic Publisher fetch Job. Next firing time will be: {}", + jobExecutionContext.getNextFireTime()); + + // Get Job Data Map + final JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap(); + + // Fetch all Job Params from Job Data Map + final String cdapAlertsTableName = jobDataMap.getString(CDAP_ALERTS_TABLE_VARIABLE_NAME); + final WorkerContext workerContext = (WorkerContext) jobDataMap.get(WORKER_CONTEXT_VARIABLE_NAME); + final DMaaPMRPublisher publisher = (DMaaPMRPublisher) jobDataMap.get(DMAAP_PUBLISHER_VARIABLE_NAME); + final Metrics metrics = (Metrics) jobDataMap.get(DMAAP_METRICS_VARIABLE_NAME); + + LOG.debug("Start looking for new message in Alerts Table: {}", cdapAlertsTableName); + + // Get new alerts from alerts table + final Map newAlertsMap = getNewAlertsMap(cdapAlertsTableName, workerContext); + + // If no new alerts are found - nothing to publish + if (newAlertsMap.isEmpty()) { + LOG.debug("No new alerts found in Alerts Table name: {}. Nothing to Publisher....", cdapAlertsTableName); + metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_NO_NEW_ALERTS_LOOKUP_METRIC, 1); + return; + } + + final int newAlertsCount = newAlertsMap.size(); + LOG.debug("Found new alerts in Alerts Table name: {}. No of new alerts: {}", cdapAlertsTableName, + newAlertsCount); + metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_NEW_ALERTS_METRIC, newAlertsCount); + + // Get alert message strings from alert Entities + final List newAlertsMessages = CDAPTCAUtils.extractAlertFromAlertEntities(newAlertsMap.values()); + + // Publish messages to DMaaP MR Topic + try { + + final DMaaPMRPublisherResponse publisherResponse = publisher.publish(newAlertsMessages); + + final Integer responseCode = publisherResponse.getResponseCode(); + final String responseMessage = publisherResponse.getResponseMessage(); + final int pendingMessagesCount = publisherResponse.getPendingMessagesCount(); + + LOG.debug("Publisher Response Code: {}, Publisher message: {}, Pending Messages Count: {}", responseCode, + responseMessage, pendingMessagesCount); + + if (HTTPUtils.isSuccessfulResponseCode(responseCode)) { + LOG.debug("Successfully Published alerts to DMaaP MR Topic."); + metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_SUCCESSFUL_DMAAP_RESPONSE_METRIC, 1); + } else { + LOG.warn("Unable to publish alerts to DMaaP MR Topic. Publisher will try to send it later...."); + metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_UNSUCCESSFUL_DMAAP_RESPONSE_METRIC, 1); + } + + } catch (DCAEAnalyticsRuntimeException e) { + LOG.error("Exception while publishing messages to DMaaP MR Topic: {}", e); + } finally { + // delete send message from alerts table + deleteAlertsByKey(cdapAlertsTableName, workerContext, newAlertsMap.keySet(), metrics); + } + + LOG.debug("Finished DMaaP MR Topic Publisher fetch Job."); + + } + + /** + * Gets New Messages from alerts table as Map with row keys as keys and {@link TCAVESAlertEntity} as values + * + * @param cdapAlertsTableName alerts table name + * @param workerContext worker context + * @return Map with row keys as keys and {@link TCAVESAlertEntity} as values + */ + protected Map getNewAlertsMap(final String cdapAlertsTableName, + final WorkerContext workerContext) { + final Map newAlertsMap = new LinkedHashMap<>(); + try { + workerContext.execute(new TxRunnable() { + @Override + public void run(DatasetContext context) throws Exception { + final ObjectMappedTable alertsTable = context.getDataset(cdapAlertsTableName); + final Date currentTime = new Date(); + final String rowKey = TCAVESAlertsPersister.createRowKey(currentTime); + final CloseableIterator> scan = alertsTable.scan(null, rowKey); + while (scan.hasNext()) { + final KeyValue alertEntityKeyValue = scan.next(); + newAlertsMap.put(Bytes.toString(alertEntityKeyValue.getKey()), alertEntityKeyValue.getValue()); + } + } + }); + } catch (TransactionFailureException e) { + final String errorMessage = "Transaction Error while getting new alerts from alerts table: " + e.toString(); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + return newAlertsMap; + } + + /** + * Deletes rows in Alerts table for give rowKeys + * + * @param cdapAlertsTableName CDAP Alerts Table Name + * @param workerContext Worker Context + * @param rowKeys Row Key Set + * @param metrics CDAP metrics + */ + protected void deleteAlertsByKey(final String cdapAlertsTableName, final WorkerContext workerContext, + final Set rowKeys, final Metrics metrics) { + LOG.debug("Deleting Published Alerts from alerts table with rowKeys: {}", Joiner.on(",").join(rowKeys)); + try { + workerContext.execute(new TxRunnable() { + @Override + public void run(DatasetContext context) throws Exception { + final ObjectMappedTable alertsTable = context.getDataset(cdapAlertsTableName); + for (String rowKey : rowKeys) { + alertsTable.delete(rowKey); + metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_DELETED_ALERTS_METRIC, 1); + } + } + }); + } catch (TransactionFailureException e) { + final String errorMessage = + "Transaction Error while deleting published alerts in alerts table: " + e.toString(); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java new file mode 100644 index 0000000..1714d65 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java @@ -0,0 +1,114 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.metrics.Metrics; +import co.cask.cdap.api.worker.WorkerContext; +import com.google.common.base.Optional; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.cdap.common.utils.DMaaPMRUtils; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.PersistJobDataAfterExecution; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.List; + +import static java.lang.String.format; + +/** + * Quartz Job which polls DMaaP MR VES Collector Topic for messages and writes them to + * a given CDAP Stream + * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +@DisallowConcurrentExecution +@PersistJobDataAfterExecution +public class TCADMaaPMRSubscriberJob implements Job { + + private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPMRSubscriberJob.class); + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + LOG.debug("Starting DMaaP MR Topic Subscriber fetch Job. Next firing time will be: {}", + jobExecutionContext.getNextFireTime()); + + // Get Job Data Map + final JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap(); + + // Fetch all Job Params from Job Data Map + final String cdapStreamName = jobDataMap.getString(AnalyticsConstants.CDAP_STREAM_VARIABLE_NAME); + final WorkerContext workerContext = + (WorkerContext) jobDataMap.get(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME); + final DMaaPMRSubscriber subscriber = + (DMaaPMRSubscriber) jobDataMap.get(AnalyticsConstants.DMAAP_SUBSCRIBER_VARIABLE_NAME); + final Metrics metrics = (Metrics) jobDataMap.get(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME); + + final Optional> subscriberMessagesOptional = + DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); + + // Write message to CDAP Stream using Stream Writer + if (subscriberMessagesOptional.isPresent()) { + writeMessageToCDAPStream(subscriberMessagesOptional.get(), cdapStreamName, workerContext, metrics); + } + } + + + /** + * Writes given messages to CDAP Stream + * + * @param actualMessages List of messages that need to written to cdap stream + * @param cdapStreamName cdap stream name + * @param workerContext cdap worker context + * @param metrics cdap metrics + */ + private void writeMessageToCDAPStream(final List actualMessages, final String cdapStreamName, + final WorkerContext workerContext, final Metrics metrics) { + LOG.debug("Writing message to CDAP Stream: {}, Message Count: {}", cdapStreamName, actualMessages.size()); + try { + + for (String message : actualMessages) { + workerContext.write(cdapStreamName, message); + } + + } catch (IOException e) { + metrics.count(CDAPMetricsConstants.TCA_SUBSCRIBER_FAILURE_TO_WRITE_TO_STREAM_METRIC, 1); + final String errorMessage = + format("Error while DMaaP message router subscriber attempting to write to CDAP Stream: %s, " + + "Exception: %s", cdapStreamName, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + LOG.debug("DMaaP MR Subscriber successfully finished writing messages to CDAP Stream: {}, Message count: {}", + cdapStreamName, actualMessages.size()); + + } + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java new file mode 100644 index 0000000..e8130f3 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java @@ -0,0 +1,141 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.annotation.Property; +import co.cask.cdap.api.worker.AbstractWorker; +import co.cask.cdap.api.worker.WorkerContext; +import com.fasterxml.jackson.core.type.TypeReference; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import static org.onap.dcae.apod.analytics.tca.utils.TCAUtils.readValue; +import static org.onap.dcae.apod.analytics.tca.utils.TCAUtils.writeValueAsString; + +/** + * CDAP Worker which mocks fetching VES Messages from DMaaP MR topic. + * The mock instead of making DMaaP MR calls will actually take messages + * from file and send them to stream at subscriber polling interval + * + * TODO: To be removed before going to production - only for testing purposes + * + * @author Rajiv Singla . Creation Date: 11/4/2016. + */ +public class TCADMaaPMockSubscriberWorker extends AbstractWorker { + + private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPMockSubscriberWorker.class); + + // TODO: Remove this file before going to production - only for mocking purposes + private static final String MOCK_MESSAGE_FILE_LOCATION = "ves_mock_messages.json"; + private static final TypeReference> EVENT_LISTENER_TYPE_REFERENCE = + new TypeReference>() { + }; + + private TCAAppPreferences tcaAppPreferences; + private boolean stopSendingMessages; + @Property + private final String tcaSubscriberOutputStreamName; + + public TCADMaaPMockSubscriberWorker(final String tcaSubscriberOutputStreamName) { + this.tcaSubscriberOutputStreamName = tcaSubscriberOutputStreamName; + } + + @Override + public void configure() { + setName("MockTCASubscriberWorker"); + setDescription("Writes Mocked VES messages to CDAP Stream"); + LOG.info("Configuring Mock TCA MR DMaaP Subscriber worker with name: {}", "MockTCASubscriberWorker"); + } + + @Override + public void initialize(WorkerContext context) throws Exception { + super.initialize(context); + + final TCAAppPreferences appPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(context); + LOG.info("Initializing Mock TCA MR DMaaP Subscriber worker with preferences: {}", appPreferences); + this.tcaAppPreferences = appPreferences; + this.stopSendingMessages = false; + } + + + @Override + public void run() { + final Integer subscriberPollingInterval = tcaAppPreferences.getSubscriberPollingInterval(); + LOG.debug("Mock TCA Subscriber Polling interval: {}", subscriberPollingInterval); + + final InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream + (MOCK_MESSAGE_FILE_LOCATION); + + if (resourceAsStream == null) { + LOG.error("Unable to find file at location: {}", MOCK_MESSAGE_FILE_LOCATION); + throw new DCAEAnalyticsRuntimeException("Unable to find file", LOG, new FileNotFoundException()); + } + + + try { + List eventListeners = readValue(resourceAsStream, EVENT_LISTENER_TYPE_REFERENCE); + + final int totalMessageCount = eventListeners.size(); + LOG.debug("Mock message count to be written to cdap stream: ()", totalMessageCount); + + int i = 1; + for (EventListener eventListener : eventListeners) { + if (stopSendingMessages) { + LOG.debug("Stop sending messages......"); + break; + } + final String eventListenerString = writeValueAsString(eventListener); + LOG.debug("=======>> Writing message to cdap stream no: {} of {}", i, totalMessageCount); + getContext().write(tcaSubscriberOutputStreamName, eventListenerString); + i++; + + try { + Thread.sleep(subscriberPollingInterval); + } catch (InterruptedException e) { + LOG.error("Error while sleeping"); + throw new DCAEAnalyticsRuntimeException("Error while sleeping", LOG, e); + } + } + + LOG.debug("Finished writing mock messages to CDAP Stream"); + + } catch (IOException e) { + LOG.error("Error while parsing json file"); + throw new DCAEAnalyticsRuntimeException("Error while parsing mock json file", LOG, e); + } + + + } + + @Override + public void stop() { + stopSendingMessages = true; + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java new file mode 100644 index 0000000..78dbd35 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java @@ -0,0 +1,146 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.annotation.Property; +import co.cask.cdap.api.metrics.Metrics; +import co.cask.cdap.api.worker.WorkerContext; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.utils.AppPreferencesToPublisherConfigMapper; +import org.onap.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.quartz.JobDataMap; +import org.quartz.SchedulerException; +import org.quartz.impl.StdSchedulerFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.atomic.AtomicBoolean; + +import static java.lang.String.format; + +/** + * TCA DMaaP Publisher will monitor alerts table at regular intervals and publish any alerts to DMaaP MR Publishing + * Topic + *

+ * @author Rajiv Singla . Creation Date: 11/16/2016. + */ +public class TCADMaaPPublisherWorker extends BaseTCADMaaPMRWorker { + + private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPPublisherWorker.class); + + private DMaaPMRPublisher publisher; + private Metrics metrics; + @Property + private final String tcaVESAlertsTableName; + + public TCADMaaPPublisherWorker(final String tcaVESAlertsTableName) { + this.tcaVESAlertsTableName = tcaVESAlertsTableName; + } + + @Override + public void configure() { + setName(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_WORKER); + setDescription(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_DESCRIPTION_WORKER); + LOG.debug("Configuring TCA MR DMaaP Publisher worker with name: {}", + CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_WORKER); + } + + + @Override + public void initialize(WorkerContext context) throws Exception { + super.initialize(context); + + // Parse runtime arguments + final TCAAppPreferences tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(context); + + LOG.info("Initializing TCA MR DMaaP Publisher worker with preferences: {}", tcaAppPreferences); + + // Map TCA App Preferences to DMaaP MR Publisher Config + final DMaaPMRPublisherConfig publisherConfig = AppPreferencesToPublisherConfigMapper.map(tcaAppPreferences); + + LOG.info("TCA DMaaP MR Publisher worker will be polling TCA Alerts Table Name: {}", tcaVESAlertsTableName); + + // Create an instance of DMaaP MR Publisher + LOG.debug("Creating an instance of DMaaP Publisher"); + publisher = DMaaPMRFactory.create().createPublisher(publisherConfig); + + // initialize a new Quartz scheduler + initializeScheduler(tcaAppPreferences, new StdSchedulerFactory()); + + // initialize scheduler state + isSchedulerShutdown = new AtomicBoolean(true); + } + + + /** + * Stop DMaaP Publisher + */ + @Override + public void stop() { + // Close Publisher - which will flush any batch messages if present in batch queue + if (publisher != null) { + try { + publisher.close(); + } catch (Exception e) { + final String errorMessage = format("Error while shutting down DMaaP MR Publisher: %s", e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + // Shut down scheduler + super.stop(); + } + + + /** + * Initializes a scheduler instance for DMaaP MR Publisher Job + * + * @throws SchedulerException SchedulerException + */ + private void initializeScheduler(final TCAAppPreferences tcaAnalyticsAppConfig, + final StdSchedulerFactory stdSchedulerFactory) throws SchedulerException { + + // Get Publisher polling interval + final Integer publisherPollingInterval = tcaAnalyticsAppConfig.getPublisherPollingInterval(); + + // Publisher Quartz Properties file + final String quartzPublisherPropertiesFileName = AnalyticsConstants.TCA_QUARTZ_PUBLISHER_PROPERTIES_FILE_NAME; + + // Create a new JobDataMap containing information required by TCA DMaaP Publisher Job + final JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put(AnalyticsConstants.CDAP_ALERTS_TABLE_VARIABLE_NAME, tcaVESAlertsTableName); + jobDataMap.put(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME, getContext()); + jobDataMap.put(AnalyticsConstants.DMAAP_PUBLISHER_VARIABLE_NAME, publisher); + jobDataMap.put(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME, metrics); + + // Create new publisher scheduler + scheduler = TCAUtils.createQuartzScheduler(publisherPollingInterval, stdSchedulerFactory, + quartzPublisherPropertiesFileName, jobDataMap, TCADMaaPMRPublisherJob.class, + AnalyticsConstants.TCA_DMAAP_PUBLISHER_QUARTZ_JOB_NAME, + AnalyticsConstants.TCA_DMAAP_PUBLISHER_QUARTZ_TRIGGER_NAME); + } +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java new file mode 100644 index 0000000..64bf0d1 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/main/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java @@ -0,0 +1,124 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.annotation.Property; +import co.cask.cdap.api.metrics.Metrics; +import co.cask.cdap.api.worker.WorkerContext; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.utils.AppPreferencesToSubscriberConfigMapper; +import org.onap.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; +import org.quartz.JobDataMap; +import org.quartz.SchedulerException; +import org.quartz.impl.StdSchedulerFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * TCA DMaaP Subscriber will read messages and post them to cdap stream at regular intervals + *

+ * @author Rajiv Singla . Creation Date: 10/14/2016. + */ +public class TCADMaaPSubscriberWorker extends BaseTCADMaaPMRWorker { + + private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPSubscriberWorker.class); + + private DMaaPMRSubscriber subscriber; + private Metrics metrics; + @Property + private final String tcaSubscriberOutputStreamName; + + public TCADMaaPSubscriberWorker(final String tcaSubscriberOutputStreamName) { + this.tcaSubscriberOutputStreamName = tcaSubscriberOutputStreamName; + } + + + @Override + public void configure() { + setName(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_WORKER); + setDescription(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_DESCRIPTION_WORKER); + LOG.debug("Configuring TCA MR DMaaP Subscriber worker with name: {}", + CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_WORKER); + } + + @Override + public void initialize(WorkerContext context) throws Exception { + super.initialize(context); + + // Parse runtime arguments + final TCAAppPreferences tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(context); + + LOG.info("Initializing TCA MR DMaaP Subscriber worker with preferences: {}", tcaAppPreferences); + + // Map TCA App Preferences to DMaaP MR Subscriber Config + final DMaaPMRSubscriberConfig subscriberConfig = AppPreferencesToSubscriberConfigMapper.map(tcaAppPreferences); + + LOG.info("TCA DMaaP MR Subscriber worker will be writing to CDAP Stream: {}", tcaSubscriberOutputStreamName); + + // Create an instance of DMaaP MR Subscriber + LOG.debug("Creating an instance of DMaaP Subscriber"); + subscriber = DMaaPMRFactory.create().createSubscriber(subscriberConfig); + + // initialize a new Quartz scheduler + initializeScheduler(tcaAppPreferences, new StdSchedulerFactory()); + + // initialize scheduler state + isSchedulerShutdown = new AtomicBoolean(true); + } + + /** + * Initializes a scheduler instance for DMaaP MR Subscriber Job + * + * @throws SchedulerException SchedulerException + */ + private void initializeScheduler(final TCAAppPreferences tcaAppPreferences, + final StdSchedulerFactory stdSchedulerFactory) throws SchedulerException { + + // Get Subscriber polling interval + final Integer subscriberPollingInterval = tcaAppPreferences.getSubscriberPollingInterval(); + + // Subscriber Quartz Properties file + final String quartzSubscriberPropertiesFileName = AnalyticsConstants.TCA_QUARTZ_SUBSCRIBER_PROPERTIES_FILE_NAME; + + // Create a new JobDataMap containing information required by TCA DMaaP Subscriber Job + final JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put(AnalyticsConstants.CDAP_STREAM_VARIABLE_NAME, tcaSubscriberOutputStreamName); + jobDataMap.put(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME, getContext()); + jobDataMap.put(AnalyticsConstants.DMAAP_SUBSCRIBER_VARIABLE_NAME, subscriber); + jobDataMap.put(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME, metrics); + + // Create new publisher scheduler + scheduler = TCAUtils.createQuartzScheduler(subscriberPollingInterval, stdSchedulerFactory, + quartzSubscriberPropertiesFileName, jobDataMap, TCADMaaPMRSubscriberJob.class, + AnalyticsConstants.TCA_DMAAP_SUBSCRIBER_QUARTZ_JOB_NAME, + AnalyticsConstants.TCA_DMAAP_SUBSCRIBER_QUARTZ_TRIGGER_NAME); + } + + +} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java deleted file mode 100644 index f0224a9..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplication.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca; - -import co.cask.cdap.api.app.AbstractApplication; -import co.cask.cdap.api.data.stream.Stream; -import co.cask.cdap.api.dataset.DatasetProperties; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementPersister; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusPersister; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertsPersister; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils; -import org.openecomp.dcae.apod.analytics.cdap.tca.flow.TCAVESCollectorFlow; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; -import org.openecomp.dcae.apod.analytics.cdap.tca.validator.TCAAppConfigValidator; -import org.openecomp.dcae.apod.analytics.cdap.tca.worker.TCADMaaPMockSubscriberWorker; -import org.openecomp.dcae.apod.analytics.cdap.tca.worker.TCADMaaPPublisherWorker; -import org.openecomp.dcae.apod.analytics.cdap.tca.worker.TCADMaaPSubscriberWorker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Rajiv Singla . Creation Date: 10/21/2016. - */ -public class TCAAnalyticsApplication extends AbstractApplication { - - private static final Logger LOG = LoggerFactory.getLogger(TCAAnalyticsApplication.class); - - @Override - @SuppressWarnings("unchecked") - public void configure() { - - - // ========= Application configuration Setup ============== // - final TCAAppConfig tcaAppConfig = getConfig(); - - LOG.info("Configuring TCA Application with startup application configuration: {}", tcaAppConfig); - - // Validate application configuration - ValidationUtils.validateSettings(tcaAppConfig, new TCAAppConfigValidator()); - - // App Setup - setName(tcaAppConfig.getAppName()); - setDescription(tcaAppConfig.getAppDescription()); - - // ========== Streams Setup ============== // - // Create DMaaP MR Subscriber CDAP output stream - final String tcaSubscriberOutputStreamName = tcaAppConfig.getTcaSubscriberOutputStreamName(); - LOG.info("Creating TCA VES Output Stream: {}", tcaSubscriberOutputStreamName); - final Stream subscriberOutputStream = new Stream(tcaSubscriberOutputStreamName, - CDAPComponentsConstants.TCA_FIXED_SUBSCRIBER_OUTPUT_DESCRIPTION_STREAM); - addStream(subscriberOutputStream); - - - // ============ Datasets Setup ======== // - // Create TCA Message Status Table - final String tcaVESMessageStatusTableName = tcaAppConfig.getTcaVESMessageStatusTableName(); - final Integer messageStatusTableTTLSeconds = tcaAppConfig.getTcaVESMessageStatusTableTTLSeconds(); - LOG.info("Creating TCA Message Status Table: {} with TTL: {}", - tcaVESMessageStatusTableName, messageStatusTableTTLSeconds); - final DatasetProperties messageStatusTableProperties = - TCAMessageStatusPersister.getDatasetProperties(messageStatusTableTTLSeconds); - createDataset(tcaVESMessageStatusTableName, ObjectMappedTable.class, messageStatusTableProperties); - - - // Create TCA Alerts Abatement Table - final String tcaAlertsAbatementTableName = tcaAppConfig.getTcaAlertsAbatementTableName(); - final Integer tcaAlertsAbatementTableTTLSeconds = tcaAppConfig.getTcaAlertsAbatementTableTTLSeconds(); - LOG.info("Creating Alerts Abatement Table: {} with TTL: {}", - tcaAlertsAbatementTableName, tcaAlertsAbatementTableTTLSeconds); - final DatasetProperties alertsAbatementTableProperties = - TCAAlertsAbatementPersister.getDatasetProperties(tcaAlertsAbatementTableTTLSeconds); - createDataset(tcaAlertsAbatementTableName, ObjectMappedTable.class, alertsAbatementTableProperties); - - // Create TCA VES Alerts Table - final String tcaVESAlertsTableName = tcaAppConfig.getTcaVESAlertsTableName(); - final Integer alertsTableTTLSeconds = tcaAppConfig.getTcaVESAlertsTableTTLSeconds(); - LOG.info("Creating TCA Alerts Table: {} with TTL: {}", - tcaVESAlertsTableName, alertsTableTTLSeconds); - final DatasetProperties alertTableProperties = - TCAVESAlertsPersister.getDatasetProperties(alertsTableTTLSeconds); - createDataset(tcaVESAlertsTableName, ObjectMappedTable.class, alertTableProperties); - - // =========== Flow Setup ============= // - addFlow(new TCAVESCollectorFlow(tcaAppConfig)); - - // ========== Workers Setup =========== // - LOG.info("Creating TCA DMaaP Subscriber Worker"); - addWorker(new TCADMaaPSubscriberWorker(tcaAppConfig.getTcaSubscriberOutputStreamName())); - LOG.info("Creating TCA DMaaP Publisher Worker"); - addWorker(new TCADMaaPPublisherWorker(tcaAppConfig.getTcaVESAlertsTableName())); - // TODO: Remove this before going to production - addWorker(new TCADMaaPMockSubscriberWorker(tcaAppConfig.getTcaSubscriberOutputStreamName())); - } - - -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java deleted file mode 100644 index 1bb31a1..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlow.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flow; - -import co.cask.cdap.api.flow.AbstractFlow; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.tca.flowlet.TCAVESAAIEnrichmentFlowlet; -import org.openecomp.dcae.apod.analytics.cdap.tca.flowlet.TCAVESAlertsAbatementFlowlet; -import org.openecomp.dcae.apod.analytics.cdap.tca.flowlet.TCAVESAlertsSinkFlowlet; -import org.openecomp.dcae.apod.analytics.cdap.tca.flowlet.TCAVESMessageRouterFlowlet; -import org.openecomp.dcae.apod.analytics.cdap.tca.flowlet.TCAVESThresholdViolationCalculatorFlowlet; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; - -/** - * TCA Flow for VES (Virtual Event Streaming) Collector Flow - * - * @author Rajiv Singla . Creation Date: 11/3/2016. - */ -public class TCAVESCollectorFlow extends AbstractFlow { - - private final TCAAppConfig tcaAppConfig; - - public TCAVESCollectorFlow(TCAAppConfig tcaAppConfig) { - this.tcaAppConfig = tcaAppConfig; - } - - @Override - protected void configure() { - - setName(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_NAME_FLOW); - setDescription(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_DESCRIPTION_FLOW); - - final TCAVESMessageRouterFlowlet messageRouterFlowlet = new TCAVESMessageRouterFlowlet(); - addFlowlet(messageRouterFlowlet); - - final TCAVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = - new TCAVESThresholdViolationCalculatorFlowlet(tcaAppConfig.getTcaVESMessageStatusTableName()); - addFlowlet(thresholdViolationCalculatorFlowlet, tcaAppConfig.getThresholdCalculatorFlowletInstances()); - - final TCAVESAlertsAbatementFlowlet tcavesAlertsAbatementFlowlet = - new TCAVESAlertsAbatementFlowlet(tcaAppConfig.getTcaAlertsAbatementTableName()); - addFlowlet(tcavesAlertsAbatementFlowlet); - - final TCAVESAAIEnrichmentFlowlet tcavesaaiEnrichmentFlowlet = new TCAVESAAIEnrichmentFlowlet(); - addFlowlet(tcavesaaiEnrichmentFlowlet); - - final TCAVESAlertsSinkFlowlet alertsSinkFlowlet = - new TCAVESAlertsSinkFlowlet(tcaAppConfig.getTcaVESAlertsTableName()); - addFlowlet(alertsSinkFlowlet); - - - // connect DMaaP MR VES Subscriber output stream to VES Message Router Flowlet - connectStream(tcaAppConfig.getTcaSubscriberOutputStreamName(), messageRouterFlowlet); - // connect message router to VES threshold calculator - connect(messageRouterFlowlet, thresholdViolationCalculatorFlowlet); - // connect VES threshold calculator flowlet to Alerts Abatement Flowlet - connect(thresholdViolationCalculatorFlowlet, tcavesAlertsAbatementFlowlet); - // connect Alerts Abatement flowlet to AAI Enrichment Flowlet - connect(tcavesAlertsAbatementFlowlet, tcavesaaiEnrichmentFlowlet); - // connect A&AI Enrichment flowlet to Alerts Sink Flowlet - connect(tcavesaaiEnrichmentFlowlet, alertsSinkFlowlet); - - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java deleted file mode 100644 index 3fca3d7..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAAIEnrichmentFlowlet.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.annotation.Output; -import co.cask.cdap.api.annotation.ProcessInput; -import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import co.cask.cdap.api.flow.flowlet.OutputEmitter; -import org.openecomp.dcae.apod.analytics.aai.AAIClientFactory; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import org.openecomp.dcae.apod.analytics.aai.service.AAIEnrichmentClient; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ControlLoopSchemaType; -import org.openecomp.dcae.apod.analytics.model.facade.tca.TCAVESResponse; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; - -/** - * Flowlet responsible for doing A&AI Enrichment - * - * @author Rajiv Singla . Creation Date: 9/20/2017. - */ -public class TCAVESAAIEnrichmentFlowlet extends AbstractFlowlet { - - private static final Logger LOG = LoggerFactory.getLogger(TCAVESAAIEnrichmentFlowlet.class); - - @Output(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_OUTPUT) - protected OutputEmitter aaiEnrichmentOutputEmitter; - - private TCAAppPreferences tcaAppPreferences; - private AAIEnrichmentClient aaiEnrichmentClient; - - @Override - public void configure() { - setName(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_FLOWLET); - setDescription(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_DESCRIPTION_FLOWLET); - } - - @Override - public void initialize(FlowletContext flowletContext) throws Exception { - super.initialize(flowletContext); - tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(flowletContext); - if (tcaAppPreferences.getEnableAAIEnrichment()) { - final AAIHttpClientConfig aaiHttpClientConfig = - CDAPTCAUtils.createAAIEnrichmentClientConfig(tcaAppPreferences); - aaiEnrichmentClient = AAIClientFactory.create().getEnrichmentClient(aaiHttpClientConfig); - } - } - - @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_OUTPUT) - public void performAAIEnrichment(final String alertMessageString) throws IOException { - - // if A&AI enrichment is disabled - no A&AI lookups are required - if (!tcaAppPreferences.getEnableAAIEnrichment()) { - - LOG.debug("A&AI Enrichment is disabled. Skip A&AI Enrichment for alert: {}", alertMessageString); - aaiEnrichmentOutputEmitter.emit(alertMessageString); - - } else { - - // determine closed Loop Event Status - final TCAVESResponse tcavesResponse = TCAUtils.readValue(alertMessageString, TCAVESResponse.class); - final ClosedLoopEventStatus closedLoopEventStatus = - ClosedLoopEventStatus.valueOf(tcavesResponse.getClosedLoopEventStatus()); - - if (closedLoopEventStatus == ClosedLoopEventStatus.ONSET) { - LOG.debug("Performing A&AI Enrichment of ONSET Alert: {}", alertMessageString); - final ControlLoopSchemaType controlLoopSchemaType = - TCAUtils.determineControlLoopSchemaType(tcavesResponse); - final String sourceName = TCAUtils.determineSourceName(tcavesResponse); - LOG.debug("A&AI Source Name: {}, Control Loop Schema Type: {} for ONSET Alert: {}", - sourceName, controlLoopSchemaType, alertMessageString); - - if (controlLoopSchemaType == ControlLoopSchemaType.VM) { - final String aaiVMEnrichmentAPIPath = tcaAppPreferences.getAaiVMEnrichmentAPIPath(); - TCAUtils.doAAIVMEnrichment(tcavesResponse, aaiEnrichmentClient, aaiVMEnrichmentAPIPath, - alertMessageString, sourceName); - } else { - final String aaiVNFEnrichmentAPIPath = tcaAppPreferences.getAaiVNFEnrichmentAPIPath(); - TCAUtils.doAAIVNFEnrichment(tcavesResponse, aaiEnrichmentClient, aaiVNFEnrichmentAPIPath, - alertMessageString, sourceName); - } - - final String aaiEnrichedAlert = TCAUtils.writeValueAsString(tcavesResponse); - LOG.debug("Emitting Alert after A&AI Enrichment: {}", aaiEnrichedAlert); - aaiEnrichmentOutputEmitter.emit(aaiEnrichedAlert); - - // skip A&AI Enrichment of alerts with closed Loop Event Status - ABATED - } else if (closedLoopEventStatus == ClosedLoopEventStatus.ABATED) { - LOG.debug("Skipping Enrichment of Abated Alert: {}", alertMessageString); - aaiEnrichmentOutputEmitter.emit(alertMessageString); - - } else { - // unsupported closed loop event status - final String errorMessage = String.format( - "Unexpected ClosedLoopEventStatus: %s. Only ONSET and ABATED are supported." + - "Ignoring alert: %s", closedLoopEventStatus, alertMessageString); - throw new CDAPSettingsException(errorMessage, LOG, new IllegalStateException(errorMessage)); - } - } - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java deleted file mode 100644 index 1f9e9b4..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowlet.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.annotation.Output; -import co.cask.cdap.api.annotation.ProcessInput; -import co.cask.cdap.api.annotation.Property; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import co.cask.cdap.api.flow.flowlet.OutputEmitter; -import org.apache.commons.lang3.StringUtils; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementEntity; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementPersister; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.model.facade.tca.TCAVESResponse; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Date; - -/** - * Flowlet responsible to sending out abatement alerts - * - * @author Rajiv Singla . Creation Date: 9/11/2017. - */ -public class TCAVESAlertsAbatementFlowlet extends AbstractFlowlet { - - private static final Logger LOG = LoggerFactory.getLogger(TCAVESAlertsAbatementFlowlet.class); - - @Property - private final String tcaAlertsAbatementTableName; - - @Output(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_OUTPUT) - protected OutputEmitter alertsAbatementOutputEmitter; - - private ObjectMappedTable tcaAlertsAbatementTable; - - public TCAVESAlertsAbatementFlowlet(final String tcaAlertsAbatementTableName) { - this.tcaAlertsAbatementTableName = tcaAlertsAbatementTableName; - } - - @Override - public void configure() { - setName(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET); - setDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET); - } - - @Override - public void initialize(FlowletContext flowletContext) throws Exception { - super.initialize(flowletContext); - tcaAlertsAbatementTable = getContext().getDataset(tcaAlertsAbatementTableName); - } - - @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_TCA_CALCULATOR_NAME_OUTPUT) - public void determineAbatementAlerts(final ThresholdCalculatorOutput thresholdCalculatorOutput) throws IOException { - - final String cefMessage = thresholdCalculatorOutput.getCefMessage(); - final String alertMessageString = thresholdCalculatorOutput.getAlertMessage(); - final String violatedMetricsPerEventNameString = thresholdCalculatorOutput.getViolatedMetricsPerEventName(); - - // alerts must have violated metrics per event name present - if (StringUtils.isBlank(violatedMetricsPerEventNameString)) { - final String errorMessage = String.format( - "No violated metricsPerEventName found for VES Message: %s." + - "Ignored alert message: %s", cefMessage, alertMessageString); - throw new CDAPSettingsException(errorMessage, LOG, new IllegalStateException(errorMessage)); - } - - final MetricsPerEventName violatedMetricsPerEventName = - TCAUtils.readValue(violatedMetricsPerEventNameString, MetricsPerEventName.class); - final EventListener eventListener = TCAUtils.readValue(cefMessage, EventListener.class); - final TCAVESResponse tcavesResponse = TCAUtils.readValue(alertMessageString, TCAVESResponse.class); - final Threshold violatedThreshold = violatedMetricsPerEventName.getThresholds().get(0); - final ClosedLoopEventStatus closedLoopEventStatus = violatedThreshold.getClosedLoopEventStatus(); - - switch (closedLoopEventStatus) { - - case ONSET: - - LOG.debug("Saving information for ONSET event for cefMessage: {}", cefMessage); - TCAAlertsAbatementPersister.persist(eventListener, violatedMetricsPerEventName, tcavesResponse, - null, tcaAlertsAbatementTable); - LOG.debug("Emitting ONSET alert: {}", alertMessageString); - alertsAbatementOutputEmitter.emit(alertMessageString); - break; - - case ABATED: - - LOG.debug("Looking up previous sent alert for abated threshold: {}", violatedThreshold); - final TCAAlertsAbatementEntity previousAlertsAbatementEntry = - TCAAlertsAbatementPersister.lookUpByKey(eventListener, violatedMetricsPerEventName, - tcaAlertsAbatementTable); - - if (previousAlertsAbatementEntry != null) { - - LOG.debug("Found previous AlertsAbatementEntity: {}", previousAlertsAbatementEntry); - - final String abatementSentTS = previousAlertsAbatementEntry.getAbatementSentTS(); - if (abatementSentTS != null) { - LOG.debug("Abatement alert was already sent at timestamp: {}. " + - "Skip resending this abatement alert again", abatementSentTS); - } else { - - final long newAbatementSentTS = new Date().getTime(); - LOG.debug( - "No abatement alert was sent before." + - "Sending abatement alert:{} for the first time at:{}", - alertMessageString, newAbatementSentTS); - - // save new Abatement alert sent timestamp in table - TCAAlertsAbatementPersister.persist(eventListener, violatedMetricsPerEventName, tcavesResponse, - Long.toString(newAbatementSentTS), tcaAlertsAbatementTable); - - // Set request id to be same as previous ONSET event request ID - tcavesResponse.setRequestID(previousAlertsAbatementEntry.getRequestId()); - final String abatedAlertString = TCAUtils.writeValueAsString(tcavesResponse); - - LOG.info("Emitting ABATED alert: {}", abatedAlertString); - alertsAbatementOutputEmitter.emit(abatedAlertString); - - } - - } else { - LOG.info("No previous ONSET alert was found for this ABATED alert: {}.Skip sending abated alert.", - alertMessageString); - } - - break; - - default: - - final String errorMessage = String.format( - "Unexpected ClosedLoopEventStatus: %s. Only ONSET and ABATED are supported." + - "Ignoring alert: %s", closedLoopEventStatus, alertMessageString); - throw new CDAPSettingsException(errorMessage, LOG, new IllegalStateException(errorMessage)); - - } - - - } - -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java deleted file mode 100644 index 8f38ec2..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowlet.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.annotation.ProcessInput; -import co.cask.cdap.api.annotation.Property; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertsPersister; - -/** - * Saves TCA VES Alert Messages in a Time series Table - * - * @author Rajiv Singla . Creation Date: 11/15/2016. - */ -public class TCAVESAlertsSinkFlowlet extends AbstractFlowlet { - - @Property - private final String tcaVESAlertsTableName; - - private ObjectMappedTable tcaVESAlertsTable; - - public TCAVESAlertsSinkFlowlet(String tcaVESAlertsTableName) { - this.tcaVESAlertsTableName = tcaVESAlertsTableName; - } - - @Override - public void configure() { - setName(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET); - setDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_DESCRIPTION_FLOWLET); - } - - @Override - public void initialize(FlowletContext flowletContext) throws Exception { - super.initialize(flowletContext); - tcaVESAlertsTable = getContext().getDataset(tcaVESAlertsTableName); - } - - /** - * Saves messages to Alerts table - * - * @param alertMessage alert message - */ - @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_OUTPUT) - public void saveAlerts(String alertMessage) { - // Saves alert message in alerts table - TCAVESAlertsPersister.persist(alertMessage, tcaVESAlertsTable); - } - -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java deleted file mode 100644 index 06b4f18..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowlet.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.annotation.Output; -import co.cask.cdap.api.annotation.ProcessInput; -import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; -import co.cask.cdap.api.flow.flowlet.OutputEmitter; -import co.cask.cdap.api.flow.flowlet.StreamEvent; -import com.google.common.base.Charsets; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - - -/** - * TCA Message Router Flowlet emits VES Message to {@link TCAVESThresholdViolationCalculatorFlowlet} instances - * - * @author Rajiv Singla . Creation Date: 11/14/2016. - */ -public class TCAVESMessageRouterFlowlet extends AbstractFlowlet { - - /** - * Emits ves message to TCA Calculator Instances - */ - @Output(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_OUTPUT) - protected OutputEmitter vesMessageEmitter; - - - @Override - public void configure() { - setName(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET); - setDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_DESCRIPTION_FLOWLET); - } - - @ProcessInput - public void routeVESMessage(StreamEvent vesMessageStreamEvent) { - final String vesMessage = Charsets.UTF_8.decode(vesMessageStreamEvent.getBody()).toString(); - vesMessageEmitter.emit( - vesMessage, AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY, vesMessage.hashCode()); - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java deleted file mode 100644 index f895d70..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowlet.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.annotation.HashPartition; -import co.cask.cdap.api.annotation.Output; -import co.cask.cdap.api.annotation.ProcessInput; -import co.cask.cdap.api.annotation.Property; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import co.cask.cdap.api.flow.flowlet.OutputEmitter; -import co.cask.cdap.api.metrics.Metrics; -import com.fasterxml.jackson.core.JsonProcessingException; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCACalculatorMessageType; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusEntity; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; -import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFProcessorContext; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusPersister.persist; - -/** - * TCA VES Message Filter filters out messages which are not applicable for TCA as per TCA Policy - * - * @author Rajiv Singla . Creation Date: 11/3/2016. - */ -public class TCAVESThresholdViolationCalculatorFlowlet extends AbstractFlowlet { - - private static final Logger LOG = LoggerFactory.getLogger(TCAVESThresholdViolationCalculatorFlowlet.class); - - @Output(CDAPComponentsConstants.TCA_FIXED_VES_TCA_CALCULATOR_NAME_OUTPUT) - protected OutputEmitter tcaAlertOutputEmitter; - protected Metrics metrics; - private ObjectMappedTable vesMessageStatusTable; - - @Property - private final String messageStatusTableName; - private Boolean enableAlertCEFFormat; - - private TCAPolicy tcaPolicy; - - /** - * Creates an instance of TCA VES Threshold violation calculator flowlet with give message status table name - * - * @param messageStatusTableName message status table name - */ - public TCAVESThresholdViolationCalculatorFlowlet(String messageStatusTableName) { - this.messageStatusTableName = messageStatusTableName; - } - - @Override - public void configure() { - setName(CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET); - setDescription(CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_DESCRIPTION_FLOWLET); - } - - - @Override - public void initialize(FlowletContext flowletContext) throws Exception { - super.initialize(flowletContext); - - // parse Runtime Arguments to tca policy preferences - tcaPolicy = CDAPTCAUtils.getValidatedTCAPolicyPreferences(flowletContext); - // Parse runtime arguments - final TCAAppPreferences tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(flowletContext); - enableAlertCEFFormat = tcaAppPreferences.getEnableAlertCEFFormat(); - vesMessageStatusTable = getContext().getDataset(messageStatusTableName); - - } - - /** - * Filters VES Messages that violates TCA Policy - * - * @param vesMessage VES Message - * @throws JsonProcessingException if alert message cannot be parsed into JSON object - */ - @ProcessInput(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_OUTPUT) - @HashPartition(AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY) - public void filterVESMessages(String vesMessage) throws JsonProcessingException { - - TCACalculatorMessageType calculatorMessageType = TCACalculatorMessageType.INAPPLICABLE; - String alertMessage = null; - - // Step 1: Filter incoming messages - final TCACEFProcessorContext processorContext = TCAUtils.filterCEFMessage(vesMessage, tcaPolicy); - - if (processorContext.canProcessingContinue()) { - - // Step 2: Check if CEF Message violate any thresholds - final TCACEFProcessorContext processorContextWithViolations = - TCAUtils.computeThresholdViolations(processorContext); - - if (processorContextWithViolations.canProcessingContinue()) { - - // Step 3: Create Alert Message - final String tcaAppName = getContext().getApplicationSpecification().getName(); - alertMessage = - TCAUtils.createTCAAlertString(processorContextWithViolations, tcaAppName, enableAlertCEFFormat); - calculatorMessageType = TCACalculatorMessageType.NON_COMPLIANT; - LOG.debug("VES Threshold Violation Detected. An alert message is be generated. {}", alertMessage); - - metrics.count(CDAPMetricsConstants.TCA_VES_NON_COMPLIANT_MESSAGES_METRIC, 1); - - // Step 4: Emit message to Alert Sink Flowlet - final ThresholdCalculatorOutput thresholdCalculatorOutput = - new ThresholdCalculatorOutput(processorContext.getMessage(), - TCAUtils.writeValueAsString(processorContext.getTCAPolicy()), - TCAUtils.writeValueAsString(processorContextWithViolations.getMetricsPerEventName()), - alertMessage); - tcaAlertOutputEmitter.emit(thresholdCalculatorOutput); - - } else { - - calculatorMessageType = TCACalculatorMessageType.COMPLIANT; - metrics.count(CDAPMetricsConstants.TCA_VES_COMPLIANT_MESSAGES_METRIC, 1); - } - - } else { - - metrics.count(CDAPMetricsConstants.TCA_VES_INAPPLICABLE_MESSAGES_METRIC, 1); - } - - // save message to message status table - final int instanceId = getContext().getInstanceId(); - persist(processorContext, instanceId, calculatorMessageType, vesMessageStatusTable, alertMessage); - } - - -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java deleted file mode 100644 index 9d0b409..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppConfig.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.settings; - -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPBaseAppConfig; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - - -/** - * Contains CDAP App Config Settings for TCA Application - * - * @author Rajiv Singla . Creation Date: 11/2/2016. - */ -public class TCAAppConfig extends CDAPBaseAppConfig { - - - private static final long serialVersionUID = 1L; - - protected String tcaSubscriberOutputStreamName; - protected Integer thresholdCalculatorFlowletInstances; - - protected String tcaVESMessageStatusTableName; - protected Integer tcaVESMessageStatusTableTTLSeconds; - protected String tcaVESAlertsTableName; - protected Integer tcaVESAlertsTableTTLSeconds; - protected String tcaAlertsAbatementTableName; - protected Integer tcaAlertsAbatementTableTTLSeconds; - - - public TCAAppConfig() { - appName = CDAPComponentsConstants.TCA_DEFAULT_NAME_APP; - appDescription = CDAPComponentsConstants.TCA_DEFAULT_DESCRIPTION_APP; - tcaSubscriberOutputStreamName = CDAPComponentsConstants.TCA_DEFAULT_SUBSCRIBER_OUTPUT_NAME_STREAM; - thresholdCalculatorFlowletInstances = AnalyticsConstants.TCA_DEFAULT_THRESHOLD_CALCULATOR_FLOWLET_INSTANCES; - tcaVESMessageStatusTableName = CDAPComponentsConstants.TCA_DEFAULT_VES_MESSAGE_STATUS_NAME_TABLE; - tcaVESMessageStatusTableTTLSeconds = AnalyticsConstants.TCA_DEFAULT_VES_MESSAGE_STATUS_TTL_TABLE; - tcaVESAlertsTableName = CDAPComponentsConstants.TCA_DEFAULT_VES_ALERTS_NAME_TABLE; - tcaVESAlertsTableTTLSeconds = AnalyticsConstants.TCA_DEFAULT_VES_ALERTS_TTL_TABLE; - tcaAlertsAbatementTableName = CDAPComponentsConstants.TCA_DEFAULT_ALERTS_ABATEMENT_NAME_TABLE; - tcaAlertsAbatementTableTTLSeconds = AnalyticsConstants.TCA_DEFAULT_ALERTS_ABATEMENT_TTL_TABLE; - } - - public String getTcaSubscriberOutputStreamName() { - return tcaSubscriberOutputStreamName; - } - - public String getTcaVESMessageStatusTableName() { - return tcaVESMessageStatusTableName; - } - - public Integer getTcaVESMessageStatusTableTTLSeconds() { - return tcaVESMessageStatusTableTTLSeconds; - } - - public String getTcaVESAlertsTableName() { - return tcaVESAlertsTableName; - } - - public Integer getTcaVESAlertsTableTTLSeconds() { - return tcaVESAlertsTableTTLSeconds; - } - - public Integer getThresholdCalculatorFlowletInstances() { - return thresholdCalculatorFlowletInstances; - } - - public String getTcaAlertsAbatementTableName() { - return tcaAlertsAbatementTableName; - } - - public Integer getTcaAlertsAbatementTableTTLSeconds() { - return tcaAlertsAbatementTableTTLSeconds; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("appName", appName) - .add("appDescription", appDescription) - .add("tcaSubscriberOutputStreamName", tcaSubscriberOutputStreamName) - .add("thresholdCalculatorFlowletInstances", thresholdCalculatorFlowletInstances) - .add("tcaVESMessageStatusTableName", tcaVESMessageStatusTableName) - .add("tcaVESMessageStatusTableTTLSeconds", tcaVESMessageStatusTableTTLSeconds) - .add("tcaVESAlertsTableName", tcaVESAlertsTableName) - .add("tcaVESAlertsTableTTLSeconds", tcaVESAlertsTableTTLSeconds) - .add("tcaAlertsAbatementTableName", tcaAlertsAbatementTableName) - .add("tcaAlertsAbatementTableTTLSeconds", tcaAlertsAbatementTableTTLSeconds) - .toString(); - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java deleted file mode 100644 index 2dadcf2..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAAppPreferences.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.settings; - -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPAppPreferences; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - -/** - *

- * App Preferences for Analytics TCA (Threshold Crossing Alert) App - *

- * @author Rajiv Singla . Creation Date: 10/4/2016. - */ -public class TCAAppPreferences implements CDAPAppPreferences { - - private static final long serialVersionUID = 1L; - - // subscriber preferences - protected String subscriberHostName; - - protected Integer subscriberHostPort; - - protected String subscriberTopicName; - - protected String subscriberProtocol; - - protected String subscriberUserName; - - protected String subscriberUserPassword; - - protected String subscriberContentType; - - protected String subscriberConsumerId; - - protected String subscriberConsumerGroup; - - protected Integer subscriberTimeoutMS; - - protected Integer subscriberMessageLimit; - - protected Integer subscriberPollingInterval; - - // publisher preferences - protected String publisherHostName; - - protected Integer publisherHostPort; - - protected String publisherTopicName; - - protected String publisherProtocol; - - protected String publisherUserName; - - protected String publisherUserPassword; - - protected String publisherContentType; - - protected Integer publisherMaxBatchSize; - - protected Integer publisherMaxRecoveryQueueSize; - - protected Integer publisherPollingInterval; - - protected Boolean enableAlertCEFFormat; - - - // A&AI Enrichment - - protected Boolean enableAAIEnrichment; - - protected String aaiEnrichmentHost; - - protected Integer aaiEnrichmentPortNumber; - - protected String aaiEnrichmentProtocol; - - protected String aaiEnrichmentUserName; - - protected String aaiEnrichmentUserPassword; - - protected Boolean aaiEnrichmentIgnoreSSLCertificateErrors; - - protected String aaiVNFEnrichmentAPIPath; - - protected String aaiVMEnrichmentAPIPath; - - - // A&AI Enrichment Proxy - - protected String aaiEnrichmentProxyURL; - - /** - * Default constructor to setup default values for TCA App Preferences - */ - public TCAAppPreferences() { - - // subscriber defaults - subscriberPollingInterval = AnalyticsConstants.TCA_DEFAULT_SUBSCRIBER_POLLING_INTERVAL_MS; - - // publisher defaults - publisherMaxBatchSize = AnalyticsConstants.TCA_DEFAULT_PUBLISHER_MAX_BATCH_QUEUE_SIZE; - publisherMaxRecoveryQueueSize = AnalyticsConstants.TCA_DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE; - publisherPollingInterval = AnalyticsConstants.TCA_DEFAULT_PUBLISHER_POLLING_INTERVAL_MS; - - enableAlertCEFFormat = AnalyticsConstants.TCA_DEFAULT_ENABLE_CEF_FORMATTED_ALERT; - - enableAAIEnrichment = AnalyticsConstants.TCA_DEFAULT_ENABLE_AAI_ENRICHMENT; - aaiEnrichmentIgnoreSSLCertificateErrors = - AnalyticsConstants.TCA_DEFAULT_AAI_ENRICHMENT_IGNORE_SSL_CERTIFICATE_ERRORS; - aaiEnrichmentProxyURL = AnalyticsConstants.TCA_DEFAULT_AAI_ENRICHMENT_PROXY_URL; - - } - - public String getSubscriberHostName() { - return subscriberHostName; - } - - public Integer getSubscriberHostPort() { - return subscriberHostPort; - } - - public String getSubscriberTopicName() { - return subscriberTopicName; - } - - public String getSubscriberProtocol() { - return subscriberProtocol; - } - - public String getSubscriberUserName() { - return subscriberUserName; - } - - public String getSubscriberUserPassword() { - return subscriberUserPassword; - } - - public String getSubscriberContentType() { - return subscriberContentType; - } - - public String getSubscriberConsumerId() { - return subscriberConsumerId; - } - - public String getSubscriberConsumerGroup() { - return subscriberConsumerGroup; - } - - public Integer getSubscriberTimeoutMS() { - return subscriberTimeoutMS; - } - - public Integer getSubscriberMessageLimit() { - return subscriberMessageLimit; - } - - public Integer getSubscriberPollingInterval() { - return subscriberPollingInterval; - } - - public String getPublisherHostName() { - return publisherHostName; - } - - public Integer getPublisherHostPort() { - return publisherHostPort; - } - - public String getPublisherTopicName() { - return publisherTopicName; - } - - public String getPublisherProtocol() { - return publisherProtocol; - } - - public String getPublisherUserName() { - return publisherUserName; - } - - public String getPublisherUserPassword() { - return publisherUserPassword; - } - - public String getPublisherContentType() { - return publisherContentType; - } - - public Integer getPublisherMaxBatchSize() { - return publisherMaxBatchSize; - } - - public Integer getPublisherMaxRecoveryQueueSize() { - return publisherMaxRecoveryQueueSize; - } - - public Integer getPublisherPollingInterval() { - return publisherPollingInterval; - } - - public Boolean getEnableAlertCEFFormat() { - return enableAlertCEFFormat; - } - - - public void setSubscriberHostName(String subscriberHostName) { - this.subscriberHostName = subscriberHostName; - } - - public void setSubscriberHostPort(Integer subscriberHostPort) { - this.subscriberHostPort = subscriberHostPort; - } - - public void setSubscriberTopicName(String subscriberTopicName) { - this.subscriberTopicName = subscriberTopicName; - } - - public void setSubscriberProtocol(String subscriberProtocol) { - this.subscriberProtocol = subscriberProtocol; - } - - public void setSubscriberUserName(String subscriberUserName) { - this.subscriberUserName = subscriberUserName; - } - - public void setSubscriberUserPassword(String subscriberUserPassword) { - this.subscriberUserPassword = subscriberUserPassword; - } - - public void setPublisherHostName(String publisherHostName) { - this.publisherHostName = publisherHostName; - } - - public void setPublisherHostPort(Integer publisherHostPort) { - this.publisherHostPort = publisherHostPort; - } - - public void setPublisherTopicName(String publisherTopicName) { - this.publisherTopicName = publisherTopicName; - } - - public void setPublisherProtocol(String publisherProtocol) { - this.publisherProtocol = publisherProtocol; - } - - public void setPublisherUserName(String publisherUserName) { - this.publisherUserName = publisherUserName; - } - - public void setPublisherUserPassword(String publisherUserPassword) { - this.publisherUserPassword = publisherUserPassword; - } - - public Boolean getEnableAAIEnrichment() { - return enableAAIEnrichment; - } - - public String getAaiEnrichmentHost() { - return aaiEnrichmentHost; - } - - public Integer getAaiEnrichmentPortNumber() { - return aaiEnrichmentPortNumber; - } - - public String getAaiEnrichmentProtocol() { - return aaiEnrichmentProtocol; - } - - public String getAaiEnrichmentUserName() { - return aaiEnrichmentUserName; - } - - public String getAaiEnrichmentUserPassword() { - return aaiEnrichmentUserPassword; - } - - public Boolean getAaiEnrichmentIgnoreSSLCertificateErrors() { - return aaiEnrichmentIgnoreSSLCertificateErrors; - } - - public String getAaiVNFEnrichmentAPIPath() { - return aaiVNFEnrichmentAPIPath; - } - - public String getAaiVMEnrichmentAPIPath() { - return aaiVMEnrichmentAPIPath; - } - - public String getAaiEnrichmentProxyURL() { - return aaiEnrichmentProxyURL; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("subscriberHostName", subscriberHostName) - .add("subscriberHostPort", subscriberHostPort) - .add("subscriberTopicName", subscriberTopicName) - .add("subscriberProtocol", subscriberProtocol) - .add("subscriberUserName", subscriberUserName) - .add("subscriberContentType", subscriberContentType) - .add("subscriberConsumerId", subscriberConsumerId) - .add("subscriberConsumerGroup", subscriberConsumerGroup) - .add("subscriberTimeoutMS", subscriberTimeoutMS) - .add("subscriberMessageLimit", subscriberMessageLimit) - .add("subscriberPollingInterval", subscriberPollingInterval) - .add("publisherHostName", publisherHostName) - .add("publisherHostPort", publisherHostPort) - .add("publisherTopicName", publisherTopicName) - .add("publisherProtocol", publisherProtocol) - .add("publisherUserName", publisherUserName) - .add("publisherContentType", publisherContentType) - .add("publisherMaxBatchSize", publisherMaxBatchSize) - .add("publisherMaxRecoveryQueueSize", publisherMaxRecoveryQueueSize) - .add("publisherPollingInterval", publisherPollingInterval) - .add("enableAlertCEFFormat", enableAlertCEFFormat) - .add("enableAAIEnrichment", enableAAIEnrichment) - .add("aaiEnrichmentHost", aaiEnrichmentHost) - .add("aaiEnrichmentPortNumber", aaiEnrichmentPortNumber) - .add("aaiEnrichmentProtocol", aaiEnrichmentProtocol) - .add("aaiEnrichmentUserName", aaiEnrichmentUserName) - .add("aaiEnrichmentIgnoreSSLCertificateErrors", aaiEnrichmentIgnoreSSLCertificateErrors) - .add("aaiVNFEnrichmentAPIPath", aaiVNFEnrichmentAPIPath) - .add("aaiVMEnrichmentAPIPath", aaiVMEnrichmentAPIPath) - .add("aaiEnrichmentProxyEnabled", aaiEnrichmentProxyURL == null ? "false" : "true") - .toString(); - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java deleted file mode 100644 index 1a7a7ea..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCAPolicyPreferences.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.settings; - -import org.openecomp.dcae.apod.analytics.cdap.common.settings.CDAPAppPreferences; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; - -/** - * A wrapper over {@link TCAPolicy} to act as app Preferences as TCA Policy is passed - * by controller as runtime arguments from CDAP app preferences - *

- * @author Rajiv Singla . Creation Date: 11/29/2016. - */ -public class TCAPolicyPreferences extends TCAPolicy implements CDAPAppPreferences { - - private static final long serialVersionUID = 1L; - -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java deleted file mode 100644 index 9993a2e..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapper.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.utils; - -import com.google.common.base.Function; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; - -import javax.annotation.Nonnull; - -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; - - -/** - * Function which translates {@link TCAAppPreferences} to {@link DMaaPMRPublisherConfig} - *

- * @author Rajiv Singla . Creation Date: 11/17/2016. - */ -public class AppPreferencesToPublisherConfigMapper implements Function { - - /** - * Factory method to convert {@link TCAAppPreferences} to {@link DMaaPMRPublisherConfig} object - * - * @param tcaAppPreferences tca App Preferences - * - * @return publisher config object - */ - public static DMaaPMRPublisherConfig map(final TCAAppPreferences tcaAppPreferences) { - return new AppPreferencesToPublisherConfigMapper().apply(tcaAppPreferences); - } - - /** - * Implementation to convert {@link TCAAppPreferences} to {@link DMaaPMRPublisherConfig} object - * - * @param tcaAppPreferences tca App Preferences - * - * @return publisher config object - */ - @Nonnull - @Override - public DMaaPMRPublisherConfig apply(@Nonnull TCAAppPreferences tcaAppPreferences) { - - // Create a new publisher settings builder - final DMaaPMRPublisherConfig.Builder publisherConfigBuilder = new DMaaPMRPublisherConfig.Builder( - tcaAppPreferences.getPublisherHostName(), tcaAppPreferences.getPublisherTopicName()); - - // Setup up any optional publisher parameters if they are present - final Integer publisherHostPort = tcaAppPreferences.getPublisherHostPort(); - if (publisherHostPort != null) { - publisherConfigBuilder.setPortNumber(publisherHostPort); - } - final String publisherProtocol = tcaAppPreferences.getPublisherProtocol(); - if (isPresent(publisherProtocol)) { - publisherConfigBuilder.setProtocol(publisherProtocol); - } - final String publisherUserName = tcaAppPreferences.getPublisherUserName(); - if (isPresent(publisherUserName)) { - publisherConfigBuilder.setUserName(publisherUserName); - } - final String publisherUserPassword = tcaAppPreferences.getPublisherUserPassword(); - if (isPresent(publisherUserPassword)) { - publisherConfigBuilder.setUserPassword(publisherUserPassword); - } - final String publisherContentType = tcaAppPreferences.getPublisherContentType(); - if (isPresent(publisherContentType)) { - publisherConfigBuilder.setContentType(publisherContentType); - } - final Integer publisherMaxBatchSize = tcaAppPreferences.getPublisherMaxBatchSize(); - if (publisherMaxBatchSize != null) { - publisherConfigBuilder.setMaxBatchSize(publisherMaxBatchSize); - } - final Integer publisherMaxRecoveryQueueSize = tcaAppPreferences.getPublisherMaxRecoveryQueueSize(); - if (publisherMaxRecoveryQueueSize != null) { - publisherConfigBuilder.setMaxRecoveryQueueSize(publisherMaxRecoveryQueueSize); - } - - return publisherConfigBuilder.build(); - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java deleted file mode 100644 index d7447f0..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapper.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.utils; - -import com.google.common.base.Function; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; - -import javax.annotation.Nonnull; - -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isPresent; - - -/** - * Function which translates {@link TCAAppPreferences} to {@link DMaaPMRSubscriberConfig} - * - * @author Rajiv Singla . Creation Date: 11/17/2016. - */ -public class AppPreferencesToSubscriberConfigMapper implements Function { - - /** - * Factory Method to converts {@link TCAAppPreferences} to {@link DMaaPMRSubscriberConfig} object - * - * @param tcaAppPreferences tca app preferences - * @return DMaaP Subscriber Config - */ - public static DMaaPMRSubscriberConfig map(final TCAAppPreferences tcaAppPreferences) { - return new AppPreferencesToSubscriberConfigMapper().apply(tcaAppPreferences); - } - - /** - * Implementation to convert {@link TCAAppPreferences} to {@link DMaaPMRSubscriberConfig} object - * - * @param tcaAppPreferences tca app preferences - * - * @return DMaaP Subscriber Config - */ - @Nonnull - @Override - public DMaaPMRSubscriberConfig apply(@Nonnull TCAAppPreferences tcaAppPreferences) { - - // Create a new subscriber settings builder - final DMaaPMRSubscriberConfig.Builder subscriberConfigBuilder = new DMaaPMRSubscriberConfig.Builder( - tcaAppPreferences.getSubscriberHostName(), tcaAppPreferences.getSubscriberTopicName()); - - // Setup up any optional subscriber parameters if they are present - final Integer subscriberHostPortNumber = tcaAppPreferences.getSubscriberHostPort(); - if (subscriberHostPortNumber != null) { - subscriberConfigBuilder.setPortNumber(subscriberHostPortNumber); - } - - final String subscriberProtocol = tcaAppPreferences.getSubscriberProtocol(); - if (isPresent(subscriberProtocol)) { - subscriberConfigBuilder.setProtocol(subscriberProtocol); - } - - final String subscriberUserName = tcaAppPreferences.getSubscriberUserName(); - if (isPresent(subscriberUserName)) { - subscriberConfigBuilder.setUserName(subscriberUserName); - } - - final String subscriberUserPassword = tcaAppPreferences.getSubscriberUserPassword(); - if (isPresent(subscriberUserPassword)) { - subscriberConfigBuilder.setUserPassword(subscriberUserPassword); - } - - final String subscriberContentType = tcaAppPreferences.getSubscriberContentType(); - if (isPresent(subscriberContentType)) { - subscriberConfigBuilder.setContentType(subscriberContentType); - } - - final String subscriberConsumerId = tcaAppPreferences.getSubscriberConsumerId(); - if (isPresent(subscriberConsumerId)) { - subscriberConfigBuilder.setConsumerId(subscriberConsumerId); - } - - final String subscriberConsumerGroup = tcaAppPreferences.getSubscriberConsumerGroup(); - if (isPresent(subscriberConsumerGroup)) { - subscriberConfigBuilder.setConsumerGroup(subscriberConsumerGroup); - } - - final Integer subscriberTimeoutMS = tcaAppPreferences.getSubscriberTimeoutMS(); - if (subscriberTimeoutMS != null) { - subscriberConfigBuilder.setTimeoutMS(subscriberTimeoutMS); - } - final Integer subscriberMessageLimit = tcaAppPreferences.getSubscriberMessageLimit(); - if (subscriberMessageLimit != null) { - subscriberConfigBuilder.setMessageLimit(subscriberMessageLimit); - } - - // return Subscriber settings - return subscriberConfigBuilder.build(); - - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java deleted file mode 100644 index 8a16f0f..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtils.java +++ /dev/null @@ -1,321 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.utils; - -import co.cask.cdap.api.RuntimeContext; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import org.apache.commons.lang3.StringUtils; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig; -import org.openecomp.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfigBuilder; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.validator.TCAPolicyPreferencesValidator; -import org.openecomp.dcae.apod.analytics.cdap.tca.validator.TCAPreferencesValidator; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.model.config.tca.DMAAPInfo; -import org.openecomp.dcae.apod.analytics.model.config.tca.TCAControllerAppConfig; -import org.openecomp.dcae.apod.analytics.model.config.tca.TCAHandleIn; -import org.openecomp.dcae.apod.analytics.model.config.tca.TCAHandleOut; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import static com.google.common.collect.Lists.newArrayList; -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.validateSettings; -import static org.openecomp.dcae.apod.analytics.common.AnalyticsConstants.TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH; - -/** - * Utility Helper methods for CDAP TCA sub module. - * - *

- * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public abstract class CDAPTCAUtils extends TCAUtils { - - private static final Logger LOG = LoggerFactory.getLogger(CDAPTCAUtils.class); - - /** - * Function that extracts alert message string from {@link TCAVESAlertEntity} - */ - public static final Function MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION = - new Function() { - @Override - public String apply(TCAVESAlertEntity alertEntity) { - return alertEntity == null ? null : alertEntity.getAlertMessage(); - } - }; - - - /** - * Parses and validates Runtime Arguments to {@link TCAAppPreferences} object - * - * @param runtimeContext Runtime Context - * - * @return validated runtime arguments as {@link TCAAppPreferences} object - */ - public static TCAAppPreferences getValidatedTCAAppPreferences(final RuntimeContext runtimeContext) { - // Parse runtime arguments - final Map runtimeArguments = runtimeContext.getRuntimeArguments(); - final TCAAppPreferences tcaAppPreferences = - ANALYTICS_MODEL_OBJECT_MAPPER.convertValue(runtimeArguments, TCAAppPreferences.class); - - final String appConfigString = runtimeContext.getApplicationSpecification().getConfiguration(); - - // populate DMaaP Information from App Config String - populateDMaaPInfoFromAppConfiguration(appConfigString, tcaAppPreferences); - - // Validate runtime arguments - validateSettings(tcaAppPreferences, new TCAPreferencesValidator()); - - return tcaAppPreferences; - } - - /** - * Creates an A&AI Http Client config from give {@link TCAAppPreferences} - * - * @param tcaAppPreferences TCA App Preferences - * - * @return A&AI Http Client config - */ - public static AAIHttpClientConfig createAAIEnrichmentClientConfig(final TCAAppPreferences tcaAppPreferences) { - final String aaiEnrichmentProxyURLString = tcaAppPreferences.getAaiEnrichmentProxyURL(); - URL aaiEnrichmentProxyURL = null; - if (StringUtils.isNotBlank(aaiEnrichmentProxyURLString)) { - aaiEnrichmentProxyURL = parseURL(aaiEnrichmentProxyURLString); - } - - return new AAIHttpClientConfigBuilder(tcaAppPreferences.getAaiEnrichmentHost()) - .setAaiProtocol(tcaAppPreferences.getAaiEnrichmentProtocol()) - .setAaiHostPortNumber(tcaAppPreferences.getAaiEnrichmentPortNumber()) - .setAaiUserName(tcaAppPreferences.getAaiEnrichmentUserName()) - .setAaiUserPassword(tcaAppPreferences.getAaiEnrichmentUserPassword()) - .setAaiProxyURL(aaiEnrichmentProxyURL) - .setAaiIgnoreSSLCertificateErrors(tcaAppPreferences.getAaiEnrichmentIgnoreSSLCertificateErrors()) - .build(); - } - - /** - * Populated App Preferences DMaaP Information from Application Config String - * - * @param appConfigString CDAP Application config String - * @param tcaAppPreferences TCA App Preferences - */ - private static void populateDMaaPInfoFromAppConfiguration(final String appConfigString, - final TCAAppPreferences tcaAppPreferences) { - - if (null != tcaAppPreferences.getSubscriberHostName() || null != tcaAppPreferences.getPublisherHostName()) { - LOG.info("DMaaP Information is set from runtime preferences. Skipping getting DMaaP info from App Config"); - return; - } - - LOG.info("Fetching DMaaP information from App Configuration String: {}", appConfigString); - - try { - final TCAControllerAppConfig tcaControllerAppConfig = - readValue(appConfigString, TCAControllerAppConfig.class); - - // Parse Subscriber DMaaP information from App Config String - if (tcaControllerAppConfig.getStreamsSubscribes() != null && - tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn() != null && - tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo() != null) { - - final DMAAPInfo subscriberDmaapInfo = - tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo(); - LOG.debug("App Config Subscriber Host URL: {}", subscriberDmaapInfo.getTopicUrl()); - final URL subscriberUrl = parseURL(subscriberDmaapInfo.getTopicUrl()); - tcaAppPreferences.setSubscriberProtocol(subscriberUrl.getProtocol()); - tcaAppPreferences.setSubscriberHostName(subscriberUrl.getHost()); - final int subscriberUrlPort = subscriberUrl.getPort() != -1 ? - subscriberUrl.getPort() : getDefaultDMaaPPort(subscriberUrl.getProtocol()); - tcaAppPreferences.setSubscriberHostPort(subscriberUrlPort); - tcaAppPreferences.setSubscriberTopicName(subscriberUrl.getPath().substring(8)); - - final TCAHandleIn tcaHandleIn = tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn(); - tcaAppPreferences.setSubscriberUserName(tcaHandleIn.getAafUserName()); - tcaAppPreferences.setSubscriberUserPassword(tcaHandleIn.getAafPassword()); - } else { - LOG.warn("Unable to populate Subscriber DMaaP Information from App Config String: {}", appConfigString); - } - - - // Parse Publisher DMaaP information from App Config String - if (tcaControllerAppConfig.getStreamsPublishes() != null && - tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut() != null && - tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo() != null) { - - final DMAAPInfo publisherDmaapInfo = - tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo(); - LOG.debug("App Config Publisher Host URL: {}", publisherDmaapInfo.getTopicUrl()); - final URL publisherUrl = parseURL(publisherDmaapInfo.getTopicUrl()); - tcaAppPreferences.setPublisherProtocol(publisherUrl.getProtocol()); - tcaAppPreferences.setPublisherHostName(publisherUrl.getHost()); - final int publisherUrlPort = publisherUrl.getPort() != -1 ? - publisherUrl.getPort() : getDefaultDMaaPPort(publisherUrl.getProtocol()); - tcaAppPreferences.setPublisherHostPort(publisherUrlPort); - tcaAppPreferences.setPublisherTopicName(publisherUrl.getPath().substring(8)); - - final TCAHandleOut tcaHandleOut = tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut(); - tcaAppPreferences.setPublisherUserName(tcaHandleOut.getAafUserName()); - tcaAppPreferences.setPublisherUserPassword(tcaHandleOut.getAafPassword()); - } else { - LOG.warn("Unable to populate Publisher DMaaP Information from App Config String: {}", appConfigString); - } - - - } catch (IOException e) { - throw new CDAPSettingsException( - "Unable to parse App Config to Json Object.Invalid App Config String: " + appConfigString, LOG, e); - } - } - - /** - * Parses provided DMaaP MR URL string to {@link URL} object - * - * @param urlString url string - * - * @return url object - */ - private static URL parseURL(final String urlString) { - try { - return new URL(urlString); - } catch (MalformedURLException e) { - final String errorMessage = String.format("Invalid URL format: %s", urlString); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - - /** - * Sets up default DMaaP Port if not provided with DMaaP URL - * - * @param protocol protocol e.g. http or https - * - * @return default DMaaP MR port number - */ - private static int getDefaultDMaaPPort(final String protocol) { - if ("http".equals(protocol)) { - return 3904; - } else if ("https".equals(protocol)) { - return 3905; - } else { - return 80; - } - } - - - /** - * Extracts alert message strings from {@link TCAVESAlertEntity} - * - * @param alertEntities collection of alert entities - * - * @return List of alert message strings - */ - public static List extractAlertFromAlertEntities(final Collection alertEntities) { - return Lists.transform(newArrayList(alertEntities), MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION); - } - - - /** - * Converts Runtime Arguments to {@link TCAPolicyPreferences} object - * - * @param runtimeContext CDAP Runtime Arguments - * - * @return TCA Policy Preferences - */ - public static TCAPolicy getValidatedTCAPolicyPreferences(final RuntimeContext runtimeContext) { - - final Map runtimeArguments = runtimeContext.getRuntimeArguments(); - final TreeMap sortedRuntimeArguments = new TreeMap<>(runtimeArguments); - - LOG.debug("Printing all Received Runtime Arguments:"); - for (Map.Entry runtimeArgsEntry : sortedRuntimeArguments.entrySet()) { - LOG.debug("{}:{}", runtimeArgsEntry.getKey(), runtimeArgsEntry.getValue()); - } - - TCAPolicyPreferences tcaPolicyPreferences = new TCAPolicyPreferences(); - - final String tcaPolicyJsonString = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_JSON_KEY); - - if (StringUtils.isNotBlank(tcaPolicyJsonString)) { - - LOG.info("TcaPolicy will be set from input argument name: {} as JSON String with value: {}", - AnalyticsConstants.TCA_POLICY_JSON_KEY, tcaPolicyJsonString); - - // initialize unquotedTCAPolicy - String unquotedTCAPolicy = tcaPolicyJsonString.trim(); - - //remove starting and ending quote from passed tca policy Json string if present - if (tcaPolicyJsonString.trim().startsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER) && - tcaPolicyJsonString.trim().endsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER)) { - unquotedTCAPolicy = tcaPolicyJsonString.trim().substring(1, tcaPolicyJsonString.trim().length() - 1); - } - - try { - tcaPolicyPreferences = readValue(unquotedTCAPolicy , TCAPolicyPreferences.class); - } catch (IOException e) { - throw new CDAPSettingsException( - "Input tca_policy string format is not correct. tca_policy: " + tcaPolicyJsonString, LOG, e); - } - - } else { // classical controller is being used. Validate preferences as received from classical controller - - LOG.info("TcaPolicy is being parsed as key value pair from classical controller"); - - // extract TCA Policy Domain from Runtime Arguments - final String policyDomain = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_DOMAIN_PATH); - - // create new TCA Policy object - tcaPolicyPreferences.setDomain(policyDomain); - - // filter out other non relevant fields which are not related to tca policy - final Map tcaPolicyMap = filterMapByKeyNamePrefix(sortedRuntimeArguments, - TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH); - - // determine functional Roles - final Map> functionalRolesMap = - extractSubTree(tcaPolicyMap, 2, 3, AnalyticsConstants.TCA_POLICY_DELIMITER); - - // create metrics per functional role list - tcaPolicyPreferences.setMetricsPerEventName( - createTCAPolicyMetricsPerEventNameList(functionalRolesMap)); - - } - - // validate tca Policy Preferences - validateSettings(tcaPolicyPreferences, new TCAPolicyPreferencesValidator()); - - LOG.info("Printing Effective TCA Policy: {}", tcaPolicyPreferences); - - return tcaPolicyPreferences; - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java deleted file mode 100644 index fe44c1a..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidator.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.validator; - -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; - -/** - *

- * TCA App Config Validator validates any TCA App Config parameter values - *

- * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public class TCAAppConfigValidator implements CDAPAppSettingsValidator> { - - private static final long serialVersionUID = 1L; - - @Override - public GenericValidationResponse validateAppSettings(TCAAppConfig tcaAppConfig) { - - final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); - - if (isEmpty(tcaAppConfig.getTcaSubscriberOutputStreamName())) { - validationResponse.addErrorMessage("tcaSubscriberOutputStreamName", - "tcaSubscriberOutputStreamName must be present"); - } - - if (isEmpty(tcaAppConfig.getTcaVESMessageStatusTableName())) { - validationResponse.addErrorMessage("tcaVESMessageStatusTableName", - "tcaVESMessageStatusTableName must be present"); - } - if (isEmpty(tcaAppConfig.getTcaVESAlertsTableName())) { - validationResponse.addErrorMessage("tcaVESAlertsTableName", - "tcaVESAlertsTableName must be present"); - } - - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java deleted file mode 100644 index 7b5c9cf..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidator.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.validator; - -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventSeverity; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ControlLoopSchemaType; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Direction; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; - -import java.util.List; - -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; - -/** - * Validates TCA Policy Preferences - *

- * - * @author Rajiv Singla . Creation Date: 11/29/2016. - */ -public class TCAPolicyPreferencesValidator implements CDAPAppSettingsValidator> { - - private static final long serialVersionUID = 1L; - - @Override - public GenericValidationResponse validateAppSettings( - final TCAPolicyPreferences tcaPolicyPreferences) { - - final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); - - // validate TCA Policy must domain present - final String domain = tcaPolicyPreferences.getDomain(); - if (isEmpty(domain)) { - validationResponse.addErrorMessage("domain", "TCA Policy must have only one domain present"); - } - - // validate TCA Policy must have at least one event name - final List policyEventNames = TCAUtils.getPolicyEventNames(tcaPolicyPreferences); - if (policyEventNames.isEmpty()) { - validationResponse.addErrorMessage("metricsPerEventNames", - "TCA Policy must have at least one or more event names"); - } - - final List metricsPerEventNames = - tcaPolicyPreferences.getMetricsPerEventName(); - - // validate Metrics Per Event Name - for (MetricsPerEventName metricsPerEventName : metricsPerEventNames) { - - // event name must be present - final String eventName = metricsPerEventName.getEventName(); - if (isEmpty(eventName)) { - validationResponse.addErrorMessage("eventName", - "TCA Policy eventName is not present for metricsPerEventName:" + metricsPerEventName); - } - - // control Loop Schema type must be present - final ControlLoopSchemaType controlLoopSchemaType = metricsPerEventName.getControlLoopSchemaType(); - if (controlLoopSchemaType == null) { - validationResponse.addErrorMessage("controlLoopEventType", - "TCA Policy controlLoopSchemaType is not present for metricsPerEventName:" - + metricsPerEventName); - } - - // must have at least 1 threshold defined - if (metricsPerEventName.getThresholds() == null || metricsPerEventName.getThresholds().isEmpty()) { - validationResponse.addErrorMessage("thresholds", - "TCA Policy event Name must have at least one threshold. " + - "Event Name causing this validation error:" + metricsPerEventName); - } else { - // validate each threshold must have non null - fieldPath, thresholdValue, direction and severity - final List eventNameThresholds = metricsPerEventName.getThresholds(); - for (Threshold eventNameThreshold : eventNameThresholds) { - final String fieldPath = eventNameThreshold.getFieldPath(); - final Long thresholdValue = eventNameThreshold.getThresholdValue(); - final Direction direction = eventNameThreshold.getDirection(); - final EventSeverity severity = eventNameThreshold.getSeverity(); - final ClosedLoopEventStatus closedLoopEventStatus = eventNameThreshold.getClosedLoopEventStatus(); - if (isEmpty(fieldPath) || thresholdValue == null || direction == null || severity == null || - closedLoopEventStatus == null) { - validationResponse.addErrorMessage("threshold", - "TCA Policy threshold must have fieldPath,thresholdValue,direction, " + - "closedLoopEventStatus and severity defined." + - "Threshold causing this validation error:" + eventNameThreshold); - } - } - } - } - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java deleted file mode 100644 index 498ca85..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidator.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.validator; - -import org.openecomp.dcae.apod.analytics.cdap.common.validation.CDAPAppSettingsValidator; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.openecomp.dcae.apod.analytics.cdap.common.utils.ValidationUtils.isEmpty; - -/** - * - * @author Rajiv Singla . Creation Date: 11/3/2016. - */ -public class TCAPreferencesValidator implements CDAPAppSettingsValidator> { - - private static final long serialVersionUID = 1L; - - @Override - public GenericValidationResponse validateAppSettings(TCAAppPreferences appPreferences) { - - final GenericValidationResponse validationResponse = new GenericValidationResponse<>(); - - // subscriber validations - final String subscriberHostName = appPreferences.getSubscriberHostName(); - if (isEmpty(subscriberHostName)) { - validationResponse.addErrorMessage("subscriberHostName", "Subscriber host name must be present"); - } - final String subscriberTopicName = appPreferences.getSubscriberTopicName(); - if (isEmpty(subscriberTopicName)) { - validationResponse.addErrorMessage("subscriberTopicName", "Subscriber topic name must be present"); - } - - // publisher validations - final String publisherHostName = appPreferences.getPublisherHostName(); - if (isEmpty(publisherHostName)) { - validationResponse.addErrorMessage("publisherHostName", "Publisher host name must be present"); - } - final String publisherTopicName = appPreferences.getPublisherTopicName(); - if (isEmpty(publisherTopicName)) { - validationResponse.addErrorMessage("publisherTopicName", "Publisher topic name must be present"); - } - - final Boolean enableAAIEnrichment = appPreferences.getEnableAAIEnrichment(); - - // if aai enrichment is enabled then do some aai validations - if (enableAAIEnrichment) { - final String aaiEnrichmentHost = appPreferences.getAaiEnrichmentHost(); - if (isEmpty(aaiEnrichmentHost)) { - validationResponse.addErrorMessage("aaiEnrichmentHost", "AAI Enrichment Host must be present"); - } - final String aaiVMEnrichmentAPIPath = appPreferences.getAaiVMEnrichmentAPIPath(); - if (isEmpty(aaiVMEnrichmentAPIPath)) { - validationResponse.addErrorMessage("aaiVMEnrichmentAPIPath", "AAI VM Enrichment path must be present"); - } - final String aaiVNFEnrichmentAPIPath = appPreferences.getAaiVNFEnrichmentAPIPath(); - if (isEmpty(aaiVNFEnrichmentAPIPath)) { - validationResponse.addErrorMessage("aaiVNFEnrichmentAPIPath", "AAI VNF Enrichment path must be " + - "present"); - } - } - - return validationResponse; - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java deleted file mode 100644 index 348f392..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorker.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.worker.AbstractWorker; -import com.google.common.base.Preconditions; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.atomic.AtomicBoolean; - -import static java.lang.String.format; - -/** - * Base logic for DMaaP Workers which uses scheduler to poll DMaaP MR topics at frequent intervals - *

- * @author Rajiv Singla . Creation Date: 12/19/2016. - */ -public abstract class BaseTCADMaaPMRWorker extends AbstractWorker { - - private static final Logger LOG = LoggerFactory.getLogger(BaseTCADMaaPMRWorker.class); - - /** - * Quartz Scheduler - */ - protected Scheduler scheduler; - /** - * Determines if scheduler is shutdown - */ - protected AtomicBoolean isSchedulerShutdown; - - - @Override - public void run() { - - Preconditions.checkNotNull(scheduler, "Scheduler must not be null"); - String schedulerName = ""; - - // Start scheduler - try { - schedulerName = scheduler.getSchedulerName(); - scheduler.start(); - isSchedulerShutdown.getAndSet(false); - - } catch (SchedulerException e) { - final String errorMessage = - format("Error while starting TCA DMaaP MR scheduler name: %s, error: %s", schedulerName, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - LOG.info("Successfully started DMaaP MR Scheduler: {}", schedulerName); - - // indefinite loop which wakes up and confirms scheduler is indeed running - while (!isSchedulerShutdown.get()) { - try { - - Thread.sleep(AnalyticsConstants.TCA_DEFAULT_WORKER_SHUTDOWN_CHECK_INTERVAL_MS); - - } catch (InterruptedException e) { - - final String errorMessage = - format("Error while checking TCA DMaaP MR Scheduler worker status name: %s, error: %s", - schedulerName, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - - LOG.info("Finished execution of TCA DMaaP MR worker thread: {}", schedulerName); - - } - - @Override - public void stop() { - - Preconditions.checkNotNull(scheduler, "Scheduler must not be null"); - String schedulerName = ""; - - // Stop Scheduler - try { - schedulerName = scheduler.getSchedulerName(); - LOG.info("Shutting TCA DMaaP MR Scheduler: {}", schedulerName); - scheduler.shutdown(); - isSchedulerShutdown.getAndSet(true); - - } catch (SchedulerException e) { - - final String errorMessage = - format("Error while shutting down TCA DMaaP MR Scheduler: name: %s, error: %s", schedulerName, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - - -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java deleted file mode 100644 index 7c8e3c6..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJob.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.TxRunnable; -import co.cask.cdap.api.common.Bytes; -import co.cask.cdap.api.data.DatasetContext; -import co.cask.cdap.api.dataset.lib.CloseableIterator; -import co.cask.cdap.api.dataset.lib.KeyValue; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.metrics.Metrics; -import co.cask.cdap.api.worker.WorkerContext; -import com.google.common.base.Joiner; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.apache.tephra.TransactionFailureException; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertsPersister; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.quartz.DisallowConcurrentExecution; -import org.quartz.Job; -import org.quartz.JobDataMap; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.quartz.PersistJobDataAfterExecution; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.openecomp.dcae.apod.analytics.common.AnalyticsConstants.CDAP_ALERTS_TABLE_VARIABLE_NAME; -import static org.openecomp.dcae.apod.analytics.common.AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME; -import static org.openecomp.dcae.apod.analytics.common.AnalyticsConstants.DMAAP_PUBLISHER_VARIABLE_NAME; -import static org.openecomp.dcae.apod.analytics.common.AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME; - -/** - * Quartz Job that will monitor any new alert messages in given TCA Alerts table and if any found publish them to - * DMaaP MR topic - *

- * @author Rajiv Singla . Creation Date: 11/17/2016. - */ -@DisallowConcurrentExecution -@PersistJobDataAfterExecution -@SuppressFBWarnings("SIC_INNER_SHOULD_BE_STATIC_ANON") -public class TCADMaaPMRPublisherJob implements Job { - - private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPMRPublisherJob.class); - - @Override - public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - - LOG.debug("Starting DMaaP MR Topic Publisher fetch Job. Next firing time will be: {}", - jobExecutionContext.getNextFireTime()); - - // Get Job Data Map - final JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap(); - - // Fetch all Job Params from Job Data Map - final String cdapAlertsTableName = jobDataMap.getString(CDAP_ALERTS_TABLE_VARIABLE_NAME); - final WorkerContext workerContext = (WorkerContext) jobDataMap.get(WORKER_CONTEXT_VARIABLE_NAME); - final DMaaPMRPublisher publisher = (DMaaPMRPublisher) jobDataMap.get(DMAAP_PUBLISHER_VARIABLE_NAME); - final Metrics metrics = (Metrics) jobDataMap.get(DMAAP_METRICS_VARIABLE_NAME); - - LOG.debug("Start looking for new message in Alerts Table: {}", cdapAlertsTableName); - - // Get new alerts from alerts table - final Map newAlertsMap = getNewAlertsMap(cdapAlertsTableName, workerContext); - - // If no new alerts are found - nothing to publish - if (newAlertsMap.isEmpty()) { - LOG.debug("No new alerts found in Alerts Table name: {}. Nothing to Publisher....", cdapAlertsTableName); - metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_NO_NEW_ALERTS_LOOKUP_METRIC, 1); - return; - } - - final int newAlertsCount = newAlertsMap.size(); - LOG.debug("Found new alerts in Alerts Table name: {}. No of new alerts: {}", cdapAlertsTableName, - newAlertsCount); - metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_NEW_ALERTS_METRIC, newAlertsCount); - - // Get alert message strings from alert Entities - final List newAlertsMessages = CDAPTCAUtils.extractAlertFromAlertEntities(newAlertsMap.values()); - - // Publish messages to DMaaP MR Topic - try { - - final DMaaPMRPublisherResponse publisherResponse = publisher.publish(newAlertsMessages); - - final Integer responseCode = publisherResponse.getResponseCode(); - final String responseMessage = publisherResponse.getResponseMessage(); - final int pendingMessagesCount = publisherResponse.getPendingMessagesCount(); - - LOG.debug("Publisher Response Code: {}, Publisher message: {}, Pending Messages Count: {}", responseCode, - responseMessage, pendingMessagesCount); - - if (HTTPUtils.isSuccessfulResponseCode(responseCode)) { - LOG.debug("Successfully Published alerts to DMaaP MR Topic."); - metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_SUCCESSFUL_DMAAP_RESPONSE_METRIC, 1); - } else { - LOG.warn("Unable to publish alerts to DMaaP MR Topic. Publisher will try to send it later...."); - metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_UNSUCCESSFUL_DMAAP_RESPONSE_METRIC, 1); - } - - } catch (DCAEAnalyticsRuntimeException e) { - LOG.error("Exception while publishing messages to DMaaP MR Topic: {}", e); - } finally { - // delete send message from alerts table - deleteAlertsByKey(cdapAlertsTableName, workerContext, newAlertsMap.keySet(), metrics); - } - - LOG.debug("Finished DMaaP MR Topic Publisher fetch Job."); - - } - - /** - * Gets New Messages from alerts table as Map with row keys as keys and {@link TCAVESAlertEntity} as values - * - * @param cdapAlertsTableName alerts table name - * @param workerContext worker context - * @return Map with row keys as keys and {@link TCAVESAlertEntity} as values - */ - protected Map getNewAlertsMap(final String cdapAlertsTableName, - final WorkerContext workerContext) { - final Map newAlertsMap = new LinkedHashMap<>(); - try { - workerContext.execute(new TxRunnable() { - @Override - public void run(DatasetContext context) throws Exception { - final ObjectMappedTable alertsTable = context.getDataset(cdapAlertsTableName); - final Date currentTime = new Date(); - final String rowKey = TCAVESAlertsPersister.createRowKey(currentTime); - final CloseableIterator> scan = alertsTable.scan(null, rowKey); - while (scan.hasNext()) { - final KeyValue alertEntityKeyValue = scan.next(); - newAlertsMap.put(Bytes.toString(alertEntityKeyValue.getKey()), alertEntityKeyValue.getValue()); - } - } - }); - } catch (TransactionFailureException e) { - final String errorMessage = "Transaction Error while getting new alerts from alerts table: " + e.toString(); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - return newAlertsMap; - } - - /** - * Deletes rows in Alerts table for give rowKeys - * - * @param cdapAlertsTableName CDAP Alerts Table Name - * @param workerContext Worker Context - * @param rowKeys Row Key Set - * @param metrics CDAP metrics - */ - protected void deleteAlertsByKey(final String cdapAlertsTableName, final WorkerContext workerContext, - final Set rowKeys, final Metrics metrics) { - LOG.debug("Deleting Published Alerts from alerts table with rowKeys: {}", Joiner.on(",").join(rowKeys)); - try { - workerContext.execute(new TxRunnable() { - @Override - public void run(DatasetContext context) throws Exception { - final ObjectMappedTable alertsTable = context.getDataset(cdapAlertsTableName); - for (String rowKey : rowKeys) { - alertsTable.delete(rowKey); - metrics.count(CDAPMetricsConstants.TCA_PUBLISHER_DELETED_ALERTS_METRIC, 1); - } - } - }); - } catch (TransactionFailureException e) { - final String errorMessage = - "Transaction Error while deleting published alerts in alerts table: " + e.toString(); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java deleted file mode 100644 index d21be2d..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJob.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.metrics.Metrics; -import co.cask.cdap.api.worker.WorkerContext; -import com.google.common.base.Optional; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.utils.DMaaPMRUtils; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.quartz.DisallowConcurrentExecution; -import org.quartz.Job; -import org.quartz.JobDataMap; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.quartz.PersistJobDataAfterExecution; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.List; - -import static java.lang.String.format; - -/** - * Quartz Job which polls DMaaP MR VES Collector Topic for messages and writes them to - * a given CDAP Stream - * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -@DisallowConcurrentExecution -@PersistJobDataAfterExecution -public class TCADMaaPMRSubscriberJob implements Job { - - private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPMRSubscriberJob.class); - - @Override - public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - - LOG.debug("Starting DMaaP MR Topic Subscriber fetch Job. Next firing time will be: {}", - jobExecutionContext.getNextFireTime()); - - // Get Job Data Map - final JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap(); - - // Fetch all Job Params from Job Data Map - final String cdapStreamName = jobDataMap.getString(AnalyticsConstants.CDAP_STREAM_VARIABLE_NAME); - final WorkerContext workerContext = - (WorkerContext) jobDataMap.get(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME); - final DMaaPMRSubscriber subscriber = - (DMaaPMRSubscriber) jobDataMap.get(AnalyticsConstants.DMAAP_SUBSCRIBER_VARIABLE_NAME); - final Metrics metrics = (Metrics) jobDataMap.get(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME); - - final Optional> subscriberMessagesOptional = - DMaaPMRUtils.getSubscriberMessages(subscriber, metrics); - - // Write message to CDAP Stream using Stream Writer - if (subscriberMessagesOptional.isPresent()) { - writeMessageToCDAPStream(subscriberMessagesOptional.get(), cdapStreamName, workerContext, metrics); - } - } - - - /** - * Writes given messages to CDAP Stream - * - * @param actualMessages List of messages that need to written to cdap stream - * @param cdapStreamName cdap stream name - * @param workerContext cdap worker context - * @param metrics cdap metrics - */ - private void writeMessageToCDAPStream(final List actualMessages, final String cdapStreamName, - final WorkerContext workerContext, final Metrics metrics) { - LOG.debug("Writing message to CDAP Stream: {}, Message Count: {}", cdapStreamName, actualMessages.size()); - try { - - for (String message : actualMessages) { - workerContext.write(cdapStreamName, message); - } - - } catch (IOException e) { - metrics.count(CDAPMetricsConstants.TCA_SUBSCRIBER_FAILURE_TO_WRITE_TO_STREAM_METRIC, 1); - final String errorMessage = - format("Error while DMaaP message router subscriber attempting to write to CDAP Stream: %s, " + - "Exception: %s", cdapStreamName, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - LOG.debug("DMaaP MR Subscriber successfully finished writing messages to CDAP Stream: {}, Message count: {}", - cdapStreamName, actualMessages.size()); - - } - -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java deleted file mode 100644 index 12a52f2..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMockSubscriberWorker.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.annotation.Property; -import co.cask.cdap.api.worker.AbstractWorker; -import co.cask.cdap.api.worker.WorkerContext; -import com.fasterxml.jackson.core.type.TypeReference; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import static org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils.readValue; -import static org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils.writeValueAsString; - -/** - * CDAP Worker which mocks fetching VES Messages from DMaaP MR topic. - * The mock instead of making DMaaP MR calls will actually take messages - * from file and send them to stream at subscriber polling interval - * - * TODO: To be removed before going to production - only for testing purposes - * - * @author Rajiv Singla . Creation Date: 11/4/2016. - */ -public class TCADMaaPMockSubscriberWorker extends AbstractWorker { - - private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPMockSubscriberWorker.class); - - // TODO: Remove this file before going to production - only for mocking purposes - private static final String MOCK_MESSAGE_FILE_LOCATION = "ves_mock_messages.json"; - private static final TypeReference> EVENT_LISTENER_TYPE_REFERENCE = - new TypeReference>() { - }; - - private TCAAppPreferences tcaAppPreferences; - private boolean stopSendingMessages; - @Property - private final String tcaSubscriberOutputStreamName; - - public TCADMaaPMockSubscriberWorker(final String tcaSubscriberOutputStreamName) { - this.tcaSubscriberOutputStreamName = tcaSubscriberOutputStreamName; - } - - @Override - public void configure() { - setName("MockTCASubscriberWorker"); - setDescription("Writes Mocked VES messages to CDAP Stream"); - LOG.info("Configuring Mock TCA MR DMaaP Subscriber worker with name: {}", "MockTCASubscriberWorker"); - } - - @Override - public void initialize(WorkerContext context) throws Exception { - super.initialize(context); - - final TCAAppPreferences appPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(context); - LOG.info("Initializing Mock TCA MR DMaaP Subscriber worker with preferences: {}", appPreferences); - this.tcaAppPreferences = appPreferences; - this.stopSendingMessages = false; - } - - - @Override - public void run() { - final Integer subscriberPollingInterval = tcaAppPreferences.getSubscriberPollingInterval(); - LOG.debug("Mock TCA Subscriber Polling interval: {}", subscriberPollingInterval); - - final InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream - (MOCK_MESSAGE_FILE_LOCATION); - - if (resourceAsStream == null) { - LOG.error("Unable to find file at location: {}", MOCK_MESSAGE_FILE_LOCATION); - throw new DCAEAnalyticsRuntimeException("Unable to find file", LOG, new FileNotFoundException()); - } - - - try { - List eventListeners = readValue(resourceAsStream, EVENT_LISTENER_TYPE_REFERENCE); - - final int totalMessageCount = eventListeners.size(); - LOG.debug("Mock message count to be written to cdap stream: ()", totalMessageCount); - - int i = 1; - for (EventListener eventListener : eventListeners) { - if (stopSendingMessages) { - LOG.debug("Stop sending messages......"); - break; - } - final String eventListenerString = writeValueAsString(eventListener); - LOG.debug("=======>> Writing message to cdap stream no: {} of {}", i, totalMessageCount); - getContext().write(tcaSubscriberOutputStreamName, eventListenerString); - i++; - - try { - Thread.sleep(subscriberPollingInterval); - } catch (InterruptedException e) { - LOG.error("Error while sleeping"); - throw new DCAEAnalyticsRuntimeException("Error while sleeping", LOG, e); - } - } - - LOG.debug("Finished writing mock messages to CDAP Stream"); - - } catch (IOException e) { - LOG.error("Error while parsing json file"); - throw new DCAEAnalyticsRuntimeException("Error while parsing mock json file", LOG, e); - } - - - } - - @Override - public void stop() { - stopSendingMessages = true; - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java deleted file mode 100644 index 42f8c8b..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorker.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.annotation.Property; -import co.cask.cdap.api.metrics.Metrics; -import co.cask.cdap.api.worker.WorkerContext; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.AppPreferencesToPublisherConfigMapper; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.quartz.JobDataMap; -import org.quartz.SchedulerException; -import org.quartz.impl.StdSchedulerFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.atomic.AtomicBoolean; - -import static java.lang.String.format; - -/** - * TCA DMaaP Publisher will monitor alerts table at regular intervals and publish any alerts to DMaaP MR Publishing - * Topic - *

- * @author Rajiv Singla . Creation Date: 11/16/2016. - */ -public class TCADMaaPPublisherWorker extends BaseTCADMaaPMRWorker { - - private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPPublisherWorker.class); - - private DMaaPMRPublisher publisher; - private Metrics metrics; - @Property - private final String tcaVESAlertsTableName; - - public TCADMaaPPublisherWorker(final String tcaVESAlertsTableName) { - this.tcaVESAlertsTableName = tcaVESAlertsTableName; - } - - @Override - public void configure() { - setName(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_WORKER); - setDescription(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_DESCRIPTION_WORKER); - LOG.debug("Configuring TCA MR DMaaP Publisher worker with name: {}", - CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_WORKER); - } - - - @Override - public void initialize(WorkerContext context) throws Exception { - super.initialize(context); - - // Parse runtime arguments - final TCAAppPreferences tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(context); - - LOG.info("Initializing TCA MR DMaaP Publisher worker with preferences: {}", tcaAppPreferences); - - // Map TCA App Preferences to DMaaP MR Publisher Config - final DMaaPMRPublisherConfig publisherConfig = AppPreferencesToPublisherConfigMapper.map(tcaAppPreferences); - - LOG.info("TCA DMaaP MR Publisher worker will be polling TCA Alerts Table Name: {}", tcaVESAlertsTableName); - - // Create an instance of DMaaP MR Publisher - LOG.debug("Creating an instance of DMaaP Publisher"); - publisher = DMaaPMRFactory.create().createPublisher(publisherConfig); - - // initialize a new Quartz scheduler - initializeScheduler(tcaAppPreferences, new StdSchedulerFactory()); - - // initialize scheduler state - isSchedulerShutdown = new AtomicBoolean(true); - } - - - /** - * Stop DMaaP Publisher - */ - @Override - public void stop() { - // Close Publisher - which will flush any batch messages if present in batch queue - if (publisher != null) { - try { - publisher.close(); - } catch (Exception e) { - final String errorMessage = format("Error while shutting down DMaaP MR Publisher: %s", e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - // Shut down scheduler - super.stop(); - } - - - /** - * Initializes a scheduler instance for DMaaP MR Publisher Job - * - * @throws SchedulerException SchedulerException - */ - private void initializeScheduler(final TCAAppPreferences tcaAnalyticsAppConfig, - final StdSchedulerFactory stdSchedulerFactory) throws SchedulerException { - - // Get Publisher polling interval - final Integer publisherPollingInterval = tcaAnalyticsAppConfig.getPublisherPollingInterval(); - - // Publisher Quartz Properties file - final String quartzPublisherPropertiesFileName = AnalyticsConstants.TCA_QUARTZ_PUBLISHER_PROPERTIES_FILE_NAME; - - // Create a new JobDataMap containing information required by TCA DMaaP Publisher Job - final JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put(AnalyticsConstants.CDAP_ALERTS_TABLE_VARIABLE_NAME, tcaVESAlertsTableName); - jobDataMap.put(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME, getContext()); - jobDataMap.put(AnalyticsConstants.DMAAP_PUBLISHER_VARIABLE_NAME, publisher); - jobDataMap.put(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME, metrics); - - // Create new publisher scheduler - scheduler = TCAUtils.createQuartzScheduler(publisherPollingInterval, stdSchedulerFactory, - quartzPublisherPropertiesFileName, jobDataMap, TCADMaaPMRPublisherJob.class, - AnalyticsConstants.TCA_DMAAP_PUBLISHER_QUARTZ_JOB_NAME, - AnalyticsConstants.TCA_DMAAP_PUBLISHER_QUARTZ_TRIGGER_NAME); - } -} diff --git a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java b/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java deleted file mode 100644 index d868ff4..0000000 --- a/dcae-analytics-cdap-tca/src/main/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorker.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.annotation.Property; -import co.cask.cdap.api.metrics.Metrics; -import co.cask.cdap.api.worker.WorkerContext; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.AppPreferencesToSubscriberConfigMapper; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; -import org.quartz.JobDataMap; -import org.quartz.SchedulerException; -import org.quartz.impl.StdSchedulerFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * TCA DMaaP Subscriber will read messages and post them to cdap stream at regular intervals - *

- * @author Rajiv Singla . Creation Date: 10/14/2016. - */ -public class TCADMaaPSubscriberWorker extends BaseTCADMaaPMRWorker { - - private static final Logger LOG = LoggerFactory.getLogger(TCADMaaPSubscriberWorker.class); - - private DMaaPMRSubscriber subscriber; - private Metrics metrics; - @Property - private final String tcaSubscriberOutputStreamName; - - public TCADMaaPSubscriberWorker(final String tcaSubscriberOutputStreamName) { - this.tcaSubscriberOutputStreamName = tcaSubscriberOutputStreamName; - } - - - @Override - public void configure() { - setName(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_WORKER); - setDescription(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_DESCRIPTION_WORKER); - LOG.debug("Configuring TCA MR DMaaP Subscriber worker with name: {}", - CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_WORKER); - } - - @Override - public void initialize(WorkerContext context) throws Exception { - super.initialize(context); - - // Parse runtime arguments - final TCAAppPreferences tcaAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(context); - - LOG.info("Initializing TCA MR DMaaP Subscriber worker with preferences: {}", tcaAppPreferences); - - // Map TCA App Preferences to DMaaP MR Subscriber Config - final DMaaPMRSubscriberConfig subscriberConfig = AppPreferencesToSubscriberConfigMapper.map(tcaAppPreferences); - - LOG.info("TCA DMaaP MR Subscriber worker will be writing to CDAP Stream: {}", tcaSubscriberOutputStreamName); - - // Create an instance of DMaaP MR Subscriber - LOG.debug("Creating an instance of DMaaP Subscriber"); - subscriber = DMaaPMRFactory.create().createSubscriber(subscriberConfig); - - // initialize a new Quartz scheduler - initializeScheduler(tcaAppPreferences, new StdSchedulerFactory()); - - // initialize scheduler state - isSchedulerShutdown = new AtomicBoolean(true); - } - - /** - * Initializes a scheduler instance for DMaaP MR Subscriber Job - * - * @throws SchedulerException SchedulerException - */ - private void initializeScheduler(final TCAAppPreferences tcaAppPreferences, - final StdSchedulerFactory stdSchedulerFactory) throws SchedulerException { - - // Get Subscriber polling interval - final Integer subscriberPollingInterval = tcaAppPreferences.getSubscriberPollingInterval(); - - // Subscriber Quartz Properties file - final String quartzSubscriberPropertiesFileName = AnalyticsConstants.TCA_QUARTZ_SUBSCRIBER_PROPERTIES_FILE_NAME; - - // Create a new JobDataMap containing information required by TCA DMaaP Subscriber Job - final JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put(AnalyticsConstants.CDAP_STREAM_VARIABLE_NAME, tcaSubscriberOutputStreamName); - jobDataMap.put(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME, getContext()); - jobDataMap.put(AnalyticsConstants.DMAAP_SUBSCRIBER_VARIABLE_NAME, subscriber); - jobDataMap.put(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME, metrics); - - // Create new publisher scheduler - scheduler = TCAUtils.createQuartzScheduler(subscriberPollingInterval, stdSchedulerFactory, - quartzSubscriberPropertiesFileName, jobDataMap, TCADMaaPMRSubscriberJob.class, - AnalyticsConstants.TCA_DMAAP_SUBSCRIBER_QUARTZ_JOB_NAME, - AnalyticsConstants.TCA_DMAAP_SUBSCRIBER_QUARTZ_TRIGGER_NAME); - } - - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java new file mode 100644 index 0000000..f7b5aea --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java @@ -0,0 +1,95 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.google.common.base.Suppliers; +import org.junit.BeforeClass; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; +import org.onap.dcae.apod.analytics.model.util.AnalyticsModelIOUtils; +import org.onap.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; + +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +/** + * + * @author Rajiv Singla . Creation Date: 10/25/2016. + */ +public abstract class BaseAnalyticsCDAPTCAIT extends BaseDCAEAnalyticsIT { + + protected static ObjectMapper objectMapper; + + @BeforeClass + public static void beforeClass() { + final AnalyticsModelObjectMapperSupplier analyticsModelObjectMapperSupplier = + new AnalyticsModelObjectMapperSupplier(); + objectMapper = Suppliers.memoize(analyticsModelObjectMapperSupplier).get(); + objectMapper.enable(SerializationFeature.INDENT_OUTPUT); + } + + protected static final String TCA_CONTROLLER_POLICY_FILE_LOCATION = + "data/properties/tca_controller_policy.properties"; + + // App Settings + protected static final String DCAE_ANALYTICS_TCA_TEST_APP_NAME = "dcae-tca"; + protected static final String DCAE_ANALYTICS_TCA_TEST_APP_DESC = + "DCAE Analytics Threshold Crossing Alert Application"; + + + protected static TCATestAppConfig getTCATestAppConfig() { + final TCATestAppConfig tcaTestAppConfig = new TCATestAppConfig(); + tcaTestAppConfig.setAppName(DCAE_ANALYTICS_TCA_TEST_APP_NAME); + tcaTestAppConfig.setAppDescription(DCAE_ANALYTICS_TCA_TEST_APP_DESC); + return tcaTestAppConfig; + } + + protected static TCATestAppPreferences getTCATestAppPreferences() { + final TCATestAppPreferences tcaTestAppPreferences = new TCATestAppPreferences(getTCAPolicyPreferences()); + tcaTestAppPreferences.setSubscriberPollingInterval(null); + tcaTestAppPreferences.setPublisherMaxBatchSize(null); + tcaTestAppPreferences.setPublisherMaxRecoveryQueueSize(null); + tcaTestAppPreferences.setEnableAlertCEFFormat(null); + tcaTestAppPreferences.setPublisherPollingInterval(null); + return tcaTestAppPreferences; + } + + + protected static Map getTCAPolicyPreferences() { + final Map policyPreferences = new TreeMap<>(); + final Properties policyPreferencesProps = + AnalyticsModelIOUtils.loadPropertiesFile(TCA_CONTROLLER_POLICY_FILE_LOCATION, new Properties()); + for (Map.Entry propEntry : policyPreferencesProps.entrySet()) { + policyPreferences.put(propEntry.getKey().toString(), propEntry.getValue().toString()); + } + + return policyPreferences; + } + + protected static String serializeModelToJson(Object model) throws JsonProcessingException { + return objectMapper.writeValueAsString(model); + } +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java new file mode 100644 index 0000000..eff7374 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java @@ -0,0 +1,294 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca; + +import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import co.cask.cdap.internal.flow.DefaultFlowletConfigurer; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Suppliers; +import org.junit.Assert; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; +import org.onap.dcae.apod.analytics.model.util.AnalyticsModelIOUtils; +import org.onap.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 10/25/2016. + */ +public abstract class BaseAnalyticsCDAPTCAUnitTest extends BaseDCAEAnalyticsUnitTest { + + /** + * Object mapper to be used for all TCA Json Parsing + */ + protected static final ObjectMapper ANALYTICS_MODEL_OBJECT_MAPPER = + Suppliers.memoize(new AnalyticsModelObjectMapperSupplier()).get(); + + protected static final String TCA_POLICY_JSON_FILE_LOCATION = "data/json/policy/tca_policy.json"; + protected static final String CEF_MESSAGES_JSON_FILE_LOCATION = "data/json/cef/cef_messages.json"; + protected static final String CEF_MESSAGE_JSON_FILE_LOCATION = "data/json/cef/cef_message.json"; + protected static final String CEF_MESSAGE_WITH_THRESHOLD_VIOLATION_JSON_FILE_LOCATION = + "data/json/cef/cef_message_with_threshold_violation.json"; + protected static final String TCA_APP_CONFIG_FILE_LOCATION = "data/json/config/controller_app_config.json"; + protected static final String TCA_ALERT_JSON_FILE_LOCATION = "data/json/facade/tca_ves_cef_response.json"; + + + protected static final String TCA_CONTROLLER_POLICY_FILE_LOCATION = + "data/properties/tca_controller_policy.properties"; + + protected static final String TCA_CONTROLLER_POLICY_FROM_JSON_FILE_LOCATION = + "data/properties/tca_controller_policy_from_json.properties"; + + + protected static final String TCA_TEST_APP_CONFIG_NAME = "testTCAAppName"; + protected static final String TCA_TEST_APP_CONFIG_DESCRIPTION = "testTCAAppDescription"; + protected static final String TCA_TEST_APP_CONFIG_SUBSCRIBER_OUTPUT_STREAM_NAME = + "testTcaSubscriberOutputStreamName"; + protected static final String TCA_TEST_APP_CONFIG_VES_ALERT_TABLE_NAME = "testTcaVESAlertsTableName"; + protected static final String TCA_TEST_APP_CONFIG_VES_MESSAGE_STATUS_TABLE_NAME = + "testTcaVESMessageStatusTableName"; + + + /** + * Provides TCA Policy that can be used for testing + * + * @return test TCA Policy Object + */ + protected static TCAPolicy getSampleTCAPolicy() { + return deserializeJsonFileToModel(TCA_POLICY_JSON_FILE_LOCATION, TCAPolicy.class); + } + + /** + * Provides TCA Policy that can be used for testing + * + * @return test {@link TCAPolicyPreferences} + */ + protected static TCAPolicyPreferences getSampleTCAPolicyPreferences() { + return deserializeJsonFileToModel(TCA_POLICY_JSON_FILE_LOCATION, TCAPolicyPreferences.class); + } + + /** + * Provides list containing 350 CEF messages + * + * @return CEF Test Message + * + * @throws Exception Exception + */ + protected static List getCEFMessages() throws Exception { + final String cefMessageAsString = fromStream(CEF_MESSAGES_JSON_FILE_LOCATION); + final TypeReference> eventListenerListTypeReference = + new TypeReference>() { + }; + return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(cefMessageAsString, eventListenerListTypeReference); + } + + /** + * Provides 1 valid CEF messages which does not violate Threshold as String + * + * @return CEF Test Message String + * + * @throws Exception Exception + */ + protected static String getValidCEFMessage() throws Exception { + return fromStream(CEF_MESSAGE_JSON_FILE_LOCATION); + } + + + /** + * Provides single CEF Test Message + * + * @return CEF Test Message + * + * @throws Exception Exception + */ + protected static EventListener getCEFEventListener() throws Exception { + final String cefMessageAsString = fromStream(CEF_MESSAGE_JSON_FILE_LOCATION); + return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(cefMessageAsString, EventListener.class); + } + + /** + * Deserialize given Json file location to given model class and returns it back without any validation check + * + * @param jsonFileLocation Classpath location of the json file + * @param modelClass Model Class type + * @param Json Model Type + * + * @return Json model object + */ + public static T deserializeJsonFileToModel(String jsonFileLocation, Class modelClass) { + final InputStream jsonFileInputStream = + BaseDCAEAnalyticsUnitTest.class.getClassLoader().getResourceAsStream(jsonFileLocation); + Assert.assertNotNull("Json File Location must be valid", jsonFileInputStream); + try { + return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(jsonFileInputStream, modelClass); + } catch (IOException ex) { + LOG.error("Error while doing assert Json for fileLocation: {}, modelClass: {}, Exception {}", + jsonFileLocation, modelClass, ex); + throw new RuntimeException(ex); + } finally { + try { + jsonFileInputStream.close(); + } catch (IOException e) { + LOG.error("Error while closing input stream at file location: {}", jsonFileLocation); + throw new RuntimeException(e); + } + } + } + + protected static TCATestAppConfig getTCATestAppConfig() { + final TCATestAppConfig tcaAppConfig = new TCATestAppConfig(); + tcaAppConfig.setAppName(TCA_TEST_APP_CONFIG_NAME); + tcaAppConfig.setAppDescription(TCA_TEST_APP_CONFIG_DESCRIPTION); + tcaAppConfig.setTcaSubscriberOutputStreamName(TCA_TEST_APP_CONFIG_SUBSCRIBER_OUTPUT_STREAM_NAME); + tcaAppConfig.setTcaVESAlertsTableName(TCA_TEST_APP_CONFIG_VES_ALERT_TABLE_NAME); + tcaAppConfig.setTcaVESMessageStatusTableName(TCA_TEST_APP_CONFIG_VES_MESSAGE_STATUS_TABLE_NAME); + return tcaAppConfig; + } + + /** + * Provides a test application preference for unit testing + * + * @return tca app preferences + */ + protected static TCATestAppPreferences getTCATestAppPreferences() { + final TCATestAppPreferences tcaTestAppPreferences = new TCATestAppPreferences(); + tcaTestAppPreferences.setSubscriberHostName("SUBSCRIBER_HOST_NAME"); + tcaTestAppPreferences.setSubscriberHostPortNumber(10000); + tcaTestAppPreferences.setSubscriberTopicName("SUBSCRIBER_TOPIC_NAME"); + tcaTestAppPreferences.setSubscriberUserName("SUBSCRIBER_USERNAME"); + tcaTestAppPreferences.setSubscriberUserPassword("SUBSCRIBER_PASSWORD"); + tcaTestAppPreferences.setSubscriberProtocol("https"); + tcaTestAppPreferences.setSubscriberContentType("application/json"); + tcaTestAppPreferences.setSubscriberConsumerId("SUBSCRIBER_CONSUMER_ID"); + tcaTestAppPreferences.setSubscriberConsumerGroup("SUBSCRIBER_CONSUMER_GROUP_NAME"); + tcaTestAppPreferences.setSubscriberTimeoutMS(10); + tcaTestAppPreferences.setSubscriberMessageLimit(100); + tcaTestAppPreferences.setSubscriberPollingInterval(1000); + + tcaTestAppPreferences.setPublisherHostName("PUBLISHER_HOST_NAME"); + tcaTestAppPreferences.setPublisherHostPort(1234); + tcaTestAppPreferences.setPublisherTopicName("PUBLISHER_TOPIC_NAME"); + tcaTestAppPreferences.setPublisherUserName("PUBLISHER_USERNAME"); + tcaTestAppPreferences.setPublisherUserPassword("PUBLISHER_PASSWORD"); + tcaTestAppPreferences.setPublisherProtocol("https"); + tcaTestAppPreferences.setPublisherContentType("application/json"); + tcaTestAppPreferences.setPublisherMaxBatchSize(100); + tcaTestAppPreferences.setPublisherMaxRecoveryQueueSize(100); + tcaTestAppPreferences.setPublisherPollingInterval(6000); + + tcaTestAppPreferences.setEnableAAIEnrichment(true); + tcaTestAppPreferences.setAaiEnrichmentHost("AAI_ENRICHMENT_HOST"); + tcaTestAppPreferences.setAaiEnrichmentPortNumber(8443); + tcaTestAppPreferences.setAaiEnrichmentProtocol("https"); + tcaTestAppPreferences.setAaiEnrichmentUserName("AAI_USERNAME"); + tcaTestAppPreferences.setAaiEnrichmentUserPassword("AAI_USERPASSWORD"); + tcaTestAppPreferences.setAaiEnrichmentIgnoreSSLCertificateErrors(true); + tcaTestAppPreferences.setAaiVMEnrichmentAPIPath("VM_ENRICHMENT_PATH"); + tcaTestAppPreferences.setAaiVNFEnrichmentAPIPath("VNF_ENRICHMENT_PATH"); + return tcaTestAppPreferences; + } + + protected static Map getPreferenceMap() { + Map preference = new HashMap<>(); + preference.put("subscriberHostName", "mrlocal-mtnjftle01.homer.com"); + preference.put("subscriberHostPort", "3905"); + preference.put("subscriberTopicName", "com.dcae.dmaap.mtnje2.DcaeTestVESPub"); + preference.put("subscriberProtocol", "https"); + preference.put("subscriberUserName", "USER"); + preference.put("subscriberUserPassword", "PASSWORD"); + preference.put("subscriberContentType", "application/json"); + preference.put("subscriberConsumerId", "123"); + preference.put("subscriberConsumerGroup", "testTCAConsumerName-123"); + preference.put("subscriberTimeoutMS", "-1"); + preference.put("subscriberMessageLimit", "-1"); + preference.put("subscriberPollingInterval", "30000"); + + preference.put("publisherHostName", "publisherHostName"); + preference.put("publisherHostPort", "3905"); + preference.put("publisherTopicName", "publisherTopicName"); + preference.put("publisherProtocol", "https"); + preference.put("publisherUserName", "publisherUserName"); + preference.put("publisherContentType", "application/json"); + preference.put("publisherMaxBatchSize", "1000"); + preference.put("publisherMaxRecoveryQueueSize", "100"); + preference.put("publisherPollingInterval", "6000"); + return preference; + } + + protected static void assertFlowletNameAndDescription( + final String expectedName, final String expectedDescription, final T flowlet) { + final DefaultFlowletConfigurer defaultFlowletConfigurer = + new DefaultFlowletConfigurer(flowlet); + flowlet.configure(defaultFlowletConfigurer); + + final String flowletName = getPrivateFiledValue(defaultFlowletConfigurer, "name", String.class); + final String flowletDescription = + getPrivateFiledValue(defaultFlowletConfigurer, "description", String.class); + + assertThat("Flowlet name must match with CDAPComponentsConstants", + flowletName, is(expectedName)); + + assertThat("Flowlet description must match with CDAPComponentsConstants", + flowletDescription, is(expectedDescription)); + + } + + protected static FlowletContext getTestFlowletContextWithValidPolicy() { + return createNewFlowletContextFromPropertiesFile(TCA_CONTROLLER_POLICY_FILE_LOCATION); + } + + protected static FlowletContext getTestFlowletContextWithValidPolicyFromJSON() { + return createNewFlowletContextFromPropertiesFile(TCA_CONTROLLER_POLICY_FROM_JSON_FILE_LOCATION); + } + + private static FlowletContext createNewFlowletContextFromPropertiesFile(final String propertyFileLocation) { + final Properties controllerProperties = + AnalyticsModelIOUtils.loadPropertiesFile(propertyFileLocation, new Properties()); + + Map runtimeArgs = new LinkedHashMap<>(); + for (Map.Entry property : controllerProperties.entrySet()) { + runtimeArgs.put(property.getKey().toString(), property.getValue().toString()); + } + + final FlowletContext flowletContext = mock(FlowletContext.class); + when(flowletContext.getRuntimeArguments()).thenReturn(runtimeArgs); + return flowletContext; + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java new file mode 100644 index 0000000..e645a6d --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java @@ -0,0 +1,47 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca; + +import co.cask.cdap.app.DefaultApplicationContext; +import co.cask.cdap.app.MockAppConfigurer; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 1/12/2017. + */ +public class TCAAnalyticsApplicationTest extends BaseAnalyticsCDAPTCAUnitTest { + + @Test + public void testConfigure() throws Exception { + final TCAAnalyticsApplication tcaAnalyticsApplication = new TCAAnalyticsApplication(); + MockAppConfigurer mockAppConfigurer = new MockAppConfigurer(tcaAnalyticsApplication); + final DefaultApplicationContext applicationContext = + new DefaultApplicationContext(getTCATestAppConfig()); + tcaAnalyticsApplication.configure(mockAppConfigurer, applicationContext); + assertThat(TCA_TEST_APP_CONFIG_NAME, is(mockAppConfigurer.getName())); + } + + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java new file mode 100644 index 0000000..87f16d6 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java @@ -0,0 +1,79 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flow; + +import co.cask.cdap.AllProgramsApp; +import co.cask.cdap.api.flow.FlowletConnection; +import co.cask.cdap.api.flow.FlowletDefinition; +import co.cask.cdap.internal.app.runtime.flow.DefaultFlowConfigurer; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 1/12/2017. + */ +public class TCAVESCollectorFlowTest extends BaseAnalyticsCDAPTCAUnitTest { + + @Test + @SuppressWarnings("unchecked") + public void testConfigure() throws Exception { + + final TCAVESCollectorFlow tcavesCollectorFlow = new TCAVESCollectorFlow(getTCATestAppConfig()); + final DefaultFlowConfigurer configurer = new DefaultFlowConfigurer(new AllProgramsApp.NoOpFlow()); + tcavesCollectorFlow.configure(configurer); + final String flowName = getPrivateFiledValue(configurer, "name", String.class); + final String flowDescription = getPrivateFiledValue(configurer, "description", String.class); + + assertThat("TCAVESCollectorFlow Name must match with what is defined in CDAPComponents Constants", + flowName, is(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_NAME_FLOW)); + + assertThat("TCAVESCollectorFlow Description must match with what is defined in CDAPComponents Constants", + flowDescription, is(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_DESCRIPTION_FLOW)); + + final Map flowlets = + (Map) getPrivateFiledValue(configurer, "flowlets", HashMap.class); + + assertThat("TCAVESCollector must contain all TCA VES flowlets", flowlets.keySet(), + containsInAnyOrder(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET)); + + final List connections = + (List) getPrivateFiledValue(configurer, "connections", ArrayList.class); + + assertThat("There must be four connections in VES Collector Flow", connections.size(), is(5)); + + } + + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java new file mode 100644 index 0000000..7755a13 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java @@ -0,0 +1,251 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import co.cask.cdap.api.flow.flowlet.OutputEmitter; +import com.google.common.collect.ImmutableList; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementEntity; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; +import org.onap.dcae.apod.analytics.tca.utils.TCAUtils; + +import java.util.Date; +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 9/12/2017. + */ +@SuppressWarnings("unchecked") +public class TCAVESAlertsAbatementFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { + + private static final TCAPolicyPreferences sampleTCAPolicyPreferences = getSampleTCAPolicyPreferences(); + private static final List metricsPerEventNames = sampleTCAPolicyPreferences + .getMetricsPerEventName(); + private final OutputEmitter mockOutputEmitter = mock(OutputEmitter.class); + + private class TestTCAVESAlertsAbatementFlowlet extends TCAVESAlertsAbatementFlowlet { + + public TestTCAVESAlertsAbatementFlowlet(String tcaAlertsAbatementTableName) { + super(tcaAlertsAbatementTableName); + this.alertsAbatementOutputEmitter = mockOutputEmitter; + doNothing().when(mockOutputEmitter).emit(any(String.class)); + } + } + + @Test + public void testConfigure() throws Exception { + final TCAVESAlertsAbatementFlowlet tcavesAlertsAbatementFlowlet = + new TCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); + assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET, + tcavesAlertsAbatementFlowlet); + } + + @Test(expected = CDAPSettingsException.class) + public void testDetermineAbatementAlertsWhenViolatedMetricsEventNameIsBlank() throws Exception { + + final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = + new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); + final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET); + final ThresholdCalculatorOutput mockThresholdCalculatorOutput = + getMockThresholdCalculatorOutput(violatedThreshold); + when(mockThresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn(""); + + tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); + } + + @Test + public void testDetermineAbatementAlertsWhenControlLoopTypeIsONSET() throws Exception { + + final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; + final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = + new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); + + final FlowletContext mockFlowletContext = mock(FlowletContext.class); + final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); + when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); + tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); + + doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + + final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET); + final ThresholdCalculatorOutput mockThresholdCalculatorOutput = + getMockThresholdCalculatorOutput(violatedThreshold); + + tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); + verify(mockObjectMappedTable, + times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + verify(mockOutputEmitter, times(1)).emit(any(String.class)); + + } + + + @Test + public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousAlertWasSent() throws Exception { + + final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; + final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = + new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); + + final FlowletContext mockFlowletContext = mock(FlowletContext.class); + final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); + when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); + tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); + + doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class); + when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity); + when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(null); + + final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED); + final ThresholdCalculatorOutput mockThresholdCalculatorOutput = + getMockThresholdCalculatorOutput(violatedThreshold); + + tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); + verify(mockObjectMappedTable, + times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + verify(mockOutputEmitter, times(1)).emit(any(String.class)); + + } + + @Test + public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndPreviousAlertWasAlreadySent() throws + Exception { + + final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; + final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = + new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); + + final FlowletContext mockFlowletContext = mock(FlowletContext.class); + final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); + when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); + tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); + + doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class); + when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity); + final long time = new Date().getTime(); + when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(Long.toString(time)); + + final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED); + final ThresholdCalculatorOutput mockThresholdCalculatorOutput = + getMockThresholdCalculatorOutput(violatedThreshold); + + tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); + verify(mockObjectMappedTable, + times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + verify(mockOutputEmitter, times(0)).emit(any(String.class)); + + } + + + @Test + public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousONSETEventFound() throws + Exception { + + final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; + final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = + new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); + + final FlowletContext mockFlowletContext = mock(FlowletContext.class); + final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); + when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); + tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); + + doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + when(mockObjectMappedTable.read(any(String.class))).thenReturn(null); + + final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED); + final ThresholdCalculatorOutput mockThresholdCalculatorOutput = + getMockThresholdCalculatorOutput(violatedThreshold); + + tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); + verify(mockObjectMappedTable, + times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); + verify(mockOutputEmitter, times(0)).emit(any(String.class)); + + } + + @Test(expected = CDAPSettingsException.class) + public void testDetermineAbatementAlertsWhenControlLoopTypeIsNotOnsetOrAbated() throws + Exception { + final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = + new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); + final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.CONTINUE); + final ThresholdCalculatorOutput mockThresholdCalculatorOutput = + getMockThresholdCalculatorOutput(violatedThreshold); + + tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); + + } + + private static Threshold getViolatedThreshold(final ClosedLoopEventStatus closedLoopEventStatus) { + final Threshold violatedThreshold = Threshold.copy(metricsPerEventNames.get(0).getThresholds().get(0)); + violatedThreshold.setClosedLoopEventStatus(closedLoopEventStatus); + return violatedThreshold; + } + + + private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final Threshold violatedThreshold) throws + Exception { + + final MetricsPerEventName violatedMetricsPerEventName = + MetricsPerEventName.copy(metricsPerEventNames.get(0)); + violatedMetricsPerEventName.setThresholds(ImmutableList.of(violatedThreshold)); + return getMockThresholdCalculatorOutput( + fromStream(CEF_MESSAGE_JSON_FILE_LOCATION), + fromStream(TCA_POLICY_JSON_FILE_LOCATION), + TCAUtils.writeValueAsString(violatedMetricsPerEventName), + fromStream(TCA_ALERT_JSON_FILE_LOCATION) + ); + } + + + private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final String cefMessage, + final String tcaPolicy, + final String violatedMetricsPerEventName, + final String alertMessage) { + final ThresholdCalculatorOutput thresholdCalculatorOutput = mock(ThresholdCalculatorOutput.class); + when(thresholdCalculatorOutput.getCefMessage()).thenReturn(cefMessage); + when(thresholdCalculatorOutput.getTcaPolicy()).thenReturn(tcaPolicy); + when(thresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn(violatedMetricsPerEventName); + when(thresholdCalculatorOutput.getAlertMessage()).thenReturn(alertMessage); + return thresholdCalculatorOutput; + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java new file mode 100644 index 0000000..242c712 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java @@ -0,0 +1,78 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/16/2016. + */ +public class TCAVESAlertsSinkFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { + + + @Test + public void testConfigure() throws Exception { + final TCAVESAlertsSinkFlowlet tcavesAlertsSinkFlowlet = + new TCAVESAlertsSinkFlowlet("testTCAVESAlertTableName"); + assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_DESCRIPTION_FLOWLET, tcavesAlertsSinkFlowlet); + } + + @SuppressWarnings("unchecked") + @Test + public void saveAlerts() throws Exception { + + final String testAlertTableName = "testTCAVESAlertTableName"; + + final TCAVESAlertsSinkFlowlet tcavesAlertsSinkFlowlet = new TCAVESAlertsSinkFlowlet(testAlertTableName); + + final FlowletContext mockFlowletContext = Mockito.mock(FlowletContext.class); + final ObjectMappedTable mockObjectMappedTable = Mockito.mock(ObjectMappedTable.class); + when(mockFlowletContext.getDataset(eq(testAlertTableName))).thenReturn(mockObjectMappedTable); + tcavesAlertsSinkFlowlet.initialize(mockFlowletContext); + final ObjectMappedTable tcaVESAlertsTableName = + getPrivateFiledValue(tcavesAlertsSinkFlowlet, "tcaVESAlertsTable", ObjectMappedTable.class); + assertTrue(tcaVESAlertsTableName == mockObjectMappedTable); + + doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAVESAlertEntity.class)); + final String testAlertMessage = "testMessage"; + tcavesAlertsSinkFlowlet.saveAlerts(testAlertMessage); + + verify(mockObjectMappedTable, + times(1)).write(any(String.class), any(TCAVESAlertEntity.class)); + + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java new file mode 100644 index 0000000..610227d --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java @@ -0,0 +1,80 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.flow.flowlet.OutputEmitter; +import co.cask.cdap.api.flow.flowlet.StreamEvent; +import com.google.common.base.Charsets; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + +import java.nio.ByteBuffer; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/19/2016. + */ +public class TCAVESMessageRouterFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { + + private static final String TEST_MESSAGE = "test message"; + private final OutputEmitter mockOutputEmitter = Mockito.mock(OutputEmitter.class); + + private class TCATestVESMessageRouterFlowlet extends TCAVESMessageRouterFlowlet { + + @SuppressWarnings("unchecked") + public TCATestVESMessageRouterFlowlet() { + this.vesMessageEmitter = mockOutputEmitter; + doNothing().when(mockOutputEmitter).emit(eq(TEST_MESSAGE), + eq(AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY), + eq(TEST_MESSAGE.hashCode())); + } + } + + @Test + public void testConfigure() throws Exception { + final TCAVESMessageRouterFlowlet tcavesMessageRouterFlowlet = new TCAVESMessageRouterFlowlet(); + assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_DESCRIPTION_FLOWLET, tcavesMessageRouterFlowlet); + } + + @SuppressWarnings("unchecked") + @Test + public void routeVESMessage() throws Exception { + final TCATestVESMessageRouterFlowlet tcavesMessageRouterFlowlet = new TCATestVESMessageRouterFlowlet(); + final StreamEvent mockStreamEvent = Mockito.mock(StreamEvent.class); + final ByteBuffer testMessage = Charsets.UTF_8.encode(TEST_MESSAGE); + when(mockStreamEvent.getBody()).thenReturn(testMessage); + tcavesMessageRouterFlowlet.routeVESMessage(mockStreamEvent); + verify(mockOutputEmitter, + times(1)).emit(eq(TEST_MESSAGE), + eq(AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY), + eq(TEST_MESSAGE.hashCode())); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java new file mode 100644 index 0000000..988cd96 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java @@ -0,0 +1,163 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.flowlet; + +import co.cask.cdap.api.app.ApplicationSpecification; +import co.cask.cdap.api.dataset.lib.ObjectMappedTable; +import co.cask.cdap.api.flow.flowlet.FlowletContext; +import co.cask.cdap.api.flow.flowlet.OutputEmitter; +import co.cask.cdap.api.metrics.Metrics; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusEntity; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; +import org.onap.dcae.apod.analytics.model.domain.cef.EventListener; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/19/2016. + */ +@SuppressWarnings("unchecked") +public class TCAVESThresholdViolationCalculatorFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { + + private static final String messageStatusTableName = "TEST_MESSAGE_STATUS_TABLE"; + + private TCAVESThresholdViolationCalculatorFlowlet violationCalculatorFlowlet; + private Metrics metrics; + private OutputEmitter outputEmitter; + private ObjectMappedTable vesMessageStatusTable; + + private static class TCATestVESThresholdViolationCalculatorFlowlet extends + TCAVESThresholdViolationCalculatorFlowlet { + public TCATestVESThresholdViolationCalculatorFlowlet( + final String messageStatusTableName, + final OutputEmitter tcaAlertOutputEmitter, + ObjectMappedTable vesMessageStatusTable, + Metrics metrics) { + super(messageStatusTableName); + this.tcaAlertOutputEmitter = tcaAlertOutputEmitter; + this.metrics = metrics; + } + } + + @Before + public void before() { + violationCalculatorFlowlet = new TCAVESThresholdViolationCalculatorFlowlet(messageStatusTableName); + vesMessageStatusTable = Mockito.mock(ObjectMappedTable.class); + outputEmitter = Mockito.mock(OutputEmitter.class); + metrics = Mockito.mock(Metrics.class); + } + + @Test + public void testConfigure() throws Exception { + assertFlowletNameAndDescription( + CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET, + CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_DESCRIPTION_FLOWLET, + violationCalculatorFlowlet); + } + + @Test + public void testInitialize() throws Exception { + final FlowletContext mockFlowletContext = initializeFlowlet(violationCalculatorFlowlet, vesMessageStatusTable); + verify(mockFlowletContext, times(1)).getDataset(anyString()); + } + + @Test + public void testFilterVESMessagesWhenVESMessageIsInApplicable() throws Exception { + final TCATestVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = + createTestViolationCalculator(vesMessageStatusTable, outputEmitter, metrics); + initializeFlowlet(thresholdViolationCalculatorFlowlet, vesMessageStatusTable); + thresholdViolationCalculatorFlowlet.filterVESMessages("inapplicable"); + verify(vesMessageStatusTable, times(1)).write(anyString(), + any(TCAMessageStatusEntity.class)); + } + + @Test + public void testFilterVESMessagesWhenVESMessageIsCompliant() throws Exception { + final TCATestVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = + createTestViolationCalculator(vesMessageStatusTable, outputEmitter, metrics); + initializeFlowlet(thresholdViolationCalculatorFlowlet, vesMessageStatusTable); + thresholdViolationCalculatorFlowlet.filterVESMessages(getValidCEFMessage()); + verify(vesMessageStatusTable, times(1)).write(anyString(), + any(TCAMessageStatusEntity.class)); + } + + @Test + public void testFilterVESMessagesWhenVESMessageNonCompliant() throws Exception { + final TCATestVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = + createTestViolationCalculator(vesMessageStatusTable, outputEmitter, metrics); + final FlowletContext flowletContext = + initializeFlowlet(thresholdViolationCalculatorFlowlet, vesMessageStatusTable); + final TCAPolicy policy = CDAPTCAUtils.getValidatedTCAPolicyPreferences(flowletContext); + final Threshold threshold = policy.getMetricsPerEventName().get(0).getThresholds().get(0); + final Long thresholdValue = threshold.getThresholdValue(); + final EventListener thresholdViolatingMessage = getCEFEventListener(); + thresholdViolatingMessage.getEvent().getMeasurementsForVfScalingFields().getVNicPerformanceArray(). + get(0).setReceivedBroadcastPacketsAccumulated(thresholdValue - 1); + thresholdViolationCalculatorFlowlet.filterVESMessages( + ANALYTICS_MODEL_OBJECT_MAPPER.writeValueAsString(thresholdViolatingMessage)); + verify(vesMessageStatusTable, times(1)).write(anyString(), + any(TCAMessageStatusEntity.class)); + verify(outputEmitter, times(1)).emit(any(ThresholdCalculatorOutput.class)); + } + + private static TCATestVESThresholdViolationCalculatorFlowlet createTestViolationCalculator( + final ObjectMappedTable vesMessageStatusTable, + final OutputEmitter outputEmitter, final Metrics metrics) { + doNothing().when(outputEmitter).emit(anyString()); + doNothing().when(metrics).count(anyString(), anyInt()); + doNothing().when(vesMessageStatusTable).write(anyString(), any(TCAMessageStatusEntity.class)); + return new TCATestVESThresholdViolationCalculatorFlowlet(messageStatusTableName, outputEmitter, + vesMessageStatusTable, metrics); + } + + private static FlowletContext initializeFlowlet( + T calculatorFlowlet, ObjectMappedTable vesMessageStatusTable) throws Exception { + final FlowletContext mockFlowletContext = getTestFlowletContextWithValidPolicy(); + when(mockFlowletContext.getDataset(anyString())).thenReturn(vesMessageStatusTable); + when(mockFlowletContext.getInstanceId()).thenReturn(1); + ApplicationSpecification mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); + when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); + when(mockFlowletContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); + when(mockApplicationSpecification.getName()).thenReturn("TestTCAAppName"); + try { + calculatorFlowlet.initialize(mockFlowletContext); + return mockFlowletContext; + } catch (Exception e) { + LOG.error("error while flowlet initialization"); + throw new RuntimeException(e); + } + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java new file mode 100644 index 0000000..324a092 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java @@ -0,0 +1,52 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.it; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAIT; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfigHolder; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; + +/** + * @author Rajiv Singla . Creation Date: 10/25/2016. + */ +public class TCAnalyticsAppConfigIT extends BaseAnalyticsCDAPTCAIT { + + + @Test + public void createTestAppConfigJson() throws Exception { + final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); + final TCATestAppConfigHolder appConfigHolder = new TCATestAppConfigHolder(tcaTestAppConfig); + final String appConfigJson = serializeModelToJson(appConfigHolder); + LOG.info("AppConfigJson: \n{}", appConfigJson); + writeToOutputTextFile("appSettings/tca_app_config.json", appConfigJson, TCAnalyticsAppConfigIT.class); + } + + @Test + public void createTestAppPreferencesJson() throws Exception { + final TCATestAppPreferences tcaTestAppPreferences = getTCATestAppPreferences(); + final String appPreferencesJson = serializeModelToJson(tcaTestAppPreferences); + LOG.info("AppPreferences: \n{}", appPreferencesJson); + writeToOutputTextFile("appSettings/tca_app_preferences.json", + appPreferencesJson, TCAnalyticsAppConfigIT.class); + } +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java new file mode 100644 index 0000000..4ec89b4 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.settings; + +/** + * TCA Test App Config is used for testing purposes only + * + * @author Rajiv Singla . Creation Date: 11/3/2016. + */ +public class TCATestAppConfig extends TCAAppConfig { + + public void setAppName(String appName) { + this.appName = appName; + } + + public void setAppDescription(String appDescription) { + this.appDescription = appDescription; + } + + public void setTcaSubscriberOutputStreamName(String tcaSubscriberOutputStreamName) { + this.tcaSubscriberOutputStreamName = tcaSubscriberOutputStreamName; + } + + public void setThresholdCalculatorFlowletInstances(Integer thresholdCalculatorFlowletInstances) { + this.thresholdCalculatorFlowletInstances = thresholdCalculatorFlowletInstances; + } + + public void setTcaVESMessageStatusTableName(String tcaVESMessageStatusTableName) { + this.tcaVESMessageStatusTableName = tcaVESMessageStatusTableName; + } + + public void setTcaVESMessageStatusTableTTLSeconds(Integer tcaVESMessageStatusTableTTLSeconds) { + this.tcaVESMessageStatusTableTTLSeconds = tcaVESMessageStatusTableTTLSeconds; + } + + public void setTcaVESAlertsTableName(String tcaVESAlertsTableName) { + this.tcaVESAlertsTableName = tcaVESAlertsTableName; + } + + public void setTcaVESAlertsTableTTLSeconds(Integer tcaVESAlertsTableTTLSeconds) { + this.tcaVESAlertsTableTTLSeconds = tcaVESAlertsTableTTLSeconds; + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java new file mode 100644 index 0000000..f3467f4 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java @@ -0,0 +1,40 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.settings; + +/** + * Holder for TCA Test App Config + * + * @author Rajiv Singla . Creation Date: 11/3/2016. + */ +public class TCATestAppConfigHolder { + + private final TCATestAppConfig config; + + public TCATestAppConfigHolder(TCATestAppConfig config) { + this.config = config; + } + + public TCATestAppConfig getConfig() { + return config; + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java new file mode 100644 index 0000000..729630c --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java @@ -0,0 +1,176 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.settings; + + +import com.fasterxml.jackson.annotation.JsonAnyGetter; + +import java.util.Map; + +/** + * TCA Test App Preferences are used for testing purposes only + * + * @author Rajiv Singla . Creation Date: 11/3/2016. + */ +public class TCATestAppPreferences extends TCAAppPreferences { + + private Map policyPreferences; + + public TCATestAppPreferences() { + } + + public TCATestAppPreferences(final Map policyPreferences) { + this.policyPreferences = policyPreferences; + } + + @JsonAnyGetter + public Map getPolicyPreferences() { + return policyPreferences; + } + + public void setSubscriberHostName(String subscriberHostName) { + this.subscriberHostName = subscriberHostName; + } + + public void setSubscriberHostPortNumber(Integer subscriberHostPort) { + this.subscriberHostPort = subscriberHostPort; + } + + public void setSubscriberTopicName(String subscriberTopicName) { + this.subscriberTopicName = subscriberTopicName; + } + + public void setSubscriberProtocol(String subscriberProtocol) { + this.subscriberProtocol = subscriberProtocol; + } + + public void setSubscriberUserName(String subscriberUserName) { + this.subscriberUserName = subscriberUserName; + } + + public void setSubscriberUserPassword(String subscriberUserPassword) { + this.subscriberUserPassword = subscriberUserPassword; + } + + public void setSubscriberContentType(String subscriberContentType) { + this.subscriberContentType = subscriberContentType; + } + + public void setSubscriberConsumerId(String subscriberConsumerId) { + this.subscriberConsumerId = subscriberConsumerId; + } + + public void setSubscriberConsumerGroup(String subscriberConsumerGroup) { + this.subscriberConsumerGroup = subscriberConsumerGroup; + } + + public void setSubscriberTimeoutMS(Integer subscriberTimeoutMS) { + this.subscriberTimeoutMS = subscriberTimeoutMS; + } + + public void setSubscriberMessageLimit(Integer subscriberMessageLimit) { + this.subscriberMessageLimit = subscriberMessageLimit; + } + + public void setSubscriberPollingInterval(Integer subscriberPollingInterval) { + this.subscriberPollingInterval = subscriberPollingInterval; + } + + public void setPublisherHostName(String publisherHostName) { + this.publisherHostName = publisherHostName; + } + + public void setPublisherHostPort(Integer publisherHostPort) { + this.publisherHostPort = publisherHostPort; + } + + public void setPublisherTopicName(String publisherTopicName) { + this.publisherTopicName = publisherTopicName; + } + + public void setPublisherProtocol(String publisherProtocol) { + this.publisherProtocol = publisherProtocol; + } + + public void setPublisherUserName(String publisherUserName) { + this.publisherUserName = publisherUserName; + } + + public void setPublisherUserPassword(String publisherUserPassword) { + this.publisherUserPassword = publisherUserPassword; + } + + public void setPublisherContentType(String publisherContentType) { + this.publisherContentType = publisherContentType; + } + + public void setPublisherMaxBatchSize(Integer publisherMaxBatchSize) { + this.publisherMaxBatchSize = publisherMaxBatchSize; + } + + public void setPublisherMaxRecoveryQueueSize(Integer publisherMaxRecoveryQueueSize) { + this.publisherMaxRecoveryQueueSize = publisherMaxRecoveryQueueSize; + } + + public void setPublisherPollingInterval(Integer publisherPollingInterval) { + this.publisherPollingInterval = publisherPollingInterval; + } + + public void setEnableAlertCEFFormat(Boolean enableAlertCEFFormat) { + this.enableAlertCEFFormat = enableAlertCEFFormat; + } + + public void setEnableAAIEnrichment(Boolean enableAAIEnrichment) { + this.enableAAIEnrichment = enableAAIEnrichment; + } + + public void setAaiEnrichmentHost(String aaiEnrichmentHost) { + this.aaiEnrichmentHost = aaiEnrichmentHost; + } + + public void setAaiEnrichmentPortNumber(Integer aaiEnrichmentPortNumber) { + this.aaiEnrichmentPortNumber = aaiEnrichmentPortNumber; + } + + public void setAaiEnrichmentProtocol(String aaiEnrichmentProtocol) { + this.aaiEnrichmentProtocol = aaiEnrichmentProtocol; + } + + public void setAaiEnrichmentUserName(String aaiEnrichmentUserName) { + this.aaiEnrichmentUserName = aaiEnrichmentUserName; + } + + public void setAaiEnrichmentUserPassword(String aaiEnrichmentUserPassword) { + this.aaiEnrichmentUserPassword = aaiEnrichmentUserPassword; + } + + public void setAaiEnrichmentIgnoreSSLCertificateErrors(Boolean aaiEnrichmentIgnoreSSLCertificateErrors) { + this.aaiEnrichmentIgnoreSSLCertificateErrors = aaiEnrichmentIgnoreSSLCertificateErrors; + } + + public void setAaiVNFEnrichmentAPIPath(String aaiVNFEnrichmentAPIPath) { + this.aaiVNFEnrichmentAPIPath = aaiVNFEnrichmentAPIPath; + } + + public void setAaiVMEnrichmentAPIPath(String aaiVMEnrichmentAPIPath) { + this.aaiVMEnrichmentAPIPath = aaiVMEnrichmentAPIPath; + } +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java new file mode 100644 index 0000000..e548f6f --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java @@ -0,0 +1,41 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.settings; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; + +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 12/16/2016. + */ +public class TCATestAppPreferencesTest extends BaseAnalyticsCDAPTCAUnitTest { + + @Test + public void testToString() throws Exception { + final TCATestAppPreferences tcaTestAppPreferences = getTCATestAppPreferences(); + assertTrue(tcaTestAppPreferences.toString().contains("subscriberHostName")); + assertTrue(tcaTestAppPreferences.toString().contains("subscriberHostPort")); + assertTrue(tcaTestAppPreferences.toString().contains("publisherHostName")); + assertTrue(tcaTestAppPreferences.toString().contains("publisherHostPort")); + } +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java new file mode 100644 index 0000000..197d0b0 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.utils; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author Manjesh Gowda. Creation Date: 11/21/2016. + */ +public class AppPreferencesToPublisherConfigMapperTest extends BaseAnalyticsCDAPTCAUnitTest { + @Test + public void testMapTCAConfigToPublisherConfigFunctionGood() { + DMaaPMRPublisherConfig dMaaPMRPublisherConfig = + (new AppPreferencesToPublisherConfigMapper()).apply(getTCATestAppPreferences()); + assertEquals(dMaaPMRPublisherConfig.getHostName(), "PUBLISHER_HOST_NAME"); + } + + @Test + public void testMapTCAConfigToPublisherConfigFunctionMap() { + DMaaPMRPublisherConfig dMaaPMRPublisherConfig = AppPreferencesToPublisherConfigMapper.map( + getTCATestAppPreferences()); + assertEquals(dMaaPMRPublisherConfig.getHostName(), "PUBLISHER_HOST_NAME"); + } + + @Test + public void testMapTCAConfigToPublisherConfigFunction() { + final TCATestAppPreferences tcaAppPreferences = new TCATestAppPreferences(); + final String publisherHostName = "publisherHostName"; + final String publisherTopicName = "publisherTopicName"; + tcaAppPreferences.setPublisherHostName(publisherHostName); + tcaAppPreferences.setPublisherTopicName(publisherTopicName); + DMaaPMRPublisherConfig dMaaPMRPublisherConfig = + (new AppPreferencesToPublisherConfigMapper()).apply(tcaAppPreferences); + assertTrue(publisherHostName.equals(dMaaPMRPublisherConfig.getHostName())); + assertTrue(publisherTopicName.equals(dMaaPMRPublisherConfig.getTopicName())); + + } +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java new file mode 100644 index 0000000..a2b8a52 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.utils; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author Manjesh Gowda. Creation Date: 11/21/2016. + */ +public class AppPreferencesToSubscriberConfigMapperTest extends BaseAnalyticsCDAPTCAUnitTest { + + @Test + public void testMapTCAConfigToSubscriberConfigFunctionGood() { + DMaaPMRSubscriberConfig dMaaPMRSubscriberConfig = + (new AppPreferencesToSubscriberConfigMapper()).apply(getTCATestAppPreferences()); + assertEquals(dMaaPMRSubscriberConfig.getHostName(), "SUBSCRIBER_HOST_NAME"); + } + + @Test + public void testMapTCAConfigToSubscriberConfigFunctionMap() { + DMaaPMRSubscriberConfig dMaaPMRSubscriberConfig = + AppPreferencesToSubscriberConfigMapper.map(getTCATestAppPreferences()); + assertEquals(dMaaPMRSubscriberConfig.getHostName(), "SUBSCRIBER_HOST_NAME"); + } + + @Test + public void testMapTCAConfigToSubscriberConfigFunction() { + final TCATestAppPreferences tcaAppPreferences = new TCATestAppPreferences(); + final String subscriberHostname = "subscriberHostname"; + tcaAppPreferences.setSubscriberHostName(subscriberHostname); + final String subscriberTopicName = "subscriberTopicName"; + tcaAppPreferences.setSubscriberTopicName(subscriberTopicName); + DMaaPMRSubscriberConfig dMaaPMRSubscriberConfig = + (new AppPreferencesToSubscriberConfigMapper()).apply(tcaAppPreferences); + assertTrue(subscriberHostname.equals(dMaaPMRSubscriberConfig.getHostName())); + assertTrue(subscriberTopicName.equals(dMaaPMRSubscriberConfig.getTopicName())); + } +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java new file mode 100644 index 0000000..917269f --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java @@ -0,0 +1,80 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.utils; + +import co.cask.cdap.api.RuntimeContext; +import co.cask.cdap.api.app.ApplicationSpecification; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; + +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 11/9/2016. + */ +public class CDAPTCAUtilsTest extends BaseAnalyticsCDAPTCAUnitTest { + + @Test + public void testGetValidatedTCAAppPreferences() throws Exception { + RuntimeContext runtimeContext = mock(RuntimeContext.class); + final Map preferenceMap = getPreferenceMap(); + preferenceMap.remove("subscriberHostName"); + preferenceMap.remove("publisherHostName"); + when(runtimeContext.getRuntimeArguments()).thenReturn(preferenceMap); + ApplicationSpecification mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); + when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); + when(runtimeContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); + TCAAppPreferences validatedTCAAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(runtimeContext); + assertEquals(validatedTCAAppPreferences.getSubscriberHostName(), "HOSTNAME"); + } + + @Test + public void testConvertRuntimeContextToTCAPolicy() throws Exception { + + final TCAPolicy tcaPolicy = + CDAPTCAUtils.getValidatedTCAPolicyPreferences(getTestFlowletContextWithValidPolicy()); + assertThat("Policy Domain must be measurementsForVfScaling", + tcaPolicy.getDomain(), is("measurementsForVfScaling")); + assertThat("Policy must have 2 metrics per functional roles", + tcaPolicy.getMetricsPerEventName().size(), is(2)); + } + + @Test + public void testConvertRuntimeContextToTCAPolicyFromJSON() throws Exception { + + final TCAPolicy tcaPolicy = + CDAPTCAUtils.getValidatedTCAPolicyPreferences(getTestFlowletContextWithValidPolicyFromJSON()); + assertThat("Policy Domain must be measurementsForVfScaling", + tcaPolicy.getDomain(), is("measurementsForVfScaling")); + assertThat("Policy must have 2 metrics per functional roles", + tcaPolicy.getMetricsPerEventName().size(), is(2)); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java new file mode 100644 index 0000000..6ed0a00 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java @@ -0,0 +1,77 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.validator; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 12/16/2016. + */ +public class TCAAppConfigValidatorTest extends BaseAnalyticsCDAPTCAUnitTest { + + + @Test + public void validateAppSettingsWhenAppConfigIsValid() throws Exception { + final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); + final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); + final GenericValidationResponse validationResponse = + tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); + assertFalse(validationResponse.hasErrors()); + } + + @Test + public void testWhenSubscriberOutputStreamIsNull() throws Exception { + final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); + final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); + tcaTestAppConfig.setTcaSubscriberOutputStreamName(null); + final GenericValidationResponse validationResponse = + tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); + assertTrue(validationResponse.hasErrors()); + } + + @Test + public void testWhenVESMessageStatusTableNameIsNull() throws Exception { + final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); + final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); + tcaTestAppConfig.setTcaVESMessageStatusTableName(null); + final GenericValidationResponse validationResponse = + tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); + assertTrue(validationResponse.hasErrors()); + } + + @Test + public void testWhenVESAlertsTableNameIsNull() throws Exception { + final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); + final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); + tcaTestAppConfig.setTcaVESAlertsTableName(null); + final GenericValidationResponse validationResponse = + tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); + assertTrue(validationResponse.hasErrors()); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java new file mode 100644 index 0000000..8aef4de --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java @@ -0,0 +1,85 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.validator; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; +import org.onap.dcae.apod.analytics.model.domain.policy.tca.Threshold; + +import java.util.Collections; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 12/16/2016. + */ +public class TCAPolicyPreferencesValidatorTest extends BaseAnalyticsCDAPTCAUnitTest { + + private TCAPolicyPreferencesValidator tcaPolicyPreferencesValidator; + private TCAPolicyPreferences tcaPolicyPreferences; + + @Before + public void before() { + tcaPolicyPreferencesValidator = new TCAPolicyPreferencesValidator(); + tcaPolicyPreferences = getSampleTCAPolicyPreferences(); + } + + @Test + public void testValidateAppSettingsWhenSettingsAreValid() throws Exception { + final GenericValidationResponse validationResponse = + tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); + assertFalse(validationResponse.hasErrors()); + } + + @Test + public void testValidateAppSettingsWhenDomainIsNullAndFunctionRoleIsEmpty() throws Exception { + tcaPolicyPreferences.setDomain(null); + tcaPolicyPreferences.setMetricsPerEventName(Collections.emptyList()); + final GenericValidationResponse validationResponse = + tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); + assertTrue(validationResponse.hasErrors()); + assertTrue(validationResponse.getErrorMessages().size() == 2); + } + + @Test + public void testValidateAppSettingsWhenThresholdIsEmpty() throws Exception { + tcaPolicyPreferences.getMetricsPerEventName().get(0).setThresholds(Collections.emptyList()); + final GenericValidationResponse validationResponse = + tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); + assertTrue(validationResponse.hasErrors()); + assertTrue(validationResponse.getErrorMessages().size() == 1); + } + + @Test + public void testValidateAppSettingsWhenThresholdPathIsMissing() throws Exception { + tcaPolicyPreferences.getMetricsPerEventName().get(0).getThresholds().get(0).setFieldPath(null); + final GenericValidationResponse validationResponse = + tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); + assertTrue(validationResponse.hasErrors()); + assertTrue(validationResponse.getErrorMessages().size() == 1); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java new file mode 100644 index 0000000..e2051a8 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java @@ -0,0 +1,86 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.validator; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; +import org.onap.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; +import org.onap.dcae.apod.analytics.common.validation.GenericValidationResponse; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 12/19/2016. + */ +public class TCAPreferencesValidatorTest extends BaseAnalyticsCDAPTCAUnitTest { + + private TCAPreferencesValidator tcaPreferencesValidator; + private TCATestAppPreferences tcaTestAppPreferences; + + @Before + public void before() { + tcaPreferencesValidator = new TCAPreferencesValidator(); + tcaTestAppPreferences = getTCATestAppPreferences(); + } + + @Test + public void validateAppSettingsWithValidParameters() throws Exception { + final GenericValidationResponse validationResponse = + tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); + assertFalse(validationResponse.hasErrors()); + } + + @Test + public void validateAppSettingsWhenSubscriberHostOrTopicNameIsNotPresent() throws Exception { + tcaTestAppPreferences.setSubscriberHostName(null); + tcaTestAppPreferences.setSubscriberTopicName(null); + final GenericValidationResponse validationResponse = + tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); + assertTrue(validationResponse.hasErrors()); + assertTrue(validationResponse.getErrorMessages().size() == 2); + } + + @Test + public void validateAppSettingsWhenPublisherHostOrTopicNameIsNotPresent() throws Exception { + tcaTestAppPreferences.setPublisherHostName(null); + tcaTestAppPreferences.setPublisherTopicName(null); + final GenericValidationResponse validationResponse = + tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); + assertTrue(validationResponse.hasErrors()); + assertTrue(validationResponse.getErrorMessages().size() == 2); + } + + @Test + public void validateAppSettingsWhenAAIEnrichmentIsEnabledAndAAIRequiredFieldsAreNotPresent() throws Exception { + tcaTestAppPreferences.setEnableAAIEnrichment(true); + tcaTestAppPreferences.setAaiEnrichmentHost(null); + tcaTestAppPreferences.setAaiVMEnrichmentAPIPath(null); + tcaTestAppPreferences.setAaiVNFEnrichmentAPIPath(null); + final GenericValidationResponse validationResponse = + tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); + assertTrue(validationResponse.hasErrors()); + assertTrue(validationResponse.getErrorMessages().size() == 3); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java new file mode 100644 index 0000000..f168794 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java @@ -0,0 +1,99 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.quartz.Scheduler; + +import java.util.concurrent.atomic.AtomicBoolean; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/19/2016. + */ +public class BaseTCADMaaPMRWorkerTest extends BaseAnalyticsCDAPTCAUnitTest { + + private static final String SCHEDULER_NAME = "testSchedulerName"; + + private Scheduler mockScheduler; + private AtomicBoolean mockIsSchedulerShutdown; + private BaseTestTCADMaaPMRWorker baseTestTCADMaaPMRWorker; + + private static class BaseTestTCADMaaPMRWorker extends BaseTCADMaaPMRWorker { + + public BaseTestTCADMaaPMRWorker(final Scheduler scheduler, final AtomicBoolean isSchedulerShutdown) { + this.scheduler = scheduler; + this.isSchedulerShutdown = isSchedulerShutdown; + } + + } + + @Before + public void before() throws Exception { + mockScheduler = mock(Scheduler.class); + mockIsSchedulerShutdown = mock(AtomicBoolean.class); + baseTestTCADMaaPMRWorker = new BaseTestTCADMaaPMRWorker(mockScheduler, mockIsSchedulerShutdown); + when(mockScheduler.getSchedulerName()).thenReturn(SCHEDULER_NAME); + doNothing().when(mockScheduler).start(); + doNothing().when(mockScheduler).shutdown(); + } + + @Test + public void testRun() throws Exception { + createShutdownHookThread(); + baseTestTCADMaaPMRWorker.run(); + verify(mockScheduler, times(1)).start(); + } + + @Test + public void testStop() throws Exception { + baseTestTCADMaaPMRWorker.stop(); + verify(mockScheduler, times(1)).shutdown(); + } + + /** + * A helper thread which shuts down the scheduler after some time + */ + public void createShutdownHookThread() { + new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.yield(); + Thread.sleep(AnalyticsConstants.TCA_DEFAULT_WORKER_SHUTDOWN_CHECK_INTERVAL_MS * 2); + } catch (InterruptedException e) { + LOG.error("Interrupted Exception while running test: {}", e); + throw new RuntimeException(e); + } + mockIsSchedulerShutdown.getAndSet(true); + } + }).start(); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java new file mode 100644 index 0000000..31ffcd2 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java @@ -0,0 +1,158 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.TxRunnable; +import co.cask.cdap.api.metrics.Metrics; +import co.cask.cdap.api.worker.WorkerContext; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/20/2016. + */ +public class TCADMaaPMRPublisherJobTest extends BaseAnalyticsCDAPTCAUnitTest { + + private JobExecutionContext jobExecutionContext; + private TCADMaaPMRPublisherJob publisherJob; + private JobDataMap jobDataMap; + private WorkerContext workerContext; + private DMaaPMRPublisher publisher; + private Metrics metrics; + + private class TCATestDMaaPMRPublisherJob extends TCADMaaPMRPublisherJob { + + private Map alertEntityMap; + + public TCATestDMaaPMRPublisherJob(Map alertEntityMap) { + this.alertEntityMap = alertEntityMap; + } + + @Override + protected Map getNewAlertsMap( + String cdapAlertsTableName, WorkerContext workerContext) { + return alertEntityMap; + } + + @Override + protected void deleteAlertsByKey(String cdapAlertsTableName, WorkerContext workerContext, + Set rowKeys, Metrics metrics) { + // do nothing + } + } + + @Before + public void before() throws Exception { + + jobExecutionContext = mock(JobExecutionContext.class); + workerContext = mock(WorkerContext.class); + + metrics = mock(Metrics.class); + doNothing().when(metrics).count(anyString(), anyInt()); + publisher = mock(DMaaPMRPublisher.class); + + jobDataMap = mock(JobDataMap.class); + when(jobDataMap.getString(eq(AnalyticsConstants.CDAP_ALERTS_TABLE_VARIABLE_NAME))).thenReturn + ("testAlertTableName"); + when(jobDataMap.get(eq(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME))).thenReturn(workerContext); + when(jobDataMap.get(eq(AnalyticsConstants.DMAAP_PUBLISHER_VARIABLE_NAME))).thenReturn(publisher); + when(jobDataMap.get(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME)).thenReturn(metrics); + when(jobExecutionContext.getMergedJobDataMap()).thenReturn(jobDataMap); + + + publisherJob = new TCADMaaPMRPublisherJob(); + } + + @Test + public void testExecuteWhenNoAlertsFoundInAlertsTable() throws Exception { + doNothing().when(workerContext).execute(any(TxRunnable.class)); + publisherJob.execute(jobExecutionContext); + verify(metrics, times(1)) + .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_NO_NEW_ALERTS_LOOKUP_METRIC), eq(1)); + } + + @Test + public void testExecuteWhenAlertsWereFoundInAlertsTable() throws Exception { + + final DMaaPMRPublisherResponse publisherResponse = mock(DMaaPMRPublisherResponse.class); + when(publisherResponse.getResponseCode()).thenReturn(200); + when(publisherResponse.getResponseMessage()).thenReturn("success"); + when(publisherResponse.getPendingMessagesCount()).thenReturn(0); + when(publisher.publish(ArgumentMatchers.anyList())).thenReturn(publisherResponse); + + final TCAVESAlertEntity tcavesAlertEntity = mock(TCAVESAlertEntity.class); + when(tcavesAlertEntity.getAlertMessage()).thenReturn("testAlertMessage"); + Map alertEntityMap = new HashMap<>(); + alertEntityMap.put("key1", tcavesAlertEntity); + final TCATestDMaaPMRPublisherJob testPublisherJob = new TCATestDMaaPMRPublisherJob(alertEntityMap); + testPublisherJob.execute(jobExecutionContext); + verify(metrics, times(1)) + .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_NEW_ALERTS_METRIC), eq(1)); + verify(metrics, times(1)) + .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_SUCCESSFUL_DMAAP_RESPONSE_METRIC), eq(1)); + } + + @Test + public void testExecuteWhenAlertsWereFoundButPublisherReturnedNon200ResponseCode() throws Exception { + + final DMaaPMRPublisherResponse publisherResponse = mock(DMaaPMRPublisherResponse.class); + when(publisherResponse.getResponseCode()).thenReturn(500); + when(publisherResponse.getResponseMessage()).thenReturn("failed"); + when(publisherResponse.getPendingMessagesCount()).thenReturn(0); + when(publisher.publish(ArgumentMatchers.anyList())).thenReturn(publisherResponse); + + final TCAVESAlertEntity tcavesAlertEntity = mock(TCAVESAlertEntity.class); + when(tcavesAlertEntity.getAlertMessage()).thenReturn("testAlertMessage"); + Map alertEntityMap = new HashMap<>(); + alertEntityMap.put("key1", tcavesAlertEntity); + final TCATestDMaaPMRPublisherJob testPublisherJob = new TCATestDMaaPMRPublisherJob(alertEntityMap); + testPublisherJob.execute(jobExecutionContext); + verify(metrics, times(1)) + .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_NEW_ALERTS_METRIC), eq(1)); + verify(metrics, times(1)) + .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_UNSUCCESSFUL_DMAAP_RESPONSE_METRIC), eq(1)); + } + + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java new file mode 100644 index 0000000..e15c2c6 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java @@ -0,0 +1,135 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.metrics.Metrics; +import co.cask.cdap.api.worker.WorkerContext; +import com.google.common.collect.ImmutableList; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/20/2016. + */ +public class TCADMaaPMRSubscriberJobTest extends BaseAnalyticsCDAPTCAUnitTest { + + private JobExecutionContext jobExecutionContext; + private TCADMaaPMRSubscriberJob subscriberJob; + private JobDataMap jobDataMap; + private WorkerContext workerContext; + private DMaaPMRSubscriber subscriber; + private Metrics metrics; + + + @Before + public void before() throws Exception { + + jobExecutionContext = mock(JobExecutionContext.class); + workerContext = mock(WorkerContext.class); + + metrics = mock(Metrics.class); + doNothing().when(metrics).count(anyString(), anyInt()); + subscriber = mock(DMaaPMRSubscriber.class); + + jobDataMap = mock(JobDataMap.class); + when(jobDataMap.getString(eq(AnalyticsConstants.CDAP_STREAM_VARIABLE_NAME))).thenReturn + (CDAPComponentsConstants.TCA_DEFAULT_SUBSCRIBER_OUTPUT_NAME_STREAM); + when(jobDataMap.get(eq(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME))).thenReturn(workerContext); + when(jobDataMap.get(eq(AnalyticsConstants.DMAAP_SUBSCRIBER_VARIABLE_NAME))).thenReturn(subscriber); + when(jobDataMap.get(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME)).thenReturn(metrics); + when(jobExecutionContext.getMergedJobDataMap()).thenReturn(jobDataMap); + + doNothing().when(workerContext).write(anyString(), anyString()); + + subscriberJob = new TCADMaaPMRSubscriberJob(); + } + + @Test + public void testExecuteWhenMessagesAreFound() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(200); + when(subscriberResponse.getResponseMessage()).thenReturn("testMessage"); + when(subscriberResponse.getFetchedMessages()).thenReturn(ImmutableList.of("testMessage1", "testMessage1")); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + subscriberJob.execute(jobExecutionContext); + verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants + .DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC), eq(2)); + } + + @Test + public void testExecuteWhenNoMessagesFound() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(200); + when(subscriberResponse.getResponseMessage()).thenReturn("no messages"); + when(subscriberResponse.getFetchedMessages()).thenReturn(Collections.emptyList()); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + subscriberJob.execute(jobExecutionContext); + verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants + .DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC), eq(1)); + } + + + @Test + public void testExecuteWhenSubscriberReturnNonSuccessfulReturnCode() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(500); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + subscriberJob.execute(jobExecutionContext); + verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants + .DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC), eq(1)); + } + + @Test(expected = DCAEAnalyticsRuntimeException.class) + public void testExecuteWhenWritingToCDAPStreamThrowsException() throws Exception { + final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); + when(subscriberResponse.getResponseCode()).thenReturn(200); + when(subscriberResponse.getFetchedMessages()).thenReturn(Arrays.asList("TestMessage")); + when(subscriber.fetchMessages()).thenReturn(subscriberResponse); + doThrow(new IOException()).when(workerContext).write(anyString(), anyString()); + subscriberJob.execute(jobExecutionContext); + } + + + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java new file mode 100644 index 0000000..e0e5229 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java @@ -0,0 +1,87 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.app.ApplicationSpecification; +import co.cask.cdap.api.worker.WorkerConfigurer; +import co.cask.cdap.api.worker.WorkerContext; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/20/2016. + */ +public class TCADMaaPPublisherWorkerTest extends BaseAnalyticsCDAPTCAUnitTest { + + private static final String VES_ALERTS_TABLE_NAME = "vesAlertsTable"; + + private WorkerConfigurer workerConfigurer; + private WorkerContext workerContext; + private TCADMaaPPublisherWorker publisherWorker; + private ApplicationSpecification mockApplicationSpecification; + + @Before + public void before() throws Exception { + workerConfigurer = mock(WorkerConfigurer.class); + workerContext = mock(WorkerContext.class); + doNothing().when(workerConfigurer).setName(anyString()); + doNothing().when(workerConfigurer).setDescription(anyString()); + mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); + when(workerContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); + publisherWorker = new TCADMaaPPublisherWorker(VES_ALERTS_TABLE_NAME); + + } + + @Test + public void testConfigure() throws Exception { + publisherWorker.configure(workerConfigurer); + verify(workerConfigurer, times(1)) + .setName(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_WORKER)); + verify(workerConfigurer, times(1)) + .setDescription(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_DESCRIPTION_WORKER)); + } + + @Test(expected = CDAPSettingsException.class) + public void testInitializeWhenSettingsHaveErrors() throws Exception { + when(mockApplicationSpecification.getConfiguration()).thenReturn("{}"); + publisherWorker.initialize(workerContext); + } + + @Test + public void testInitializeWhenSettingsAreValid() throws Exception { + when(workerContext.getRuntimeArguments()).thenReturn(getPreferenceMap()); + when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); + publisherWorker.initialize(workerContext); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java new file mode 100644 index 0000000..e402cc3 --- /dev/null +++ b/dcae-analytics-cdap-tca/src/test/java/org/onap/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java @@ -0,0 +1,88 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.cdap.tca.worker; + +import co.cask.cdap.api.app.ApplicationSpecification; +import co.cask.cdap.api.worker.WorkerConfigurer; +import co.cask.cdap.api.worker.WorkerContext; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; +import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; +import org.onap.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Rajiv Singla . Creation Date: 12/20/2016. + */ +public class TCADMaaPSubscriberWorkerTest extends BaseAnalyticsCDAPTCAUnitTest { + + private static final String TEST_SUBSCRIBER_OUTPUT_STREAM_NAME = "testSubscriberOutputStream"; + + private WorkerConfigurer workerConfigurer; + private WorkerContext workerContext; + private TCADMaaPSubscriberWorker subscriberWorker; + private ApplicationSpecification mockApplicationSpecification; + + @Before + public void before() throws Exception { + workerConfigurer = mock(WorkerConfigurer.class); + workerContext = mock(WorkerContext.class); + mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); + when(workerContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); + doNothing().when(workerConfigurer).setName(anyString()); + doNothing().when(workerConfigurer).setDescription(anyString()); + subscriberWorker = + new TCADMaaPSubscriberWorker(TEST_SUBSCRIBER_OUTPUT_STREAM_NAME); + + } + + @Test + public void testConfigure() throws Exception { + subscriberWorker.configure(workerConfigurer); + verify(workerConfigurer, times(1)) + .setName(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_WORKER)); + verify(workerConfigurer, times(1)) + .setDescription(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_DESCRIPTION_WORKER)); + } + + @Test(expected = CDAPSettingsException.class) + public void testInitializeWhenSettingsHaveErrors() throws Exception { + when(mockApplicationSpecification.getConfiguration()).thenReturn("{}"); + subscriberWorker.initialize(workerContext); + } + + @Test + public void testInitializeWhenSettingsAreValid() throws Exception { + when(workerContext.getRuntimeArguments()).thenReturn(getPreferenceMap()); + when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); + subscriberWorker.initialize(workerContext); + } + +} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java deleted file mode 100644 index 4910035..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAIT.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.google.common.base.Suppliers; -import org.junit.BeforeClass; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; -import org.openecomp.dcae.apod.analytics.model.util.AnalyticsModelIOUtils; -import org.openecomp.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; - -import java.util.Map; -import java.util.Properties; -import java.util.TreeMap; - -/** - * - * @author Rajiv Singla . Creation Date: 10/25/2016. - */ -public abstract class BaseAnalyticsCDAPTCAIT extends BaseDCAEAnalyticsIT { - - protected static ObjectMapper objectMapper; - - @BeforeClass - public static void beforeClass() { - final AnalyticsModelObjectMapperSupplier analyticsModelObjectMapperSupplier = - new AnalyticsModelObjectMapperSupplier(); - objectMapper = Suppliers.memoize(analyticsModelObjectMapperSupplier).get(); - objectMapper.enable(SerializationFeature.INDENT_OUTPUT); - } - - protected static final String TCA_CONTROLLER_POLICY_FILE_LOCATION = - "data/properties/tca_controller_policy.properties"; - - // App Settings - protected static final String DCAE_ANALYTICS_TCA_TEST_APP_NAME = "dcae-tca"; - protected static final String DCAE_ANALYTICS_TCA_TEST_APP_DESC = - "DCAE Analytics Threshold Crossing Alert Application"; - - - protected static TCATestAppConfig getTCATestAppConfig() { - final TCATestAppConfig tcaTestAppConfig = new TCATestAppConfig(); - tcaTestAppConfig.setAppName(DCAE_ANALYTICS_TCA_TEST_APP_NAME); - tcaTestAppConfig.setAppDescription(DCAE_ANALYTICS_TCA_TEST_APP_DESC); - return tcaTestAppConfig; - } - - protected static TCATestAppPreferences getTCATestAppPreferences() { - final TCATestAppPreferences tcaTestAppPreferences = new TCATestAppPreferences(getTCAPolicyPreferences()); - tcaTestAppPreferences.setSubscriberPollingInterval(null); - tcaTestAppPreferences.setPublisherMaxBatchSize(null); - tcaTestAppPreferences.setPublisherMaxRecoveryQueueSize(null); - tcaTestAppPreferences.setEnableAlertCEFFormat(null); - tcaTestAppPreferences.setPublisherPollingInterval(null); - return tcaTestAppPreferences; - } - - - protected static Map getTCAPolicyPreferences() { - final Map policyPreferences = new TreeMap<>(); - final Properties policyPreferencesProps = - AnalyticsModelIOUtils.loadPropertiesFile(TCA_CONTROLLER_POLICY_FILE_LOCATION, new Properties()); - for (Map.Entry propEntry : policyPreferencesProps.entrySet()) { - policyPreferences.put(propEntry.getKey().toString(), propEntry.getValue().toString()); - } - - return policyPreferences; - } - - protected static String serializeModelToJson(Object model) throws JsonProcessingException { - return objectMapper.writeValueAsString(model); - } -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java deleted file mode 100644 index e30a1ca..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/BaseAnalyticsCDAPTCAUnitTest.java +++ /dev/null @@ -1,294 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca; - -import co.cask.cdap.api.flow.flowlet.AbstractFlowlet; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import co.cask.cdap.internal.flow.DefaultFlowletConfigurer; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Suppliers; -import org.junit.Assert; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; -import org.openecomp.dcae.apod.analytics.model.util.AnalyticsModelIOUtils; -import org.openecomp.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 10/25/2016. - */ -public abstract class BaseAnalyticsCDAPTCAUnitTest extends BaseDCAEAnalyticsUnitTest { - - /** - * Object mapper to be used for all TCA Json Parsing - */ - protected static final ObjectMapper ANALYTICS_MODEL_OBJECT_MAPPER = - Suppliers.memoize(new AnalyticsModelObjectMapperSupplier()).get(); - - protected static final String TCA_POLICY_JSON_FILE_LOCATION = "data/json/policy/tca_policy.json"; - protected static final String CEF_MESSAGES_JSON_FILE_LOCATION = "data/json/cef/cef_messages.json"; - protected static final String CEF_MESSAGE_JSON_FILE_LOCATION = "data/json/cef/cef_message.json"; - protected static final String CEF_MESSAGE_WITH_THRESHOLD_VIOLATION_JSON_FILE_LOCATION = - "data/json/cef/cef_message_with_threshold_violation.json"; - protected static final String TCA_APP_CONFIG_FILE_LOCATION = "data/json/config/controller_app_config.json"; - protected static final String TCA_ALERT_JSON_FILE_LOCATION = "data/json/facade/tca_ves_cef_response.json"; - - - protected static final String TCA_CONTROLLER_POLICY_FILE_LOCATION = - "data/properties/tca_controller_policy.properties"; - - protected static final String TCA_CONTROLLER_POLICY_FROM_JSON_FILE_LOCATION = - "data/properties/tca_controller_policy_from_json.properties"; - - - protected static final String TCA_TEST_APP_CONFIG_NAME = "testTCAAppName"; - protected static final String TCA_TEST_APP_CONFIG_DESCRIPTION = "testTCAAppDescription"; - protected static final String TCA_TEST_APP_CONFIG_SUBSCRIBER_OUTPUT_STREAM_NAME = - "testTcaSubscriberOutputStreamName"; - protected static final String TCA_TEST_APP_CONFIG_VES_ALERT_TABLE_NAME = "testTcaVESAlertsTableName"; - protected static final String TCA_TEST_APP_CONFIG_VES_MESSAGE_STATUS_TABLE_NAME = - "testTcaVESMessageStatusTableName"; - - - /** - * Provides TCA Policy that can be used for testing - * - * @return test TCA Policy Object - */ - protected static TCAPolicy getSampleTCAPolicy() { - return deserializeJsonFileToModel(TCA_POLICY_JSON_FILE_LOCATION, TCAPolicy.class); - } - - /** - * Provides TCA Policy that can be used for testing - * - * @return test {@link TCAPolicyPreferences} - */ - protected static TCAPolicyPreferences getSampleTCAPolicyPreferences() { - return deserializeJsonFileToModel(TCA_POLICY_JSON_FILE_LOCATION, TCAPolicyPreferences.class); - } - - /** - * Provides list containing 350 CEF messages - * - * @return CEF Test Message - * - * @throws Exception Exception - */ - protected static List getCEFMessages() throws Exception { - final String cefMessageAsString = fromStream(CEF_MESSAGES_JSON_FILE_LOCATION); - final TypeReference> eventListenerListTypeReference = - new TypeReference>() { - }; - return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(cefMessageAsString, eventListenerListTypeReference); - } - - /** - * Provides 1 valid CEF messages which does not violate Threshold as String - * - * @return CEF Test Message String - * - * @throws Exception Exception - */ - protected static String getValidCEFMessage() throws Exception { - return fromStream(CEF_MESSAGE_JSON_FILE_LOCATION); - } - - - /** - * Provides single CEF Test Message - * - * @return CEF Test Message - * - * @throws Exception Exception - */ - protected static EventListener getCEFEventListener() throws Exception { - final String cefMessageAsString = fromStream(CEF_MESSAGE_JSON_FILE_LOCATION); - return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(cefMessageAsString, EventListener.class); - } - - /** - * Deserialize given Json file location to given model class and returns it back without any validation check - * - * @param jsonFileLocation Classpath location of the json file - * @param modelClass Model Class type - * @param Json Model Type - * - * @return Json model object - */ - public static T deserializeJsonFileToModel(String jsonFileLocation, Class modelClass) { - final InputStream jsonFileInputStream = - BaseDCAEAnalyticsUnitTest.class.getClassLoader().getResourceAsStream(jsonFileLocation); - Assert.assertNotNull("Json File Location must be valid", jsonFileInputStream); - try { - return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(jsonFileInputStream, modelClass); - } catch (IOException ex) { - LOG.error("Error while doing assert Json for fileLocation: {}, modelClass: {}, Exception {}", - jsonFileLocation, modelClass, ex); - throw new RuntimeException(ex); - } finally { - try { - jsonFileInputStream.close(); - } catch (IOException e) { - LOG.error("Error while closing input stream at file location: {}", jsonFileLocation); - throw new RuntimeException(e); - } - } - } - - protected static TCATestAppConfig getTCATestAppConfig() { - final TCATestAppConfig tcaAppConfig = new TCATestAppConfig(); - tcaAppConfig.setAppName(TCA_TEST_APP_CONFIG_NAME); - tcaAppConfig.setAppDescription(TCA_TEST_APP_CONFIG_DESCRIPTION); - tcaAppConfig.setTcaSubscriberOutputStreamName(TCA_TEST_APP_CONFIG_SUBSCRIBER_OUTPUT_STREAM_NAME); - tcaAppConfig.setTcaVESAlertsTableName(TCA_TEST_APP_CONFIG_VES_ALERT_TABLE_NAME); - tcaAppConfig.setTcaVESMessageStatusTableName(TCA_TEST_APP_CONFIG_VES_MESSAGE_STATUS_TABLE_NAME); - return tcaAppConfig; - } - - /** - * Provides a test application preference for unit testing - * - * @return tca app preferences - */ - protected static TCATestAppPreferences getTCATestAppPreferences() { - final TCATestAppPreferences tcaTestAppPreferences = new TCATestAppPreferences(); - tcaTestAppPreferences.setSubscriberHostName("SUBSCRIBER_HOST_NAME"); - tcaTestAppPreferences.setSubscriberHostPortNumber(10000); - tcaTestAppPreferences.setSubscriberTopicName("SUBSCRIBER_TOPIC_NAME"); - tcaTestAppPreferences.setSubscriberUserName("SUBSCRIBER_USERNAME"); - tcaTestAppPreferences.setSubscriberUserPassword("SUBSCRIBER_PASSWORD"); - tcaTestAppPreferences.setSubscriberProtocol("https"); - tcaTestAppPreferences.setSubscriberContentType("application/json"); - tcaTestAppPreferences.setSubscriberConsumerId("SUBSCRIBER_CONSUMER_ID"); - tcaTestAppPreferences.setSubscriberConsumerGroup("SUBSCRIBER_CONSUMER_GROUP_NAME"); - tcaTestAppPreferences.setSubscriberTimeoutMS(10); - tcaTestAppPreferences.setSubscriberMessageLimit(100); - tcaTestAppPreferences.setSubscriberPollingInterval(1000); - - tcaTestAppPreferences.setPublisherHostName("PUBLISHER_HOST_NAME"); - tcaTestAppPreferences.setPublisherHostPort(1234); - tcaTestAppPreferences.setPublisherTopicName("PUBLISHER_TOPIC_NAME"); - tcaTestAppPreferences.setPublisherUserName("PUBLISHER_USERNAME"); - tcaTestAppPreferences.setPublisherUserPassword("PUBLISHER_PASSWORD"); - tcaTestAppPreferences.setPublisherProtocol("https"); - tcaTestAppPreferences.setPublisherContentType("application/json"); - tcaTestAppPreferences.setPublisherMaxBatchSize(100); - tcaTestAppPreferences.setPublisherMaxRecoveryQueueSize(100); - tcaTestAppPreferences.setPublisherPollingInterval(6000); - - tcaTestAppPreferences.setEnableAAIEnrichment(true); - tcaTestAppPreferences.setAaiEnrichmentHost("AAI_ENRICHMENT_HOST"); - tcaTestAppPreferences.setAaiEnrichmentPortNumber(8443); - tcaTestAppPreferences.setAaiEnrichmentProtocol("https"); - tcaTestAppPreferences.setAaiEnrichmentUserName("AAI_USERNAME"); - tcaTestAppPreferences.setAaiEnrichmentUserPassword("AAI_USERPASSWORD"); - tcaTestAppPreferences.setAaiEnrichmentIgnoreSSLCertificateErrors(true); - tcaTestAppPreferences.setAaiVMEnrichmentAPIPath("VM_ENRICHMENT_PATH"); - tcaTestAppPreferences.setAaiVNFEnrichmentAPIPath("VNF_ENRICHMENT_PATH"); - return tcaTestAppPreferences; - } - - protected static Map getPreferenceMap() { - Map preference = new HashMap<>(); - preference.put("subscriberHostName", "mrlocal-mtnjftle01.homer.com"); - preference.put("subscriberHostPort", "3905"); - preference.put("subscriberTopicName", "com.dcae.dmaap.mtnje2.DcaeTestVESPub"); - preference.put("subscriberProtocol", "https"); - preference.put("subscriberUserName", "USER"); - preference.put("subscriberUserPassword", "PASSWORD"); - preference.put("subscriberContentType", "application/json"); - preference.put("subscriberConsumerId", "123"); - preference.put("subscriberConsumerGroup", "testTCAConsumerName-123"); - preference.put("subscriberTimeoutMS", "-1"); - preference.put("subscriberMessageLimit", "-1"); - preference.put("subscriberPollingInterval", "30000"); - - preference.put("publisherHostName", "publisherHostName"); - preference.put("publisherHostPort", "3905"); - preference.put("publisherTopicName", "publisherTopicName"); - preference.put("publisherProtocol", "https"); - preference.put("publisherUserName", "publisherUserName"); - preference.put("publisherContentType", "application/json"); - preference.put("publisherMaxBatchSize", "1000"); - preference.put("publisherMaxRecoveryQueueSize", "100"); - preference.put("publisherPollingInterval", "6000"); - return preference; - } - - protected static void assertFlowletNameAndDescription( - final String expectedName, final String expectedDescription, final T flowlet) { - final DefaultFlowletConfigurer defaultFlowletConfigurer = - new DefaultFlowletConfigurer(flowlet); - flowlet.configure(defaultFlowletConfigurer); - - final String flowletName = getPrivateFiledValue(defaultFlowletConfigurer, "name", String.class); - final String flowletDescription = - getPrivateFiledValue(defaultFlowletConfigurer, "description", String.class); - - assertThat("Flowlet name must match with CDAPComponentsConstants", - flowletName, is(expectedName)); - - assertThat("Flowlet description must match with CDAPComponentsConstants", - flowletDescription, is(expectedDescription)); - - } - - protected static FlowletContext getTestFlowletContextWithValidPolicy() { - return createNewFlowletContextFromPropertiesFile(TCA_CONTROLLER_POLICY_FILE_LOCATION); - } - - protected static FlowletContext getTestFlowletContextWithValidPolicyFromJSON() { - return createNewFlowletContextFromPropertiesFile(TCA_CONTROLLER_POLICY_FROM_JSON_FILE_LOCATION); - } - - private static FlowletContext createNewFlowletContextFromPropertiesFile(final String propertyFileLocation) { - final Properties controllerProperties = - AnalyticsModelIOUtils.loadPropertiesFile(propertyFileLocation, new Properties()); - - Map runtimeArgs = new LinkedHashMap<>(); - for (Map.Entry property : controllerProperties.entrySet()) { - runtimeArgs.put(property.getKey().toString(), property.getValue().toString()); - } - - final FlowletContext flowletContext = mock(FlowletContext.class); - when(flowletContext.getRuntimeArguments()).thenReturn(runtimeArgs); - return flowletContext; - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java deleted file mode 100644 index c5df58f..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/TCAAnalyticsApplicationTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca; - -import co.cask.cdap.app.DefaultApplicationContext; -import co.cask.cdap.app.MockAppConfigurer; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 1/12/2017. - */ -public class TCAAnalyticsApplicationTest extends BaseAnalyticsCDAPTCAUnitTest { - - @Test - public void testConfigure() throws Exception { - final TCAAnalyticsApplication tcaAnalyticsApplication = new TCAAnalyticsApplication(); - MockAppConfigurer mockAppConfigurer = new MockAppConfigurer(tcaAnalyticsApplication); - final DefaultApplicationContext applicationContext = - new DefaultApplicationContext(getTCATestAppConfig()); - tcaAnalyticsApplication.configure(mockAppConfigurer, applicationContext); - assertThat(TCA_TEST_APP_CONFIG_NAME, is(mockAppConfigurer.getName())); - } - - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java deleted file mode 100644 index 145c396..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flow/TCAVESCollectorFlowTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flow; - -import co.cask.cdap.AllProgramsApp; -import co.cask.cdap.api.flow.FlowletConnection; -import co.cask.cdap.api.flow.FlowletDefinition; -import co.cask.cdap.internal.app.runtime.flow.DefaultFlowConfigurer; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 1/12/2017. - */ -public class TCAVESCollectorFlowTest extends BaseAnalyticsCDAPTCAUnitTest { - - @Test - @SuppressWarnings("unchecked") - public void testConfigure() throws Exception { - - final TCAVESCollectorFlow tcavesCollectorFlow = new TCAVESCollectorFlow(getTCATestAppConfig()); - final DefaultFlowConfigurer configurer = new DefaultFlowConfigurer(new AllProgramsApp.NoOpFlow()); - tcavesCollectorFlow.configure(configurer); - final String flowName = getPrivateFiledValue(configurer, "name", String.class); - final String flowDescription = getPrivateFiledValue(configurer, "description", String.class); - - assertThat("TCAVESCollectorFlow Name must match with what is defined in CDAPComponents Constants", - flowName, is(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_NAME_FLOW)); - - assertThat("TCAVESCollectorFlow Description must match with what is defined in CDAPComponents Constants", - flowDescription, is(CDAPComponentsConstants.TCA_FIXED_VES_COLLECTOR_DESCRIPTION_FLOW)); - - final Map flowlets = - (Map) getPrivateFiledValue(configurer, "flowlets", HashMap.class); - - assertThat("TCAVESCollector must contain all TCA VES flowlets", flowlets.keySet(), - containsInAnyOrder(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_AAI_ENRICHMENT_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET)); - - final List connections = - (List) getPrivateFiledValue(configurer, "connections", ArrayList.class); - - assertThat("There must be four connections in VES Collector Flow", connections.size(), is(5)); - - } - - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java deleted file mode 100644 index e0c6d06..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsAbatementFlowletTest.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import co.cask.cdap.api.flow.flowlet.OutputEmitter; -import com.google.common.collect.ImmutableList; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementEntity; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; -import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils; - -import java.util.Date; -import java.util.List; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 9/12/2017. - */ -@SuppressWarnings("unchecked") -public class TCAVESAlertsAbatementFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { - - private static final TCAPolicyPreferences sampleTCAPolicyPreferences = getSampleTCAPolicyPreferences(); - private static final List metricsPerEventNames = sampleTCAPolicyPreferences - .getMetricsPerEventName(); - private final OutputEmitter mockOutputEmitter = mock(OutputEmitter.class); - - private class TestTCAVESAlertsAbatementFlowlet extends TCAVESAlertsAbatementFlowlet { - - public TestTCAVESAlertsAbatementFlowlet(String tcaAlertsAbatementTableName) { - super(tcaAlertsAbatementTableName); - this.alertsAbatementOutputEmitter = mockOutputEmitter; - doNothing().when(mockOutputEmitter).emit(any(String.class)); - } - } - - @Test - public void testConfigure() throws Exception { - final TCAVESAlertsAbatementFlowlet tcavesAlertsAbatementFlowlet = - new TCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); - assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET, - tcavesAlertsAbatementFlowlet); - } - - @Test(expected = CDAPSettingsException.class) - public void testDetermineAbatementAlertsWhenViolatedMetricsEventNameIsBlank() throws Exception { - - final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = - new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); - final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET); - final ThresholdCalculatorOutput mockThresholdCalculatorOutput = - getMockThresholdCalculatorOutput(violatedThreshold); - when(mockThresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn(""); - - tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); - } - - @Test - public void testDetermineAbatementAlertsWhenControlLoopTypeIsONSET() throws Exception { - - final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; - final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = - new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); - - final FlowletContext mockFlowletContext = mock(FlowletContext.class); - final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); - when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); - tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); - - doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - - final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET); - final ThresholdCalculatorOutput mockThresholdCalculatorOutput = - getMockThresholdCalculatorOutput(violatedThreshold); - - tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); - verify(mockObjectMappedTable, - times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - verify(mockOutputEmitter, times(1)).emit(any(String.class)); - - } - - - @Test - public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousAlertWasSent() throws Exception { - - final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; - final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = - new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); - - final FlowletContext mockFlowletContext = mock(FlowletContext.class); - final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); - when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); - tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); - - doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class); - when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity); - when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(null); - - final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED); - final ThresholdCalculatorOutput mockThresholdCalculatorOutput = - getMockThresholdCalculatorOutput(violatedThreshold); - - tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); - verify(mockObjectMappedTable, - times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - verify(mockOutputEmitter, times(1)).emit(any(String.class)); - - } - - @Test - public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndPreviousAlertWasAlreadySent() throws - Exception { - - final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; - final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = - new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); - - final FlowletContext mockFlowletContext = mock(FlowletContext.class); - final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); - when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); - tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); - - doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class); - when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity); - final long time = new Date().getTime(); - when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(Long.toString(time)); - - final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED); - final ThresholdCalculatorOutput mockThresholdCalculatorOutput = - getMockThresholdCalculatorOutput(violatedThreshold); - - tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); - verify(mockObjectMappedTable, - times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - verify(mockOutputEmitter, times(0)).emit(any(String.class)); - - } - - - @Test - public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousONSETEventFound() throws - Exception { - - final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName"; - final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = - new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); - - final FlowletContext mockFlowletContext = mock(FlowletContext.class); - final ObjectMappedTable mockObjectMappedTable = mock(ObjectMappedTable.class); - when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable); - tcaAlertsAbatementFlowlet.initialize(mockFlowletContext); - - doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - when(mockObjectMappedTable.read(any(String.class))).thenReturn(null); - - final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED); - final ThresholdCalculatorOutput mockThresholdCalculatorOutput = - getMockThresholdCalculatorOutput(violatedThreshold); - - tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); - verify(mockObjectMappedTable, - times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class)); - verify(mockOutputEmitter, times(0)).emit(any(String.class)); - - } - - @Test(expected = CDAPSettingsException.class) - public void testDetermineAbatementAlertsWhenControlLoopTypeIsNotOnsetOrAbated() throws - Exception { - final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet = - new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName"); - final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.CONTINUE); - final ThresholdCalculatorOutput mockThresholdCalculatorOutput = - getMockThresholdCalculatorOutput(violatedThreshold); - - tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput); - - } - - private static Threshold getViolatedThreshold(final ClosedLoopEventStatus closedLoopEventStatus) { - final Threshold violatedThreshold = Threshold.copy(metricsPerEventNames.get(0).getThresholds().get(0)); - violatedThreshold.setClosedLoopEventStatus(closedLoopEventStatus); - return violatedThreshold; - } - - - private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final Threshold violatedThreshold) throws - Exception { - - final MetricsPerEventName violatedMetricsPerEventName = - MetricsPerEventName.copy(metricsPerEventNames.get(0)); - violatedMetricsPerEventName.setThresholds(ImmutableList.of(violatedThreshold)); - return getMockThresholdCalculatorOutput( - fromStream(CEF_MESSAGE_JSON_FILE_LOCATION), - fromStream(TCA_POLICY_JSON_FILE_LOCATION), - TCAUtils.writeValueAsString(violatedMetricsPerEventName), - fromStream(TCA_ALERT_JSON_FILE_LOCATION) - ); - } - - - private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final String cefMessage, - final String tcaPolicy, - final String violatedMetricsPerEventName, - final String alertMessage) { - final ThresholdCalculatorOutput thresholdCalculatorOutput = mock(ThresholdCalculatorOutput.class); - when(thresholdCalculatorOutput.getCefMessage()).thenReturn(cefMessage); - when(thresholdCalculatorOutput.getTcaPolicy()).thenReturn(tcaPolicy); - when(thresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn(violatedMetricsPerEventName); - when(thresholdCalculatorOutput.getAlertMessage()).thenReturn(alertMessage); - return thresholdCalculatorOutput; - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java deleted file mode 100644 index 8be0b87..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESAlertsSinkFlowletTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; - -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/16/2016. - */ -public class TCAVESAlertsSinkFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { - - - @Test - public void testConfigure() throws Exception { - final TCAVESAlertsSinkFlowlet tcavesAlertsSinkFlowlet = - new TCAVESAlertsSinkFlowlet("testTCAVESAlertTableName"); - assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_SINK_DESCRIPTION_FLOWLET, tcavesAlertsSinkFlowlet); - } - - @SuppressWarnings("unchecked") - @Test - public void saveAlerts() throws Exception { - - final String testAlertTableName = "testTCAVESAlertTableName"; - - final TCAVESAlertsSinkFlowlet tcavesAlertsSinkFlowlet = new TCAVESAlertsSinkFlowlet(testAlertTableName); - - final FlowletContext mockFlowletContext = Mockito.mock(FlowletContext.class); - final ObjectMappedTable mockObjectMappedTable = Mockito.mock(ObjectMappedTable.class); - when(mockFlowletContext.getDataset(eq(testAlertTableName))).thenReturn(mockObjectMappedTable); - tcavesAlertsSinkFlowlet.initialize(mockFlowletContext); - final ObjectMappedTable tcaVESAlertsTableName = - getPrivateFiledValue(tcavesAlertsSinkFlowlet, "tcaVESAlertsTable", ObjectMappedTable.class); - assertTrue(tcaVESAlertsTableName == mockObjectMappedTable); - - doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAVESAlertEntity.class)); - final String testAlertMessage = "testMessage"; - tcavesAlertsSinkFlowlet.saveAlerts(testAlertMessage); - - verify(mockObjectMappedTable, - times(1)).write(any(String.class), any(TCAVESAlertEntity.class)); - - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java deleted file mode 100644 index 332f9dd..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESMessageRouterFlowletTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.flow.flowlet.OutputEmitter; -import co.cask.cdap.api.flow.flowlet.StreamEvent; -import com.google.common.base.Charsets; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - -import java.nio.ByteBuffer; - -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/19/2016. - */ -public class TCAVESMessageRouterFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { - - private static final String TEST_MESSAGE = "test message"; - private final OutputEmitter mockOutputEmitter = Mockito.mock(OutputEmitter.class); - - private class TCATestVESMessageRouterFlowlet extends TCAVESMessageRouterFlowlet { - - @SuppressWarnings("unchecked") - public TCATestVESMessageRouterFlowlet() { - this.vesMessageEmitter = mockOutputEmitter; - doNothing().when(mockOutputEmitter).emit(eq(TEST_MESSAGE), - eq(AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY), - eq(TEST_MESSAGE.hashCode())); - } - } - - @Test - public void testConfigure() throws Exception { - final TCAVESMessageRouterFlowlet tcavesMessageRouterFlowlet = new TCAVESMessageRouterFlowlet(); - assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_ROUTER_DESCRIPTION_FLOWLET, tcavesMessageRouterFlowlet); - } - - @SuppressWarnings("unchecked") - @Test - public void routeVESMessage() throws Exception { - final TCATestVESMessageRouterFlowlet tcavesMessageRouterFlowlet = new TCATestVESMessageRouterFlowlet(); - final StreamEvent mockStreamEvent = Mockito.mock(StreamEvent.class); - final ByteBuffer testMessage = Charsets.UTF_8.encode(TEST_MESSAGE); - when(mockStreamEvent.getBody()).thenReturn(testMessage); - tcavesMessageRouterFlowlet.routeVESMessage(mockStreamEvent); - verify(mockOutputEmitter, - times(1)).emit(eq(TEST_MESSAGE), - eq(AnalyticsConstants.TCA_VES_MESSAGE_ROUTER_PARTITION_KEY), - eq(TEST_MESSAGE.hashCode())); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java deleted file mode 100644 index 95b2d83..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/flowlet/TCAVESThresholdViolationCalculatorFlowletTest.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet; - -import co.cask.cdap.api.app.ApplicationSpecification; -import co.cask.cdap.api.dataset.lib.ObjectMappedTable; -import co.cask.cdap.api.flow.flowlet.FlowletContext; -import co.cask.cdap.api.flow.flowlet.OutputEmitter; -import co.cask.cdap.api.metrics.Metrics; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAMessageStatusEntity; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.utils.CDAPTCAUtils; -import org.openecomp.dcae.apod.analytics.model.domain.cef.EventListener; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/19/2016. - */ -@SuppressWarnings("unchecked") -public class TCAVESThresholdViolationCalculatorFlowletTest extends BaseAnalyticsCDAPTCAUnitTest { - - private static final String messageStatusTableName = "TEST_MESSAGE_STATUS_TABLE"; - - private TCAVESThresholdViolationCalculatorFlowlet violationCalculatorFlowlet; - private Metrics metrics; - private OutputEmitter outputEmitter; - private ObjectMappedTable vesMessageStatusTable; - - private static class TCATestVESThresholdViolationCalculatorFlowlet extends - TCAVESThresholdViolationCalculatorFlowlet { - public TCATestVESThresholdViolationCalculatorFlowlet( - final String messageStatusTableName, - final OutputEmitter tcaAlertOutputEmitter, - ObjectMappedTable vesMessageStatusTable, - Metrics metrics) { - super(messageStatusTableName); - this.tcaAlertOutputEmitter = tcaAlertOutputEmitter; - this.metrics = metrics; - } - } - - @Before - public void before() { - violationCalculatorFlowlet = new TCAVESThresholdViolationCalculatorFlowlet(messageStatusTableName); - vesMessageStatusTable = Mockito.mock(ObjectMappedTable.class); - outputEmitter = Mockito.mock(OutputEmitter.class); - metrics = Mockito.mock(Metrics.class); - } - - @Test - public void testConfigure() throws Exception { - assertFlowletNameAndDescription( - CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_NAME_FLOWLET, - CDAPComponentsConstants.TCA_FIXED_VES_THRESHOLD_VIOLATION_CALCULATOR_DESCRIPTION_FLOWLET, - violationCalculatorFlowlet); - } - - @Test - public void testInitialize() throws Exception { - final FlowletContext mockFlowletContext = initializeFlowlet(violationCalculatorFlowlet, vesMessageStatusTable); - verify(mockFlowletContext, times(1)).getDataset(anyString()); - } - - @Test - public void testFilterVESMessagesWhenVESMessageIsInApplicable() throws Exception { - final TCATestVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = - createTestViolationCalculator(vesMessageStatusTable, outputEmitter, metrics); - initializeFlowlet(thresholdViolationCalculatorFlowlet, vesMessageStatusTable); - thresholdViolationCalculatorFlowlet.filterVESMessages("inapplicable"); - verify(vesMessageStatusTable, times(1)).write(anyString(), - any(TCAMessageStatusEntity.class)); - } - - @Test - public void testFilterVESMessagesWhenVESMessageIsCompliant() throws Exception { - final TCATestVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = - createTestViolationCalculator(vesMessageStatusTable, outputEmitter, metrics); - initializeFlowlet(thresholdViolationCalculatorFlowlet, vesMessageStatusTable); - thresholdViolationCalculatorFlowlet.filterVESMessages(getValidCEFMessage()); - verify(vesMessageStatusTable, times(1)).write(anyString(), - any(TCAMessageStatusEntity.class)); - } - - @Test - public void testFilterVESMessagesWhenVESMessageNonCompliant() throws Exception { - final TCATestVESThresholdViolationCalculatorFlowlet thresholdViolationCalculatorFlowlet = - createTestViolationCalculator(vesMessageStatusTable, outputEmitter, metrics); - final FlowletContext flowletContext = - initializeFlowlet(thresholdViolationCalculatorFlowlet, vesMessageStatusTable); - final TCAPolicy policy = CDAPTCAUtils.getValidatedTCAPolicyPreferences(flowletContext); - final Threshold threshold = policy.getMetricsPerEventName().get(0).getThresholds().get(0); - final Long thresholdValue = threshold.getThresholdValue(); - final EventListener thresholdViolatingMessage = getCEFEventListener(); - thresholdViolatingMessage.getEvent().getMeasurementsForVfScalingFields().getVNicPerformanceArray(). - get(0).setReceivedBroadcastPacketsAccumulated(thresholdValue - 1); - thresholdViolationCalculatorFlowlet.filterVESMessages( - ANALYTICS_MODEL_OBJECT_MAPPER.writeValueAsString(thresholdViolatingMessage)); - verify(vesMessageStatusTable, times(1)).write(anyString(), - any(TCAMessageStatusEntity.class)); - verify(outputEmitter, times(1)).emit(any(ThresholdCalculatorOutput.class)); - } - - private static TCATestVESThresholdViolationCalculatorFlowlet createTestViolationCalculator( - final ObjectMappedTable vesMessageStatusTable, - final OutputEmitter outputEmitter, final Metrics metrics) { - doNothing().when(outputEmitter).emit(anyString()); - doNothing().when(metrics).count(anyString(), anyInt()); - doNothing().when(vesMessageStatusTable).write(anyString(), any(TCAMessageStatusEntity.class)); - return new TCATestVESThresholdViolationCalculatorFlowlet(messageStatusTableName, outputEmitter, - vesMessageStatusTable, metrics); - } - - private static FlowletContext initializeFlowlet( - T calculatorFlowlet, ObjectMappedTable vesMessageStatusTable) throws Exception { - final FlowletContext mockFlowletContext = getTestFlowletContextWithValidPolicy(); - when(mockFlowletContext.getDataset(anyString())).thenReturn(vesMessageStatusTable); - when(mockFlowletContext.getInstanceId()).thenReturn(1); - ApplicationSpecification mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); - when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); - when(mockFlowletContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); - when(mockApplicationSpecification.getName()).thenReturn("TestTCAAppName"); - try { - calculatorFlowlet.initialize(mockFlowletContext); - return mockFlowletContext; - } catch (Exception e) { - LOG.error("error while flowlet initialization"); - throw new RuntimeException(e); - } - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java deleted file mode 100644 index f1c7ca3..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/it/TCAnalyticsAppConfigIT.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.it; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAIT; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfigHolder; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; - -/** - * @author Rajiv Singla . Creation Date: 10/25/2016. - */ -public class TCAnalyticsAppConfigIT extends BaseAnalyticsCDAPTCAIT { - - - @Test - public void createTestAppConfigJson() throws Exception { - final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); - final TCATestAppConfigHolder appConfigHolder = new TCATestAppConfigHolder(tcaTestAppConfig); - final String appConfigJson = serializeModelToJson(appConfigHolder); - LOG.info("AppConfigJson: \n{}", appConfigJson); - writeToOutputTextFile("appSettings/tca_app_config.json", appConfigJson, TCAnalyticsAppConfigIT.class); - } - - @Test - public void createTestAppPreferencesJson() throws Exception { - final TCATestAppPreferences tcaTestAppPreferences = getTCATestAppPreferences(); - final String appPreferencesJson = serializeModelToJson(tcaTestAppPreferences); - LOG.info("AppPreferences: \n{}", appPreferencesJson); - writeToOutputTextFile("appSettings/tca_app_preferences.json", - appPreferencesJson, TCAnalyticsAppConfigIT.class); - } -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java deleted file mode 100644 index 1608803..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfig.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.settings; - -/** - * TCA Test App Config is used for testing purposes only - * - * @author Rajiv Singla . Creation Date: 11/3/2016. - */ -public class TCATestAppConfig extends TCAAppConfig { - - public void setAppName(String appName) { - this.appName = appName; - } - - public void setAppDescription(String appDescription) { - this.appDescription = appDescription; - } - - public void setTcaSubscriberOutputStreamName(String tcaSubscriberOutputStreamName) { - this.tcaSubscriberOutputStreamName = tcaSubscriberOutputStreamName; - } - - public void setThresholdCalculatorFlowletInstances(Integer thresholdCalculatorFlowletInstances) { - this.thresholdCalculatorFlowletInstances = thresholdCalculatorFlowletInstances; - } - - public void setTcaVESMessageStatusTableName(String tcaVESMessageStatusTableName) { - this.tcaVESMessageStatusTableName = tcaVESMessageStatusTableName; - } - - public void setTcaVESMessageStatusTableTTLSeconds(Integer tcaVESMessageStatusTableTTLSeconds) { - this.tcaVESMessageStatusTableTTLSeconds = tcaVESMessageStatusTableTTLSeconds; - } - - public void setTcaVESAlertsTableName(String tcaVESAlertsTableName) { - this.tcaVESAlertsTableName = tcaVESAlertsTableName; - } - - public void setTcaVESAlertsTableTTLSeconds(Integer tcaVESAlertsTableTTLSeconds) { - this.tcaVESAlertsTableTTLSeconds = tcaVESAlertsTableTTLSeconds; - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java deleted file mode 100644 index 39e673f..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppConfigHolder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.settings; - -/** - * Holder for TCA Test App Config - * - * @author Rajiv Singla . Creation Date: 11/3/2016. - */ -public class TCATestAppConfigHolder { - - private final TCATestAppConfig config; - - public TCATestAppConfigHolder(TCATestAppConfig config) { - this.config = config; - } - - public TCATestAppConfig getConfig() { - return config; - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java deleted file mode 100644 index e129775..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferences.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.settings; - - -import com.fasterxml.jackson.annotation.JsonAnyGetter; - -import java.util.Map; - -/** - * TCA Test App Preferences are used for testing purposes only - * - * @author Rajiv Singla . Creation Date: 11/3/2016. - */ -public class TCATestAppPreferences extends TCAAppPreferences { - - private Map policyPreferences; - - public TCATestAppPreferences() { - } - - public TCATestAppPreferences(final Map policyPreferences) { - this.policyPreferences = policyPreferences; - } - - @JsonAnyGetter - public Map getPolicyPreferences() { - return policyPreferences; - } - - public void setSubscriberHostName(String subscriberHostName) { - this.subscriberHostName = subscriberHostName; - } - - public void setSubscriberHostPortNumber(Integer subscriberHostPort) { - this.subscriberHostPort = subscriberHostPort; - } - - public void setSubscriberTopicName(String subscriberTopicName) { - this.subscriberTopicName = subscriberTopicName; - } - - public void setSubscriberProtocol(String subscriberProtocol) { - this.subscriberProtocol = subscriberProtocol; - } - - public void setSubscriberUserName(String subscriberUserName) { - this.subscriberUserName = subscriberUserName; - } - - public void setSubscriberUserPassword(String subscriberUserPassword) { - this.subscriberUserPassword = subscriberUserPassword; - } - - public void setSubscriberContentType(String subscriberContentType) { - this.subscriberContentType = subscriberContentType; - } - - public void setSubscriberConsumerId(String subscriberConsumerId) { - this.subscriberConsumerId = subscriberConsumerId; - } - - public void setSubscriberConsumerGroup(String subscriberConsumerGroup) { - this.subscriberConsumerGroup = subscriberConsumerGroup; - } - - public void setSubscriberTimeoutMS(Integer subscriberTimeoutMS) { - this.subscriberTimeoutMS = subscriberTimeoutMS; - } - - public void setSubscriberMessageLimit(Integer subscriberMessageLimit) { - this.subscriberMessageLimit = subscriberMessageLimit; - } - - public void setSubscriberPollingInterval(Integer subscriberPollingInterval) { - this.subscriberPollingInterval = subscriberPollingInterval; - } - - public void setPublisherHostName(String publisherHostName) { - this.publisherHostName = publisherHostName; - } - - public void setPublisherHostPort(Integer publisherHostPort) { - this.publisherHostPort = publisherHostPort; - } - - public void setPublisherTopicName(String publisherTopicName) { - this.publisherTopicName = publisherTopicName; - } - - public void setPublisherProtocol(String publisherProtocol) { - this.publisherProtocol = publisherProtocol; - } - - public void setPublisherUserName(String publisherUserName) { - this.publisherUserName = publisherUserName; - } - - public void setPublisherUserPassword(String publisherUserPassword) { - this.publisherUserPassword = publisherUserPassword; - } - - public void setPublisherContentType(String publisherContentType) { - this.publisherContentType = publisherContentType; - } - - public void setPublisherMaxBatchSize(Integer publisherMaxBatchSize) { - this.publisherMaxBatchSize = publisherMaxBatchSize; - } - - public void setPublisherMaxRecoveryQueueSize(Integer publisherMaxRecoveryQueueSize) { - this.publisherMaxRecoveryQueueSize = publisherMaxRecoveryQueueSize; - } - - public void setPublisherPollingInterval(Integer publisherPollingInterval) { - this.publisherPollingInterval = publisherPollingInterval; - } - - public void setEnableAlertCEFFormat(Boolean enableAlertCEFFormat) { - this.enableAlertCEFFormat = enableAlertCEFFormat; - } - - public void setEnableAAIEnrichment(Boolean enableAAIEnrichment) { - this.enableAAIEnrichment = enableAAIEnrichment; - } - - public void setAaiEnrichmentHost(String aaiEnrichmentHost) { - this.aaiEnrichmentHost = aaiEnrichmentHost; - } - - public void setAaiEnrichmentPortNumber(Integer aaiEnrichmentPortNumber) { - this.aaiEnrichmentPortNumber = aaiEnrichmentPortNumber; - } - - public void setAaiEnrichmentProtocol(String aaiEnrichmentProtocol) { - this.aaiEnrichmentProtocol = aaiEnrichmentProtocol; - } - - public void setAaiEnrichmentUserName(String aaiEnrichmentUserName) { - this.aaiEnrichmentUserName = aaiEnrichmentUserName; - } - - public void setAaiEnrichmentUserPassword(String aaiEnrichmentUserPassword) { - this.aaiEnrichmentUserPassword = aaiEnrichmentUserPassword; - } - - public void setAaiEnrichmentIgnoreSSLCertificateErrors(Boolean aaiEnrichmentIgnoreSSLCertificateErrors) { - this.aaiEnrichmentIgnoreSSLCertificateErrors = aaiEnrichmentIgnoreSSLCertificateErrors; - } - - public void setAaiVNFEnrichmentAPIPath(String aaiVNFEnrichmentAPIPath) { - this.aaiVNFEnrichmentAPIPath = aaiVNFEnrichmentAPIPath; - } - - public void setAaiVMEnrichmentAPIPath(String aaiVMEnrichmentAPIPath) { - this.aaiVMEnrichmentAPIPath = aaiVMEnrichmentAPIPath; - } -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java deleted file mode 100644 index 4129481..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/settings/TCATestAppPreferencesTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.settings; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; - -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 12/16/2016. - */ -public class TCATestAppPreferencesTest extends BaseAnalyticsCDAPTCAUnitTest { - - @Test - public void testToString() throws Exception { - final TCATestAppPreferences tcaTestAppPreferences = getTCATestAppPreferences(); - assertTrue(tcaTestAppPreferences.toString().contains("subscriberHostName")); - assertTrue(tcaTestAppPreferences.toString().contains("subscriberHostPort")); - assertTrue(tcaTestAppPreferences.toString().contains("publisherHostName")); - assertTrue(tcaTestAppPreferences.toString().contains("publisherHostPort")); - } -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java deleted file mode 100644 index b71fb4d..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToPublisherConfigMapperTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.utils; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -/** - * @author Manjesh Gowda. Creation Date: 11/21/2016. - */ -public class AppPreferencesToPublisherConfigMapperTest extends BaseAnalyticsCDAPTCAUnitTest { - @Test - public void testMapTCAConfigToPublisherConfigFunctionGood() { - DMaaPMRPublisherConfig dMaaPMRPublisherConfig = - (new AppPreferencesToPublisherConfigMapper()).apply(getTCATestAppPreferences()); - assertEquals(dMaaPMRPublisherConfig.getHostName(), "PUBLISHER_HOST_NAME"); - } - - @Test - public void testMapTCAConfigToPublisherConfigFunctionMap() { - DMaaPMRPublisherConfig dMaaPMRPublisherConfig = AppPreferencesToPublisherConfigMapper.map( - getTCATestAppPreferences()); - assertEquals(dMaaPMRPublisherConfig.getHostName(), "PUBLISHER_HOST_NAME"); - } - - @Test - public void testMapTCAConfigToPublisherConfigFunction() { - final TCATestAppPreferences tcaAppPreferences = new TCATestAppPreferences(); - final String publisherHostName = "publisherHostName"; - final String publisherTopicName = "publisherTopicName"; - tcaAppPreferences.setPublisherHostName(publisherHostName); - tcaAppPreferences.setPublisherTopicName(publisherTopicName); - DMaaPMRPublisherConfig dMaaPMRPublisherConfig = - (new AppPreferencesToPublisherConfigMapper()).apply(tcaAppPreferences); - assertTrue(publisherHostName.equals(dMaaPMRPublisherConfig.getHostName())); - assertTrue(publisherTopicName.equals(dMaaPMRPublisherConfig.getTopicName())); - - } -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java deleted file mode 100644 index 4c5c29e..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/AppPreferencesToSubscriberConfigMapperTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.utils; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -/** - * @author Manjesh Gowda. Creation Date: 11/21/2016. - */ -public class AppPreferencesToSubscriberConfigMapperTest extends BaseAnalyticsCDAPTCAUnitTest { - - @Test - public void testMapTCAConfigToSubscriberConfigFunctionGood() { - DMaaPMRSubscriberConfig dMaaPMRSubscriberConfig = - (new AppPreferencesToSubscriberConfigMapper()).apply(getTCATestAppPreferences()); - assertEquals(dMaaPMRSubscriberConfig.getHostName(), "SUBSCRIBER_HOST_NAME"); - } - - @Test - public void testMapTCAConfigToSubscriberConfigFunctionMap() { - DMaaPMRSubscriberConfig dMaaPMRSubscriberConfig = - AppPreferencesToSubscriberConfigMapper.map(getTCATestAppPreferences()); - assertEquals(dMaaPMRSubscriberConfig.getHostName(), "SUBSCRIBER_HOST_NAME"); - } - - @Test - public void testMapTCAConfigToSubscriberConfigFunction() { - final TCATestAppPreferences tcaAppPreferences = new TCATestAppPreferences(); - final String subscriberHostname = "subscriberHostname"; - tcaAppPreferences.setSubscriberHostName(subscriberHostname); - final String subscriberTopicName = "subscriberTopicName"; - tcaAppPreferences.setSubscriberTopicName(subscriberTopicName); - DMaaPMRSubscriberConfig dMaaPMRSubscriberConfig = - (new AppPreferencesToSubscriberConfigMapper()).apply(tcaAppPreferences); - assertTrue(subscriberHostname.equals(dMaaPMRSubscriberConfig.getHostName())); - assertTrue(subscriberTopicName.equals(dMaaPMRSubscriberConfig.getTopicName())); - } -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java deleted file mode 100644 index 7b4f72b..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/utils/CDAPTCAUtilsTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.utils; - -import co.cask.cdap.api.RuntimeContext; -import co.cask.cdap.api.app.ApplicationSpecification; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy; - -import java.util.Map; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 11/9/2016. - */ -public class CDAPTCAUtilsTest extends BaseAnalyticsCDAPTCAUnitTest { - - @Test - public void testGetValidatedTCAAppPreferences() throws Exception { - RuntimeContext runtimeContext = mock(RuntimeContext.class); - final Map preferenceMap = getPreferenceMap(); - preferenceMap.remove("subscriberHostName"); - preferenceMap.remove("publisherHostName"); - when(runtimeContext.getRuntimeArguments()).thenReturn(preferenceMap); - ApplicationSpecification mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); - when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); - when(runtimeContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); - TCAAppPreferences validatedTCAAppPreferences = CDAPTCAUtils.getValidatedTCAAppPreferences(runtimeContext); - assertEquals(validatedTCAAppPreferences.getSubscriberHostName(), "HOSTNAME"); - } - - @Test - public void testConvertRuntimeContextToTCAPolicy() throws Exception { - - final TCAPolicy tcaPolicy = - CDAPTCAUtils.getValidatedTCAPolicyPreferences(getTestFlowletContextWithValidPolicy()); - assertThat("Policy Domain must be measurementsForVfScaling", - tcaPolicy.getDomain(), is("measurementsForVfScaling")); - assertThat("Policy must have 2 metrics per functional roles", - tcaPolicy.getMetricsPerEventName().size(), is(2)); - } - - @Test - public void testConvertRuntimeContextToTCAPolicyFromJSON() throws Exception { - - final TCAPolicy tcaPolicy = - CDAPTCAUtils.getValidatedTCAPolicyPreferences(getTestFlowletContextWithValidPolicyFromJSON()); - assertThat("Policy Domain must be measurementsForVfScaling", - tcaPolicy.getDomain(), is("measurementsForVfScaling")); - assertThat("Policy must have 2 metrics per functional roles", - tcaPolicy.getMetricsPerEventName().size(), is(2)); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java deleted file mode 100644 index 1efa06f..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAAppConfigValidatorTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.validator; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppConfig; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppConfig; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 12/16/2016. - */ -public class TCAAppConfigValidatorTest extends BaseAnalyticsCDAPTCAUnitTest { - - - @Test - public void validateAppSettingsWhenAppConfigIsValid() throws Exception { - final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); - final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); - final GenericValidationResponse validationResponse = - tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); - assertFalse(validationResponse.hasErrors()); - } - - @Test - public void testWhenSubscriberOutputStreamIsNull() throws Exception { - final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); - final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); - tcaTestAppConfig.setTcaSubscriberOutputStreamName(null); - final GenericValidationResponse validationResponse = - tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); - assertTrue(validationResponse.hasErrors()); - } - - @Test - public void testWhenVESMessageStatusTableNameIsNull() throws Exception { - final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); - final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); - tcaTestAppConfig.setTcaVESMessageStatusTableName(null); - final GenericValidationResponse validationResponse = - tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); - assertTrue(validationResponse.hasErrors()); - } - - @Test - public void testWhenVESAlertsTableNameIsNull() throws Exception { - final TCAAppConfigValidator tcaAppConfigValidator = new TCAAppConfigValidator(); - final TCATestAppConfig tcaTestAppConfig = getTCATestAppConfig(); - tcaTestAppConfig.setTcaVESAlertsTableName(null); - final GenericValidationResponse validationResponse = - tcaAppConfigValidator.validateAppSettings(tcaTestAppConfig); - assertTrue(validationResponse.hasErrors()); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java deleted file mode 100644 index 4e37d80..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPolicyPreferencesValidatorTest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.validator; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName; -import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold; - -import java.util.Collections; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 12/16/2016. - */ -public class TCAPolicyPreferencesValidatorTest extends BaseAnalyticsCDAPTCAUnitTest { - - private TCAPolicyPreferencesValidator tcaPolicyPreferencesValidator; - private TCAPolicyPreferences tcaPolicyPreferences; - - @Before - public void before() { - tcaPolicyPreferencesValidator = new TCAPolicyPreferencesValidator(); - tcaPolicyPreferences = getSampleTCAPolicyPreferences(); - } - - @Test - public void testValidateAppSettingsWhenSettingsAreValid() throws Exception { - final GenericValidationResponse validationResponse = - tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); - assertFalse(validationResponse.hasErrors()); - } - - @Test - public void testValidateAppSettingsWhenDomainIsNullAndFunctionRoleIsEmpty() throws Exception { - tcaPolicyPreferences.setDomain(null); - tcaPolicyPreferences.setMetricsPerEventName(Collections.emptyList()); - final GenericValidationResponse validationResponse = - tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); - assertTrue(validationResponse.hasErrors()); - assertTrue(validationResponse.getErrorMessages().size() == 2); - } - - @Test - public void testValidateAppSettingsWhenThresholdIsEmpty() throws Exception { - tcaPolicyPreferences.getMetricsPerEventName().get(0).setThresholds(Collections.emptyList()); - final GenericValidationResponse validationResponse = - tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); - assertTrue(validationResponse.hasErrors()); - assertTrue(validationResponse.getErrorMessages().size() == 1); - } - - @Test - public void testValidateAppSettingsWhenThresholdPathIsMissing() throws Exception { - tcaPolicyPreferences.getMetricsPerEventName().get(0).getThresholds().get(0).setFieldPath(null); - final GenericValidationResponse validationResponse = - tcaPolicyPreferencesValidator.validateAppSettings(tcaPolicyPreferences); - assertTrue(validationResponse.hasErrors()); - assertTrue(validationResponse.getErrorMessages().size() == 1); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java deleted file mode 100644 index 0d15f6f..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/validator/TCAPreferencesValidatorTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.validator; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences; -import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCATestAppPreferences; -import org.openecomp.dcae.apod.analytics.common.validation.GenericValidationResponse; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 12/19/2016. - */ -public class TCAPreferencesValidatorTest extends BaseAnalyticsCDAPTCAUnitTest { - - private TCAPreferencesValidator tcaPreferencesValidator; - private TCATestAppPreferences tcaTestAppPreferences; - - @Before - public void before() { - tcaPreferencesValidator = new TCAPreferencesValidator(); - tcaTestAppPreferences = getTCATestAppPreferences(); - } - - @Test - public void validateAppSettingsWithValidParameters() throws Exception { - final GenericValidationResponse validationResponse = - tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); - assertFalse(validationResponse.hasErrors()); - } - - @Test - public void validateAppSettingsWhenSubscriberHostOrTopicNameIsNotPresent() throws Exception { - tcaTestAppPreferences.setSubscriberHostName(null); - tcaTestAppPreferences.setSubscriberTopicName(null); - final GenericValidationResponse validationResponse = - tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); - assertTrue(validationResponse.hasErrors()); - assertTrue(validationResponse.getErrorMessages().size() == 2); - } - - @Test - public void validateAppSettingsWhenPublisherHostOrTopicNameIsNotPresent() throws Exception { - tcaTestAppPreferences.setPublisherHostName(null); - tcaTestAppPreferences.setPublisherTopicName(null); - final GenericValidationResponse validationResponse = - tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); - assertTrue(validationResponse.hasErrors()); - assertTrue(validationResponse.getErrorMessages().size() == 2); - } - - @Test - public void validateAppSettingsWhenAAIEnrichmentIsEnabledAndAAIRequiredFieldsAreNotPresent() throws Exception { - tcaTestAppPreferences.setEnableAAIEnrichment(true); - tcaTestAppPreferences.setAaiEnrichmentHost(null); - tcaTestAppPreferences.setAaiVMEnrichmentAPIPath(null); - tcaTestAppPreferences.setAaiVNFEnrichmentAPIPath(null); - final GenericValidationResponse validationResponse = - tcaPreferencesValidator.validateAppSettings(tcaTestAppPreferences); - assertTrue(validationResponse.hasErrors()); - assertTrue(validationResponse.getErrorMessages().size() == 3); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java deleted file mode 100644 index 3f13b7f..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/BaseTCADMaaPMRWorkerTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.quartz.Scheduler; - -import java.util.concurrent.atomic.AtomicBoolean; - -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/19/2016. - */ -public class BaseTCADMaaPMRWorkerTest extends BaseAnalyticsCDAPTCAUnitTest { - - private static final String SCHEDULER_NAME = "testSchedulerName"; - - private Scheduler mockScheduler; - private AtomicBoolean mockIsSchedulerShutdown; - private BaseTestTCADMaaPMRWorker baseTestTCADMaaPMRWorker; - - private static class BaseTestTCADMaaPMRWorker extends BaseTCADMaaPMRWorker { - - public BaseTestTCADMaaPMRWorker(final Scheduler scheduler, final AtomicBoolean isSchedulerShutdown) { - this.scheduler = scheduler; - this.isSchedulerShutdown = isSchedulerShutdown; - } - - } - - @Before - public void before() throws Exception { - mockScheduler = mock(Scheduler.class); - mockIsSchedulerShutdown = mock(AtomicBoolean.class); - baseTestTCADMaaPMRWorker = new BaseTestTCADMaaPMRWorker(mockScheduler, mockIsSchedulerShutdown); - when(mockScheduler.getSchedulerName()).thenReturn(SCHEDULER_NAME); - doNothing().when(mockScheduler).start(); - doNothing().when(mockScheduler).shutdown(); - } - - @Test - public void testRun() throws Exception { - createShutdownHookThread(); - baseTestTCADMaaPMRWorker.run(); - verify(mockScheduler, times(1)).start(); - } - - @Test - public void testStop() throws Exception { - baseTestTCADMaaPMRWorker.stop(); - verify(mockScheduler, times(1)).shutdown(); - } - - /** - * A helper thread which shuts down the scheduler after some time - */ - public void createShutdownHookThread() { - new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.yield(); - Thread.sleep(AnalyticsConstants.TCA_DEFAULT_WORKER_SHUTDOWN_CHECK_INTERVAL_MS * 2); - } catch (InterruptedException e) { - LOG.error("Interrupted Exception while running test: {}", e); - throw new RuntimeException(e); - } - mockIsSchedulerShutdown.getAndSet(true); - } - }).start(); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java deleted file mode 100644 index 8028dd4..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRPublisherJobTest.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.TxRunnable; -import co.cask.cdap.api.metrics.Metrics; -import co.cask.cdap.api.worker.WorkerContext; -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentMatchers; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.quartz.JobDataMap; -import org.quartz.JobExecutionContext; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/20/2016. - */ -public class TCADMaaPMRPublisherJobTest extends BaseAnalyticsCDAPTCAUnitTest { - - private JobExecutionContext jobExecutionContext; - private TCADMaaPMRPublisherJob publisherJob; - private JobDataMap jobDataMap; - private WorkerContext workerContext; - private DMaaPMRPublisher publisher; - private Metrics metrics; - - private class TCATestDMaaPMRPublisherJob extends TCADMaaPMRPublisherJob { - - private Map alertEntityMap; - - public TCATestDMaaPMRPublisherJob(Map alertEntityMap) { - this.alertEntityMap = alertEntityMap; - } - - @Override - protected Map getNewAlertsMap( - String cdapAlertsTableName, WorkerContext workerContext) { - return alertEntityMap; - } - - @Override - protected void deleteAlertsByKey(String cdapAlertsTableName, WorkerContext workerContext, - Set rowKeys, Metrics metrics) { - // do nothing - } - } - - @Before - public void before() throws Exception { - - jobExecutionContext = mock(JobExecutionContext.class); - workerContext = mock(WorkerContext.class); - - metrics = mock(Metrics.class); - doNothing().when(metrics).count(anyString(), anyInt()); - publisher = mock(DMaaPMRPublisher.class); - - jobDataMap = mock(JobDataMap.class); - when(jobDataMap.getString(eq(AnalyticsConstants.CDAP_ALERTS_TABLE_VARIABLE_NAME))).thenReturn - ("testAlertTableName"); - when(jobDataMap.get(eq(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME))).thenReturn(workerContext); - when(jobDataMap.get(eq(AnalyticsConstants.DMAAP_PUBLISHER_VARIABLE_NAME))).thenReturn(publisher); - when(jobDataMap.get(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME)).thenReturn(metrics); - when(jobExecutionContext.getMergedJobDataMap()).thenReturn(jobDataMap); - - - publisherJob = new TCADMaaPMRPublisherJob(); - } - - @Test - public void testExecuteWhenNoAlertsFoundInAlertsTable() throws Exception { - doNothing().when(workerContext).execute(any(TxRunnable.class)); - publisherJob.execute(jobExecutionContext); - verify(metrics, times(1)) - .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_NO_NEW_ALERTS_LOOKUP_METRIC), eq(1)); - } - - @Test - public void testExecuteWhenAlertsWereFoundInAlertsTable() throws Exception { - - final DMaaPMRPublisherResponse publisherResponse = mock(DMaaPMRPublisherResponse.class); - when(publisherResponse.getResponseCode()).thenReturn(200); - when(publisherResponse.getResponseMessage()).thenReturn("success"); - when(publisherResponse.getPendingMessagesCount()).thenReturn(0); - when(publisher.publish(ArgumentMatchers.anyList())).thenReturn(publisherResponse); - - final TCAVESAlertEntity tcavesAlertEntity = mock(TCAVESAlertEntity.class); - when(tcavesAlertEntity.getAlertMessage()).thenReturn("testAlertMessage"); - Map alertEntityMap = new HashMap<>(); - alertEntityMap.put("key1", tcavesAlertEntity); - final TCATestDMaaPMRPublisherJob testPublisherJob = new TCATestDMaaPMRPublisherJob(alertEntityMap); - testPublisherJob.execute(jobExecutionContext); - verify(metrics, times(1)) - .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_NEW_ALERTS_METRIC), eq(1)); - verify(metrics, times(1)) - .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_SUCCESSFUL_DMAAP_RESPONSE_METRIC), eq(1)); - } - - @Test - public void testExecuteWhenAlertsWereFoundButPublisherReturnedNon200ResponseCode() throws Exception { - - final DMaaPMRPublisherResponse publisherResponse = mock(DMaaPMRPublisherResponse.class); - when(publisherResponse.getResponseCode()).thenReturn(500); - when(publisherResponse.getResponseMessage()).thenReturn("failed"); - when(publisherResponse.getPendingMessagesCount()).thenReturn(0); - when(publisher.publish(ArgumentMatchers.anyList())).thenReturn(publisherResponse); - - final TCAVESAlertEntity tcavesAlertEntity = mock(TCAVESAlertEntity.class); - when(tcavesAlertEntity.getAlertMessage()).thenReturn("testAlertMessage"); - Map alertEntityMap = new HashMap<>(); - alertEntityMap.put("key1", tcavesAlertEntity); - final TCATestDMaaPMRPublisherJob testPublisherJob = new TCATestDMaaPMRPublisherJob(alertEntityMap); - testPublisherJob.execute(jobExecutionContext); - verify(metrics, times(1)) - .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_NEW_ALERTS_METRIC), eq(1)); - verify(metrics, times(1)) - .count(eq(CDAPMetricsConstants.TCA_PUBLISHER_UNSUCCESSFUL_DMAAP_RESPONSE_METRIC), eq(1)); - } - - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java deleted file mode 100644 index 7e47aca..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPMRSubscriberJobTest.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.metrics.Metrics; -import co.cask.cdap.api.worker.WorkerContext; -import com.google.common.collect.ImmutableList; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPMetricsConstants; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.quartz.JobDataMap; -import org.quartz.JobExecutionContext; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; - -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/20/2016. - */ -public class TCADMaaPMRSubscriberJobTest extends BaseAnalyticsCDAPTCAUnitTest { - - private JobExecutionContext jobExecutionContext; - private TCADMaaPMRSubscriberJob subscriberJob; - private JobDataMap jobDataMap; - private WorkerContext workerContext; - private DMaaPMRSubscriber subscriber; - private Metrics metrics; - - - @Before - public void before() throws Exception { - - jobExecutionContext = mock(JobExecutionContext.class); - workerContext = mock(WorkerContext.class); - - metrics = mock(Metrics.class); - doNothing().when(metrics).count(anyString(), anyInt()); - subscriber = mock(DMaaPMRSubscriber.class); - - jobDataMap = mock(JobDataMap.class); - when(jobDataMap.getString(eq(AnalyticsConstants.CDAP_STREAM_VARIABLE_NAME))).thenReturn - (CDAPComponentsConstants.TCA_DEFAULT_SUBSCRIBER_OUTPUT_NAME_STREAM); - when(jobDataMap.get(eq(AnalyticsConstants.WORKER_CONTEXT_VARIABLE_NAME))).thenReturn(workerContext); - when(jobDataMap.get(eq(AnalyticsConstants.DMAAP_SUBSCRIBER_VARIABLE_NAME))).thenReturn(subscriber); - when(jobDataMap.get(AnalyticsConstants.DMAAP_METRICS_VARIABLE_NAME)).thenReturn(metrics); - when(jobExecutionContext.getMergedJobDataMap()).thenReturn(jobDataMap); - - doNothing().when(workerContext).write(anyString(), anyString()); - - subscriberJob = new TCADMaaPMRSubscriberJob(); - } - - @Test - public void testExecuteWhenMessagesAreFound() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(200); - when(subscriberResponse.getResponseMessage()).thenReturn("testMessage"); - when(subscriberResponse.getFetchedMessages()).thenReturn(ImmutableList.of("testMessage1", "testMessage1")); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - subscriberJob.execute(jobExecutionContext); - verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants - .DMAAP_MR_SUBSCRIBER_TOTAL_MESSAGES_PROCESSED_METRIC), eq(2)); - } - - @Test - public void testExecuteWhenNoMessagesFound() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(200); - when(subscriberResponse.getResponseMessage()).thenReturn("no messages"); - when(subscriberResponse.getFetchedMessages()).thenReturn(Collections.emptyList()); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - subscriberJob.execute(jobExecutionContext); - verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants - .DMAAP_MR_SUBSCRIBER_RESPONSES_WITH_NO_MESSAGES_METRIC), eq(1)); - } - - - @Test - public void testExecuteWhenSubscriberReturnNonSuccessfulReturnCode() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(500); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - subscriberJob.execute(jobExecutionContext); - verify(metrics, Mockito.times(1)).count(eq(CDAPMetricsConstants - .DMAAP_MR_SUBSCRIBER_UNSUCCESSFUL_RESPONSES_METRIC), eq(1)); - } - - @Test(expected = DCAEAnalyticsRuntimeException.class) - public void testExecuteWhenWritingToCDAPStreamThrowsException() throws Exception { - final DMaaPMRSubscriberResponse subscriberResponse = mock(DMaaPMRSubscriberResponse.class); - when(subscriberResponse.getResponseCode()).thenReturn(200); - when(subscriberResponse.getFetchedMessages()).thenReturn(Arrays.asList("TestMessage")); - when(subscriber.fetchMessages()).thenReturn(subscriberResponse); - doThrow(new IOException()).when(workerContext).write(anyString(), anyString()); - subscriberJob.execute(jobExecutionContext); - } - - - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java deleted file mode 100644 index eab9b39..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPPublisherWorkerTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.app.ApplicationSpecification; -import co.cask.cdap.api.worker.WorkerConfigurer; -import co.cask.cdap.api.worker.WorkerContext; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; - -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/20/2016. - */ -public class TCADMaaPPublisherWorkerTest extends BaseAnalyticsCDAPTCAUnitTest { - - private static final String VES_ALERTS_TABLE_NAME = "vesAlertsTable"; - - private WorkerConfigurer workerConfigurer; - private WorkerContext workerContext; - private TCADMaaPPublisherWorker publisherWorker; - private ApplicationSpecification mockApplicationSpecification; - - @Before - public void before() throws Exception { - workerConfigurer = mock(WorkerConfigurer.class); - workerContext = mock(WorkerContext.class); - doNothing().when(workerConfigurer).setName(anyString()); - doNothing().when(workerConfigurer).setDescription(anyString()); - mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); - when(workerContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); - publisherWorker = new TCADMaaPPublisherWorker(VES_ALERTS_TABLE_NAME); - - } - - @Test - public void testConfigure() throws Exception { - publisherWorker.configure(workerConfigurer); - verify(workerConfigurer, times(1)) - .setName(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_WORKER)); - verify(workerConfigurer, times(1)) - .setDescription(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_PUBLISHER_DESCRIPTION_WORKER)); - } - - @Test(expected = CDAPSettingsException.class) - public void testInitializeWhenSettingsHaveErrors() throws Exception { - when(mockApplicationSpecification.getConfiguration()).thenReturn("{}"); - publisherWorker.initialize(workerContext); - } - - @Test - public void testInitializeWhenSettingsAreValid() throws Exception { - when(workerContext.getRuntimeArguments()).thenReturn(getPreferenceMap()); - when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); - publisherWorker.initialize(workerContext); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java b/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java deleted file mode 100644 index e3ed9cc..0000000 --- a/dcae-analytics-cdap-tca/src/test/java/org/openecomp/dcae/apod/analytics/cdap/tca/worker/TCADMaaPSubscriberWorkerTest.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.cdap.tca.worker; - -import co.cask.cdap.api.app.ApplicationSpecification; -import co.cask.cdap.api.worker.WorkerConfigurer; -import co.cask.cdap.api.worker.WorkerContext; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants; -import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException; -import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest; - -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * @author Rajiv Singla . Creation Date: 12/20/2016. - */ -public class TCADMaaPSubscriberWorkerTest extends BaseAnalyticsCDAPTCAUnitTest { - - private static final String TEST_SUBSCRIBER_OUTPUT_STREAM_NAME = "testSubscriberOutputStream"; - - private WorkerConfigurer workerConfigurer; - private WorkerContext workerContext; - private TCADMaaPSubscriberWorker subscriberWorker; - private ApplicationSpecification mockApplicationSpecification; - - @Before - public void before() throws Exception { - workerConfigurer = mock(WorkerConfigurer.class); - workerContext = mock(WorkerContext.class); - mockApplicationSpecification = Mockito.mock(ApplicationSpecification.class); - when(workerContext.getApplicationSpecification()).thenReturn(mockApplicationSpecification); - doNothing().when(workerConfigurer).setName(anyString()); - doNothing().when(workerConfigurer).setDescription(anyString()); - subscriberWorker = - new TCADMaaPSubscriberWorker(TEST_SUBSCRIBER_OUTPUT_STREAM_NAME); - - } - - @Test - public void testConfigure() throws Exception { - subscriberWorker.configure(workerConfigurer); - verify(workerConfigurer, times(1)) - .setName(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_WORKER)); - verify(workerConfigurer, times(1)) - .setDescription(eq(CDAPComponentsConstants.TCA_FIXED_DMAAP_SUBSCRIBER_DESCRIPTION_WORKER)); - } - - @Test(expected = CDAPSettingsException.class) - public void testInitializeWhenSettingsHaveErrors() throws Exception { - when(mockApplicationSpecification.getConfiguration()).thenReturn("{}"); - subscriberWorker.initialize(workerContext); - } - - @Test - public void testInitializeWhenSettingsAreValid() throws Exception { - when(workerContext.getRuntimeArguments()).thenReturn(getPreferenceMap()); - when(mockApplicationSpecification.getConfiguration()).thenReturn(fromStream(TCA_APP_CONFIG_FILE_LOCATION)); - subscriberWorker.initialize(workerContext); - } - -} diff --git a/dcae-analytics-cdap-tca/src/test/resources/logback-test.xml b/dcae-analytics-cdap-tca/src/test/resources/logback-test.xml index dc51dfd..54c8fef 100644 --- a/dcae-analytics-cdap-tca/src/test/resources/logback-test.xml +++ b/dcae-analytics-cdap-tca/src/test/resources/logback-test.xml @@ -1,55 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + + + + + + + + + + diff --git a/dcae-analytics-common/pom.xml b/dcae-analytics-common/pom.xml index ed7e778..af37fbc 100644 --- a/dcae-analytics-common/pom.xml +++ b/dcae-analytics-common/pom.xml @@ -1,115 +1,115 @@ - - - - - 4.0.0 - - - org.onap.dcaegen2.analytics.tca - dcae-analytics - 2.1.0-SNAPSHOT - - - dcae-analytics-common - jar - - - DCAE Analytics Common - Contains Components common to all DCAE Analytics Modules - - - - ${project.parent.basedir} - - - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-model - 2.1.0-SNAPSHOT - - - - - org.slf4j - slf4j-api - - - - ch.qos.logback - logback-core - - - - ch.qos.logback - logback-classic - - - - - com.google.guava - guava - - - com.google.code.findbugs - jsr305 - - - com.google.code.findbugs - annotations - - - org.apache.commons - commons-lang3 - - - - - - com.google.inject - guice - - - com.google.inject.extensions - guice-assistedinject - - - com.google.inject.extensions - guice-multibindings - - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-test - 2.1.0-SNAPSHOT - test - - - - - - + + + + + 4.0.0 + + + org.onap.dcaegen2.analytics.tca + dcae-analytics + 2.1.0-SNAPSHOT + + + dcae-analytics-common + jar + + + DCAE Analytics Common + Contains Components common to all DCAE Analytics Modules + + + + ${project.parent.basedir} + + + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-model + 2.1.0-SNAPSHOT + + + + + org.slf4j + slf4j-api + + + + ch.qos.logback + logback-core + + + + ch.qos.logback + logback-classic + + + + + com.google.guava + guava + + + com.google.code.findbugs + jsr305 + + + com.google.code.findbugs + annotations + + + org.apache.commons + commons-lang3 + + + + + + com.google.inject + guice + + + com.google.inject.extensions + guice-assistedinject + + + com.google.inject.extensions + guice-multibindings + + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-test + 2.1.0-SNAPSHOT + test + + + + + + diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/AnalyticsConstants.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/AnalyticsConstants.java new file mode 100644 index 0000000..62a6fab --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/AnalyticsConstants.java @@ -0,0 +1,167 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common; + +/** + * Contains static variable for all DCAE Components. + * + * @author Rajiv Singla . Creation Date: 10/21/2016. + */ +public abstract class AnalyticsConstants { + + // =============== Common Constants for all DCAE Analytics Modules ==================== // + + + // =============== DMaaP Constants for all DCAE Analytics Modules ==================== // + + // DMaaP Config Constants + public static final Integer DEFAULT_PORT_NUMBER = 80; // default port number + public static final String DEFAULT_USER_NAME = null; // default to no username + public static final String DEFAULT_USER_PASSWORD = null; // defaults to no userPassword + public static final String DEFAULT_PROTOCOL = "https"; // defaults to using https protocol + public static final String DEFAULT_CONTENT_TYPE = "application/json"; // defaults to json content type + + public static final String DMAAP_URI_PATH_PREFIX = "/events/"; + public static final String DMAAP_GROUP_PREFIX = "OpenDCAE-"; + + // ================== DMaaP MR Constants ============================== // + // Publisher Constants + public static final int DEFAULT_PUBLISHER_MAX_BATCH_SIZE = 1; // disable batching by default + public static final int DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 100000; // default recovery messages size + public static final int PUBLISHER_MAX_FLUSH_RETRIES_ON_CLOSE = 5; // number of retries when flushing messages + public static final int PUBLISHER_DELAY_MS_ON_RETRIES_ON_CLOSE = 5000; // delay in retrying for flushing messages + // Subscriber Constants + public static final int DEFAULT_SUBSCRIBER_TIMEOUT_MS = -1; + public static final int DEFAULT_SUBSCRIBER_MESSAGE_LIMIT = -1; + public static final String DEFAULT_SUBSCRIBER_GROUP_PREFIX = DMAAP_GROUP_PREFIX + "DMaaPSub-"; + public static final String SUBSCRIBER_TIMEOUT_QUERY_PARAM_NAME = "timeout"; + public static final String SUBSCRIBER_MSG_LIMIT_QUERY_PARAM_NAME = "limit"; + + + // ================== TCA Constants ============================== // + + // Default subscriber polling interval + public static final Integer TCA_DEFAULT_SUBSCRIBER_POLLING_INTERVAL_MS = 30000; + + // Default publisher polling interval + public static final Integer TCA_DEFAULT_PUBLISHER_POLLING_INTERVAL_MS = 30000; + + // Default publisher max batch queue size determines the minimum number of messages that need to be published in + // batch mode + public static final Integer TCA_DEFAULT_PUBLISHER_MAX_BATCH_QUEUE_SIZE = 10; + + // Default publisher max recovery queue size determines max number of messages can be cached in memory + // in case publisher is not responding + public static final Integer TCA_DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 100000; + + // Default interval during which TCA DMaaP Worker checks if scheduler is shut down + public static final Integer TCA_DEFAULT_WORKER_SHUTDOWN_CHECK_INTERVAL_MS = 5000; + + // ***** TCA Quartz Scheduler Settings ******// + + public static final String TCA_QUARTZ_SUBSCRIBER_PROPERTIES_FILE_NAME = "quartz-subscriber.properties"; + + public static final String TCA_QUARTZ_PUBLISHER_PROPERTIES_FILE_NAME = "quartz-publisher.properties"; + + // TCA Quartz Group Settings + public static final String TCA_QUARTZ_GROUP_NAME = "TCAQuartzGroup"; + // TCA Quartz Trigger Settings + public static final String TCA_DMAAP_SUBSCRIBER_QUARTZ_TRIGGER_NAME = "TCADMaaPSubscriberTrigger"; + public static final String TCA_DMAAP_PUBLISHER_QUARTZ_TRIGGER_NAME = "TCADMaaPPublisherTrigger"; + + // TCA Quartz DMaaP Subscriber Job Settings + public static final String TCA_DMAAP_SUBSCRIBER_QUARTZ_JOB_NAME = "TCADMaaPSubscriberJob"; + public static final String TCA_DMAAP_PUBLISHER_QUARTZ_JOB_NAME = "TCADMaaPPublisherJob"; + + // TCA Quartz Publisher and Subscriber Job Parameters + // Common Job parameters for both Publisher and Subscriber + public static final String WORKER_CONTEXT_VARIABLE_NAME = "WORKER_CONTEXT"; + public static final String DMAAP_METRICS_VARIABLE_NAME = "DMAAP_METRICS"; + // TCA Quartz DMaaP Subscriber Job Parameter Settings + public static final String CDAP_STREAM_VARIABLE_NAME = "CDAP_STREAM_NAME"; + public static final String DMAAP_SUBSCRIBER_VARIABLE_NAME = "DMAAP_SUBSCRIBER"; + // TCA Quartz DMaaP Publisher Job Parameter Settings + public static final String CDAP_ALERTS_TABLE_VARIABLE_NAME = "CDAP_TCA_ALERTS_TABLE_NAME"; + public static final String DMAAP_PUBLISHER_VARIABLE_NAME = "DMAAP_PUBLISHER"; + + // TCA VES Response Constants + // VNF Constants + public static final String TCA_VES_RESPONSE_VNF_TARGET_TYPE = "VNF"; + public static final String AAI_VNF_KEY_PREFIX = "generic-vnf."; + public static final String TCA_VES_RESPONSE_VNF_TARGET = AAI_VNF_KEY_PREFIX + "vnf-name"; + // VM Constants + public static final String TCA_VES_RESPONSE_VM_TARGET_TYPE = "VM"; + public static final String AAI_VSERVER_KEY_PREFIX = "vserver."; + public static final String TCA_VES_RESPONSE_VM_TARGET = AAI_VSERVER_KEY_PREFIX + "vserver-name"; + // VNF & VM - Common Constants + public static final String TCA_VES_RESPONSE_FROM = "DCAE"; + + // TCA VES Message Router Partition Key + public static final String TCA_VES_MESSAGE_ROUTER_PARTITION_KEY = "VESMessageHash"; + + /** + * Default Number of instances for Threshold violation calculator flowlet + */ + public static final Integer TCA_DEFAULT_THRESHOLD_CALCULATOR_FLOWLET_INSTANCES = 2; + + /** + * Default TTL for TCA VES Message status table which contain status of all messages processed by TCA + */ + public static final Integer TCA_DEFAULT_VES_MESSAGE_STATUS_TTL_TABLE = 60 * 60 * 24 * 10; // 10 Days + + /** + * Default TTL for TCA VES Alerts table which contains alerts that can be send to downstream systems + */ + public static final Integer TCA_DEFAULT_VES_ALERTS_TTL_TABLE = 60 * 60 * 24 * 30; // 30 Days + + + /** + * Default TTL for TCA Alerts abatement table which contains information to send out abated alerts + */ + public static final Integer TCA_DEFAULT_ALERTS_ABATEMENT_TTL_TABLE = 60 * 60 * 24 * 30; // 30 Days + + + // TCA Policy Runtime Argument Paths + public static final String TCA_POLICY_DELIMITER = "."; + public static final String TCA_POLICY_DOMAIN_PATH = "domain"; + public static final String TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH = "configuration.metricsPerEventName"; + public static final String TCA_POLICY_THRESHOLDS_PATH_POSTFIX = "thresholds"; + + public static final String TCA_POLICY_JSON_KEY = "tca_policy"; + public static final String TCA_POLICY_STRING_DELIMITER = "\""; + + // TCA Alert output format by default is not CEF + public static final Boolean TCA_DEFAULT_ENABLE_CEF_FORMATTED_ALERT = false; + + // TCA A&AI Enrichment is disabled by default + public static final Boolean TCA_DEFAULT_ENABLE_AAI_ENRICHMENT = false; + // TCA A&AI SSL Certificate errors by default are *NOT* ignored + public static final Boolean TCA_DEFAULT_AAI_ENRICHMENT_IGNORE_SSL_CERTIFICATE_ERRORS = false; + // TCA A&AI proxy is disabled by default + public static final String TCA_DEFAULT_AAI_ENRICHMENT_PROXY_URL = null; + + + + private AnalyticsConstants() { + + } + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java new file mode 100644 index 0000000..b832acc --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java @@ -0,0 +1,54 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.exception; + +import org.slf4j.Logger; + +/** + * Runtime Exception for DCAE Analytics Exceptions. All DCAE Analytics + * runtime Exceptions must be wrapped inside this exception + *

+ * @author Rajiv Singla . Creation Date: 10/5/2016. + */ +public class DCAEAnalyticsRuntimeException extends RuntimeException { + + + /** + * @param message - Error Message for Exception + * @param cause - Actual Exception which caused {@link DCAEAnalyticsRuntimeException} + */ + public DCAEAnalyticsRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates and logs the DCAE Runtime Exception to given logger + * + * @param message - Error Message for Exception and logging + * @param logger - Logger used for logging exception + * @param cause - Actual exception which caused {@link DCAEAnalyticsRuntimeException} + */ + public DCAEAnalyticsRuntimeException(String message, Logger logger, Throwable cause) { + super(message, cause); + logger.error(message); + } + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/MessageProcessingException.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/MessageProcessingException.java new file mode 100644 index 0000000..8b92c28 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/exception/MessageProcessingException.java @@ -0,0 +1,51 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.exception; + +import org.onap.dcae.apod.analytics.common.service.processor.MessageProcessor; +import org.slf4j.Logger; + +/** + * Runtime Exception caused due to {@link MessageProcessor} failure while processing a message. + * + * @author Rajiv Singla . Creation Date: 11/7/2016. + */ +public class MessageProcessingException extends DCAEAnalyticsRuntimeException { + + /** + * @param message - Error Message for Exception + * @param cause - Actual Exception which caused {@link DCAEAnalyticsRuntimeException} + */ + public MessageProcessingException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates and logs the DCAE Runtime Exception to given logger + * + * @param message - Error Message for Exception and logging + * @param logger - Logger used for logging exception + * @param cause - Actual exception which caused {@link DCAEAnalyticsRuntimeException} + */ + public MessageProcessingException(String message, Logger logger, Throwable cause) { + super(message, logger, cause); + } +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java new file mode 100644 index 0000000..0bdae9e --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java @@ -0,0 +1,115 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.filter; + +import com.google.common.collect.ImmutableSet; +import com.jayway.jsonpath.DocumentContext; +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.PathNotFoundException; +import org.apache.commons.lang3.StringUtils; +import org.onap.dcae.apod.analytics.common.service.processor.AbstractMessageProcessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Set; + +/** + * A Generic Json Message Filter which filter the json message based on given json Path and list of expected values + * for that json path. The {@link JsonMessageFilterProcessorContext#isMatched} flag will be changed as per table below: + *

+ *      Incoming message is blank or invalid Json                               =  null
+ *      Incoming message path is matches expected values                        = true
+ *      Incoming message does not match expected values or path does not exist  = false
+ * 
+ *

+ * @author Rajiv Singla . Creation Date: 2/10/2017. + */ +public class GenericJsonMessageFilter extends AbstractMessageProcessor { + + private static final Logger LOG = LoggerFactory.getLogger(GenericJsonMessageFilter.class); + private static final long serialVersionUID = 1L; + + private final String filterName; + private final String jsonPath; + private final Set expectedValues; + + public GenericJsonMessageFilter(final String filterName, final String jsonPath, final Set expectedValues) { + this.filterName = filterName; + this.jsonPath = jsonPath; + this.expectedValues = expectedValues; + } + + public GenericJsonMessageFilter(final String filterName, final String jsonPath, final String expectedValue) { + this(filterName, jsonPath, ImmutableSet.of(expectedValue)); + } + + @Override + public String getProcessorDescription() { + return filterName; + } + + @Override + public JsonMessageFilterProcessorContext processMessage(final JsonMessageFilterProcessorContext processorContext) { + + final String jsonMessage = processorContext.getMessage().trim(); + + if (StringUtils.isNotBlank(jsonMessage) && jsonMessage.startsWith("{") && jsonMessage.endsWith("}")) { + + // locate json path value + final DocumentContext documentContext = JsonPath.parse(jsonMessage); + String jsonPathValue = null; + try { + final List jsonPathValues = documentContext.read(jsonPath); + final Object pathValue = jsonPathValues.isEmpty() ? null : jsonPathValues.get(0); + jsonPathValue = pathValue instanceof Number ? pathValue.toString() : (String) pathValue; + } catch (PathNotFoundException ex) { + LOG.info("Unable to find json Path: {}. Exception: {}, Json Message: {}", jsonPath, ex, jsonMessage); + } + + LOG.debug("Value for jsonPath: {}, jsonPathValue: {}, expected Values: {}", + jsonPath, jsonPathValue, expectedValues); + + // if json path value is null or we json value is not present in expect values then terminate early + if (jsonPathValue == null || !expectedValues.contains(jsonPathValue)) { + final String terminatingMessage = String.format("Filter match unsuccessful. " + + "JsonPath: %s, Actual JsonPathValue: %s, Excepted Json Path Values: %s", + jsonPath, jsonPathValue, expectedValues); + processorContext.setMatched(false); + setTerminatingProcessingMessage(terminatingMessage, processorContext); + } else { + final String finishProcessingMessage = String.format("Filter match successful. " + + "JsonPath: %s, Actual JsonPathValue: %s, Excepted Json Path Values: %s", + jsonPath, jsonPathValue, expectedValues); + processorContext.setMatched(true); + setFinishedProcessingMessage(finishProcessingMessage, processorContext); + } + } else { + // if incoming message is blank of valid Json then matched flag will be null + final String terminatingMessage = "Incoming json message is blank or not json. " + + "Json filter cannot be applied"; + processorContext.setMatched(null); + setTerminatingProcessingMessage(terminatingMessage, processorContext); + } + + return processorContext; + } +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java new file mode 100644 index 0000000..e9f1e51 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java @@ -0,0 +1,57 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.filter; + +import org.onap.dcae.apod.analytics.common.service.processor.AbstractProcessorContext; + +/** + * A processor context for Json Message Filter Processor + *

+ * @author Rajiv Singla . Creation Date: 2/10/2017. + */ +public class JsonMessageFilterProcessorContext extends AbstractProcessorContext { + + private static final long serialVersionUID = 1L; + + private Boolean isMatched; + + public JsonMessageFilterProcessorContext(final String jsonMessageString) { + super(jsonMessageString, true); + } + + /** + * Returns true if Json Message Filter match was successful + * + * @return true if Json Message Filter match was successful, false if filter was match was unsuccessful + */ + public Boolean getMatched() { + return isMatched; + } + + /** + * Sets the value for Json Message Filter match + * + * @param matched new value for json message filter match + */ + public void setMatched(final Boolean matched) { + isMatched = matched; + } +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java new file mode 100644 index 0000000..dbf9cbb --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java @@ -0,0 +1,162 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import com.google.common.base.Optional; +import org.onap.dcae.apod.analytics.common.exception.MessageProcessingException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; + +import static java.lang.String.format; + +/** + * An abstract Message Processor which can be extended by {@link MessageProcessor} implementations + * to get default behavior for Message Processors + * + * @param

Processor Context sub classes + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public abstract class AbstractMessageProcessor

implements MessageProcessor

{ + + private static final Logger LOG = LoggerFactory.getLogger(AbstractMessageProcessor.class); + + /** + * By Default there is no processing message + */ + private String processingMessage = null; + + /** + * By Default Processing State is set to not required - subclasses must + * set processing state to {@link ProcessingState#PROCESSING_FINISHED_SUCCESSFULLY} on successful processing + * or {@link ProcessingState#PROCESSING_TERMINATED_EARLY} if processing fails + */ + protected ProcessingState processingState = ProcessingState.PROCESSING_NOT_REQUIRED; + + /** + * Sub classes must provide a description of a processor + * + * @return description of processor + * + */ + public abstract String getProcessorDescription(); + + + /** + * Sub classes must provide implementation to process Message + * + * @param processorContext incoming {@link ProcessorContext} + * @return outgoing {@link ProcessorContext} + */ + public abstract P processMessage(P processorContext); + + @Override + public ProcessorInfo getProcessorInfo() { + // by default the class of the Processor is assigned as Processor Name + final String processorClassName = getClass().getSimpleName(); + return new GenericProcessorInfo(processorClassName, getProcessorDescription()); + } + + @Override + public P preProcessor(P processorContext) { + LOG.debug("Processing Started for Processor: {}", getProcessorInfo().getProcessorName()); + // by default check to see if continue processing Flag is not false + final boolean okToContinue = processorContext.canProcessingContinue(); + if (!okToContinue) { + final String errorMessage = + format("Processor: %s. Processing Context flag okToContinue is false. Unable to proceed...", + getProcessorInfo().getProcessorName()); + throw new MessageProcessingException(errorMessage, LOG, new IllegalStateException(errorMessage)); + } + processingState = ProcessingState.PROCESSING_STARTED; + return processorContext; + } + + @Override + public ProcessingState getProcessingState() { + return processingState; + } + + @Override + public Optional getProcessingMessage() { + return Optional.fromNullable(processingMessage); + } + + @Override + public P postProcessor(P processorContext) { + // Default implementation updates the post processing flag if processing did not + // completed successfully + if (processingState != ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY) { + LOG.debug("Processor: {}, Update Process Context State to stop Processing.", + getProcessorInfo().getProcessorName()); + processorContext.setProcessingContinueFlag(false); + } + // attaches itself to message processor context + processorContext.getMessageProcessors().add(this); + LOG.debug("Processing Completed for Processor: {}", getProcessorInfo()); + return processorContext; + } + + + @Override + public final P apply(@Nonnull P processorContext) { + final P preProcessedProcessorContext = preProcessor(processorContext); + final P processedProcessorContext = processMessage(preProcessedProcessorContext); + return postProcessor(processedProcessorContext); + } + + + /** + * Helper method that updates processing state in case of early termination, logs the processing + * termination reason, updates Processor processing state as Terminated and sets it processing message + * + * @param terminatingMessage error Message + * @param processorContext message processor context + */ + protected void setTerminatingProcessingMessage(final String terminatingMessage, + final P processorContext) { + + final String message = processorContext.getMessage(); + this.processingState = ProcessingState.PROCESSING_TERMINATED_EARLY; + this.processingMessage = terminatingMessage; + LOG.debug("Processor: {}, Early Terminating Message: {}, Incoming Message: {}", + getProcessorInfo().getProcessorName(), terminatingMessage, message); + } + + /** + * Helper method that updates Processing state and logs completion message + * passed + * + * @param processorPassingMessage Processor passing message + * @param processorContext message processor context + */ + protected void setFinishedProcessingMessage(final String processorPassingMessage, P processorContext) { + final String message = processorContext.getMessage(); + processingState = ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY; + this.processingMessage = processorPassingMessage; + LOG.debug("Processor: {}, Successful Completion Message: {}, Incoming Message: {}", + getProcessorInfo().getProcessorName(), processorPassingMessage, message); + } + + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java new file mode 100644 index 0000000..5c39ea4 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java @@ -0,0 +1,96 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import com.google.common.base.Objects; + +import java.util.LinkedList; +import java.util.List; + +/** + *

+ * An abstract implementation for {@link ProcessorContext} which other DCAE Analytics Modules + * can extend to add module specific functionality + *

+ * + * @author Rajiv Singla . Creation Date: 11/7/2016. + */ +public abstract class AbstractProcessorContext implements ProcessorContext { + + private final String message; + private List> messageProcessors; + private boolean canProcessingContinue; + + public AbstractProcessorContext(final String message, + boolean canProcessingContinue) { + this.message = message; + this.canProcessingContinue = canProcessingContinue; + this.messageProcessors = new LinkedList<>(); + } + + /** + * Returns JSON String of incoming CEF Message that needs to be processed + * + * @return incoming CEF message that needs to be processed + */ + @Override + public String getMessage() { + return message; + } + + /** + * Sets if it is ok to continue processing normally + * + * @return boolean which determines if it is ok to continue processing normally + */ + @Override + public boolean canProcessingContinue() { + return canProcessingContinue; + } + + + /** + * Set if it is ok to continue processing normally + * + * @param canProcessingContinue sets boolean which determines if it is ok to continue processing normally + */ + @Override + public void setProcessingContinueFlag(boolean canProcessingContinue) { + this.canProcessingContinue = canProcessingContinue; + } + + /** + * Provides List of message processors which were used in processing CEF message + * + * @return List of message processors which were used in processing CEF message + */ + @Override + public List> getMessageProcessors() { + return messageProcessors; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("canProcessingContinue", canProcessingContinue) + .toString(); + } +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java new file mode 100644 index 0000000..7a9fc08 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java @@ -0,0 +1,70 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import org.onap.dcae.apod.analytics.common.utils.MessageProcessorUtils.MessageProcessorFunction; + +import java.util.List; + +import static org.onap.dcae.apod.analytics.common.utils.MessageProcessorUtils.computeMessageProcessorChain; + +/** + *

+ * A Generic Message Processor which passes the {@link ProcessorContext} from first to second + * {@link MessageProcessor} + *

+ * + * @param

Processor Context sub classes + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public class GenericMessageChainProcessor

{ + + private final List> messageProcessors; + private final P initialProcessorContext; + + public GenericMessageChainProcessor(List> messageProcessors, + P initialProcessorContext) { + this.messageProcessors = messageProcessors; + this.initialProcessorContext = initialProcessorContext; + } + + /** + * Process a processor chain + * + * @return Processor Context after processing the processor chain + */ + public P processChain() { + + final MessageProcessorFunction

messageProcessorFunction = + new MessageProcessorFunction

() { + @Override + public > P apply(P context, M processor) { + return processor.apply(context); + } + }; + + return computeMessageProcessorChain(messageProcessors, initialProcessorContext, + messageProcessorFunction); + + } + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java new file mode 100644 index 0000000..23ffd21 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java @@ -0,0 +1,57 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import javax.annotation.Nonnull; + +/** + * A Generic Implementation of {@link ProcessorInfo} + * + * @author Rajiv Singla . Creation Date: 11/7/2016. + */ +public class GenericProcessorInfo implements ProcessorInfo { + + private static final long serialVersionUID = 1L; + + private final String processorName; + private final String processorDescription; + + public GenericProcessorInfo(@Nonnull String processorName, @Nonnull String processorDescription) { + this.processorName = processorName; + this.processorDescription = processorDescription; + } + + @Override + public String getProcessorName() { + return processorName; + } + + @Override + public String getProcessorDescription() { + return processorDescription; + } + + + @Override + public String toString() { + return processorName; + } +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/MessageProcessor.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/MessageProcessor.java new file mode 100644 index 0000000..fbdc783 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/MessageProcessor.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import com.google.common.base.Function; +import com.google.common.base.Optional; + +import java.io.Serializable; + +/** + *

+ * A message processor can be used to process incoming messages. + * It uses implementations of {@link ProcessorContext} as input and output + *

+ * + * @param

Message Processor Context implementations + * + * @author Rajiv Singla . Creation Date: 11/7/2016. + */ +public interface MessageProcessor

extends Function, Serializable { + + /** + * Returns processor information + * + * @return processor Information + */ + ProcessorInfo getProcessorInfo(); + + + /** + * Does pre-processing of {@link ProcessorContext} e.g. validate input conditions and return + * pre processed context + * + * @param processorContext incoming Processor Context + * @return Pre processed Processor Context + */ + P preProcessor(P processorContext); + + + /** + * Return processing state of a processor + * + * @return Processing State + */ + ProcessingState getProcessingState(); + + + /** + * May return a message from a processor which indicates the reason for {@link ProcessingState} especially if + * there was some failure in processing + * + * @return processing Message + */ + Optional getProcessingMessage(); + + + /** + * Does post-processing of {@link ProcessorContext} + * + * @param processorContext incoming Processor Context + * @return processor Context after post processing is finished + */ + P postProcessor(P processorContext); + + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessingState.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessingState.java new file mode 100644 index 0000000..e844282 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessingState.java @@ -0,0 +1,36 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +/** + *

+ * Processing state of a {@link MessageProcessor} + *

+ * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +public enum ProcessingState { + + PROCESSING_STARTED, + PROCESSING_FINISHED_SUCCESSFULLY, + PROCESSING_TERMINATED_EARLY, + PROCESSING_NOT_REQUIRED; + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorContext.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorContext.java new file mode 100644 index 0000000..23a6ece --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorContext.java @@ -0,0 +1,70 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * A Processor Context is used a an input and output to a {@link MessageProcessor} + *
+ * DCAE Analytics sub projects should extend this interface and add specific fields + * required for input and output + *

+ * + * @author Rajiv Singla . Creation Date: 11/7/2016. + */ +public interface ProcessorContext extends Serializable { + + /** + * Returns Processor Context message that will be processed by Chain of Processors + * + * @return message that need to be processed by processors + */ + String getMessage(); + + /** + * Processing Context flag which determines if Processing can continue in a processing + * chain + * + * @return true if ok to continue processing normally + */ + boolean canProcessingContinue(); + + + /** + * Sets new value for ProcessingContinue flag which will cause early termination of processing in chain if + * set to false + * + * @param canProcessingContinue set new value for canProcessing Continue flag + */ + void setProcessingContinueFlag(boolean canProcessingContinue); + + + /** + * Provides a List of previous processors which have completed processing + * + * @return list of previous processors + */ + List> getMessageProcessors(); + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorInfo.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorInfo.java new file mode 100644 index 0000000..ea49335 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/service/processor/ProcessorInfo.java @@ -0,0 +1,49 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import java.io.Serializable; + +/** + *

+ * Contains Information about a processor. For e.g. Processor name, processor description etc + *

+ * + * @author Rajiv Singla . Creation Date: 11/7/2016. + */ +public interface ProcessorInfo extends Serializable { + + /** + * Returns a name which should uniquely identify a particular {@link MessageProcessor} + * + * @return processor name + */ + String getProcessorName(); + + + /** + * Returns description of a {@link MessageProcessor} + * + * @return processor description + */ + String getProcessorDescription(); + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtils.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtils.java new file mode 100644 index 0000000..7235afd --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtils.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.utils; + +/** + * Contains common utils to check HTTP Related Utils + * + * @author Rajiv Singla . Creation Date: 11/2/2016. + */ +public abstract class HTTPUtils { + + /** + * HTTP Status code for successful HTTP call + */ + public static final Integer HTTP_SUCCESS_STATUS_CODE = 200; + + /** + * HTTP Response code when request has been accepted for processing, but the processing has not been completed + */ + public static final Integer HTTP_ACCEPTED_RESPONSE_CODE = 202; + + /** + * HTTP Response code when there is no content + */ + public static final Integer HTTP_NO_CONTENT_RESPONSE_CODE = 204; + + + public static final String JSON_APPLICATION_TYPE = "application/json"; + + + private HTTPUtils() { + + } + + /** + * Checks if HTTP Status code is less than or equal to 200 but less then 300 + * + * @param statusCode http status code + * @return true if response code between 200 and 300 + */ + public static boolean isSuccessfulResponseCode(Integer statusCode) { + return statusCode >= 200 && statusCode < 300; + } +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtils.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtils.java new file mode 100644 index 0000000..034d5e9 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtils.java @@ -0,0 +1,162 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.utils; + +import com.google.common.base.Preconditions; +import org.onap.dcae.apod.analytics.common.exception.MessageProcessingException; +import org.onap.dcae.apod.analytics.common.service.filter.GenericJsonMessageFilter; +import org.onap.dcae.apod.analytics.common.service.filter.JsonMessageFilterProcessorContext; +import org.onap.dcae.apod.analytics.common.service.processor.GenericMessageChainProcessor; +import org.onap.dcae.apod.analytics.common.service.processor.MessageProcessor; +import org.onap.dcae.apod.analytics.common.service.processor.ProcessorContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Nonnull; + + +/** + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public abstract class MessageProcessorUtils { + + private static final Logger LOG = LoggerFactory.getLogger(MessageProcessorUtils.class); + + /** + * Provides an abstraction how to apply {@link ProcessorContext} to next {@link MessageProcessor} + * in the message processor chain + * + * @param

Sub classes of Processor Context + */ + public interface MessageProcessorFunction

{ + + /** + * Method which provides accumulated {@link ProcessorContext} from previous processors and a reference + * to next processor in the chain + * + * @param p accumulated {@link ProcessorContext} from previous processors + * @param m current {@link MessageProcessor} in the chain + * @param Message processor sub classes + * + * @return processing context after computing the current Message Processor + */ + > P apply(P p, M m); + } + + + /** + * Provides an abstraction to compute a chain of {@link MessageProcessor} + * + * @param messageProcessors An iterable containing one or more {@link MessageProcessor}s + * @param initialProcessorContext An initial processing Context + * @param messageProcessorFunction messageProcessor Function + * @param

Sub classes for Processor Context + * + * @return processing context which results after computing the whole chain + */ + public static

P computeMessageProcessorChain( + final Iterable> messageProcessors, + final P initialProcessorContext, + final MessageProcessorFunction

messageProcessorFunction) { + + // Get message processor iterator + final Iterator> processorIterator = messageProcessors.iterator(); + + // If no next message processor - return initial processor context + if (!processorIterator.hasNext()) { + return initialProcessorContext; + } + + // An accumulator for processor Context + P processorContextAccumulator = initialProcessorContext; + + while (processorIterator.hasNext()) { + + final MessageProcessor

nextProcessor = processorIterator.next(); + + // If Initial Processor Context is null + if (processorContextAccumulator == null) { + final String errorMessage = + String.format("Processor Context must not be null for Message Process: %s", + nextProcessor.getProcessorInfo().getProcessorName()); + throw new MessageProcessingException(errorMessage, LOG, new IllegalStateException(errorMessage)); + } + + + if (!processorContextAccumulator.canProcessingContinue()) { + LOG.debug("Triggering Early Termination, before Message Processor: {}, Incoming Message: {}", + nextProcessor.getProcessorInfo().getProcessorName(), processorContextAccumulator.getMessage()); + break; + } + processorContextAccumulator = messageProcessorFunction.apply(processorContextAccumulator, nextProcessor); + } + + return processorContextAccumulator; + } + + + /** + * Utility method to process Json Filter Mappings. Processes incoming json message and applies a list of json + * filter mappings and returns the resulting {@link JsonMessageFilterProcessorContext} + * + * @param jsonMessage json message to which filter mappings will be applies + * @param jsonFilterMappings Filter mappings contains a Map containing keys as filter json path + * and values as set of expected value corresponding to filter path + * + * @return json message processor context which contains the {@link JsonMessageFilterProcessorContext#isMatched} + * status after applying all filter mappings + */ + public static JsonMessageFilterProcessorContext processJsonFilterMappings( + final String jsonMessage, @Nonnull final Map> jsonFilterMappings) { + + Preconditions.checkState(jsonFilterMappings.size() > 0, "Json Filter Mappings must not be empty"); + + // create initial processor context containing the json message that need to be processed + final JsonMessageFilterProcessorContext initialProcessorContext = + new JsonMessageFilterProcessorContext(jsonMessage); + + // Create Json Message Filters + final List jsonMessageFilters = new LinkedList<>(); + + int i = 0; + for (Map.Entry> jsonFilterMapping : jsonFilterMappings.entrySet()) { + jsonMessageFilters.add(new GenericJsonMessageFilter("Filter-" + i, jsonFilterMapping.getKey(), + jsonFilterMapping.getValue())); + i++; + } + + // Create Generic Message Chain Processor + final GenericMessageChainProcessor messageChainProcessor = + new GenericMessageChainProcessor<>(jsonMessageFilters, initialProcessorContext); + + // Process chain and return resulting json Message Filter Processor Context + return messageChainProcessor.processChain(); + } + + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtils.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtils.java new file mode 100644 index 0000000..3364a64 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtils.java @@ -0,0 +1,59 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.utils; + +import java.util.Date; + +/** + * Contains Utility methods for creating persistence row keys etc. + * + * @author Rajiv Singla . Creation Date: 11/16/2016. + */ +public abstract class PersistenceUtils { + + + /** + * Name of the column which will contain Table Key + */ + public static final String TABLE_ROW_KEY_COLUMN_NAME = "key"; + + /** + * Delimited to be used when creating a row key with multiple fields + */ + public static final String ROW_KEY_DELIMITER = "-"; + + + private PersistenceUtils() { + + } + + /** + * Creates a decreasing number using current timestamp. Handy when you want to keep records most recent records + * close to the top of column table like HBase + * + * @return decreasing number + */ + public static String getCurrentTimeReverseSubKey() { + final long timeReverseLong = Long.MAX_VALUE - new Date().getTime(); + return String.format("%025d", timeReverseLong); + } + +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/DCAEValidator.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/DCAEValidator.java new file mode 100644 index 0000000..385f11c --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/DCAEValidator.java @@ -0,0 +1,31 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.validation; + +import java.io.Serializable; + +/** + * Marker interface for all DCAE Validators + * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public interface DCAEValidator extends Serializable { +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponse.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponse.java new file mode 100644 index 0000000..55afe29 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponse.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.validation; + +import com.google.common.base.Joiner; +import com.google.common.base.Objects; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +/** + * A generic implementation of Validation Response + * + * @param Validation Entity Type + * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public class GenericValidationResponse implements ValidationResponse { + + private LinkedHashMap errorMessageMap = new LinkedHashMap<>(); + + @Override + public boolean hasErrors() { + return errorMessageMap.size() != 0; + } + + @Override + public Set getFieldNamesWithError() { + return errorMessageMap.keySet(); + } + + @Override + public Collection getErrorMessages() { + return errorMessageMap.values(); + } + + @Override + public Map getValidationResultsAsMap() { + return errorMessageMap; + } + + @Override + public String getAllErrorMessage() { + return getAllErrorMessage(","); + } + + @Override + public String getAllErrorMessage(String delimiter) { + return Joiner.on(delimiter).join(errorMessageMap.values()); + } + + @Override + public void addErrorMessage(String fieldName, String filedErrorMessage) { + errorMessageMap.put(fieldName, filedErrorMessage); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("hasErrors", hasErrors()) + .add("errorMessageMap", errorMessageMap) + .toString(); + } +} diff --git a/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/ValidationResponse.java b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/ValidationResponse.java new file mode 100644 index 0000000..d64dab7 --- /dev/null +++ b/dcae-analytics-common/src/main/java/org/onap/dcae/apod/analytics/common/validation/ValidationResponse.java @@ -0,0 +1,90 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.validation; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +/** + * Validation Response contract + * + * @param Entity class type which is being validated + * + * @author Rajiv Singla . Creation Date: 10/24/2016. + */ +public interface ValidationResponse { + + /** + * Returns true if validation resulted in one or more errors + * + * @return true if validation has errors + */ + boolean hasErrors(); + + /** + * Returns all field names which have error + * + * @return names of fields which have error + */ + Set getFieldNamesWithError(); + + /** + * Returns list of all error messages + * + * @return list of error messages + */ + Collection getErrorMessages(); + + + /** + * Returns all error messages as string delimited by comma + * + * @return all error messages delimited by given delimiter + */ + String getAllErrorMessage(); + + /** + * Returns all error messages as string delimited by given delimited + * + * @param delimiter delimited to be used for error message + * @return all error messages delimited by given delimiter + */ + String getAllErrorMessage(String delimiter); + + /** + * Adds field name and error message to the validation response + * + * @param fieldName field name which has validation error + * @param filedErrorMessage validation error message + */ + void addErrorMessage(String fieldName, String filedErrorMessage); + + + /** + * Returns validation results as map containing values as keys and values + * as error Message + * + * @return Map containing field names and error message associated with those fields + */ + Map getValidationResultsAsMap(); + +} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/AnalyticsConstants.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/AnalyticsConstants.java deleted file mode 100644 index c362990..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/AnalyticsConstants.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common; - -/** - * Contains static variable for all DCAE Components. - * - * @author Rajiv Singla . Creation Date: 10/21/2016. - */ -public abstract class AnalyticsConstants { - - // =============== Common Constants for all DCAE Analytics Modules ==================== // - - - // =============== DMaaP Constants for all DCAE Analytics Modules ==================== // - - // DMaaP Config Constants - public static final Integer DEFAULT_PORT_NUMBER = 80; // default port number - public static final String DEFAULT_USER_NAME = null; // default to no username - public static final String DEFAULT_USER_PASSWORD = null; // defaults to no userPassword - public static final String DEFAULT_PROTOCOL = "https"; // defaults to using https protocol - public static final String DEFAULT_CONTENT_TYPE = "application/json"; // defaults to json content type - - public static final String DMAAP_URI_PATH_PREFIX = "/events/"; - public static final String DMAAP_GROUP_PREFIX = "OpenDCAE-"; - - // ================== DMaaP MR Constants ============================== // - // Publisher Constants - public static final int DEFAULT_PUBLISHER_MAX_BATCH_SIZE = 1; // disable batching by default - public static final int DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 100000; // default recovery messages size - public static final int PUBLISHER_MAX_FLUSH_RETRIES_ON_CLOSE = 5; // number of retries when flushing messages - public static final int PUBLISHER_DELAY_MS_ON_RETRIES_ON_CLOSE = 5000; // delay in retrying for flushing messages - // Subscriber Constants - public static final int DEFAULT_SUBSCRIBER_TIMEOUT_MS = -1; - public static final int DEFAULT_SUBSCRIBER_MESSAGE_LIMIT = -1; - public static final String DEFAULT_SUBSCRIBER_GROUP_PREFIX = DMAAP_GROUP_PREFIX + "DMaaPSub-"; - public static final String SUBSCRIBER_TIMEOUT_QUERY_PARAM_NAME = "timeout"; - public static final String SUBSCRIBER_MSG_LIMIT_QUERY_PARAM_NAME = "limit"; - - - // ================== TCA Constants ============================== // - - // Default subscriber polling interval - public static final Integer TCA_DEFAULT_SUBSCRIBER_POLLING_INTERVAL_MS = 30000; - - // Default publisher polling interval - public static final Integer TCA_DEFAULT_PUBLISHER_POLLING_INTERVAL_MS = 30000; - - // Default publisher max batch queue size determines the minimum number of messages that need to be published in - // batch mode - public static final Integer TCA_DEFAULT_PUBLISHER_MAX_BATCH_QUEUE_SIZE = 10; - - // Default publisher max recovery queue size determines max number of messages can be cached in memory - // in case publisher is not responding - public static final Integer TCA_DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 100000; - - // Default interval during which TCA DMaaP Worker checks if scheduler is shut down - public static final Integer TCA_DEFAULT_WORKER_SHUTDOWN_CHECK_INTERVAL_MS = 5000; - - // ***** TCA Quartz Scheduler Settings ******// - - public static final String TCA_QUARTZ_SUBSCRIBER_PROPERTIES_FILE_NAME = "quartz-subscriber.properties"; - - public static final String TCA_QUARTZ_PUBLISHER_PROPERTIES_FILE_NAME = "quartz-publisher.properties"; - - // TCA Quartz Group Settings - public static final String TCA_QUARTZ_GROUP_NAME = "TCAQuartzGroup"; - // TCA Quartz Trigger Settings - public static final String TCA_DMAAP_SUBSCRIBER_QUARTZ_TRIGGER_NAME = "TCADMaaPSubscriberTrigger"; - public static final String TCA_DMAAP_PUBLISHER_QUARTZ_TRIGGER_NAME = "TCADMaaPPublisherTrigger"; - - // TCA Quartz DMaaP Subscriber Job Settings - public static final String TCA_DMAAP_SUBSCRIBER_QUARTZ_JOB_NAME = "TCADMaaPSubscriberJob"; - public static final String TCA_DMAAP_PUBLISHER_QUARTZ_JOB_NAME = "TCADMaaPPublisherJob"; - - // TCA Quartz Publisher and Subscriber Job Parameters - // Common Job parameters for both Publisher and Subscriber - public static final String WORKER_CONTEXT_VARIABLE_NAME = "WORKER_CONTEXT"; - public static final String DMAAP_METRICS_VARIABLE_NAME = "DMAAP_METRICS"; - // TCA Quartz DMaaP Subscriber Job Parameter Settings - public static final String CDAP_STREAM_VARIABLE_NAME = "CDAP_STREAM_NAME"; - public static final String DMAAP_SUBSCRIBER_VARIABLE_NAME = "DMAAP_SUBSCRIBER"; - // TCA Quartz DMaaP Publisher Job Parameter Settings - public static final String CDAP_ALERTS_TABLE_VARIABLE_NAME = "CDAP_TCA_ALERTS_TABLE_NAME"; - public static final String DMAAP_PUBLISHER_VARIABLE_NAME = "DMAAP_PUBLISHER"; - - // TCA VES Response Constants - // VNF Constants - public static final String TCA_VES_RESPONSE_VNF_TARGET_TYPE = "VNF"; - public static final String AAI_VNF_KEY_PREFIX = "generic-vnf."; - public static final String TCA_VES_RESPONSE_VNF_TARGET = AAI_VNF_KEY_PREFIX + "vnf-name"; - // VM Constants - public static final String TCA_VES_RESPONSE_VM_TARGET_TYPE = "VM"; - public static final String AAI_VSERVER_KEY_PREFIX = "vserver."; - public static final String TCA_VES_RESPONSE_VM_TARGET = AAI_VSERVER_KEY_PREFIX + "vserver-name"; - // VNF & VM - Common Constants - public static final String TCA_VES_RESPONSE_FROM = "DCAE"; - - // TCA VES Message Router Partition Key - public static final String TCA_VES_MESSAGE_ROUTER_PARTITION_KEY = "VESMessageHash"; - - /** - * Default Number of instances for Threshold violation calculator flowlet - */ - public static final Integer TCA_DEFAULT_THRESHOLD_CALCULATOR_FLOWLET_INSTANCES = 2; - - /** - * Default TTL for TCA VES Message status table which contain status of all messages processed by TCA - */ - public static final Integer TCA_DEFAULT_VES_MESSAGE_STATUS_TTL_TABLE = 60 * 60 * 24 * 10; // 10 Days - - /** - * Default TTL for TCA VES Alerts table which contains alerts that can be send to downstream systems - */ - public static final Integer TCA_DEFAULT_VES_ALERTS_TTL_TABLE = 60 * 60 * 24 * 30; // 30 Days - - - /** - * Default TTL for TCA Alerts abatement table which contains information to send out abated alerts - */ - public static final Integer TCA_DEFAULT_ALERTS_ABATEMENT_TTL_TABLE = 60 * 60 * 24 * 30; // 30 Days - - - // TCA Policy Runtime Argument Paths - public static final String TCA_POLICY_DELIMITER = "."; - public static final String TCA_POLICY_DOMAIN_PATH = "domain"; - public static final String TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH = "configuration.metricsPerEventName"; - public static final String TCA_POLICY_THRESHOLDS_PATH_POSTFIX = "thresholds"; - - public static final String TCA_POLICY_JSON_KEY = "tca_policy"; - public static final String TCA_POLICY_STRING_DELIMITER = "\""; - - // TCA Alert output format by default is not CEF - public static final Boolean TCA_DEFAULT_ENABLE_CEF_FORMATTED_ALERT = false; - - // TCA A&AI Enrichment is disabled by default - public static final Boolean TCA_DEFAULT_ENABLE_AAI_ENRICHMENT = false; - // TCA A&AI SSL Certificate errors by default are *NOT* ignored - public static final Boolean TCA_DEFAULT_AAI_ENRICHMENT_IGNORE_SSL_CERTIFICATE_ERRORS = false; - // TCA A&AI proxy is disabled by default - public static final String TCA_DEFAULT_AAI_ENRICHMENT_PROXY_URL = null; - - - - private AnalyticsConstants() { - - } - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java deleted file mode 100644 index b634219..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/DCAEAnalyticsRuntimeException.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.exception; - -import org.slf4j.Logger; - -/** - * Runtime Exception for DCAE Analytics Exceptions. All DCAE Analytics - * runtime Exceptions must be wrapped inside this exception - *

- * @author Rajiv Singla . Creation Date: 10/5/2016. - */ -public class DCAEAnalyticsRuntimeException extends RuntimeException { - - - /** - * @param message - Error Message for Exception - * @param cause - Actual Exception which caused {@link DCAEAnalyticsRuntimeException} - */ - public DCAEAnalyticsRuntimeException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Creates and logs the DCAE Runtime Exception to given logger - * - * @param message - Error Message for Exception and logging - * @param logger - Logger used for logging exception - * @param cause - Actual exception which caused {@link DCAEAnalyticsRuntimeException} - */ - public DCAEAnalyticsRuntimeException(String message, Logger logger, Throwable cause) { - super(message, cause); - logger.error(message); - } - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/MessageProcessingException.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/MessageProcessingException.java deleted file mode 100644 index 19eca8f..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/exception/MessageProcessingException.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.exception; - -import org.openecomp.dcae.apod.analytics.common.service.processor.MessageProcessor; -import org.slf4j.Logger; - -/** - * Runtime Exception caused due to {@link MessageProcessor} failure while processing a message. - * - * @author Rajiv Singla . Creation Date: 11/7/2016. - */ -public class MessageProcessingException extends DCAEAnalyticsRuntimeException { - - /** - * @param message - Error Message for Exception - * @param cause - Actual Exception which caused {@link DCAEAnalyticsRuntimeException} - */ - public MessageProcessingException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Creates and logs the DCAE Runtime Exception to given logger - * - * @param message - Error Message for Exception and logging - * @param logger - Logger used for logging exception - * @param cause - Actual exception which caused {@link DCAEAnalyticsRuntimeException} - */ - public MessageProcessingException(String message, Logger logger, Throwable cause) { - super(message, logger, cause); - } -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java deleted file mode 100644 index 38e8d28..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilter.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.filter; - -import com.google.common.collect.ImmutableSet; -import com.jayway.jsonpath.DocumentContext; -import com.jayway.jsonpath.JsonPath; -import com.jayway.jsonpath.PathNotFoundException; -import org.apache.commons.lang3.StringUtils; -import org.openecomp.dcae.apod.analytics.common.service.processor.AbstractMessageProcessor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.Set; - -/** - * A Generic Json Message Filter which filter the json message based on given json Path and list of expected values - * for that json path. The {@link JsonMessageFilterProcessorContext#isMatched} flag will be changed as per table below: - *

- *      Incoming message is blank or invalid Json                               =  null
- *      Incoming message path is matches expected values                        = true
- *      Incoming message does not match expected values or path does not exist  = false
- * 
- *

- * @author Rajiv Singla . Creation Date: 2/10/2017. - */ -public class GenericJsonMessageFilter extends AbstractMessageProcessor { - - private static final Logger LOG = LoggerFactory.getLogger(GenericJsonMessageFilter.class); - private static final long serialVersionUID = 1L; - - private final String filterName; - private final String jsonPath; - private final Set expectedValues; - - public GenericJsonMessageFilter(final String filterName, final String jsonPath, final Set expectedValues) { - this.filterName = filterName; - this.jsonPath = jsonPath; - this.expectedValues = expectedValues; - } - - public GenericJsonMessageFilter(final String filterName, final String jsonPath, final String expectedValue) { - this(filterName, jsonPath, ImmutableSet.of(expectedValue)); - } - - @Override - public String getProcessorDescription() { - return filterName; - } - - @Override - public JsonMessageFilterProcessorContext processMessage(final JsonMessageFilterProcessorContext processorContext) { - - final String jsonMessage = processorContext.getMessage().trim(); - - if (StringUtils.isNotBlank(jsonMessage) && jsonMessage.startsWith("{") && jsonMessage.endsWith("}")) { - - // locate json path value - final DocumentContext documentContext = JsonPath.parse(jsonMessage); - String jsonPathValue = null; - try { - final List jsonPathValues = documentContext.read(jsonPath); - final Object pathValue = jsonPathValues.isEmpty() ? null : jsonPathValues.get(0); - jsonPathValue = pathValue instanceof Number ? pathValue.toString() : (String) pathValue; - } catch (PathNotFoundException ex) { - LOG.info("Unable to find json Path: {}. Exception: {}, Json Message: {}", jsonPath, ex, jsonMessage); - } - - LOG.debug("Value for jsonPath: {}, jsonPathValue: {}, expected Values: {}", - jsonPath, jsonPathValue, expectedValues); - - // if json path value is null or we json value is not present in expect values then terminate early - if (jsonPathValue == null || !expectedValues.contains(jsonPathValue)) { - final String terminatingMessage = String.format("Filter match unsuccessful. " + - "JsonPath: %s, Actual JsonPathValue: %s, Excepted Json Path Values: %s", - jsonPath, jsonPathValue, expectedValues); - processorContext.setMatched(false); - setTerminatingProcessingMessage(terminatingMessage, processorContext); - } else { - final String finishProcessingMessage = String.format("Filter match successful. " + - "JsonPath: %s, Actual JsonPathValue: %s, Excepted Json Path Values: %s", - jsonPath, jsonPathValue, expectedValues); - processorContext.setMatched(true); - setFinishedProcessingMessage(finishProcessingMessage, processorContext); - } - } else { - // if incoming message is blank of valid Json then matched flag will be null - final String terminatingMessage = "Incoming json message is blank or not json. " + - "Json filter cannot be applied"; - processorContext.setMatched(null); - setTerminatingProcessingMessage(terminatingMessage, processorContext); - } - - return processorContext; - } -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java deleted file mode 100644 index f1e0990..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/filter/JsonMessageFilterProcessorContext.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.filter; - -import org.openecomp.dcae.apod.analytics.common.service.processor.AbstractProcessorContext; - -/** - * A processor context for Json Message Filter Processor - *

- * @author Rajiv Singla . Creation Date: 2/10/2017. - */ -public class JsonMessageFilterProcessorContext extends AbstractProcessorContext { - - private static final long serialVersionUID = 1L; - - private Boolean isMatched; - - public JsonMessageFilterProcessorContext(final String jsonMessageString) { - super(jsonMessageString, true); - } - - /** - * Returns true if Json Message Filter match was successful - * - * @return true if Json Message Filter match was successful, false if filter was match was unsuccessful - */ - public Boolean getMatched() { - return isMatched; - } - - /** - * Sets the value for Json Message Filter match - * - * @param matched new value for json message filter match - */ - public void setMatched(final Boolean matched) { - isMatched = matched; - } -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java deleted file mode 100644 index 70b1e31..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessor.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import com.google.common.base.Optional; -import org.openecomp.dcae.apod.analytics.common.exception.MessageProcessingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; - -import static java.lang.String.format; - -/** - * An abstract Message Processor which can be extended by {@link MessageProcessor} implementations - * to get default behavior for Message Processors - * - * @param

Processor Context sub classes - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public abstract class AbstractMessageProcessor

implements MessageProcessor

{ - - private static final Logger LOG = LoggerFactory.getLogger(AbstractMessageProcessor.class); - - /** - * By Default there is no processing message - */ - private String processingMessage = null; - - /** - * By Default Processing State is set to not required - subclasses must - * set processing state to {@link ProcessingState#PROCESSING_FINISHED_SUCCESSFULLY} on successful processing - * or {@link ProcessingState#PROCESSING_TERMINATED_EARLY} if processing fails - */ - protected ProcessingState processingState = ProcessingState.PROCESSING_NOT_REQUIRED; - - /** - * Sub classes must provide a description of a processor - * - * @return description of processor - * - */ - public abstract String getProcessorDescription(); - - - /** - * Sub classes must provide implementation to process Message - * - * @param processorContext incoming {@link ProcessorContext} - * @return outgoing {@link ProcessorContext} - */ - public abstract P processMessage(P processorContext); - - @Override - public ProcessorInfo getProcessorInfo() { - // by default the class of the Processor is assigned as Processor Name - final String processorClassName = getClass().getSimpleName(); - return new GenericProcessorInfo(processorClassName, getProcessorDescription()); - } - - @Override - public P preProcessor(P processorContext) { - LOG.debug("Processing Started for Processor: {}", getProcessorInfo().getProcessorName()); - // by default check to see if continue processing Flag is not false - final boolean okToContinue = processorContext.canProcessingContinue(); - if (!okToContinue) { - final String errorMessage = - format("Processor: %s. Processing Context flag okToContinue is false. Unable to proceed...", - getProcessorInfo().getProcessorName()); - throw new MessageProcessingException(errorMessage, LOG, new IllegalStateException(errorMessage)); - } - processingState = ProcessingState.PROCESSING_STARTED; - return processorContext; - } - - @Override - public ProcessingState getProcessingState() { - return processingState; - } - - @Override - public Optional getProcessingMessage() { - return Optional.fromNullable(processingMessage); - } - - @Override - public P postProcessor(P processorContext) { - // Default implementation updates the post processing flag if processing did not - // completed successfully - if (processingState != ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY) { - LOG.debug("Processor: {}, Update Process Context State to stop Processing.", - getProcessorInfo().getProcessorName()); - processorContext.setProcessingContinueFlag(false); - } - // attaches itself to message processor context - processorContext.getMessageProcessors().add(this); - LOG.debug("Processing Completed for Processor: {}", getProcessorInfo()); - return processorContext; - } - - - @Override - public final P apply(@Nonnull P processorContext) { - final P preProcessedProcessorContext = preProcessor(processorContext); - final P processedProcessorContext = processMessage(preProcessedProcessorContext); - return postProcessor(processedProcessorContext); - } - - - /** - * Helper method that updates processing state in case of early termination, logs the processing - * termination reason, updates Processor processing state as Terminated and sets it processing message - * - * @param terminatingMessage error Message - * @param processorContext message processor context - */ - protected void setTerminatingProcessingMessage(final String terminatingMessage, - final P processorContext) { - - final String message = processorContext.getMessage(); - this.processingState = ProcessingState.PROCESSING_TERMINATED_EARLY; - this.processingMessage = terminatingMessage; - LOG.debug("Processor: {}, Early Terminating Message: {}, Incoming Message: {}", - getProcessorInfo().getProcessorName(), terminatingMessage, message); - } - - /** - * Helper method that updates Processing state and logs completion message - * passed - * - * @param processorPassingMessage Processor passing message - * @param processorContext message processor context - */ - protected void setFinishedProcessingMessage(final String processorPassingMessage, P processorContext) { - final String message = processorContext.getMessage(); - processingState = ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY; - this.processingMessage = processorPassingMessage; - LOG.debug("Processor: {}, Successful Completion Message: {}, Incoming Message: {}", - getProcessorInfo().getProcessorName(), processorPassingMessage, message); - } - - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java deleted file mode 100644 index 53067fe..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContext.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import com.google.common.base.Objects; - -import java.util.LinkedList; -import java.util.List; - -/** - *

- * An abstract implementation for {@link ProcessorContext} which other DCAE Analytics Modules - * can extend to add module specific functionality - *

- * - * @author Rajiv Singla . Creation Date: 11/7/2016. - */ -public abstract class AbstractProcessorContext implements ProcessorContext { - - private final String message; - private List> messageProcessors; - private boolean canProcessingContinue; - - public AbstractProcessorContext(final String message, - boolean canProcessingContinue) { - this.message = message; - this.canProcessingContinue = canProcessingContinue; - this.messageProcessors = new LinkedList<>(); - } - - /** - * Returns JSON String of incoming CEF Message that needs to be processed - * - * @return incoming CEF message that needs to be processed - */ - @Override - public String getMessage() { - return message; - } - - /** - * Sets if it is ok to continue processing normally - * - * @return boolean which determines if it is ok to continue processing normally - */ - @Override - public boolean canProcessingContinue() { - return canProcessingContinue; - } - - - /** - * Set if it is ok to continue processing normally - * - * @param canProcessingContinue sets boolean which determines if it is ok to continue processing normally - */ - @Override - public void setProcessingContinueFlag(boolean canProcessingContinue) { - this.canProcessingContinue = canProcessingContinue; - } - - /** - * Provides List of message processors which were used in processing CEF message - * - * @return List of message processors which were used in processing CEF message - */ - @Override - public List> getMessageProcessors() { - return messageProcessors; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("canProcessingContinue", canProcessingContinue) - .toString(); - } -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java deleted file mode 100644 index b21dee7..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessor.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import org.openecomp.dcae.apod.analytics.common.utils.MessageProcessorUtils.MessageProcessorFunction; - -import java.util.List; - -import static org.openecomp.dcae.apod.analytics.common.utils.MessageProcessorUtils.computeMessageProcessorChain; - -/** - *

- * A Generic Message Processor which passes the {@link ProcessorContext} from first to second - * {@link MessageProcessor} - *

- * - * @param

Processor Context sub classes - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public class GenericMessageChainProcessor

{ - - private final List> messageProcessors; - private final P initialProcessorContext; - - public GenericMessageChainProcessor(List> messageProcessors, - P initialProcessorContext) { - this.messageProcessors = messageProcessors; - this.initialProcessorContext = initialProcessorContext; - } - - /** - * Process a processor chain - * - * @return Processor Context after processing the processor chain - */ - public P processChain() { - - final MessageProcessorFunction

messageProcessorFunction = - new MessageProcessorFunction

() { - @Override - public > P apply(P context, M processor) { - return processor.apply(context); - } - }; - - return computeMessageProcessorChain(messageProcessors, initialProcessorContext, - messageProcessorFunction); - - } - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java deleted file mode 100644 index a8f561a..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfo.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import javax.annotation.Nonnull; - -/** - * A Generic Implementation of {@link ProcessorInfo} - * - * @author Rajiv Singla . Creation Date: 11/7/2016. - */ -public class GenericProcessorInfo implements ProcessorInfo { - - private static final long serialVersionUID = 1L; - - private final String processorName; - private final String processorDescription; - - public GenericProcessorInfo(@Nonnull String processorName, @Nonnull String processorDescription) { - this.processorName = processorName; - this.processorDescription = processorDescription; - } - - @Override - public String getProcessorName() { - return processorName; - } - - @Override - public String getProcessorDescription() { - return processorDescription; - } - - - @Override - public String toString() { - return processorName; - } -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/MessageProcessor.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/MessageProcessor.java deleted file mode 100644 index 8fa0610..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/MessageProcessor.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import com.google.common.base.Function; -import com.google.common.base.Optional; - -import java.io.Serializable; - -/** - *

- * A message processor can be used to process incoming messages. - * It uses implementations of {@link ProcessorContext} as input and output - *

- * - * @param

Message Processor Context implementations - * - * @author Rajiv Singla . Creation Date: 11/7/2016. - */ -public interface MessageProcessor

extends Function, Serializable { - - /** - * Returns processor information - * - * @return processor Information - */ - ProcessorInfo getProcessorInfo(); - - - /** - * Does pre-processing of {@link ProcessorContext} e.g. validate input conditions and return - * pre processed context - * - * @param processorContext incoming Processor Context - * @return Pre processed Processor Context - */ - P preProcessor(P processorContext); - - - /** - * Return processing state of a processor - * - * @return Processing State - */ - ProcessingState getProcessingState(); - - - /** - * May return a message from a processor which indicates the reason for {@link ProcessingState} especially if - * there was some failure in processing - * - * @return processing Message - */ - Optional getProcessingMessage(); - - - /** - * Does post-processing of {@link ProcessorContext} - * - * @param processorContext incoming Processor Context - * @return processor Context after post processing is finished - */ - P postProcessor(P processorContext); - - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessingState.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessingState.java deleted file mode 100644 index fa87f3f..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessingState.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -/** - *

- * Processing state of a {@link MessageProcessor} - *

- * @author Rajiv Singla . Creation Date: 11/5/2016. - */ -public enum ProcessingState { - - PROCESSING_STARTED, - PROCESSING_FINISHED_SUCCESSFULLY, - PROCESSING_TERMINATED_EARLY, - PROCESSING_NOT_REQUIRED; - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorContext.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorContext.java deleted file mode 100644 index e2c1322..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorContext.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import java.io.Serializable; -import java.util.List; - -/** - *

- * A Processor Context is used a an input and output to a {@link MessageProcessor} - *
- * DCAE Analytics sub projects should extend this interface and add specific fields - * required for input and output - *

- * - * @author Rajiv Singla . Creation Date: 11/7/2016. - */ -public interface ProcessorContext extends Serializable { - - /** - * Returns Processor Context message that will be processed by Chain of Processors - * - * @return message that need to be processed by processors - */ - String getMessage(); - - /** - * Processing Context flag which determines if Processing can continue in a processing - * chain - * - * @return true if ok to continue processing normally - */ - boolean canProcessingContinue(); - - - /** - * Sets new value for ProcessingContinue flag which will cause early termination of processing in chain if - * set to false - * - * @param canProcessingContinue set new value for canProcessing Continue flag - */ - void setProcessingContinueFlag(boolean canProcessingContinue); - - - /** - * Provides a List of previous processors which have completed processing - * - * @return list of previous processors - */ - List> getMessageProcessors(); - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorInfo.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorInfo.java deleted file mode 100644 index d1370aa..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/service/processor/ProcessorInfo.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import java.io.Serializable; - -/** - *

- * Contains Information about a processor. For e.g. Processor name, processor description etc - *

- * - * @author Rajiv Singla . Creation Date: 11/7/2016. - */ -public interface ProcessorInfo extends Serializable { - - /** - * Returns a name which should uniquely identify a particular {@link MessageProcessor} - * - * @return processor name - */ - String getProcessorName(); - - - /** - * Returns description of a {@link MessageProcessor} - * - * @return processor description - */ - String getProcessorDescription(); - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtils.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtils.java deleted file mode 100644 index 74135b9..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtils.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.utils; - -/** - * Contains common utils to check HTTP Related Utils - * - * @author Rajiv Singla . Creation Date: 11/2/2016. - */ -public abstract class HTTPUtils { - - /** - * HTTP Status code for successful HTTP call - */ - public static final Integer HTTP_SUCCESS_STATUS_CODE = 200; - - /** - * HTTP Response code when request has been accepted for processing, but the processing has not been completed - */ - public static final Integer HTTP_ACCEPTED_RESPONSE_CODE = 202; - - /** - * HTTP Response code when there is no content - */ - public static final Integer HTTP_NO_CONTENT_RESPONSE_CODE = 204; - - - public static final String JSON_APPLICATION_TYPE = "application/json"; - - - private HTTPUtils() { - - } - - /** - * Checks if HTTP Status code is less than or equal to 200 but less then 300 - * - * @param statusCode http status code - * @return true if response code between 200 and 300 - */ - public static boolean isSuccessfulResponseCode(Integer statusCode) { - return statusCode >= 200 && statusCode < 300; - } -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtils.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtils.java deleted file mode 100644 index f0553f5..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtils.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.utils; - -import com.google.common.base.Preconditions; -import org.openecomp.dcae.apod.analytics.common.exception.MessageProcessingException; -import org.openecomp.dcae.apod.analytics.common.service.filter.GenericJsonMessageFilter; -import org.openecomp.dcae.apod.analytics.common.service.filter.JsonMessageFilterProcessorContext; -import org.openecomp.dcae.apod.analytics.common.service.processor.GenericMessageChainProcessor; -import org.openecomp.dcae.apod.analytics.common.service.processor.MessageProcessor; -import org.openecomp.dcae.apod.analytics.common.service.processor.ProcessorContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - - -/** - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public abstract class MessageProcessorUtils { - - private static final Logger LOG = LoggerFactory.getLogger(MessageProcessorUtils.class); - - /** - * Provides an abstraction how to apply {@link ProcessorContext} to next {@link MessageProcessor} - * in the message processor chain - * - * @param

Sub classes of Processor Context - */ - public interface MessageProcessorFunction

{ - - /** - * Method which provides accumulated {@link ProcessorContext} from previous processors and a reference - * to next processor in the chain - * - * @param p accumulated {@link ProcessorContext} from previous processors - * @param m current {@link MessageProcessor} in the chain - * @param Message processor sub classes - * - * @return processing context after computing the current Message Processor - */ - > P apply(P p, M m); - } - - - /** - * Provides an abstraction to compute a chain of {@link MessageProcessor} - * - * @param messageProcessors An iterable containing one or more {@link MessageProcessor}s - * @param initialProcessorContext An initial processing Context - * @param messageProcessorFunction messageProcessor Function - * @param

Sub classes for Processor Context - * - * @return processing context which results after computing the whole chain - */ - public static

P computeMessageProcessorChain( - final Iterable> messageProcessors, - final P initialProcessorContext, - final MessageProcessorFunction

messageProcessorFunction) { - - // Get message processor iterator - final Iterator> processorIterator = messageProcessors.iterator(); - - // If no next message processor - return initial processor context - if (!processorIterator.hasNext()) { - return initialProcessorContext; - } - - // An accumulator for processor Context - P processorContextAccumulator = initialProcessorContext; - - while (processorIterator.hasNext()) { - - final MessageProcessor

nextProcessor = processorIterator.next(); - - // If Initial Processor Context is null - if (processorContextAccumulator == null) { - final String errorMessage = - String.format("Processor Context must not be null for Message Process: %s", - nextProcessor.getProcessorInfo().getProcessorName()); - throw new MessageProcessingException(errorMessage, LOG, new IllegalStateException(errorMessage)); - } - - - if (!processorContextAccumulator.canProcessingContinue()) { - LOG.debug("Triggering Early Termination, before Message Processor: {}, Incoming Message: {}", - nextProcessor.getProcessorInfo().getProcessorName(), processorContextAccumulator.getMessage()); - break; - } - processorContextAccumulator = messageProcessorFunction.apply(processorContextAccumulator, nextProcessor); - } - - return processorContextAccumulator; - } - - - /** - * Utility method to process Json Filter Mappings. Processes incoming json message and applies a list of json - * filter mappings and returns the resulting {@link JsonMessageFilterProcessorContext} - * - * @param jsonMessage json message to which filter mappings will be applies - * @param jsonFilterMappings Filter mappings contains a Map containing keys as filter json path - * and values as set of expected value corresponding to filter path - * - * @return json message processor context which contains the {@link JsonMessageFilterProcessorContext#isMatched} - * status after applying all filter mappings - */ - public static JsonMessageFilterProcessorContext processJsonFilterMappings( - final String jsonMessage, @Nonnull final Map> jsonFilterMappings) { - - Preconditions.checkState(jsonFilterMappings.size() > 0, "Json Filter Mappings must not be empty"); - - // create initial processor context containing the json message that need to be processed - final JsonMessageFilterProcessorContext initialProcessorContext = - new JsonMessageFilterProcessorContext(jsonMessage); - - // Create Json Message Filters - final List jsonMessageFilters = new LinkedList<>(); - - int i = 0; - for (Map.Entry> jsonFilterMapping : jsonFilterMappings.entrySet()) { - jsonMessageFilters.add(new GenericJsonMessageFilter("Filter-" + i, jsonFilterMapping.getKey(), - jsonFilterMapping.getValue())); - i++; - } - - // Create Generic Message Chain Processor - final GenericMessageChainProcessor messageChainProcessor = - new GenericMessageChainProcessor<>(jsonMessageFilters, initialProcessorContext); - - // Process chain and return resulting json Message Filter Processor Context - return messageChainProcessor.processChain(); - } - - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtils.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtils.java deleted file mode 100644 index ef7a261..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.utils; - -import java.util.Date; - -/** - * Contains Utility methods for creating persistence row keys etc. - * - * @author Rajiv Singla . Creation Date: 11/16/2016. - */ -public abstract class PersistenceUtils { - - - /** - * Name of the column which will contain Table Key - */ - public static final String TABLE_ROW_KEY_COLUMN_NAME = "key"; - - /** - * Delimited to be used when creating a row key with multiple fields - */ - public static final String ROW_KEY_DELIMITER = "-"; - - - private PersistenceUtils() { - - } - - /** - * Creates a decreasing number using current timestamp. Handy when you want to keep records most recent records - * close to the top of column table like HBase - * - * @return decreasing number - */ - public static String getCurrentTimeReverseSubKey() { - final long timeReverseLong = Long.MAX_VALUE - new Date().getTime(); - return String.format("%025d", timeReverseLong); - } - -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/DCAEValidator.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/DCAEValidator.java deleted file mode 100644 index 48713b2..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/DCAEValidator.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.validation; - -import java.io.Serializable; - -/** - * Marker interface for all DCAE Validators - * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public interface DCAEValidator extends Serializable { -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponse.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponse.java deleted file mode 100644 index 7ce9d26..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponse.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.validation; - -import com.google.common.base.Joiner; -import com.google.common.base.Objects; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -/** - * A generic implementation of Validation Response - * - * @param Validation Entity Type - * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public class GenericValidationResponse implements ValidationResponse { - - private LinkedHashMap errorMessageMap = new LinkedHashMap<>(); - - @Override - public boolean hasErrors() { - return errorMessageMap.size() != 0; - } - - @Override - public Set getFieldNamesWithError() { - return errorMessageMap.keySet(); - } - - @Override - public Collection getErrorMessages() { - return errorMessageMap.values(); - } - - @Override - public Map getValidationResultsAsMap() { - return errorMessageMap; - } - - @Override - public String getAllErrorMessage() { - return getAllErrorMessage(","); - } - - @Override - public String getAllErrorMessage(String delimiter) { - return Joiner.on(delimiter).join(errorMessageMap.values()); - } - - @Override - public void addErrorMessage(String fieldName, String filedErrorMessage) { - errorMessageMap.put(fieldName, filedErrorMessage); - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("hasErrors", hasErrors()) - .add("errorMessageMap", errorMessageMap) - .toString(); - } -} diff --git a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/ValidationResponse.java b/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/ValidationResponse.java deleted file mode 100644 index 80334b7..0000000 --- a/dcae-analytics-common/src/main/java/org/openecomp/dcae/apod/analytics/common/validation/ValidationResponse.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.validation; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -/** - * Validation Response contract - * - * @param Entity class type which is being validated - * - * @author Rajiv Singla . Creation Date: 10/24/2016. - */ -public interface ValidationResponse { - - /** - * Returns true if validation resulted in one or more errors - * - * @return true if validation has errors - */ - boolean hasErrors(); - - /** - * Returns all field names which have error - * - * @return names of fields which have error - */ - Set getFieldNamesWithError(); - - /** - * Returns list of all error messages - * - * @return list of error messages - */ - Collection getErrorMessages(); - - - /** - * Returns all error messages as string delimited by comma - * - * @return all error messages delimited by given delimiter - */ - String getAllErrorMessage(); - - /** - * Returns all error messages as string delimited by given delimited - * - * @param delimiter delimited to be used for error message - * @return all error messages delimited by given delimiter - */ - String getAllErrorMessage(String delimiter); - - /** - * Adds field name and error message to the validation response - * - * @param fieldName field name which has validation error - * @param filedErrorMessage validation error message - */ - void addErrorMessage(String fieldName, String filedErrorMessage); - - - /** - * Returns validation results as map containing values as keys and values - * as error Message - * - * @return Map containing field names and error message associated with those fields - */ - Map getValidationResultsAsMap(); - -} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java new file mode 100644 index 0000000..e30e0af --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java @@ -0,0 +1,81 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Suppliers; +import org.junit.BeforeClass; +import org.onap.dcae.apod.analytics.common.service.processor.TestEarlyTerminatingProcessor; +import org.onap.dcae.apod.analytics.common.service.processor.TestMessageProcessor1; +import org.onap.dcae.apod.analytics.common.service.processor.TestMessageProcessor2; +import org.onap.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; + +/** + * Base class from all DCEA Analytics Common Module Unit Tests + *

+ * @author Rajiv Singla . Creation Date: 10/6/2016. + */ +public abstract class BaseAnalyticsCommonUnitTest extends BaseDCAEAnalyticsUnitTest { + + + protected static final String TEST_MESSAGE_PROCESSOR_MESSAGE = "Test Processor Message"; + + protected static final String CEF_MESSAGE_FILE_PATH = "data/json/cef/cef_message.json"; + + protected static ObjectMapper objectMapper; + + /** + * Before running test cases need to assign object mapper. + */ + @BeforeClass + public static void beforeClass() { + final AnalyticsModelObjectMapperSupplier analyticsModelObjectMapperSupplier = + new AnalyticsModelObjectMapperSupplier(); + objectMapper = Suppliers.memoize(analyticsModelObjectMapperSupplier).get(); + } + + /* + * Test implementation for {@link CDAPAppSettings} + */ + protected class CDAPTestAppSettings { + + private String settingsField; + + public String getSettingsField() { + return settingsField; + } + + public void setSettingsField(String settingsField) { + this.settingsField = settingsField; + } + } + + protected TestMessageProcessor1 getTestMessageProcessor1() { + return new TestMessageProcessor1(); + } + protected TestMessageProcessor2 getTestMessageProcessor2() { + return new TestMessageProcessor2(); + } + protected TestEarlyTerminatingProcessor getTestEarlyTerminationProcessor() { + return new TestEarlyTerminatingProcessor(); + } +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java new file mode 100644 index 0000000..bca3730 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java @@ -0,0 +1,151 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.filter; + +import com.google.common.collect.ImmutableList; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; +import org.onap.dcae.apod.analytics.common.service.processor.GenericMessageChainProcessor; + +import static org.junit.Assert.assertEquals; + +/** + * @author Rajiv Singla . Creation Date: 2/10/2017. + */ +public class GenericJsonMessageFilterTest extends BaseAnalyticsCommonUnitTest { + + private String jsonMessage; + + @Before + public void before() throws Exception { + jsonMessage = fromStream(CEF_MESSAGE_FILE_PATH); + + } + + @Test + public void testJsonMessageFilterWhenAllFiltersPassed() throws Exception { + + final JsonMessageFilterProcessorContext finalMessageProcessorContext = + processJsonMessageFilterChain(jsonMessage, + "domainFilter", "$.event.commonEventHeader.domain", "measurementsForVfScaling", + "eventNameFilter", "$.event.commonEventHeader.eventName", "Mfvs_eNodeB_RANKPI"); + + assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, true, true, 2); + + } + + @Test + public void testJsonMessageFilterWhenJsonPathValueIsANumber() throws Exception { + + final JsonMessageFilterProcessorContext finalMessageProcessorContext = + processJsonMessageFilterChain(jsonMessage, + "domainFilter", "$.event.commonEventHeader.sequence", "0", + "eventNameFilter", "$.event.commonEventHeader.eventName", "Mfvs_eNodeB_RANKPI"); + + assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, true, true, 2); + } + + @Test + public void testJsonMessageFilterWhenOneFilterDoesNotMatch() throws Exception { + + final JsonMessageFilterProcessorContext finalMessageProcessorContext = + processJsonMessageFilterChain(jsonMessage, + "domainFilter", "$.event.commonEventHeader.domain", "xxxxxxxxxxx", + "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); + + assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, false, false, 1); + } + + @Test + public void testJsonMessageFilterWhenJsonPathDoesNotExist() throws Exception { + + final JsonMessageFilterProcessorContext finalMessageProcessorContext = + processJsonMessageFilterChain(jsonMessage, + "domainFilter", "$.event.commonEventHeader.xxxxxxx", "measurementsForVfScaling", + "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); + + assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, false, false, 1); + } + + @Test + public void testJsonMessageFilterWhenIncomingMessageIsBlank() throws Exception { + + final JsonMessageFilterProcessorContext finalMessageProcessorContext = + processJsonMessageFilterChain("", + "domainFilter", "$.event.commonEventHeader.domain", "measurementsForVfScaling", + "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); + + assertJsonMessageAssertions("", finalMessageProcessorContext, false, null, 1); + + } + + @Test + public void testJsonMessageFilterWhenIncomingMessageIsNotValidJson() throws Exception { + + final JsonMessageFilterProcessorContext finalMessageProcessorContext = + processJsonMessageFilterChain("invalidJson", + "domainFilter", "$.event.commonEventHeader.domain", "measurementsForVfScaling", + "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); + + assertJsonMessageAssertions("invalidJson", finalMessageProcessorContext, false, null, 1); + + } + + + private static void assertJsonMessageAssertions( + final String jsonMessage, final JsonMessageFilterProcessorContext finalMessageProcessorContext, + final Boolean canProcessingContinueFlag, final Boolean matchedFlag, + final int messageProcessorCount) throws Exception { + + assertJson(jsonMessage, finalMessageProcessorContext.getMessage()); + Assert.assertEquals(canProcessingContinueFlag, finalMessageProcessorContext.canProcessingContinue()); + assertEquals(matchedFlag, finalMessageProcessorContext.getMatched()); + Assert.assertEquals(finalMessageProcessorContext.getMessageProcessors().size(), messageProcessorCount); + + } + + + private static JsonMessageFilterProcessorContext processJsonMessageFilterChain( + final String jsonMessage, + final String firstFilterName, final String firstFilterPath, final String firstFilterValue, + final String secondFilterName, final String secondFilterPath, final String secondFilterValue) { + + // create processors + final GenericJsonMessageFilter firstFilter = new GenericJsonMessageFilter(firstFilterName, firstFilterPath, + firstFilterValue); + final GenericJsonMessageFilter secondFilter = new GenericJsonMessageFilter(secondFilterName, + secondFilterPath, secondFilterValue); + + // create initial processor context containing the json message that need to be processed + final JsonMessageFilterProcessorContext initialProcessorContext = + new JsonMessageFilterProcessorContext(jsonMessage); + + // create a generic message chain processor and feed it list of processors and initialProcessor context + final GenericMessageChainProcessor messageChainProcessor = + new GenericMessageChainProcessor<>(ImmutableList.of(firstFilter, secondFilter), + initialProcessorContext); + + // process the generic message chain + return messageChainProcessor.processChain(); + } +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java new file mode 100644 index 0000000..ea7b2d6 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java @@ -0,0 +1,68 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; +import org.onap.dcae.apod.analytics.common.exception.MessageProcessingException; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class AbstractMessageProcessorTest extends BaseAnalyticsCommonUnitTest { + + + @Test + public void testPreProcessorWhenProcessingContextFlagIsTrue() throws Exception { + TestMessageProcessor1 messageProcessor1 = new TestMessageProcessor1(); + final TestProcessorContext processorContext = + new TestProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); + final TestProcessorContext testProcessorContext = messageProcessor1.preProcessor(processorContext); + assertThat("Processing flag must be true", + testProcessorContext.canProcessingContinue(), is(true)); + } + + @Test(expected = MessageProcessingException.class) + public void testPreProcessorWhenProcessingContextFlagIsFalse() throws Exception { + TestMessageProcessor1 messageProcessor1 = new TestMessageProcessor1(); + final TestProcessorContext testProcessorContext = + new TestProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, false); + messageProcessor1.preProcessor(testProcessorContext); + } + + @Test + public void testPostProcessorWhenProcessingStateIsNotFinishedSuccessfully() throws Exception { + TestMessageProcessor1 messageProcessor1 = new TestMessageProcessor1(); + final ProcessingState processingState = messageProcessor1.getProcessingState(); + assertTrue("Processing state is not processing finished successfully", + processingState != ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY); + final TestProcessorContext processorContext = + new TestProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); + final TestProcessorContext testProcessorContext = messageProcessor1.postProcessor(processorContext); + assertThat("Processing flag must be false", + testProcessorContext.canProcessingContinue(), is(false)); + } + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java new file mode 100644 index 0000000..2710b75 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java @@ -0,0 +1,79 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; + +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class AbstractProcessorContextTest extends BaseAnalyticsCommonUnitTest { + + class TestAbstractMessageProcessorContext extends AbstractProcessorContext { + + public TestAbstractMessageProcessorContext(String message, boolean canProcessingContinue) { + super(message, canProcessingContinue); + } + } + + + @Test + public void testGetMessage() throws Exception { + TestAbstractMessageProcessorContext testProcessorContext = + new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); + final String message = testProcessorContext.getMessage(); + assertThat("Message Processor message must match", message, is(TEST_MESSAGE_PROCESSOR_MESSAGE)); + } + + @Test + public void testCanProcessingContinue() throws Exception { + TestAbstractMessageProcessorContext testProcessorContext = + new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); + final boolean canProcessingContinue = testProcessorContext.canProcessingContinue(); + assertThat("Message Can Processing flag must be true", canProcessingContinue, is(true)); + } + + @Test + public void testSetProcessingContinueFlag() throws Exception { + TestAbstractMessageProcessorContext testProcessorContext = + new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); + testProcessorContext.setProcessingContinueFlag(false); + assertThat("Message Can processing flag must be false", + testProcessorContext.canProcessingContinue(), is(false)); + + } + + @Test + public void testGetMessageProcessors() throws Exception { + TestAbstractMessageProcessorContext testProcessorContext = + new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); + final List> messageProcessors = + testProcessorContext.getMessageProcessors(); + assertThat("Message processor processing message must match", messageProcessors.size(), is(0)); + } + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java new file mode 100644 index 0000000..3a466c2 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java @@ -0,0 +1,96 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import com.google.common.collect.ImmutableList; +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; +import org.onap.dcae.apod.analytics.common.exception.MessageProcessingException; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; + + +/** + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public class GenericMessageChainProcessorTest extends BaseAnalyticsCommonUnitTest { + + + @Test + public void testProcessChainWhenProcessChainHasNoEarlyTermination() throws Exception { + + final TestMessageProcessor1 testMessageProcessor1 = getTestMessageProcessor1(); + final TestMessageProcessor2 testMessageProcessor2 = getTestMessageProcessor2(); + final ImmutableList> testMessageChain = + ImmutableList.of(testMessageProcessor1, testMessageProcessor2); + + final TestProcessorContext testProcessorContext = new TestProcessorContext("Hello", true); + + final GenericMessageChainProcessor genericMessageChainProcessor = + new GenericMessageChainProcessor<>(testMessageChain, testProcessorContext); + + final TestProcessorContext finalProcessorContext = genericMessageChainProcessor.processChain(); + + final String result = finalProcessorContext.getResult(); + assertThat("Final Result must be Hello World! Again", result, is("Hello World! Again")); + assertThat("TestProcessor1 state is correct", testMessageProcessor1.getProcessingState(), + is(ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY)); + assertThat("TestProcessor2 state is correct", testMessageProcessor2.getProcessingState(), + is(ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY)); + } + + + @Test + public void testProcessChainWhenProcessChainEarlyTermination() throws Exception { + + final TestEarlyTerminatingProcessor testEarlyTerminatingProcessor = getTestEarlyTerminationProcessor(); + final ImmutableList> testMessageChain = + ImmutableList.of(testEarlyTerminatingProcessor, getTestMessageProcessor2()); + final TestProcessorContext testProcessorContext = new TestProcessorContext("Hello", true); + + final GenericMessageChainProcessor genericMessageChainProcessor = + new GenericMessageChainProcessor<>(testMessageChain, testProcessorContext); + + final TestProcessorContext finalProcessorContext = genericMessageChainProcessor.processChain(); + final String result = finalProcessorContext.getResult(); + assertNull("Final Result must be null", result); + assertThat("TestEarlyTerminatingProcessor state is correct", + testEarlyTerminatingProcessor.getProcessingState(), is(ProcessingState.PROCESSING_TERMINATED_EARLY)); + } + + @Test(expected = MessageProcessingException.class) + public void testProcessChainWhenIncomingMessageContextIsNull() throws Exception { + + final TestEarlyTerminatingProcessor testEarlyTerminatingProcessor = getTestEarlyTerminationProcessor(); + final ImmutableList> testMessageChain = + ImmutableList.of(testEarlyTerminatingProcessor, getTestMessageProcessor2()); + final TestProcessorContext testProcessorContext = null; + + final GenericMessageChainProcessor genericMessageChainProcessor = + new GenericMessageChainProcessor<>(testMessageChain, testProcessorContext); + + genericMessageChainProcessor.processChain(); + } + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java new file mode 100644 index 0000000..f0bc30e --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java @@ -0,0 +1,53 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class GenericProcessorInfoTest extends BaseAnalyticsCommonUnitTest { + + + @Test + public void getProcessorName() throws Exception { + final String processorName = "testProcessorName"; + final String processorDescription = "testProcessorDescription"; + GenericProcessorInfo genericProcessorInfo = new GenericProcessorInfo(processorName, processorDescription); + assertThat("Processor Name must match", genericProcessorInfo.getProcessorName(), is(processorName)); + + } + + @Test + public void getProcessorDescription() throws Exception { + final String processorName = "testProcessorName"; + final String processorDescription = "testProcessorDescription"; + GenericProcessorInfo genericProcessorInfo = new GenericProcessorInfo(processorName, processorDescription); + assertThat("Processor Description must match", genericProcessorInfo.getProcessorDescription(), + is(processorDescription)); + } + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java new file mode 100644 index 0000000..80d2341 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java @@ -0,0 +1,39 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +/** + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public class TestEarlyTerminatingProcessor extends AbstractMessageProcessor { + + @Override + public String getProcessorDescription() { + return "Terminates the chain early"; + } + + @Override + public TestProcessorContext processMessage(TestProcessorContext processorContext) { + setTerminatingProcessingMessage("Terminating early", processorContext); + return processorContext; + } +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java new file mode 100644 index 0000000..4850ad5 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java @@ -0,0 +1,41 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +/** + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public class TestMessageProcessor1 extends AbstractMessageProcessor { + + @Override + public String getProcessorDescription() { + return "Appends \" World!\" to the message string and set it to result string"; + } + + @Override + public TestProcessorContext processMessage(TestProcessorContext processorContext) { + final String message = processorContext.getMessage(); + processorContext.setResult(message + " World!"); + setFinishedProcessingMessage("Finished Appending world", processorContext); + return processorContext; + } +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java new file mode 100644 index 0000000..7c0312a --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java @@ -0,0 +1,41 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +/** + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public class TestMessageProcessor2 extends AbstractMessageProcessor { + + @Override + public String getProcessorDescription() { + return "Appends \" Again\" to the result string"; + } + + @Override + public TestProcessorContext processMessage(TestProcessorContext processorContext) { + final String result = processorContext.getResult(); + processorContext.setResult(result + " Again"); + setFinishedProcessingMessage("Finished Appending again to result", processorContext); + return processorContext; + } +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestProcessorContext.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestProcessorContext.java new file mode 100644 index 0000000..6f849f5 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/service/processor/TestProcessorContext.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.service.processor; + +import java.util.LinkedList; +import java.util.List; + +/** + * + * @author Rajiv Singla . Creation Date: 11/8/2016. + */ +public class TestProcessorContext implements ProcessorContext { + + private String message; + private boolean continueProcessingFlag; + private String result; + private List> messageProcessors; + + public TestProcessorContext(String message, boolean continueProcessingFlag) { + this.message = message; + this.continueProcessingFlag = continueProcessingFlag; + this.messageProcessors = new LinkedList<>(); + } + + @Override + public String getMessage() { + return message; + } + + @Override + public boolean canProcessingContinue() { + return continueProcessingFlag; + } + + @Override + public void setProcessingContinueFlag(boolean canProcessingContinue) { + this.continueProcessingFlag = canProcessingContinue; + } + + @Override + public List> getMessageProcessors() { + return messageProcessors; + } + + + public void setMessage(String message) { + this.message = message; + } + + public boolean isContinueProcessingFlag() { + return continueProcessingFlag; + } + + public void setContinueProcessingFlag(boolean continueProcessingFlag) { + this.continueProcessingFlag = continueProcessingFlag; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtilsTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtilsTest.java new file mode 100644 index 0000000..0e02c2a --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/HTTPUtilsTest.java @@ -0,0 +1,48 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.utils; + +import org.junit.Assert; +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; + +import static org.hamcrest.CoreMatchers.is; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class HTTPUtilsTest extends BaseAnalyticsCommonUnitTest { + + + @Test + public void testIsSuccessfulResponseCodeWhenResponseCodeIsSuccessful() throws Exception { + final boolean successfulResponseCode = HTTPUtils.isSuccessfulResponseCode(200); + Assert.assertThat("200 Response code must return true", successfulResponseCode, is(true)); + } + + @Test + public void testIsSuccessfulResponseCodeWhenResponseCodeIsNotSuccessful() throws Exception { + final boolean successfulResponseCode = HTTPUtils.isSuccessfulResponseCode(301); + Assert.assertThat("301 Response code must return false", successfulResponseCode, is(false)); + } + + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java new file mode 100644 index 0000000..5edf851 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.utils; + +import com.google.common.collect.ImmutableSet; +import org.junit.Assert; +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; +import org.onap.dcae.apod.analytics.common.service.filter.JsonMessageFilterProcessorContext; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * @author Rajiv Singla . Creation Date: 3/3/2017. + */ +public class MessageProcessorUtilsTest extends BaseAnalyticsCommonUnitTest { + + + @Test + public void testProcessJsonFilterMappings() throws Exception { + final String jsonMessage = fromStream(CEF_MESSAGE_FILE_PATH); + + final Map> jsonFilterMappings = new HashMap<>(); + jsonFilterMappings.put("$.event.commonEventHeader.domain", ImmutableSet.of("measurementsForVfScaling")); + jsonFilterMappings.put("$.event.commonEventHeader.eventName", + ImmutableSet.of("vFirewall", "vLoadBalancer", "Mfvs_eNodeB_RANKPI")); + + final JsonMessageFilterProcessorContext jsonMessageFilterProcessorContext = + MessageProcessorUtils.processJsonFilterMappings(jsonMessage, jsonFilterMappings); + final Boolean matched = jsonMessageFilterProcessorContext.getMatched(); + Assert.assertNotNull(matched); + Assert.assertTrue(matched); + } + + @Test(expected = IllegalStateException.class) + public void testProcessJsonFilterMappingsWhenMappingsAreEmpty() throws Exception { + final String jsonMessage = fromStream(CEF_MESSAGE_FILE_PATH); + final Map> jsonFilterMappings = new HashMap<>(); + MessageProcessorUtils.processJsonFilterMappings(jsonMessage, jsonFilterMappings); + } + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java new file mode 100644 index 0000000..54e3770 --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java @@ -0,0 +1,40 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.utils; + +import org.junit.Assert; +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class PersistenceUtilsTest extends BaseAnalyticsCommonUnitTest { + + @Test + public void testGetCurrentTimeReverseSubKey() throws Exception { + + final String currentTimeReverseSubKey = PersistenceUtils.getCurrentTimeReverseSubKey(); + Assert.assertNotNull("Sub Key must not be null", currentTimeReverseSubKey); + Assert.assertTrue("Sub Key Length must be 25", currentTimeReverseSubKey.length() == 25); + } + +} diff --git a/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java new file mode 100644 index 0000000..e8e505e --- /dev/null +++ b/dcae-analytics-common/src/test/java/org/onap/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java @@ -0,0 +1,129 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.common.validation; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Rajiv Singla . Creation Date: 12/12/2016. + */ +public class GenericValidationResponseTest extends BaseAnalyticsCommonUnitTest { + + + @Test + public void testHasErrorsWhenResponseHasErrors() throws Exception { + + final String fieldName = "testField"; + final String errorMessage = "Some error message"; + final GenericValidationResponse validationResponse = + createTestValidationResponse(fieldName, errorMessage); + + validationResponse.addErrorMessage("testField", "Some error message"); + assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); + } + + @Test + public void testHasErrorsWhenResponseDoesNotHaveErrors() throws Exception { + GenericValidationResponse validationResponse = new + GenericValidationResponse<>(); + assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(false)); + } + + @Test + public void testGetFieldNamesWithError() throws Exception { + + final String fieldName = "testField"; + final String errorMessage = "Some error message"; + final GenericValidationResponse validationResponse = + createTestValidationResponse(fieldName, errorMessage); + + assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); + assertThat("Validation Field Name must match", + validationResponse.getFieldNamesWithError().iterator().next(), is(fieldName)); + } + + @Test + public void testGetErrorMessages() throws Exception { + + final String fieldName = "testField"; + final String errorMessage = "Some error message"; + final GenericValidationResponse validationResponse = + createTestValidationResponse(fieldName, errorMessage); + + assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); + assertThat("Validation Error Message must match", + validationResponse.getErrorMessages().iterator().next(), is(errorMessage)); + } + + @Test + public void getValidationResultsAsMap() throws Exception { + final String fieldName = "testField"; + final String errorMessage = "Some error message"; + final GenericValidationResponse validationResponse = + createTestValidationResponse(fieldName, errorMessage); + assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); + assertThat("Validation Field Name must match", + validationResponse.getValidationResultsAsMap().keySet().iterator().next(), is(fieldName)); + assertThat("Validation Error Message must match", + validationResponse.getValidationResultsAsMap().values().iterator().next(), is(errorMessage)); + } + + @Test + public void getAllErrorMessage() throws Exception { + final String fieldName = "testField"; + final String errorMessage = "Some error message"; + final GenericValidationResponse validationResponse = + createTestValidationResponse(fieldName, errorMessage); + final String allErrorMessage = validationResponse.getAllErrorMessage(); + assertThat("All Error messages should match", allErrorMessage, is(errorMessage)); + } + + @Test + public void addErrorMessage() throws Exception { + final String fieldName = "testField"; + final String errorMessage = "Some error message"; + GenericValidationResponse validationResponse = new + GenericValidationResponse<>(); + validationResponse.addErrorMessage(fieldName, errorMessage); + + assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); + assertThat("Validation Field Name must match", + validationResponse.getValidationResultsAsMap().keySet().iterator().next(), is(fieldName)); + assertThat("Validation Error Message must match", + validationResponse.getValidationResultsAsMap().values().iterator().next(), is(errorMessage)); + } + + private static GenericValidationResponse createTestValidationResponse( + final String fieldName, final String errorMessage) { + GenericValidationResponse validationResponse = new + GenericValidationResponse<>(); + if (fieldName != null || errorMessage != null) { + validationResponse.addErrorMessage(fieldName, errorMessage); + } + + return validationResponse; + } + +} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java deleted file mode 100644 index fd28624..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/BaseAnalyticsCommonUnitTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Suppliers; -import org.junit.BeforeClass; -import org.openecomp.dcae.apod.analytics.common.service.processor.TestEarlyTerminatingProcessor; -import org.openecomp.dcae.apod.analytics.common.service.processor.TestMessageProcessor1; -import org.openecomp.dcae.apod.analytics.common.service.processor.TestMessageProcessor2; -import org.openecomp.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; - -/** - * Base class from all DCEA Analytics Common Module Unit Tests - *

- * @author Rajiv Singla . Creation Date: 10/6/2016. - */ -public abstract class BaseAnalyticsCommonUnitTest extends BaseDCAEAnalyticsUnitTest { - - - protected static final String TEST_MESSAGE_PROCESSOR_MESSAGE = "Test Processor Message"; - - protected static final String CEF_MESSAGE_FILE_PATH = "data/json/cef/cef_message.json"; - - protected static ObjectMapper objectMapper; - - /** - * Before running test cases need to assign object mapper. - */ - @BeforeClass - public static void beforeClass() { - final AnalyticsModelObjectMapperSupplier analyticsModelObjectMapperSupplier = - new AnalyticsModelObjectMapperSupplier(); - objectMapper = Suppliers.memoize(analyticsModelObjectMapperSupplier).get(); - } - - /* - * Test implementation for {@link CDAPAppSettings} - */ - protected class CDAPTestAppSettings { - - private String settingsField; - - public String getSettingsField() { - return settingsField; - } - - public void setSettingsField(String settingsField) { - this.settingsField = settingsField; - } - } - - protected TestMessageProcessor1 getTestMessageProcessor1() { - return new TestMessageProcessor1(); - } - protected TestMessageProcessor2 getTestMessageProcessor2() { - return new TestMessageProcessor2(); - } - protected TestEarlyTerminatingProcessor getTestEarlyTerminationProcessor() { - return new TestEarlyTerminatingProcessor(); - } -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java deleted file mode 100644 index 918407a..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/filter/GenericJsonMessageFilterTest.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.filter; - -import com.google.common.collect.ImmutableList; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; -import org.openecomp.dcae.apod.analytics.common.service.processor.GenericMessageChainProcessor; - -import static org.junit.Assert.assertEquals; - -/** - * @author Rajiv Singla . Creation Date: 2/10/2017. - */ -public class GenericJsonMessageFilterTest extends BaseAnalyticsCommonUnitTest { - - private String jsonMessage; - - @Before - public void before() throws Exception { - jsonMessage = fromStream(CEF_MESSAGE_FILE_PATH); - - } - - @Test - public void testJsonMessageFilterWhenAllFiltersPassed() throws Exception { - - final JsonMessageFilterProcessorContext finalMessageProcessorContext = - processJsonMessageFilterChain(jsonMessage, - "domainFilter", "$.event.commonEventHeader.domain", "measurementsForVfScaling", - "eventNameFilter", "$.event.commonEventHeader.eventName", "Mfvs_eNodeB_RANKPI"); - - assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, true, true, 2); - - } - - @Test - public void testJsonMessageFilterWhenJsonPathValueIsANumber() throws Exception { - - final JsonMessageFilterProcessorContext finalMessageProcessorContext = - processJsonMessageFilterChain(jsonMessage, - "domainFilter", "$.event.commonEventHeader.sequence", "0", - "eventNameFilter", "$.event.commonEventHeader.eventName", "Mfvs_eNodeB_RANKPI"); - - assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, true, true, 2); - } - - @Test - public void testJsonMessageFilterWhenOneFilterDoesNotMatch() throws Exception { - - final JsonMessageFilterProcessorContext finalMessageProcessorContext = - processJsonMessageFilterChain(jsonMessage, - "domainFilter", "$.event.commonEventHeader.domain", "xxxxxxxxxxx", - "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); - - assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, false, false, 1); - } - - @Test - public void testJsonMessageFilterWhenJsonPathDoesNotExist() throws Exception { - - final JsonMessageFilterProcessorContext finalMessageProcessorContext = - processJsonMessageFilterChain(jsonMessage, - "domainFilter", "$.event.commonEventHeader.xxxxxxx", "measurementsForVfScaling", - "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); - - assertJsonMessageAssertions(jsonMessage, finalMessageProcessorContext, false, false, 1); - } - - @Test - public void testJsonMessageFilterWhenIncomingMessageIsBlank() throws Exception { - - final JsonMessageFilterProcessorContext finalMessageProcessorContext = - processJsonMessageFilterChain("", - "domainFilter", "$.event.commonEventHeader.domain", "measurementsForVfScaling", - "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); - - assertJsonMessageAssertions("", finalMessageProcessorContext, false, null, 1); - - } - - @Test - public void testJsonMessageFilterWhenIncomingMessageIsNotValidJson() throws Exception { - - final JsonMessageFilterProcessorContext finalMessageProcessorContext = - processJsonMessageFilterChain("invalidJson", - "domainFilter", "$.event.commonEventHeader.domain", "measurementsForVfScaling", - "functionalRoleFilter", "$.event.commonEventHeader.eventName", "vFirewall"); - - assertJsonMessageAssertions("invalidJson", finalMessageProcessorContext, false, null, 1); - - } - - - private static void assertJsonMessageAssertions( - final String jsonMessage, final JsonMessageFilterProcessorContext finalMessageProcessorContext, - final Boolean canProcessingContinueFlag, final Boolean matchedFlag, - final int messageProcessorCount) throws Exception { - - assertJson(jsonMessage, finalMessageProcessorContext.getMessage()); - Assert.assertEquals(canProcessingContinueFlag, finalMessageProcessorContext.canProcessingContinue()); - assertEquals(matchedFlag, finalMessageProcessorContext.getMatched()); - Assert.assertEquals(finalMessageProcessorContext.getMessageProcessors().size(), messageProcessorCount); - - } - - - private static JsonMessageFilterProcessorContext processJsonMessageFilterChain( - final String jsonMessage, - final String firstFilterName, final String firstFilterPath, final String firstFilterValue, - final String secondFilterName, final String secondFilterPath, final String secondFilterValue) { - - // create processors - final GenericJsonMessageFilter firstFilter = new GenericJsonMessageFilter(firstFilterName, firstFilterPath, - firstFilterValue); - final GenericJsonMessageFilter secondFilter = new GenericJsonMessageFilter(secondFilterName, - secondFilterPath, secondFilterValue); - - // create initial processor context containing the json message that need to be processed - final JsonMessageFilterProcessorContext initialProcessorContext = - new JsonMessageFilterProcessorContext(jsonMessage); - - // create a generic message chain processor and feed it list of processors and initialProcessor context - final GenericMessageChainProcessor messageChainProcessor = - new GenericMessageChainProcessor<>(ImmutableList.of(firstFilter, secondFilter), - initialProcessorContext); - - // process the generic message chain - return messageChainProcessor.processChain(); - } -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java deleted file mode 100644 index 5445150..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractMessageProcessorTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; -import org.openecomp.dcae.apod.analytics.common.exception.MessageProcessingException; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class AbstractMessageProcessorTest extends BaseAnalyticsCommonUnitTest { - - - @Test - public void testPreProcessorWhenProcessingContextFlagIsTrue() throws Exception { - TestMessageProcessor1 messageProcessor1 = new TestMessageProcessor1(); - final TestProcessorContext processorContext = - new TestProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); - final TestProcessorContext testProcessorContext = messageProcessor1.preProcessor(processorContext); - assertThat("Processing flag must be true", - testProcessorContext.canProcessingContinue(), is(true)); - } - - @Test(expected = MessageProcessingException.class) - public void testPreProcessorWhenProcessingContextFlagIsFalse() throws Exception { - TestMessageProcessor1 messageProcessor1 = new TestMessageProcessor1(); - final TestProcessorContext testProcessorContext = - new TestProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, false); - messageProcessor1.preProcessor(testProcessorContext); - } - - @Test - public void testPostProcessorWhenProcessingStateIsNotFinishedSuccessfully() throws Exception { - TestMessageProcessor1 messageProcessor1 = new TestMessageProcessor1(); - final ProcessingState processingState = messageProcessor1.getProcessingState(); - assertTrue("Processing state is not processing finished successfully", - processingState != ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY); - final TestProcessorContext processorContext = - new TestProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); - final TestProcessorContext testProcessorContext = messageProcessor1.postProcessor(processorContext); - assertThat("Processing flag must be false", - testProcessorContext.canProcessingContinue(), is(false)); - } - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java deleted file mode 100644 index b65a4f2..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/AbstractProcessorContextTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; - -import java.util.List; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class AbstractProcessorContextTest extends BaseAnalyticsCommonUnitTest { - - class TestAbstractMessageProcessorContext extends AbstractProcessorContext { - - public TestAbstractMessageProcessorContext(String message, boolean canProcessingContinue) { - super(message, canProcessingContinue); - } - } - - - @Test - public void testGetMessage() throws Exception { - TestAbstractMessageProcessorContext testProcessorContext = - new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); - final String message = testProcessorContext.getMessage(); - assertThat("Message Processor message must match", message, is(TEST_MESSAGE_PROCESSOR_MESSAGE)); - } - - @Test - public void testCanProcessingContinue() throws Exception { - TestAbstractMessageProcessorContext testProcessorContext = - new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); - final boolean canProcessingContinue = testProcessorContext.canProcessingContinue(); - assertThat("Message Can Processing flag must be true", canProcessingContinue, is(true)); - } - - @Test - public void testSetProcessingContinueFlag() throws Exception { - TestAbstractMessageProcessorContext testProcessorContext = - new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); - testProcessorContext.setProcessingContinueFlag(false); - assertThat("Message Can processing flag must be false", - testProcessorContext.canProcessingContinue(), is(false)); - - } - - @Test - public void testGetMessageProcessors() throws Exception { - TestAbstractMessageProcessorContext testProcessorContext = - new TestAbstractMessageProcessorContext(TEST_MESSAGE_PROCESSOR_MESSAGE, true); - final List> messageProcessors = - testProcessorContext.getMessageProcessors(); - assertThat("Message processor processing message must match", messageProcessors.size(), is(0)); - } - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java deleted file mode 100644 index afb3ed2..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericMessageChainProcessorTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import com.google.common.collect.ImmutableList; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; -import org.openecomp.dcae.apod.analytics.common.exception.MessageProcessingException; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; - - -/** - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public class GenericMessageChainProcessorTest extends BaseAnalyticsCommonUnitTest { - - - @Test - public void testProcessChainWhenProcessChainHasNoEarlyTermination() throws Exception { - - final TestMessageProcessor1 testMessageProcessor1 = getTestMessageProcessor1(); - final TestMessageProcessor2 testMessageProcessor2 = getTestMessageProcessor2(); - final ImmutableList> testMessageChain = - ImmutableList.of(testMessageProcessor1, testMessageProcessor2); - - final TestProcessorContext testProcessorContext = new TestProcessorContext("Hello", true); - - final GenericMessageChainProcessor genericMessageChainProcessor = - new GenericMessageChainProcessor<>(testMessageChain, testProcessorContext); - - final TestProcessorContext finalProcessorContext = genericMessageChainProcessor.processChain(); - - final String result = finalProcessorContext.getResult(); - assertThat("Final Result must be Hello World! Again", result, is("Hello World! Again")); - assertThat("TestProcessor1 state is correct", testMessageProcessor1.getProcessingState(), - is(ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY)); - assertThat("TestProcessor2 state is correct", testMessageProcessor2.getProcessingState(), - is(ProcessingState.PROCESSING_FINISHED_SUCCESSFULLY)); - } - - - @Test - public void testProcessChainWhenProcessChainEarlyTermination() throws Exception { - - final TestEarlyTerminatingProcessor testEarlyTerminatingProcessor = getTestEarlyTerminationProcessor(); - final ImmutableList> testMessageChain = - ImmutableList.of(testEarlyTerminatingProcessor, getTestMessageProcessor2()); - final TestProcessorContext testProcessorContext = new TestProcessorContext("Hello", true); - - final GenericMessageChainProcessor genericMessageChainProcessor = - new GenericMessageChainProcessor<>(testMessageChain, testProcessorContext); - - final TestProcessorContext finalProcessorContext = genericMessageChainProcessor.processChain(); - final String result = finalProcessorContext.getResult(); - assertNull("Final Result must be null", result); - assertThat("TestEarlyTerminatingProcessor state is correct", - testEarlyTerminatingProcessor.getProcessingState(), is(ProcessingState.PROCESSING_TERMINATED_EARLY)); - } - - @Test(expected = MessageProcessingException.class) - public void testProcessChainWhenIncomingMessageContextIsNull() throws Exception { - - final TestEarlyTerminatingProcessor testEarlyTerminatingProcessor = getTestEarlyTerminationProcessor(); - final ImmutableList> testMessageChain = - ImmutableList.of(testEarlyTerminatingProcessor, getTestMessageProcessor2()); - final TestProcessorContext testProcessorContext = null; - - final GenericMessageChainProcessor genericMessageChainProcessor = - new GenericMessageChainProcessor<>(testMessageChain, testProcessorContext); - - genericMessageChainProcessor.processChain(); - } - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java deleted file mode 100644 index eb7bae3..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/GenericProcessorInfoTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class GenericProcessorInfoTest extends BaseAnalyticsCommonUnitTest { - - - @Test - public void getProcessorName() throws Exception { - final String processorName = "testProcessorName"; - final String processorDescription = "testProcessorDescription"; - GenericProcessorInfo genericProcessorInfo = new GenericProcessorInfo(processorName, processorDescription); - assertThat("Processor Name must match", genericProcessorInfo.getProcessorName(), is(processorName)); - - } - - @Test - public void getProcessorDescription() throws Exception { - final String processorName = "testProcessorName"; - final String processorDescription = "testProcessorDescription"; - GenericProcessorInfo genericProcessorInfo = new GenericProcessorInfo(processorName, processorDescription); - assertThat("Processor Description must match", genericProcessorInfo.getProcessorDescription(), - is(processorDescription)); - } - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java deleted file mode 100644 index 807d890..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestEarlyTerminatingProcessor.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -/** - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public class TestEarlyTerminatingProcessor extends AbstractMessageProcessor { - - @Override - public String getProcessorDescription() { - return "Terminates the chain early"; - } - - @Override - public TestProcessorContext processMessage(TestProcessorContext processorContext) { - setTerminatingProcessingMessage("Terminating early", processorContext); - return processorContext; - } -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java deleted file mode 100644 index b663b69..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor1.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -/** - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public class TestMessageProcessor1 extends AbstractMessageProcessor { - - @Override - public String getProcessorDescription() { - return "Appends \" World!\" to the message string and set it to result string"; - } - - @Override - public TestProcessorContext processMessage(TestProcessorContext processorContext) { - final String message = processorContext.getMessage(); - processorContext.setResult(message + " World!"); - setFinishedProcessingMessage("Finished Appending world", processorContext); - return processorContext; - } -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java deleted file mode 100644 index e8a29ff..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestMessageProcessor2.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -/** - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public class TestMessageProcessor2 extends AbstractMessageProcessor { - - @Override - public String getProcessorDescription() { - return "Appends \" Again\" to the result string"; - } - - @Override - public TestProcessorContext processMessage(TestProcessorContext processorContext) { - final String result = processorContext.getResult(); - processorContext.setResult(result + " Again"); - setFinishedProcessingMessage("Finished Appending again to result", processorContext); - return processorContext; - } -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestProcessorContext.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestProcessorContext.java deleted file mode 100644 index caaae82..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/service/processor/TestProcessorContext.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.service.processor; - -import java.util.LinkedList; -import java.util.List; - -/** - * - * @author Rajiv Singla . Creation Date: 11/8/2016. - */ -public class TestProcessorContext implements ProcessorContext { - - private String message; - private boolean continueProcessingFlag; - private String result; - private List> messageProcessors; - - public TestProcessorContext(String message, boolean continueProcessingFlag) { - this.message = message; - this.continueProcessingFlag = continueProcessingFlag; - this.messageProcessors = new LinkedList<>(); - } - - @Override - public String getMessage() { - return message; - } - - @Override - public boolean canProcessingContinue() { - return continueProcessingFlag; - } - - @Override - public void setProcessingContinueFlag(boolean canProcessingContinue) { - this.continueProcessingFlag = canProcessingContinue; - } - - @Override - public List> getMessageProcessors() { - return messageProcessors; - } - - - public void setMessage(String message) { - this.message = message; - } - - public boolean isContinueProcessingFlag() { - return continueProcessingFlag; - } - - public void setContinueProcessingFlag(boolean continueProcessingFlag) { - this.continueProcessingFlag = continueProcessingFlag; - } - - public String getResult() { - return result; - } - - public void setResult(String result) { - this.result = result; - } - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtilsTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtilsTest.java deleted file mode 100644 index 9c5fe14..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/HTTPUtilsTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.utils; - -import org.junit.Assert; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; - -import static org.hamcrest.CoreMatchers.is; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class HTTPUtilsTest extends BaseAnalyticsCommonUnitTest { - - - @Test - public void testIsSuccessfulResponseCodeWhenResponseCodeIsSuccessful() throws Exception { - final boolean successfulResponseCode = HTTPUtils.isSuccessfulResponseCode(200); - Assert.assertThat("200 Response code must return true", successfulResponseCode, is(true)); - } - - @Test - public void testIsSuccessfulResponseCodeWhenResponseCodeIsNotSuccessful() throws Exception { - final boolean successfulResponseCode = HTTPUtils.isSuccessfulResponseCode(301); - Assert.assertThat("301 Response code must return false", successfulResponseCode, is(false)); - } - - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java deleted file mode 100644 index 1a44571..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/MessageProcessorUtilsTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.utils; - -import com.google.common.collect.ImmutableSet; -import org.junit.Assert; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; -import org.openecomp.dcae.apod.analytics.common.service.filter.JsonMessageFilterProcessorContext; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -/** - * @author Rajiv Singla . Creation Date: 3/3/2017. - */ -public class MessageProcessorUtilsTest extends BaseAnalyticsCommonUnitTest { - - - @Test - public void testProcessJsonFilterMappings() throws Exception { - final String jsonMessage = fromStream(CEF_MESSAGE_FILE_PATH); - - final Map> jsonFilterMappings = new HashMap<>(); - jsonFilterMappings.put("$.event.commonEventHeader.domain", ImmutableSet.of("measurementsForVfScaling")); - jsonFilterMappings.put("$.event.commonEventHeader.eventName", - ImmutableSet.of("vFirewall", "vLoadBalancer", "Mfvs_eNodeB_RANKPI")); - - final JsonMessageFilterProcessorContext jsonMessageFilterProcessorContext = - MessageProcessorUtils.processJsonFilterMappings(jsonMessage, jsonFilterMappings); - final Boolean matched = jsonMessageFilterProcessorContext.getMatched(); - Assert.assertNotNull(matched); - Assert.assertTrue(matched); - } - - @Test(expected = IllegalStateException.class) - public void testProcessJsonFilterMappingsWhenMappingsAreEmpty() throws Exception { - final String jsonMessage = fromStream(CEF_MESSAGE_FILE_PATH); - final Map> jsonFilterMappings = new HashMap<>(); - MessageProcessorUtils.processJsonFilterMappings(jsonMessage, jsonFilterMappings); - } - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java deleted file mode 100644 index f8251b0..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/utils/PersistenceUtilsTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.utils; - -import org.junit.Assert; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class PersistenceUtilsTest extends BaseAnalyticsCommonUnitTest { - - @Test - public void testGetCurrentTimeReverseSubKey() throws Exception { - - final String currentTimeReverseSubKey = PersistenceUtils.getCurrentTimeReverseSubKey(); - Assert.assertNotNull("Sub Key must not be null", currentTimeReverseSubKey); - Assert.assertTrue("Sub Key Length must be 25", currentTimeReverseSubKey.length() == 25); - } - -} diff --git a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java b/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java deleted file mode 100644 index 190dce7..0000000 --- a/dcae-analytics-common/src/test/java/org/openecomp/dcae/apod/analytics/common/validation/GenericValidationResponseTest.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.common.validation; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.BaseAnalyticsCommonUnitTest; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Rajiv Singla . Creation Date: 12/12/2016. - */ -public class GenericValidationResponseTest extends BaseAnalyticsCommonUnitTest { - - - @Test - public void testHasErrorsWhenResponseHasErrors() throws Exception { - - final String fieldName = "testField"; - final String errorMessage = "Some error message"; - final GenericValidationResponse validationResponse = - createTestValidationResponse(fieldName, errorMessage); - - validationResponse.addErrorMessage("testField", "Some error message"); - assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); - } - - @Test - public void testHasErrorsWhenResponseDoesNotHaveErrors() throws Exception { - GenericValidationResponse validationResponse = new - GenericValidationResponse<>(); - assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(false)); - } - - @Test - public void testGetFieldNamesWithError() throws Exception { - - final String fieldName = "testField"; - final String errorMessage = "Some error message"; - final GenericValidationResponse validationResponse = - createTestValidationResponse(fieldName, errorMessage); - - assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); - assertThat("Validation Field Name must match", - validationResponse.getFieldNamesWithError().iterator().next(), is(fieldName)); - } - - @Test - public void testGetErrorMessages() throws Exception { - - final String fieldName = "testField"; - final String errorMessage = "Some error message"; - final GenericValidationResponse validationResponse = - createTestValidationResponse(fieldName, errorMessage); - - assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); - assertThat("Validation Error Message must match", - validationResponse.getErrorMessages().iterator().next(), is(errorMessage)); - } - - @Test - public void getValidationResultsAsMap() throws Exception { - final String fieldName = "testField"; - final String errorMessage = "Some error message"; - final GenericValidationResponse validationResponse = - createTestValidationResponse(fieldName, errorMessage); - assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); - assertThat("Validation Field Name must match", - validationResponse.getValidationResultsAsMap().keySet().iterator().next(), is(fieldName)); - assertThat("Validation Error Message must match", - validationResponse.getValidationResultsAsMap().values().iterator().next(), is(errorMessage)); - } - - @Test - public void getAllErrorMessage() throws Exception { - final String fieldName = "testField"; - final String errorMessage = "Some error message"; - final GenericValidationResponse validationResponse = - createTestValidationResponse(fieldName, errorMessage); - final String allErrorMessage = validationResponse.getAllErrorMessage(); - assertThat("All Error messages should match", allErrorMessage, is(errorMessage)); - } - - @Test - public void addErrorMessage() throws Exception { - final String fieldName = "testField"; - final String errorMessage = "Some error message"; - GenericValidationResponse validationResponse = new - GenericValidationResponse<>(); - validationResponse.addErrorMessage(fieldName, errorMessage); - - assertThat("Validation Response must has errors", validationResponse.hasErrors(), is(true)); - assertThat("Validation Field Name must match", - validationResponse.getValidationResultsAsMap().keySet().iterator().next(), is(fieldName)); - assertThat("Validation Error Message must match", - validationResponse.getValidationResultsAsMap().values().iterator().next(), is(errorMessage)); - } - - private static GenericValidationResponse createTestValidationResponse( - final String fieldName, final String errorMessage) { - GenericValidationResponse validationResponse = new - GenericValidationResponse<>(); - if (fieldName != null || errorMessage != null) { - validationResponse.addErrorMessage(fieldName, errorMessage); - } - - return validationResponse; - } - -} diff --git a/dcae-analytics-common/src/test/resources/logback-test.xml b/dcae-analytics-common/src/test/resources/logback-test.xml index 9e40f24..fb02c74 100644 --- a/dcae-analytics-common/src/test/resources/logback-test.xml +++ b/dcae-analytics-common/src/test/resources/logback-test.xml @@ -1,55 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + + + + + + + + + + diff --git a/dcae-analytics-dmaap/pom.xml b/dcae-analytics-dmaap/pom.xml index 8ec4856..a8942e9 100644 --- a/dcae-analytics-dmaap/pom.xml +++ b/dcae-analytics-dmaap/pom.xml @@ -1,114 +1,114 @@ - - - - - - 4.0.0 - - - dcae-analytics - org.onap.dcaegen2.analytics.tca - 2.1.0-SNAPSHOT - - - dcae-analytics-dmaap - jar - - - DCAE Analytics DMaaP - - DMaaP(Data Movement as a Platform) MR API using AAF(Authentication and Authorization Framework) - - - - - ${project.parent.basedir} - - - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-common - 2.1.0-SNAPSHOT - - - - - org.apache.httpcomponents - httpclient - - - - - org.slf4j - slf4j-api - - - - ch.qos.logback - logback-core - - - - ch.qos.logback - logback-classic - - - - com.google.code.findbugs - jsr305 - - - com.google.code.findbugs - annotations - - - - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-annotations - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-test - 2.1.0-SNAPSHOT - test - - - - - - + + + + + + 4.0.0 + + + dcae-analytics + org.onap.dcaegen2.analytics.tca + 2.1.0-SNAPSHOT + + + dcae-analytics-dmaap + jar + + + DCAE Analytics DMaaP + + DMaaP(Data Movement as a Platform) MR API using AAF(Authentication and Authorization Framework) + + + + + ${project.parent.basedir} + + + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-common + 2.1.0-SNAPSHOT + + + + + org.apache.httpcomponents + httpclient + + + + + org.slf4j + slf4j-api + + + + ch.qos.logback + logback-core + + + + ch.qos.logback + logback-classic + + + + com.google.code.findbugs + jsr305 + + + com.google.code.findbugs + annotations + + + + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-test + 2.1.0-SNAPSHOT + test + + + + + + diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactory.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactory.java new file mode 100644 index 0000000..7163fe2 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactory.java @@ -0,0 +1,112 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.module.AnalyticsDMaaPModule; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherFactory; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; + +/** + * Creates pre injected implementations for {@link DMaaPMRPublisher} and {@link DMaaPMRSubscriber} + *

+ * Usage: + *

Create an instance of DMaaP MR Factory

+ *
+ *        DMaaPFactory dmaapFactory = DMaaPFactory.initalize()
+ *     
+ *

Create a new DMaaP MR Publisher

+ *
+ *         DMaaPMRPublisher publisher = dmaapFactory.createPublisher(publisherConfig)
+ *     
+ *

Create new DMaaP MR Subscriber

+ *
+ *         DMaaPMRSubscriber subscriber = dmaapFactory.createSubscriber(subscriberConfig)
+ *     
+ *

+ * All Clients must use this Factory to initalize DMaaP Message Router Publishers and Subscribers + *

+ *

+ * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +public class DMaaPMRFactory { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRFactory.class); + + private final Injector injector; + + public DMaaPMRFactory(AbstractModule guiceModule) { + injector = Guice.createInjector(guiceModule); + } + + /** + * Returns configured instance of {@link DMaaPMRPublisher} + * + * @param publisherConfig Publisher Config + * @return configured instance of DMaaP MR Publisher + */ + public DMaaPMRPublisher createPublisher(@Nonnull DMaaPMRPublisherConfig publisherConfig) { + final DMaaPMRPublisherFactory publisherFactory = injector.getInstance(DMaaPMRPublisherFactory.class); + LOG.debug("Creating new DMaaP MR Publisher Instance with configuration: {}", publisherConfig); + final DMaaPMRPublisher dMaaPMRPublisher = publisherFactory.create(publisherConfig); + LOG.info("Created new DMaaP MR Publisher Instance. Publisher creation time: {}", + dMaaPMRPublisher.getPublisherCreationTime()); + return dMaaPMRPublisher; + } + + /** + * Returns configured instance of {@link DMaaPMRSubscriber} + * + * @param subscriberConfig Subscriber Config + * @return configured instance of DMaaP MR Subscriber + */ + public DMaaPMRSubscriber createSubscriber(@Nonnull DMaaPMRSubscriberConfig subscriberConfig) { + final DMaaPMRSubscriberFactory subscriberFactory = injector.getInstance(DMaaPMRSubscriberFactory.class); + LOG.debug("Creating new DMaaP MR Subscriber Instance with configuration: {}", subscriberConfig); + final DMaaPMRSubscriber dMaaPMRSubscriber = subscriberFactory.create(subscriberConfig); + LOG.info("Created new DMaaP MR Subscriber Instance. Subscriber creation time: {}", + dMaaPMRSubscriber.getSubscriberCreationTime()); + return dMaaPMRSubscriber; + } + + /** + * Creates an instance of {@link DMaaPMRFactory} + * + * @return {@link DMaaPMRFactory} factory instance + */ + public static DMaaPMRFactory create() { + final DMaaPMRFactory dMaaPMRFactory = new DMaaPMRFactory(new AnalyticsDMaaPModule()); + LOG.info("Created new instance of DMaaP MR Factory"); + return dMaaPMRFactory; + } + + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java new file mode 100644 index 0000000..3f74091 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java @@ -0,0 +1,193 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.config; + +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Locale; + +import static org.onap.dcae.apod.analytics.common.utils.HTTPUtils.JSON_APPLICATION_TYPE; + +/** + *

+ * Contains common parameters for both DMaaP Message Router Publisher and Subscriber Configs + *

+ * @author Rajiv Singla . Creation Date: 10/12/2016. + */ +public abstract class DMaaPMRBaseConfig implements DMaaPMRConfig { + + protected static final Logger LOG = LoggerFactory.getLogger(DMaaPMRBaseConfig.class); + + protected String hostName; + protected Integer portNumber; + protected String topicName; + protected String protocol; + protected String userName; + protected String userPassword; + protected String contentType; + + /** + * Provides host name e.g. mrlocal-mtnjftle01.homer.com + * + * @return host name + */ + public String getHostName() { + return hostName; + } + + + /** + * Provides Port Number of DMaaP MR Topic Host. Defaults to 80 + * + * @return host port number + */ + public Integer getPortNumber() { + return portNumber; + } + + /** + * Provides topic name e.g. com.dcae.dmaap.mtnje2.DcaeTestVES + * + * @return topic name + */ + public String getTopicName() { + return topicName; + } + + /** + * Provides protocol type e.g. http or https + * + * @return protocol type + */ + public String getProtocol() { + return protocol; + } + + /** + * Provides content type e.g. application/json + * + * @return content type + */ + public String getContentType() { + return contentType; + } + + + /** + * Provides User name for the DMaaP MR Topic authentication + * + * @return user name + */ + public String getUserName() { + return userName; + } + + /** + * Provides User password for the DMaaP MR Topic authentication + * + * @return user Password + */ + public String getUserPassword() { + return userPassword; + } + + + /** + * Trims, adjusts casing and validates user input String for protocol selection + * + * @param protocol - User input for protocol String + * @return - network protocol e.g http or https + */ + protected static String normalizeValidateProtocol(final String protocol) { + // validate that only http and https are supported protocols are Supported for DMaaP MR + String normalizedProtocolString = protocol.trim().toLowerCase(Locale.ENGLISH); + if (normalizedProtocolString.isEmpty() || + !("http".equals(normalizedProtocolString) || "https".equals(normalizedProtocolString))) { + + final String errorMessage = + "Unsupported protocol selection. Only HTTPS and HTTPS are currently supported for DMaaP MR"; + + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); + } + return normalizedProtocolString; + } + + + /** + * Trims, adjust casing and validates content type is supported by DMaaP. + * + * NOTE: DMaaP currently only support application/json content type + * + * @param contentType content type that needs to checked for DMaaP MR support + * @return true if content type is supported by DMaaP MR + */ + protected static String normalizeValidateContentType(final String contentType) { + // Current DMaaP MR is only supporting "application/json" content type + String normalizedContentType = contentType.trim().toLowerCase(Locale.ENGLISH); + final boolean isSupported = contentType.equals(JSON_APPLICATION_TYPE); + if (!isSupported) { + final String errorMessage = + "Unsupported content type selection. Only application/json is currently supported for DMaaP MR"; + + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); + } + return normalizedContentType; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof DMaaPMRBaseConfig)) { + return false; + } + DMaaPMRBaseConfig that = (DMaaPMRBaseConfig) o; + return Objects.equal(hostName, that.hostName) && + Objects.equal(portNumber, that.portNumber) && + Objects.equal(topicName, that.topicName) && + Objects.equal(protocol, that.protocol) && + Objects.equal(userName, that.userName) && + Objects.equal(userPassword, that.userPassword) && + Objects.equal(contentType, that.contentType); + } + + @Override + public int hashCode() { + return Objects.hashCode(hostName, portNumber, topicName, protocol, userName, userPassword, contentType); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("hostName", hostName) + .add("portNumber", portNumber) + .add("topicName", topicName) + .add("protocol", protocol) + .add("userName", userName) + .add("contentType", contentType) + .toString(); + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java new file mode 100644 index 0000000..2ff3c4e --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java @@ -0,0 +1,32 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.config; + +/** + *

+ * Marker Interface for all DMaaP MR Configs. + * Holds Default configuration parameters for all Configs + *

+ * @author Rajiv Singla . Creation Date: 10/12/2016. + */ +public interface DMaaPMRConfig { + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java new file mode 100644 index 0000000..8dfc289 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java @@ -0,0 +1,248 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.config; + +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + +import javax.annotation.Nonnull; + +/** + *

+ * Immutable DMaaP MR Configuration for DMaaP MR Publisher. + *

+ * Use {@link DMaaPMRPublisherConfig.Builder} to construct Subscriber Configuration + *

+ *

+ * @author Rajiv Singla . Creation Date: 10/12/2016. + */ +public class DMaaPMRPublisherConfig extends DMaaPMRBaseConfig { + + /** + * Publisher batching queue size + */ + private int maxBatchSize; + + /** + * Publisher Recovery Queue Size + */ + private int maxRecoveryQueueSize; + + + private DMaaPMRPublisherConfig(@Nonnull String hostName, + @Nonnull Integer portNumber, + @Nonnull String topicName, + @Nonnull String protocol, + String userName, + String userPassword, + @Nonnull String contentType, + int maxBatchSize, + int maxRecoveryQueueSize) { + this.hostName = hostName; + this.portNumber = portNumber; + this.topicName = topicName; + this.protocol = protocol; + this.userName = userName; + this.userPassword = userPassword; + this.contentType = contentType; + this.maxBatchSize = maxBatchSize; + this.maxRecoveryQueueSize = maxRecoveryQueueSize; + } + + + /** + * Builder to initialize immutable {@link DMaaPMRPublisherConfig} object + */ + public static class Builder { + + private String hostName; + private Integer portNumber; + private String topicName; + private String userName; + private String userPassword; + private String protocol; + private String contentType; + private int maxBatchSize; + private int maxRecoveryQueueSize; + + public Builder(@Nonnull String hostName, @Nonnull String topicName) { + // required values + this.hostName = hostName; + this.topicName = topicName; + // Default values + this.portNumber = AnalyticsConstants.DEFAULT_PORT_NUMBER; + this.userName = AnalyticsConstants.DEFAULT_USER_NAME; + this.userPassword = AnalyticsConstants.DEFAULT_USER_PASSWORD; + this.protocol = AnalyticsConstants.DEFAULT_PROTOCOL; + this.contentType = AnalyticsConstants.DEFAULT_CONTENT_TYPE; + this.maxBatchSize = AnalyticsConstants.DEFAULT_PUBLISHER_MAX_BATCH_SIZE; + this.maxRecoveryQueueSize = AnalyticsConstants.DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE; + } + + /** + * Setup for custom host port number - Defaults to 80. + * + * @param portNumber custom port number + * @return Builder object itself for chaining + */ + public Builder setPortNumber(@Nonnull Integer portNumber) { + this.portNumber = portNumber; + return this; + } + + + /** + * Setup user name for authentication. If no username is provided authentication will be disabled + * + * @param userName user name for DMaaP Topic Authentication + * @return Builder object itself for chaining + */ + public Builder setUserName(@Nonnull String userName) { + this.userName = userName; + return this; + } + + + /** + * Setup user password for authentication. If no password is provided authentication will be disabled + * + * @param userPassword user password for DMaaP Topic Authentication + * @return Builder object itself for chaining + */ + public Builder setUserPassword(@Nonnull String userPassword) { + this.userPassword = userPassword; + return this; + } + + + /** + * Setup custom Publisher protocol - Defaults to https. + * Note: Only http and https are currently supported. + * + * @param protocol protocol e.g. https + * @return Builder object itself for chaining + */ + public Builder setProtocol(@Nonnull String protocol) { + this.protocol = normalizeValidateProtocol(protocol); + return this; + } + + + /** + * Setup custom Publisher content-type - Defaults to application/json + * + * @param contentType content type e.g. application/json + * @return Builder object itself for chaining + */ + public Builder setContentType(@Nonnull String contentType) { + final String normalizedContentType = normalizeValidateContentType(contentType); + this.contentType = normalizedContentType; + return this; + } + + + /** + * Setup custom Publisher Max Batch Size - Defaults to 100 + * + * @param maxBatchSize max Batch Size + * @return Builder object itself for chaining + */ + public Builder setMaxBatchSize(int maxBatchSize) { + this.maxBatchSize = maxBatchSize; + return this; + } + + + /** + * Setup custom Maximum Recovery Queue Size. Recovery Queue is used to hold messages temporarily in case + * DMaaP MR Publisher topic is not responding for any reason. Defaults to 100,000 + * + * @param maxRecoveryQueueSize max recovery queue size + * @return Builder object itself for chaining + */ + public Builder setMaxRecoveryQueueSize(int maxRecoveryQueueSize) { + this.maxRecoveryQueueSize = maxRecoveryQueueSize; + return this; + } + + /** + * Creates immutable instance of {@link DMaaPMRPublisherConfig} + * + * @return Builds and returns thread safe, immutable {@link DMaaPMRPublisherConfig} object + */ + public DMaaPMRPublisherConfig build() { + return new DMaaPMRPublisherConfig(hostName, portNumber, topicName, protocol, userName, userPassword, + contentType, maxBatchSize, maxRecoveryQueueSize); + } + + } + + + /** + * Returns max Publisher Batch Queue Size + * + * @return max Publisher Batch Queue size + */ + public int getMaxBatchSize() { + return maxBatchSize; + } + + /** + * Returns max Publisher Recovery Queue Size + * + * @return max Recovery Queue size + */ + public int getMaxRecoveryQueueSize() { + return maxRecoveryQueueSize; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + DMaaPMRPublisherConfig that = (DMaaPMRPublisherConfig) o; + return maxBatchSize == that.maxBatchSize && + maxRecoveryQueueSize == that.maxRecoveryQueueSize; + } + + @Override + public int hashCode() { + return Objects.hashCode(super.hashCode(), maxBatchSize, maxRecoveryQueueSize); + } + + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("baseConfig", super.toString()) + .add("maxBatchSize", maxBatchSize) + .add("maxRecoveryQueueSize", maxRecoveryQueueSize) + .toString(); + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java new file mode 100644 index 0000000..8158b6b --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java @@ -0,0 +1,295 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.config; + +import com.google.common.base.Objects; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; + +import java.util.UUID; + +import javax.annotation.Nonnull; + +/** + *

+ * Immutable DMaaP MR Configuration for Subscriber. + *

+ * Use {@link DMaaPMRSubscriberConfig.Builder} to construct Subscriber Configuration + *

+ * + * @author Rajiv Singla . Creation Date: 10/12/2016. + */ +public final class DMaaPMRSubscriberConfig extends DMaaPMRBaseConfig { + + private final String consumerId; + private final String consumerGroup; + private final Integer timeoutMS; + private final Integer messageLimit; + + private DMaaPMRSubscriberConfig(@Nonnull String hostName, + @Nonnull Integer portNumber, + @Nonnull String topicName, + @Nonnull String protocol, + String userName, + String userPassword, + @Nonnull String contentType, + @Nonnull String consumerId, + @Nonnull String consumerGroup, + @Nonnull Integer timeoutMS, + @Nonnull Integer messageLimit) { + this.hostName = hostName; + this.portNumber = portNumber; + this.topicName = topicName; + this.protocol = protocol; + this.userName = userName; + this.userPassword = userPassword; + this.contentType = contentType; + this.consumerId = consumerId; + this.consumerGroup = consumerGroup; + this.timeoutMS = timeoutMS; + this.messageLimit = messageLimit; + } + + /** + * Builder to initialize immutable {@link DMaaPMRSubscriberConfig} object + */ + public static class Builder { + + private String hostName; + private Integer portNumber; + private String topicName; + private String userName; + private String userPassword; + private String protocol; + private String contentType; + private String consumerId; + private String consumerGroup; + private Integer timeoutMS; + private Integer messageLimit; + + public Builder(@Nonnull String hostName, + @Nonnull String topicName) { + // Required Values + this.hostName = hostName; + this.topicName = topicName; + + // Default values + this.portNumber = AnalyticsConstants.DEFAULT_PORT_NUMBER; + this.userName = AnalyticsConstants.DEFAULT_USER_NAME; + this.userPassword = AnalyticsConstants.DEFAULT_USER_PASSWORD; + this.protocol = AnalyticsConstants.DEFAULT_PROTOCOL; + this.contentType = AnalyticsConstants.DEFAULT_CONTENT_TYPE; + this.consumerId = UUID.randomUUID().toString(); // consumer is assigned a random id by default + this.consumerGroup = AnalyticsConstants.DEFAULT_SUBSCRIBER_GROUP_PREFIX + consumerId; // random group + this.timeoutMS = AnalyticsConstants.DEFAULT_SUBSCRIBER_TIMEOUT_MS; // defaults to 10ms timeout + this.messageLimit = AnalyticsConstants.DEFAULT_SUBSCRIBER_MESSAGE_LIMIT; // defaults to 1000 message limit + } + + + /** + * Setup for custom host port number - Defaults to 80. + * + * @param portNumber custom port number + * @return Builder object itself for chaining + */ + public Builder setPortNumber(@Nonnull Integer portNumber) { + this.portNumber = portNumber; + return this; + } + + + /** + * Setup user name for authentication. If no username is provided authentication will be disabled + * + * @param userName user name for DMaaP Topic Authentication + * @return Builder object itself for chaining + */ + public Builder setUserName(@Nonnull String userName) { + this.userName = userName; + return this; + } + + + /** + * Setup user password for authentication. If no password is provided authentication will be disabled + * + * @param userPassword user password for DMaaP Topic Authentication + * @return Builder object itself for chaining + */ + public Builder setUserPassword(@Nonnull String userPassword) { + this.userPassword = userPassword; + return this; + } + + + /** + * Setup custom Subscriber protocol - Defaults to https. + * Note: Only http and https are currently supported. + * + * @param protocol protocol e.g. https or http + * @return Builder object itself for chaining + */ + public Builder setProtocol(@Nonnull String protocol) { + + this.protocol = normalizeValidateProtocol(protocol); + return this; + } + + /** + * Setup custom Subscriber content-type - Defaults to application/json + * + * @param contentType content type e.g. application/json + * @return Builder object itself for chaining + */ + public Builder setContentType(@Nonnull String contentType) { + final String normalizedContentType = normalizeValidateContentType(contentType); + this.contentType = normalizedContentType; + return this; + } + + + /** + * Setup custom Consumer Id - Defaults to random Id + * + * @param consumerId - custom consumer ID + * @return Builder object itself for chaining + */ + public Builder setConsumerId(@Nonnull String consumerId) { + this.consumerId = consumerId; + return this; + } + + /** + * Setup custom Consumer Group - Default to OpenDCAE-DMaaPSub-ConsumerID + * + * @param consumerGroup - custom Consumer Group + * @return Builder object itself for chaining + */ + public Builder setConsumerGroup(@Nonnull String consumerGroup) { + this.consumerGroup = consumerGroup; + return this; + } + + /** + * Setup Custom Subscriber timeout in ms - Default to no timeout limit + * + * @param timeoutMS timeout in milliseconds + * @return Builder object itself for chaining + */ + public Builder setTimeoutMS(@Nonnull Integer timeoutMS) { + this.timeoutMS = timeoutMS; + return this; + } + + /** + * Setup custom Subscriber Message Limit - Default to no limit + * + * @param messageLimit message Limit + * @return Builder object itself for chaining + */ + public Builder setMessageLimit(@Nonnull Integer messageLimit) { + this.messageLimit = messageLimit; + return this; + } + + /** + * Builds Immutable instance of {@link DMaaPMRSubscriberConfig} + * + * @return immutable DMaaP Subscriber Config Object + */ + public DMaaPMRSubscriberConfig build() { + return new DMaaPMRSubscriberConfig(hostName, portNumber, topicName, protocol, userName, userPassword, + contentType, consumerId, consumerGroup, timeoutMS, messageLimit); + } + + } + + + /** + * DMaaP MR Subscriber Consumer Id + * + * @return consumer Id + */ + public String getConsumerId() { + return consumerId; + } + + /** + * DMaaP MR Subscriber Consumer Group + * + * @return consumer group + */ + public String getConsumerGroup() { + return consumerGroup; + } + + /** + * DMaaP MR Subscriber Timeout in ms + * + * @return subscriber timeout ms + */ + public Integer getTimeoutMS() { + return timeoutMS; + } + + /** + * DMaaP MR Subscriber message limit + * + * @return subscriber message limit + */ + public Integer getMessageLimit() { + return messageLimit; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + DMaaPMRSubscriberConfig that = (DMaaPMRSubscriberConfig) o; + return Objects.equal(consumerId, that.consumerId) && + Objects.equal(consumerGroup, that.consumerGroup) && + Objects.equal(timeoutMS, that.timeoutMS) && + Objects.equal(messageLimit, that.messageLimit); + } + + @Override + public int hashCode() { + return Objects.hashCode(super.hashCode(), consumerId, consumerGroup, timeoutMS, messageLimit); + } + + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("baseConfig", super.toString()) + .add("consumerId", consumerId) + .add("consumerGroup", consumerGroup) + .add("timeoutMS", timeoutMS) + .add("messageLimit", messageLimit) + .toString(); + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java new file mode 100644 index 0000000..b4a29a1 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java @@ -0,0 +1,38 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.response; + +/** + *

+ * Contract for all DMaaPMR Publisher Response + *

+ * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public interface DMaaPMRPublisherResponse extends DMaaPMRResponse { + + + /** + * Gets number of pending messages + * + * @return pending messages in the batch queue + */ + int getPendingMessagesCount(); +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java new file mode 100644 index 0000000..879feac --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java @@ -0,0 +1,70 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.response; + +import com.google.common.base.Objects; + +import javax.annotation.Nonnull; + +/** + *

+ * An simple implementation of {@link DMaaPMRPublisherResponse} + *

+ * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public class DMaaPMRPublisherResponseImpl implements DMaaPMRPublisherResponse { + + private final Integer responseCode; + private final String responseMessage; + private final int pendingMessagesCount; + + public DMaaPMRPublisherResponseImpl(@Nonnull Integer responseCode, + @Nonnull String responseMessage, + int pendingMessagesCount) { + this.responseCode = responseCode; + this.responseMessage = responseMessage; + this.pendingMessagesCount = pendingMessagesCount; + } + + @Override + public Integer getResponseCode() { + return responseCode; + } + + @Override + public String getResponseMessage() { + return responseMessage; + } + + @Override + public int getPendingMessagesCount() { + return pendingMessagesCount; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("responseCode", responseCode) + .add("responseMessage", responseMessage) + .add("pendingMessagesCount", pendingMessagesCount) + .toString(); + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java new file mode 100644 index 0000000..4ac5cf8 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java @@ -0,0 +1,46 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.response; + +/** + *

+ * Contract for DMaaP MR Responses + *

+ * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public interface DMaaPMRResponse { + + /** + * Gets HTTP Response Code + * + * @return HTTP Response code as String + */ + Integer getResponseCode(); + + /** + * Gets Response Message + * + * @return Response Message + */ + String getResponseMessage(); + + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java new file mode 100644 index 0000000..5e90e24 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java @@ -0,0 +1,40 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.response; + +import java.util.List; + +/** + *

+ * Contract for all DMaaP MR Subscriber Responses + *

+ * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public interface DMaaPMRSubscriberResponse extends DMaaPMRResponse { + + /** + * Returns message fetched from DMaaP MR Topic + * + * @return collection of actual message retrieved from DMaaP MR Topic + */ + List getFetchedMessages(); + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java new file mode 100644 index 0000000..160491c --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java @@ -0,0 +1,80 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.response; + +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import static java.util.Collections.unmodifiableList; + +/** + *

+ * A simple implementation for {@link DMaaPMRSubscriberResponse} + *

+ * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public class DMaaPMRSubscriberResponseImpl implements DMaaPMRSubscriberResponse { + + private final Integer responseCode; + private final String responseMessage; + private final List fetchedMessages; + + public DMaaPMRSubscriberResponseImpl(@Nonnull Integer responseCode, + @Nonnull String responseMessage, + @Nullable List fetchedMessages) { + this.responseCode = responseCode; + this.responseMessage = responseMessage; + this.fetchedMessages = fetchedMessages != null ? fetchedMessages : ImmutableList.of(); + } + + public DMaaPMRSubscriberResponseImpl(Integer responseCode, String responseMessage) { + this(responseCode, responseMessage, null); + } + + @Override + public Integer getResponseCode() { + return responseCode; + } + + @Override + public String getResponseMessage() { + return responseMessage; + } + + @Override + public List getFetchedMessages() { + return unmodifiableList(fetchedMessages); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("responseCode", responseCode) + .add("responseMessage", responseMessage) + .add("fetchedMessages(size)", fetchedMessages.size()) + .toString(); + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java new file mode 100644 index 0000000..ab08642 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java @@ -0,0 +1,62 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.module; + +import com.google.inject.AbstractModule; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherFactory; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherImpl; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueFactory; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueImpl; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberFactory; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberImpl; + +/** + * Guice Module to wire concrete implementations with interfaces + *

+ * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +public class AnalyticsDMaaPModule extends AbstractModule { + + + @Override + protected void configure() { + + // Bind Http Client + bind(CloseableHttpClient.class).toInstance(HttpClients.createDefault()); + + // Bind Publishing queue + install(new FactoryModuleBuilder().implement(DMaaPMRPublisherQueue.class, DMaaPMRPublisherQueueImpl.class) + .build(DMaaPMRPublisherQueueFactory.class)); + + install(new FactoryModuleBuilder().implement(DMaaPMRPublisher.class, DMaaPMRPublisherImpl.class) + .build(DMaaPMRPublisherFactory.class)); + + install(new FactoryModuleBuilder().implement(DMaaPMRSubscriber.class, DMaaPMRSubscriberImpl.class) + .build(DMaaPMRSubscriberFactory.class)); + + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java new file mode 100644 index 0000000..f381b5f --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java @@ -0,0 +1,378 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Optional; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.util.EntityUtils; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.common.utils.HTTPUtils; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponseImpl; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponseImpl; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.Charset; +import java.util.LinkedList; +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import static java.lang.String.format; + +/** + * Base class for DMaaP MR Publishers and Subscriber Implementations containing various utility methods + * + * @author Rajiv Singla . Creation Date: 11/1/2016. + */ +public abstract class BaseDMaaPMRComponent implements DMaaPMRComponent { + + private static final Logger LOG = LoggerFactory.getLogger(BaseDMaaPMRComponent.class); + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + /** + * Creates Base64 encoded Auth Header for given userName and Password + * If either user name of password are null return absent + * + * @param userName username + * @param userPassword user password + * @return base64 encoded auth header if username or password are both non null + */ + protected static Optional getAuthHeader(@Nullable final String userName, + @Nullable final String userPassword) { + if (userName == null || userPassword == null) { + return Optional.absent(); + } else { + final String auth = userName + ":" + userPassword; + final Charset isoCharset = Charset.forName("ISO-8859-1"); + byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(isoCharset)); + return Optional.of("Basic " + new String(encodedAuth, isoCharset)); + } + } + + + /** + * Creates Publisher URI for given {@link DMaaPMRPublisherConfig} + * + * @param publisherConfig publisher settings + * + * @return DMaaP MR Publisher Topic URI that can be used to post messages to MR Topic + */ + protected static URI createPublisherURI(final DMaaPMRPublisherConfig publisherConfig) { + final String hostName = publisherConfig.getHostName(); + final Integer portNumber = publisherConfig.getPortNumber(); + final String getProtocol = publisherConfig.getProtocol(); + final String topicName = publisherConfig.getTopicName(); + URI publisherURI = null; + try { + publisherURI = new URIBuilder().setScheme(getProtocol).setHost(hostName).setPort(portNumber) + .setPath(AnalyticsConstants.DMAAP_URI_PATH_PREFIX + topicName).build(); + } catch (URISyntaxException e) { + final String errorMessage = format("Error while creating publisher URI: %s", e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + LOG.info("Created DMaaP MR Publisher URI: {}", publisherURI); + return publisherURI; + } + + + /** + * Creates Subscriber URI for given {@link DMaaPMRSubscriberConfig} + * + * @param subscriberConfig subscriber settings + * + * @return DMaaP MR Subscriber Topic URI that can be used to fetch messages from MR topic + */ + protected static URI createSubscriberURI(final DMaaPMRSubscriberConfig subscriberConfig) { + final String hostName = subscriberConfig.getHostName(); + final Integer portNumber = subscriberConfig.getPortNumber(); + final String getProtocol = subscriberConfig.getProtocol(); + final String topicName = subscriberConfig.getTopicName(); + final String consumerId = subscriberConfig.getConsumerId(); + final String consumerGroup = subscriberConfig.getConsumerGroup(); + final Integer timeoutMS = subscriberConfig.getTimeoutMS(); + final Integer messageLimit = subscriberConfig.getMessageLimit(); + URI subscriberURI = null; + try { + URIBuilder uriBuilder = new URIBuilder().setScheme(getProtocol).setHost(hostName).setPort(portNumber) + .setPath(AnalyticsConstants.DMAAP_URI_PATH_PREFIX + + topicName + "/" + + consumerGroup + "/" + + consumerId); + // add query params if present + if (timeoutMS > 0) { + uriBuilder.addParameter(AnalyticsConstants.SUBSCRIBER_TIMEOUT_QUERY_PARAM_NAME, timeoutMS.toString()); + } + if (messageLimit > 0) { + uriBuilder.addParameter(AnalyticsConstants.SUBSCRIBER_MSG_LIMIT_QUERY_PARAM_NAME, + messageLimit.toString()); + } + subscriberURI = uriBuilder.build(); + + } catch (URISyntaxException e) { + final String errorMessage = format("Error while creating subscriber URI: %s", e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + LOG.info("Created DMaaP MR Subscriber URI: {}", subscriberURI); + return subscriberURI; + } + + + /** + * Creates 202 (Accepted) Response code message + * + * @param batchQueueSize batch Queue size + * + * @return response with 202 message code + */ + protected static DMaaPMRPublisherResponse createPublisherAcceptedResponse(int batchQueueSize) { + return createPublisherResponse(HTTPUtils.HTTP_ACCEPTED_RESPONSE_CODE, + "Accepted - Messages queued for batch publishing to MR Topic", batchQueueSize); + } + + + /** + * Creates 204 (No Content) Response code message + * + * @return response with 204 message code + */ + protected static DMaaPMRPublisherResponse createPublisherNoContentResponse() { + return createPublisherResponse(HTTPUtils.HTTP_NO_CONTENT_RESPONSE_CODE, + "No Content - No Messages in batch queue for flushing to MR Topic", 0); + } + + + /** + * Creates Publisher Response for given response code, response Message and pending Message Count + * + * @param responseCode HTTP Status Code + * @param responseMessage response message + * @param pendingMessages pending messages in batch queue + * + * @return DMaaP MR Publisher Response + */ + protected static DMaaPMRPublisherResponse createPublisherResponse(int responseCode, String + responseMessage, int pendingMessages) { + return new DMaaPMRPublisherResponseImpl(responseCode, responseMessage, pendingMessages); + } + + + /** + * Returns weekly consistent pending messages in batch queue + * + * @param publisherQueue batch queue + * @param publisherConfig publisher settings + * + * @return pending messages to be published + */ + protected static int getPendingMessages(@Nonnull final DMaaPMRPublisherQueue publisherQueue, + @Nonnull final DMaaPMRPublisherConfig publisherConfig) { + return publisherConfig.getMaxBatchSize() - publisherQueue.getBatchQueueRemainingSize(); + } + + + /** + * Creates Subscriber Response for give response Code, response Message and fetch messages + * + * @param responseCode response Code + * @param responseMessage response Message + * @param fetchedMessages fetched messages + * + * @return DMaaP MR Subscriber Response + */ + protected static DMaaPMRSubscriberResponse createSubscriberResponse(int responseCode, String + responseMessage, List fetchedMessages) { + if (fetchedMessages == null) { + return new DMaaPMRSubscriberResponseImpl(responseCode, responseMessage); + } else { + return new DMaaPMRSubscriberResponseImpl(responseCode, responseMessage, fetchedMessages); + } + } + + + /** + * Custom response handler which extract status code and response body + * + * @return Pair containing Response code and response body + */ + protected static ResponseHandler> responseHandler() { + return new ResponseHandler>() { + @Override + public Pair handleResponse(HttpResponse response) throws IOException { + // Get Response status code + final int status = response.getStatusLine().getStatusCode(); + final HttpEntity responseEntity = response.getEntity(); + // If response entity is not null - extract response body as string + String responseEntityString = ""; + if (responseEntity != null) { + responseEntityString = EntityUtils.toString(responseEntity); + } + return new ImmutablePair<>(status, responseEntityString); + } + }; + } + + + /** + * Adds message to Publisher recovery queue. If recovery queue is full throws an error as messages will + * be lost + * + * @param publisherQueue publisher queue + * @param messages recoverable messages to be published to recovery queue + */ + protected static void addMessagesToRecoveryQueue(DMaaPMRPublisherQueue publisherQueue, + List messages) { + try { + publisherQueue.addRecoverableMessages(messages); + + LOG.debug("Messages Added to Recovery Queue. Messages Size: {}, Recovery Queue Remaining Size: {}", + messages.size(), publisherQueue.getBatchQueueRemainingSize()); + + } catch (IllegalStateException e) { + final String errorMessage = format("Unable to put messages in recovery queue. Messages will be lost. " + + "Recovery Queue might be full. Message Size: %d, Recovery Queue Remaining Capacity: %d", + messages.size(), publisherQueue.getRecoveryQueueRemainingSize()); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + + + /** + * Converts List of messages to Json String Array which can be published to DMaaP MR topic. + * + * @param messages messages that need to parsed to Json Array representation + * @return json string representation of message + */ + protected static String convertToJsonString(@Nullable final List messages) { + // If messages are null or empty just return empty array + if (messages == null || messages.isEmpty()) { + return "[]"; + } + + + List jsonMessageObjectsList = new LinkedList<>(); + + try { + for (String message : messages) { + final JsonNode jsonNode = objectMapper.readTree(message); + jsonMessageObjectsList.add(jsonNode); + } + return objectMapper.writeValueAsString(jsonMessageObjectsList); + } catch (JsonProcessingException e) { + final String errorMessage = + format("Unable to convert publisher messages to Json. Messages: %s, Json Error: %s", + messages, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + + } catch (IOException e) { + final String errorMessage = + format("IO Exception while converting publisher messages to Json. Messages: %s, Json Error: %s", + messages, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + } + + + /** + * Converts subscriber messages json string to List of messages. If message Json String is empty + * or null + * + * @param messagesJsonString json messages String + * + * @return List containing DMaaP MR Messages + */ + protected static List convertJsonToStringMessages(@Nullable final String messagesJsonString) { + + final LinkedList messages = new LinkedList<>(); + + // If message string is not null or not empty parse json message array to List of string messages + if (messagesJsonString != null && !messagesJsonString.trim().isEmpty() + && !("[]").equals(messagesJsonString.trim())) { + + try { + // get root node + final JsonNode rootNode = objectMapper.readTree(messagesJsonString); + // iterate over root node and parse arrays messages + for (JsonNode jsonNode : rootNode) { + // if array parse it is array of messages + final String incomingMessageString = jsonNode.toString(); + if (jsonNode.isArray()) { + final List messageList = objectMapper.readValue(incomingMessageString, List.class); + for (Object message : messageList) { + final String jsonMessageString = objectMapper.writeValueAsString(message); + addUnescapedJsonToMessage(messages, jsonMessageString); + } + } else { + // parse it as object + addUnescapedJsonToMessage(messages, incomingMessageString); + } + } + + } catch (IOException e) { + final String errorMessage = + format("Unable to convert subscriber Json String to Messages. Subscriber Response String: %s," + + " Json Error: %s", messagesJsonString, e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + } + return messages; + } + + /** + * Adds unescaped Json messages to given messages list + * + * @param messages message list in which unescaped messages will be added + * @param incomingMessageString incoming message string that may need to be escaped + */ + private static void addUnescapedJsonToMessage(List messages, String incomingMessageString) { + if (incomingMessageString.startsWith("\"") && incomingMessageString.endsWith("\"")) { + messages.add(StringEscapeUtils.unescapeJson( + incomingMessageString.substring(1, incomingMessageString.length() - 1))); + } else { + messages.add(StringEscapeUtils.unescapeJson(incomingMessageString)); + } + } + + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java new file mode 100644 index 0000000..872c4fe --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java @@ -0,0 +1,29 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service; + +/** + * Marker interface for all DMaaP MR Components e.g. MR Publishers, MR Subscribers + * + * @author Rajiv Singla . Creation Date: 11/1/2016. + */ +public interface DMaaPMRComponent { +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java new file mode 100644 index 0000000..04186c1 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java @@ -0,0 +1,95 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; + +import java.util.Date; +import java.util.List; + +/** + *

+ * DMaaP MR Publisher can be used to publish messages to DMaaP MR Topics. + *

+ * + * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public interface DMaaPMRPublisher extends AutoCloseable { + + + /** + *

+ * Adds collection of messages to DMaaP MR Topic Publishing Queue. + *

+ * Note: Invoking this method may or may not cause publishing immediately + * as publishing in done is batch mode by default. Parameter maxBatchSize + * in {@link DMaaPMRPublisherConfig} is used to determine max batch queue size. + * If the maxBatchSize is reached all message will be published automatically + * during subsequent call. + *

+ * + * @param messages messages to publish to DMaaP MR Publisher + * @return response which may contain Http Response code 202 (Accepted) as publishing + * will proceed when max batch size is reached. Throws {@link DCAEAnalyticsRuntimeException} + * if publishing fails + */ + DMaaPMRPublisherResponse publish(List messages); + + + /** + *

+ * Forces publishing of messages to DMaaP MR Topic and returns {@link DMaaPMRPublisherResponse} + * which can be inspected for HTTP status code of publishing call to DMaaP MR Topic. + *

+ * + * @param messages messages to publish to DMaaP MR Publisher + * @return DMaaP Message Router Publisher Response. Throws {@link DCAEAnalyticsRuntimeException} + * if force publishing fails + * + */ + DMaaPMRPublisherResponse forcePublish(List messages); + + + /** + *

+ * Forces publishing of messages in Publisher queue to DMaaP MR Topic and returns + * {@link DMaaPMRPublisherResponse}.If there are no messages were in the queue to + * be flushed response code 304 (Not Modified) will be returned + *

+ * + * @return DMaaP Message Router Publisher Response + */ + DMaaPMRPublisherResponse flush(); + + + /** + *

+ * Returns the creation time when Publisher instance was created. + *

+ * + * @return creation time of Subscriber instance + */ + Date getPublisherCreationTime(); + + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java new file mode 100644 index 0000000..3b55b57 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java @@ -0,0 +1,49 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; + +/** + *

+ * Factory to initialize instance of {@link DMaaPMRPublisher} for Guice DI injection purposes. + *

+ * + * NOTE: Client should not use this Factory to initialize {@link DMaaPMRPublisher} unless they + * are wiring dependencies using Guice. Client must use {@link DMaaPMRFactory} to initialize + * guice injected Publisher instances + * + *

+ * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +public interface DMaaPMRPublisherFactory { + + /** + * Guice Factory to create DMaaP MR Publisher + * + * @param publisherConfig publisher config + * + * @return DMaaP MR Publisher instance + */ + DMaaPMRPublisher create(DMaaPMRPublisherConfig publisherConfig); + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java new file mode 100644 index 0000000..16ea5fa --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java @@ -0,0 +1,210 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.service.BaseDMaaPMRComponent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URI; +import java.util.Date; +import java.util.List; + +import static org.onap.dcae.apod.analytics.common.utils.HTTPUtils.isSuccessfulResponseCode; +import static java.lang.String.format; + +/** + * Concrete Implementation of {@link DMaaPMRPublisher} which uses {@link HttpClient} + * + * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public class DMaaPMRPublisherImpl extends BaseDMaaPMRComponent implements DMaaPMRPublisher { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRPublisherImpl.class); + + private final DMaaPMRPublisherConfig publisherConfig; + private final CloseableHttpClient closeableHttpClient; + private final DMaaPMRPublisherQueue publisherQueue; + private final Date publisherCreationTime; + private URI publisherUri; + + @Inject + public DMaaPMRPublisherImpl(@Assisted DMaaPMRPublisherConfig publisherConfig, + DMaaPMRPublisherQueueFactory dMaaPMRPublisherQueueFactory, + CloseableHttpClient closeableHttpClient) { + + this.publisherConfig = publisherConfig; + final int maxBatchSize = publisherConfig.getMaxBatchSize() > 0 ? publisherConfig.getMaxBatchSize() : 1; + this.publisherQueue = dMaaPMRPublisherQueueFactory.create( + maxBatchSize, publisherConfig.getMaxRecoveryQueueSize()); + this.closeableHttpClient = closeableHttpClient; + this.publisherUri = createPublisherURI(publisherConfig); + this.publisherCreationTime = new Date(); + } + + + @Override + public DMaaPMRPublisherResponse publish(List messages) { + + final int batchQueueRemainingSize = publisherQueue.getBatchQueueRemainingSize(); + + // if messages size is less than batch queue size - just queue them for batch publishing + if (batchQueueRemainingSize > messages.size()) { + LOG.debug("Adding messages to batch Queue. No flushing required. Messages Size:{}. Batch Queue Size:{}", + messages.size(), batchQueueRemainingSize); + final int batchQueueSize = publisherQueue.addBatchMessages(messages); + return createPublisherAcceptedResponse(batchQueueSize); + + } else { + + // grab all already queued messages, append current messages and force publish them to DMaaP MR topic + final List queueMessages = publisherQueue.getMessageForPublishing(); + LOG.debug("Batch Queue capacity exceeds messages size. Flushing of all pending messages to DMaaP MR " + + "Publisher Topic."); + return forcePublish(Lists.newLinkedList(Iterables.concat(queueMessages, messages))); + } + + } + + @Override + public DMaaPMRPublisherResponse forcePublish(List messages) { + + LOG.debug("Force publishing messages to DMaaP MR Topic. Messages Size: {}", messages.size()); + + final String contentType = publisherConfig.getContentType(); + final String userName = publisherConfig.getUserName(); + final String userPassword = publisherConfig.getUserPassword(); + final HttpPost postRequest = new HttpPost(publisherUri); + + // add Authorization Header if username and password are present + final Optional authHeader = getAuthHeader(userName, userPassword); + if (authHeader.isPresent()) { + postRequest.addHeader(HttpHeaders.AUTHORIZATION, authHeader.get()); + } else { + LOG.debug("DMaaP MR Publisher Authentication is disabled as username or password is not present."); + } + + // Create post string entity + final String messagesJson = convertToJsonString(messages); + final StringEntity requestEntity = + new StringEntity(messagesJson, ContentType.create(contentType, "UTF-8")); + postRequest.setEntity(requestEntity); + + try { + final Pair responsePair = closeableHttpClient.execute(postRequest, responseHandler()); + final Integer responseCode = responsePair.getLeft(); + final String responseBody = responsePair.getRight(); + // if messages were published successfully, return successful response + if (isSuccessfulResponseCode(responseCode)) { + LOG.debug("DMaaP MR Messages published successfully. DMaaP Response Code: {}. DMaaP Response " + + "Body: {}, Number of Messages published: {}", + responseCode, responseBody, messages.size()); + + } else { + LOG.warn("Unable to publish messages to DMaaP MR Topic. DMaaP Response Code: {}, DMaaP Response " + + "Body: {}. Messages will be queued in recovery queue", responseCode, responseBody); + addMessagesToRecoveryQueue(publisherQueue, messages); + } + + return createPublisherResponse(responseCode, responseBody, + getPendingMessages(publisherQueue, publisherConfig)); + + } catch (IOException e) { + // If IO Error then we need to also put messages in recovery queue + addMessagesToRecoveryQueue(publisherQueue, messages); + final String errorMessage = format("IO Exception while publishing messages to DMaaP Topic. " + + "Messages will be queued in recovery queue. Messages Size: %d", messages.size()); + + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + } + + + @Override + public DMaaPMRPublisherResponse flush() { + final List queueMessages = publisherQueue.getMessageForPublishing(); + // If there are no message return 204 (No Content) response code + if (queueMessages.isEmpty()) { + LOG.debug("No messages to publish to batch queue. Returning 204 status code"); + return createPublisherNoContentResponse(); + } else { + // force publish messages in queue + return forcePublish(queueMessages); + } + } + + @Override + public Date getPublisherCreationTime() { + return new Date(publisherCreationTime.getTime()); + } + + @Override + public void close() throws Exception { + + // flush current message in the queue + int retrialNumber = 0; + int flushResponseCode; + + // automatic retries if messages cannot be flushed + do { + retrialNumber++; + DMaaPMRPublisherResponse flushResponse = flush(); + flushResponseCode = flushResponse.getResponseCode(); + + if (!isSuccessfulResponseCode(flushResponseCode)) { + LOG.warn("Unable to flush batch messages to publisher due to DMaaP MR invalid Response: {}. " + + "Retrial No: {} of Max {} Retries", flushResponseCode, retrialNumber, + AnalyticsConstants.PUBLISHER_MAX_FLUSH_RETRIES_ON_CLOSE); + + Thread.sleep(AnalyticsConstants.PUBLISHER_DELAY_MS_ON_RETRIES_ON_CLOSE); + } + } while (retrialNumber <= AnalyticsConstants.PUBLISHER_MAX_FLUSH_RETRIES_ON_CLOSE && + !isSuccessfulResponseCode(flushResponseCode)); + + if (!isSuccessfulResponseCode(flushResponseCode)) { + LOG.error("Unable to flush batch messages to publisher. Messages loss cannot be prevented"); + } else { + LOG.info("Successfully published all batched messages to publisher."); + } + + // close http client + closeableHttpClient.close(); + + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java new file mode 100644 index 0000000..e625fba --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java @@ -0,0 +1,87 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import java.util.List; + +/** + *

+ * DMaaP MR Publisher Queue handles back pressure in case DMaaP MR Publisher topic + * is offline for some reason. It does so by having a recovery queue which keeps + * messages in order in case there is temporary interruption in DMaaP Publisher + *

+ * + * @author Rajiv Singla . Creation Date: 11/1/2016. + */ +public interface DMaaPMRPublisherQueue { + + /** + *

+ * Add batchMessages to Batch Queue + *

+ * + * @param batchMessages messages that needs to be added to batch queue + * @return current size of batch queue. Throws {@link IllegalStateException} + * if batch queue does not have enough space + */ + int addBatchMessages(List batchMessages); + + + /** + *

+ * Add recoverable messages to Recoverable Queue + *

+ * + * @param recoverableMessages messages that needs to be added to recoverable queue + * @return current size of the recoverable queue. Throws {@link IllegalStateException} + * if recoverable queue does not have enough space + */ + int addRecoverableMessages(List recoverableMessages); + + /** + *

+ * Get messages that need to be published to DMaaP topic. Messages in recoverable + * queue are appended if present. + *

+ * + * @return List of messages from both batch and recovery queue + */ + List getMessageForPublishing(); + + /** + *

+ * Remaining capacity of Batch Queue + *

+ * + * @return Remaining Batch Queue Size + */ + int getBatchQueueRemainingSize(); + + /** + *

+ * Remaining capacity of Recovery Queue + *

+ * + * @return Remaining Recovery Queue Size + */ + int getRecoveryQueueRemainingSize(); + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java new file mode 100644 index 0000000..aeacbb0 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java @@ -0,0 +1,45 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import com.google.inject.assistedinject.Assisted; + +/** + *

+ * Factory to initialize instance of {@link DMaaPMRPublisherQueue} for Guice DI injection purposes. + *

+ * + * @author Rajiv Singla . Creation Date: 11/1/2016. + */ +public interface DMaaPMRPublisherQueueFactory { + + /** + * Guice Factory to create DMaaP MR Publisher Queue + * + * @param batchQueueSize batch queue size + * @param recoveryQueueSize recovery queue size + * + * @return instance of DMaaP MR Publisher Queue + */ + DMaaPMRPublisherQueue create(@Assisted("batchQueueSize") int batchQueueSize, + @Assisted("recoveryQueueSize") int recoveryQueueSize); + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java new file mode 100644 index 0000000..343c31a --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java @@ -0,0 +1,126 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.LinkedBlockingDeque; + +import static com.google.common.collect.Iterables.concat; +import static com.google.common.collect.Lists.newLinkedList; +import static java.util.Collections.unmodifiableList; + +/** + *

+ * An implementation of {@link DMaaPMRPublisherQueue} which uses {@link java.util.concurrent.BlockingDeque} + * for batch and recovery queues + *

+ * + * + * @author Rajiv Singla . Creation Date: 11/1/2016. + */ +public class DMaaPMRPublisherQueueImpl implements DMaaPMRPublisherQueue { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRPublisherQueueImpl.class); + + private final LinkedBlockingDeque batchQueue; + private final LinkedBlockingDeque recoveryQueue; + + @Inject + public DMaaPMRPublisherQueueImpl(@Assisted("batchQueueSize") int batchQueueSize, + @Assisted("recoveryQueueSize") int recoveryQueueSize) { + batchQueue = new LinkedBlockingDeque<>(batchQueueSize); + recoveryQueue = new LinkedBlockingDeque<>(recoveryQueueSize); + LOG.debug("Creating Instance of DMaaP Publisher Queue. BatchQueueSize: {}, RecoveryQueueSize: {}", + batchQueueSize, recoveryQueueSize); + } + + @Override + public synchronized int addBatchMessages(List batchMessages) { + + // checks if batchMessages size does not exceed batch queue capacity + if (batchMessages.size() > batchQueue.remainingCapacity()) { + throw new IllegalStateException("Not enough capacity to add batchMessages in batch queue"); + } + + // Add batchMessages to batch queue + for (String message : batchMessages) { + batchQueue.add(message); + } + + // returns current elements size in batch queue + return batchQueue.size(); + } + + @Override + public synchronized int addRecoverableMessages(List recoverableMessages) { + + // checks if messages size does not exceed recovery queue size + if (recoverableMessages.size() > recoveryQueue.remainingCapacity()) { + throw new IllegalStateException("Not enough capacity to add messages in recovery queue"); + } + + // add messages to recovery queue + for (String recoverableMessage : recoverableMessages) { + recoveryQueue.add(recoverableMessage); + } + + // returns current size of recovery queue + return recoveryQueue.size(); + } + + @Override + public synchronized List getMessageForPublishing() { + + final List recoveryMessageList = new LinkedList<>(); + final List batchMessagesList = new LinkedList<>(); + + // get messages from recovery queue if present + if (!recoveryQueue.isEmpty()) { + final int recoveryQueueSize = recoveryQueue.drainTo(recoveryMessageList); + LOG.debug("Drained Recovery Queue elements for flushing: {}", recoveryQueueSize); + } + + // get messages from batch queue if present + if (!batchQueue.isEmpty()) { + final int batchQueueSize = batchQueue.drainTo(batchMessagesList); + LOG.debug("Drained Batch Queue elements for flushing: {}", batchQueueSize); + } + + // concat recovery and batch queue elements + return unmodifiableList(newLinkedList(concat(recoveryMessageList, batchMessagesList))); + } + + @Override + public synchronized int getBatchQueueRemainingSize() { + return batchQueue.remainingCapacity(); + } + + @Override + public synchronized int getRecoveryQueueRemainingSize() { + return recoveryQueue.remainingCapacity(); + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java new file mode 100644 index 0000000..6a0aa63 --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java @@ -0,0 +1,57 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.subscriber; + +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; + +import java.util.Date; + +/** + *

+ * DMaaP MR Subscriber can be used to subscribe messages from DMaaP MR Topics. + *

+ * + * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public interface DMaaPMRSubscriber extends AutoCloseable { + + /** + * Fetches Messages from DMaaP MR Topic. {@link DMaaPMRPublisherConfig} settings parameters + * for messageLimit and message timeout are used + * + * @return DMaaP Message Router Subscriber Response + */ + DMaaPMRSubscriberResponse fetchMessages(); + + + /** + * Returns the Subscriber instance creation time + *

+ * NOTE: Due to DMaaP API Design - Subscribers can only fetch messages which + * are published to the topic after the creation of the Subscriber. + * + * @return creation time of Subscriber instance + */ + Date getSubscriberCreationTime(); + + +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java new file mode 100644 index 0000000..e06e2bd --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java @@ -0,0 +1,47 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.subscriber; + +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; + +/** + * Factory to initialize instance of {@link DMaaPMRSubscriber} for Guice DI injection purposes. + *

+ * + * NOTE: Client should not use this Factory to initialize {@link DMaaPMRSubscriber} unless they + * are wiring dependencies using Guice. Client must use {@link DMaaPMRFactory} to initialize + * guice injected Subscriber instances + * + *

+ * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +public interface DMaaPMRSubscriberFactory { + + /** + * Guice Factory to create DMaaP MR Subscriber Instance + * + * @param subscriberConfig subscriber config + * + * @return DMaaP MR Subscriber instance + */ + DMaaPMRSubscriber create(DMaaPMRSubscriberConfig subscriberConfig); +} diff --git a/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java new file mode 100644 index 0000000..9d75ffc --- /dev/null +++ b/dcae-analytics-dmaap/src/main/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java @@ -0,0 +1,129 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.subscriber; + +import com.google.common.base.Optional; +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.BaseDMaaPMRComponent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URI; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import static org.onap.dcae.apod.analytics.common.utils.HTTPUtils.isSuccessfulResponseCode; +import static java.lang.String.format; + +/** + * Concrete Implementation of {@link DMaaPMRSubscriber} which uses {@link HttpClient} + * + * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public class DMaaPMRSubscriberImpl extends BaseDMaaPMRComponent implements DMaaPMRSubscriber { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSubscriberImpl.class); + + private final DMaaPMRSubscriberConfig subscriberConfig; + private final CloseableHttpClient closeableHttpClient; + private final URI subscriberUri; + private final Date subscriberCreationTime; + + @Inject + public DMaaPMRSubscriberImpl(@Assisted DMaaPMRSubscriberConfig subscriberConfig, + CloseableHttpClient closeableHttpClient) { + this.subscriberConfig = subscriberConfig; + this.closeableHttpClient = closeableHttpClient; + this.subscriberUri = createSubscriberURI(subscriberConfig); + this.subscriberCreationTime = new Date(); + } + + @Override + public DMaaPMRSubscriberResponse fetchMessages() { + + final String userName = subscriberConfig.getUserName(); + final String userPassword = subscriberConfig.getUserPassword(); + + final HttpGet getRequest = new HttpGet(subscriberUri); + + // add Authorization Header if username and password are present + final Optional authHeader = getAuthHeader(userName, userPassword); + if (authHeader.isPresent()) { + getRequest.addHeader(HttpHeaders.AUTHORIZATION, authHeader.get()); + } else { + LOG.debug("DMaaP MR Subscriber Authentication is disabled as username or password is not present."); + } + + try { + + final Pair responsePair = closeableHttpClient.execute(getRequest, responseHandler()); + final Integer responseCode = responsePair.getLeft(); + final String responseBody = responsePair.getRight(); + + List fetchedMessages = new LinkedList<>(); + String responseMessage = responseBody; + + // if messages were published successfully, return successful response + if (isSuccessfulResponseCode(responseCode)) { + if (responseBody != null) { + fetchedMessages = convertJsonToStringMessages(responseBody); + responseMessage = "Messages Fetched Successfully"; + } else { + responseMessage = "DMaaP Response Body had no messages"; + } + } else { + LOG.error("Unable to fetch messages to DMaaP MR Topic. DMaaP MR unsuccessful Response Code: {}, " + + "DMaaP Response Body: {}", responseCode, responseBody); + } + + return createSubscriberResponse(responseCode, responseMessage, fetchedMessages); + + } catch (IOException e) { + + final String errorMessage = + format("IO Exception while fetching messages from DMaaP Topic. Exception %s", e); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + + } + + @Override + public Date getSubscriberCreationTime() { + return new Date(subscriberCreationTime.getTime()); + } + + @Override + public void close() throws Exception { + closeableHttpClient.close(); + } +} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactory.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactory.java deleted file mode 100644 index a23c1e9..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactory.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap; - -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.module.AnalyticsDMaaPModule; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; - -/** - * Creates pre injected implementations for {@link DMaaPMRPublisher} and {@link DMaaPMRSubscriber} - *

- * Usage: - *

Create an instance of DMaaP MR Factory

- *
- *        DMaaPFactory dmaapFactory = DMaaPFactory.initalize()
- *     
- *

Create a new DMaaP MR Publisher

- *
- *         DMaaPMRPublisher publisher = dmaapFactory.createPublisher(publisherConfig)
- *     
- *

Create new DMaaP MR Subscriber

- *
- *         DMaaPMRSubscriber subscriber = dmaapFactory.createSubscriber(subscriberConfig)
- *     
- *

- * All Clients must use this Factory to initalize DMaaP Message Router Publishers and Subscribers - *

- *

- * @author Rajiv Singla . Creation Date: 10/20/2016. - */ -public class DMaaPMRFactory { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRFactory.class); - - private final Injector injector; - - public DMaaPMRFactory(AbstractModule guiceModule) { - injector = Guice.createInjector(guiceModule); - } - - /** - * Returns configured instance of {@link DMaaPMRPublisher} - * - * @param publisherConfig Publisher Config - * @return configured instance of DMaaP MR Publisher - */ - public DMaaPMRPublisher createPublisher(@Nonnull DMaaPMRPublisherConfig publisherConfig) { - final DMaaPMRPublisherFactory publisherFactory = injector.getInstance(DMaaPMRPublisherFactory.class); - LOG.debug("Creating new DMaaP MR Publisher Instance with configuration: {}", publisherConfig); - final DMaaPMRPublisher dMaaPMRPublisher = publisherFactory.create(publisherConfig); - LOG.info("Created new DMaaP MR Publisher Instance. Publisher creation time: {}", - dMaaPMRPublisher.getPublisherCreationTime()); - return dMaaPMRPublisher; - } - - /** - * Returns configured instance of {@link DMaaPMRSubscriber} - * - * @param subscriberConfig Subscriber Config - * @return configured instance of DMaaP MR Subscriber - */ - public DMaaPMRSubscriber createSubscriber(@Nonnull DMaaPMRSubscriberConfig subscriberConfig) { - final DMaaPMRSubscriberFactory subscriberFactory = injector.getInstance(DMaaPMRSubscriberFactory.class); - LOG.debug("Creating new DMaaP MR Subscriber Instance with configuration: {}", subscriberConfig); - final DMaaPMRSubscriber dMaaPMRSubscriber = subscriberFactory.create(subscriberConfig); - LOG.info("Created new DMaaP MR Subscriber Instance. Subscriber creation time: {}", - dMaaPMRSubscriber.getSubscriberCreationTime()); - return dMaaPMRSubscriber; - } - - /** - * Creates an instance of {@link DMaaPMRFactory} - * - * @return {@link DMaaPMRFactory} factory instance - */ - public static DMaaPMRFactory create() { - final DMaaPMRFactory dMaaPMRFactory = new DMaaPMRFactory(new AnalyticsDMaaPModule()); - LOG.info("Created new instance of DMaaP MR Factory"); - return dMaaPMRFactory; - } - - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java deleted file mode 100644 index 32a4357..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRBaseConfig.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.config; - -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Locale; - -import static org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils.JSON_APPLICATION_TYPE; - -/** - *

- * Contains common parameters for both DMaaP Message Router Publisher and Subscriber Configs - *

- * @author Rajiv Singla . Creation Date: 10/12/2016. - */ -public abstract class DMaaPMRBaseConfig implements DMaaPMRConfig { - - protected static final Logger LOG = LoggerFactory.getLogger(DMaaPMRBaseConfig.class); - - protected String hostName; - protected Integer portNumber; - protected String topicName; - protected String protocol; - protected String userName; - protected String userPassword; - protected String contentType; - - /** - * Provides host name e.g. mrlocal-mtnjftle01.homer.com - * - * @return host name - */ - public String getHostName() { - return hostName; - } - - - /** - * Provides Port Number of DMaaP MR Topic Host. Defaults to 80 - * - * @return host port number - */ - public Integer getPortNumber() { - return portNumber; - } - - /** - * Provides topic name e.g. com.dcae.dmaap.mtnje2.DcaeTestVES - * - * @return topic name - */ - public String getTopicName() { - return topicName; - } - - /** - * Provides protocol type e.g. http or https - * - * @return protocol type - */ - public String getProtocol() { - return protocol; - } - - /** - * Provides content type e.g. application/json - * - * @return content type - */ - public String getContentType() { - return contentType; - } - - - /** - * Provides User name for the DMaaP MR Topic authentication - * - * @return user name - */ - public String getUserName() { - return userName; - } - - /** - * Provides User password for the DMaaP MR Topic authentication - * - * @return user Password - */ - public String getUserPassword() { - return userPassword; - } - - - /** - * Trims, adjusts casing and validates user input String for protocol selection - * - * @param protocol - User input for protocol String - * @return - network protocol e.g http or https - */ - protected static String normalizeValidateProtocol(final String protocol) { - // validate that only http and https are supported protocols are Supported for DMaaP MR - String normalizedProtocolString = protocol.trim().toLowerCase(Locale.ENGLISH); - if (normalizedProtocolString.isEmpty() || - !("http".equals(normalizedProtocolString) || "https".equals(normalizedProtocolString))) { - - final String errorMessage = - "Unsupported protocol selection. Only HTTPS and HTTPS are currently supported for DMaaP MR"; - - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); - } - return normalizedProtocolString; - } - - - /** - * Trims, adjust casing and validates content type is supported by DMaaP. - * - * NOTE: DMaaP currently only support application/json content type - * - * @param contentType content type that needs to checked for DMaaP MR support - * @return true if content type is supported by DMaaP MR - */ - protected static String normalizeValidateContentType(final String contentType) { - // Current DMaaP MR is only supporting "application/json" content type - String normalizedContentType = contentType.trim().toLowerCase(Locale.ENGLISH); - final boolean isSupported = contentType.equals(JSON_APPLICATION_TYPE); - if (!isSupported) { - final String errorMessage = - "Unsupported content type selection. Only application/json is currently supported for DMaaP MR"; - - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, new IllegalArgumentException(errorMessage)); - } - return normalizedContentType; - } - - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof DMaaPMRBaseConfig)) { - return false; - } - DMaaPMRBaseConfig that = (DMaaPMRBaseConfig) o; - return Objects.equal(hostName, that.hostName) && - Objects.equal(portNumber, that.portNumber) && - Objects.equal(topicName, that.topicName) && - Objects.equal(protocol, that.protocol) && - Objects.equal(userName, that.userName) && - Objects.equal(userPassword, that.userPassword) && - Objects.equal(contentType, that.contentType); - } - - @Override - public int hashCode() { - return Objects.hashCode(hostName, portNumber, topicName, protocol, userName, userPassword, contentType); - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("hostName", hostName) - .add("portNumber", portNumber) - .add("topicName", topicName) - .add("protocol", protocol) - .add("userName", userName) - .add("contentType", contentType) - .toString(); - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java deleted file mode 100644 index 687d489..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.config; - -/** - *

- * Marker Interface for all DMaaP MR Configs. - * Holds Default configuration parameters for all Configs - *

- * @author Rajiv Singla . Creation Date: 10/12/2016. - */ -public interface DMaaPMRConfig { - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java deleted file mode 100644 index 6fbebf2..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfig.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.config; - -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - -import javax.annotation.Nonnull; - -/** - *

- * Immutable DMaaP MR Configuration for DMaaP MR Publisher. - *

- * Use {@link DMaaPMRPublisherConfig.Builder} to construct Subscriber Configuration - *

- *

- * @author Rajiv Singla . Creation Date: 10/12/2016. - */ -public class DMaaPMRPublisherConfig extends DMaaPMRBaseConfig { - - /** - * Publisher batching queue size - */ - private int maxBatchSize; - - /** - * Publisher Recovery Queue Size - */ - private int maxRecoveryQueueSize; - - - private DMaaPMRPublisherConfig(@Nonnull String hostName, - @Nonnull Integer portNumber, - @Nonnull String topicName, - @Nonnull String protocol, - String userName, - String userPassword, - @Nonnull String contentType, - int maxBatchSize, - int maxRecoveryQueueSize) { - this.hostName = hostName; - this.portNumber = portNumber; - this.topicName = topicName; - this.protocol = protocol; - this.userName = userName; - this.userPassword = userPassword; - this.contentType = contentType; - this.maxBatchSize = maxBatchSize; - this.maxRecoveryQueueSize = maxRecoveryQueueSize; - } - - - /** - * Builder to initialize immutable {@link DMaaPMRPublisherConfig} object - */ - public static class Builder { - - private String hostName; - private Integer portNumber; - private String topicName; - private String userName; - private String userPassword; - private String protocol; - private String contentType; - private int maxBatchSize; - private int maxRecoveryQueueSize; - - public Builder(@Nonnull String hostName, @Nonnull String topicName) { - // required values - this.hostName = hostName; - this.topicName = topicName; - // Default values - this.portNumber = AnalyticsConstants.DEFAULT_PORT_NUMBER; - this.userName = AnalyticsConstants.DEFAULT_USER_NAME; - this.userPassword = AnalyticsConstants.DEFAULT_USER_PASSWORD; - this.protocol = AnalyticsConstants.DEFAULT_PROTOCOL; - this.contentType = AnalyticsConstants.DEFAULT_CONTENT_TYPE; - this.maxBatchSize = AnalyticsConstants.DEFAULT_PUBLISHER_MAX_BATCH_SIZE; - this.maxRecoveryQueueSize = AnalyticsConstants.DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE; - } - - /** - * Setup for custom host port number - Defaults to 80. - * - * @param portNumber custom port number - * @return Builder object itself for chaining - */ - public Builder setPortNumber(@Nonnull Integer portNumber) { - this.portNumber = portNumber; - return this; - } - - - /** - * Setup user name for authentication. If no username is provided authentication will be disabled - * - * @param userName user name for DMaaP Topic Authentication - * @return Builder object itself for chaining - */ - public Builder setUserName(@Nonnull String userName) { - this.userName = userName; - return this; - } - - - /** - * Setup user password for authentication. If no password is provided authentication will be disabled - * - * @param userPassword user password for DMaaP Topic Authentication - * @return Builder object itself for chaining - */ - public Builder setUserPassword(@Nonnull String userPassword) { - this.userPassword = userPassword; - return this; - } - - - /** - * Setup custom Publisher protocol - Defaults to https. - * Note: Only http and https are currently supported. - * - * @param protocol protocol e.g. https - * @return Builder object itself for chaining - */ - public Builder setProtocol(@Nonnull String protocol) { - this.protocol = normalizeValidateProtocol(protocol); - return this; - } - - - /** - * Setup custom Publisher content-type - Defaults to application/json - * - * @param contentType content type e.g. application/json - * @return Builder object itself for chaining - */ - public Builder setContentType(@Nonnull String contentType) { - final String normalizedContentType = normalizeValidateContentType(contentType); - this.contentType = normalizedContentType; - return this; - } - - - /** - * Setup custom Publisher Max Batch Size - Defaults to 100 - * - * @param maxBatchSize max Batch Size - * @return Builder object itself for chaining - */ - public Builder setMaxBatchSize(int maxBatchSize) { - this.maxBatchSize = maxBatchSize; - return this; - } - - - /** - * Setup custom Maximum Recovery Queue Size. Recovery Queue is used to hold messages temporarily in case - * DMaaP MR Publisher topic is not responding for any reason. Defaults to 100,000 - * - * @param maxRecoveryQueueSize max recovery queue size - * @return Builder object itself for chaining - */ - public Builder setMaxRecoveryQueueSize(int maxRecoveryQueueSize) { - this.maxRecoveryQueueSize = maxRecoveryQueueSize; - return this; - } - - /** - * Creates immutable instance of {@link DMaaPMRPublisherConfig} - * - * @return Builds and returns thread safe, immutable {@link DMaaPMRPublisherConfig} object - */ - public DMaaPMRPublisherConfig build() { - return new DMaaPMRPublisherConfig(hostName, portNumber, topicName, protocol, userName, userPassword, - contentType, maxBatchSize, maxRecoveryQueueSize); - } - - } - - - /** - * Returns max Publisher Batch Queue Size - * - * @return max Publisher Batch Queue size - */ - public int getMaxBatchSize() { - return maxBatchSize; - } - - /** - * Returns max Publisher Recovery Queue Size - * - * @return max Recovery Queue size - */ - public int getMaxRecoveryQueueSize() { - return maxRecoveryQueueSize; - } - - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - DMaaPMRPublisherConfig that = (DMaaPMRPublisherConfig) o; - return maxBatchSize == that.maxBatchSize && - maxRecoveryQueueSize == that.maxRecoveryQueueSize; - } - - @Override - public int hashCode() { - return Objects.hashCode(super.hashCode(), maxBatchSize, maxRecoveryQueueSize); - } - - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("baseConfig", super.toString()) - .add("maxBatchSize", maxBatchSize) - .add("maxRecoveryQueueSize", maxRecoveryQueueSize) - .toString(); - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java deleted file mode 100644 index 7252ce0..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfig.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.config; - -import com.google.common.base.Objects; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; - -import java.util.UUID; - -import javax.annotation.Nonnull; - -/** - *

- * Immutable DMaaP MR Configuration for Subscriber. - *

- * Use {@link DMaaPMRSubscriberConfig.Builder} to construct Subscriber Configuration - *

- * - * @author Rajiv Singla . Creation Date: 10/12/2016. - */ -public final class DMaaPMRSubscriberConfig extends DMaaPMRBaseConfig { - - private final String consumerId; - private final String consumerGroup; - private final Integer timeoutMS; - private final Integer messageLimit; - - private DMaaPMRSubscriberConfig(@Nonnull String hostName, - @Nonnull Integer portNumber, - @Nonnull String topicName, - @Nonnull String protocol, - String userName, - String userPassword, - @Nonnull String contentType, - @Nonnull String consumerId, - @Nonnull String consumerGroup, - @Nonnull Integer timeoutMS, - @Nonnull Integer messageLimit) { - this.hostName = hostName; - this.portNumber = portNumber; - this.topicName = topicName; - this.protocol = protocol; - this.userName = userName; - this.userPassword = userPassword; - this.contentType = contentType; - this.consumerId = consumerId; - this.consumerGroup = consumerGroup; - this.timeoutMS = timeoutMS; - this.messageLimit = messageLimit; - } - - /** - * Builder to initialize immutable {@link DMaaPMRSubscriberConfig} object - */ - public static class Builder { - - private String hostName; - private Integer portNumber; - private String topicName; - private String userName; - private String userPassword; - private String protocol; - private String contentType; - private String consumerId; - private String consumerGroup; - private Integer timeoutMS; - private Integer messageLimit; - - public Builder(@Nonnull String hostName, - @Nonnull String topicName) { - // Required Values - this.hostName = hostName; - this.topicName = topicName; - - // Default values - this.portNumber = AnalyticsConstants.DEFAULT_PORT_NUMBER; - this.userName = AnalyticsConstants.DEFAULT_USER_NAME; - this.userPassword = AnalyticsConstants.DEFAULT_USER_PASSWORD; - this.protocol = AnalyticsConstants.DEFAULT_PROTOCOL; - this.contentType = AnalyticsConstants.DEFAULT_CONTENT_TYPE; - this.consumerId = UUID.randomUUID().toString(); // consumer is assigned a random id by default - this.consumerGroup = AnalyticsConstants.DEFAULT_SUBSCRIBER_GROUP_PREFIX + consumerId; // random group - this.timeoutMS = AnalyticsConstants.DEFAULT_SUBSCRIBER_TIMEOUT_MS; // defaults to 10ms timeout - this.messageLimit = AnalyticsConstants.DEFAULT_SUBSCRIBER_MESSAGE_LIMIT; // defaults to 1000 message limit - } - - - /** - * Setup for custom host port number - Defaults to 80. - * - * @param portNumber custom port number - * @return Builder object itself for chaining - */ - public Builder setPortNumber(@Nonnull Integer portNumber) { - this.portNumber = portNumber; - return this; - } - - - /** - * Setup user name for authentication. If no username is provided authentication will be disabled - * - * @param userName user name for DMaaP Topic Authentication - * @return Builder object itself for chaining - */ - public Builder setUserName(@Nonnull String userName) { - this.userName = userName; - return this; - } - - - /** - * Setup user password for authentication. If no password is provided authentication will be disabled - * - * @param userPassword user password for DMaaP Topic Authentication - * @return Builder object itself for chaining - */ - public Builder setUserPassword(@Nonnull String userPassword) { - this.userPassword = userPassword; - return this; - } - - - /** - * Setup custom Subscriber protocol - Defaults to https. - * Note: Only http and https are currently supported. - * - * @param protocol protocol e.g. https or http - * @return Builder object itself for chaining - */ - public Builder setProtocol(@Nonnull String protocol) { - - this.protocol = normalizeValidateProtocol(protocol); - return this; - } - - /** - * Setup custom Subscriber content-type - Defaults to application/json - * - * @param contentType content type e.g. application/json - * @return Builder object itself for chaining - */ - public Builder setContentType(@Nonnull String contentType) { - final String normalizedContentType = normalizeValidateContentType(contentType); - this.contentType = normalizedContentType; - return this; - } - - - /** - * Setup custom Consumer Id - Defaults to random Id - * - * @param consumerId - custom consumer ID - * @return Builder object itself for chaining - */ - public Builder setConsumerId(@Nonnull String consumerId) { - this.consumerId = consumerId; - return this; - } - - /** - * Setup custom Consumer Group - Default to OpenDCAE-DMaaPSub-ConsumerID - * - * @param consumerGroup - custom Consumer Group - * @return Builder object itself for chaining - */ - public Builder setConsumerGroup(@Nonnull String consumerGroup) { - this.consumerGroup = consumerGroup; - return this; - } - - /** - * Setup Custom Subscriber timeout in ms - Default to no timeout limit - * - * @param timeoutMS timeout in milliseconds - * @return Builder object itself for chaining - */ - public Builder setTimeoutMS(@Nonnull Integer timeoutMS) { - this.timeoutMS = timeoutMS; - return this; - } - - /** - * Setup custom Subscriber Message Limit - Default to no limit - * - * @param messageLimit message Limit - * @return Builder object itself for chaining - */ - public Builder setMessageLimit(@Nonnull Integer messageLimit) { - this.messageLimit = messageLimit; - return this; - } - - /** - * Builds Immutable instance of {@link DMaaPMRSubscriberConfig} - * - * @return immutable DMaaP Subscriber Config Object - */ - public DMaaPMRSubscriberConfig build() { - return new DMaaPMRSubscriberConfig(hostName, portNumber, topicName, protocol, userName, userPassword, - contentType, consumerId, consumerGroup, timeoutMS, messageLimit); - } - - } - - - /** - * DMaaP MR Subscriber Consumer Id - * - * @return consumer Id - */ - public String getConsumerId() { - return consumerId; - } - - /** - * DMaaP MR Subscriber Consumer Group - * - * @return consumer group - */ - public String getConsumerGroup() { - return consumerGroup; - } - - /** - * DMaaP MR Subscriber Timeout in ms - * - * @return subscriber timeout ms - */ - public Integer getTimeoutMS() { - return timeoutMS; - } - - /** - * DMaaP MR Subscriber message limit - * - * @return subscriber message limit - */ - public Integer getMessageLimit() { - return messageLimit; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - DMaaPMRSubscriberConfig that = (DMaaPMRSubscriberConfig) o; - return Objects.equal(consumerId, that.consumerId) && - Objects.equal(consumerGroup, that.consumerGroup) && - Objects.equal(timeoutMS, that.timeoutMS) && - Objects.equal(messageLimit, that.messageLimit); - } - - @Override - public int hashCode() { - return Objects.hashCode(super.hashCode(), consumerId, consumerGroup, timeoutMS, messageLimit); - } - - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("baseConfig", super.toString()) - .add("consumerId", consumerId) - .add("consumerGroup", consumerGroup) - .add("timeoutMS", timeoutMS) - .add("messageLimit", messageLimit) - .toString(); - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java deleted file mode 100644 index 845f6df..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.response; - -/** - *

- * Contract for all DMaaPMR Publisher Response - *

- * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public interface DMaaPMRPublisherResponse extends DMaaPMRResponse { - - - /** - * Gets number of pending messages - * - * @return pending messages in the batch queue - */ - int getPendingMessagesCount(); -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java deleted file mode 100644 index 92996b4..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRPublisherResponseImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.response; - -import com.google.common.base.Objects; - -import javax.annotation.Nonnull; - -/** - *

- * An simple implementation of {@link DMaaPMRPublisherResponse} - *

- * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public class DMaaPMRPublisherResponseImpl implements DMaaPMRPublisherResponse { - - private final Integer responseCode; - private final String responseMessage; - private final int pendingMessagesCount; - - public DMaaPMRPublisherResponseImpl(@Nonnull Integer responseCode, - @Nonnull String responseMessage, - int pendingMessagesCount) { - this.responseCode = responseCode; - this.responseMessage = responseMessage; - this.pendingMessagesCount = pendingMessagesCount; - } - - @Override - public Integer getResponseCode() { - return responseCode; - } - - @Override - public String getResponseMessage() { - return responseMessage; - } - - @Override - public int getPendingMessagesCount() { - return pendingMessagesCount; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("responseCode", responseCode) - .add("responseMessage", responseMessage) - .add("pendingMessagesCount", pendingMessagesCount) - .toString(); - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java deleted file mode 100644 index 661a7e5..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRResponse.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.response; - -/** - *

- * Contract for DMaaP MR Responses - *

- * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public interface DMaaPMRResponse { - - /** - * Gets HTTP Response Code - * - * @return HTTP Response code as String - */ - Integer getResponseCode(); - - /** - * Gets Response Message - * - * @return Response Message - */ - String getResponseMessage(); - - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java deleted file mode 100644 index 228e2d3..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponse.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.response; - -import java.util.List; - -/** - *

- * Contract for all DMaaP MR Subscriber Responses - *

- * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public interface DMaaPMRSubscriberResponse extends DMaaPMRResponse { - - /** - * Returns message fetched from DMaaP MR Topic - * - * @return collection of actual message retrieved from DMaaP MR Topic - */ - List getFetchedMessages(); - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java deleted file mode 100644 index 08f0dab..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/domain/response/DMaaPMRSubscriberResponseImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.response; - -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableList; - -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import static java.util.Collections.unmodifiableList; - -/** - *

- * A simple implementation for {@link DMaaPMRSubscriberResponse} - *

- * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public class DMaaPMRSubscriberResponseImpl implements DMaaPMRSubscriberResponse { - - private final Integer responseCode; - private final String responseMessage; - private final List fetchedMessages; - - public DMaaPMRSubscriberResponseImpl(@Nonnull Integer responseCode, - @Nonnull String responseMessage, - @Nullable List fetchedMessages) { - this.responseCode = responseCode; - this.responseMessage = responseMessage; - this.fetchedMessages = fetchedMessages != null ? fetchedMessages : ImmutableList.of(); - } - - public DMaaPMRSubscriberResponseImpl(Integer responseCode, String responseMessage) { - this(responseCode, responseMessage, null); - } - - @Override - public Integer getResponseCode() { - return responseCode; - } - - @Override - public String getResponseMessage() { - return responseMessage; - } - - @Override - public List getFetchedMessages() { - return unmodifiableList(fetchedMessages); - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("responseCode", responseCode) - .add("responseMessage", responseMessage) - .add("fetchedMessages(size)", fetchedMessages.size()) - .toString(); - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java deleted file mode 100644 index e85b377..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPModule.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.module; - -import com.google.inject.AbstractModule; -import com.google.inject.assistedinject.FactoryModuleBuilder; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherImpl; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueImpl; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberImpl; - -/** - * Guice Module to wire concrete implementations with interfaces - *

- * @author Rajiv Singla . Creation Date: 10/20/2016. - */ -public class AnalyticsDMaaPModule extends AbstractModule { - - - @Override - protected void configure() { - - // Bind Http Client - bind(CloseableHttpClient.class).toInstance(HttpClients.createDefault()); - - // Bind Publishing queue - install(new FactoryModuleBuilder().implement(DMaaPMRPublisherQueue.class, DMaaPMRPublisherQueueImpl.class) - .build(DMaaPMRPublisherQueueFactory.class)); - - install(new FactoryModuleBuilder().implement(DMaaPMRPublisher.class, DMaaPMRPublisherImpl.class) - .build(DMaaPMRPublisherFactory.class)); - - install(new FactoryModuleBuilder().implement(DMaaPMRSubscriber.class, DMaaPMRSubscriberImpl.class) - .build(DMaaPMRSubscriberFactory.class)); - - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java deleted file mode 100644 index 22f25d1..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponent.java +++ /dev/null @@ -1,378 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Optional; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.util.EntityUtils; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponseImpl; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponseImpl; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.charset.Charset; -import java.util.LinkedList; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import static java.lang.String.format; - -/** - * Base class for DMaaP MR Publishers and Subscriber Implementations containing various utility methods - * - * @author Rajiv Singla . Creation Date: 11/1/2016. - */ -public abstract class BaseDMaaPMRComponent implements DMaaPMRComponent { - - private static final Logger LOG = LoggerFactory.getLogger(BaseDMaaPMRComponent.class); - - private static final ObjectMapper objectMapper = new ObjectMapper(); - - /** - * Creates Base64 encoded Auth Header for given userName and Password - * If either user name of password are null return absent - * - * @param userName username - * @param userPassword user password - * @return base64 encoded auth header if username or password are both non null - */ - protected static Optional getAuthHeader(@Nullable final String userName, - @Nullable final String userPassword) { - if (userName == null || userPassword == null) { - return Optional.absent(); - } else { - final String auth = userName + ":" + userPassword; - final Charset isoCharset = Charset.forName("ISO-8859-1"); - byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(isoCharset)); - return Optional.of("Basic " + new String(encodedAuth, isoCharset)); - } - } - - - /** - * Creates Publisher URI for given {@link DMaaPMRPublisherConfig} - * - * @param publisherConfig publisher settings - * - * @return DMaaP MR Publisher Topic URI that can be used to post messages to MR Topic - */ - protected static URI createPublisherURI(final DMaaPMRPublisherConfig publisherConfig) { - final String hostName = publisherConfig.getHostName(); - final Integer portNumber = publisherConfig.getPortNumber(); - final String getProtocol = publisherConfig.getProtocol(); - final String topicName = publisherConfig.getTopicName(); - URI publisherURI = null; - try { - publisherURI = new URIBuilder().setScheme(getProtocol).setHost(hostName).setPort(portNumber) - .setPath(AnalyticsConstants.DMAAP_URI_PATH_PREFIX + topicName).build(); - } catch (URISyntaxException e) { - final String errorMessage = format("Error while creating publisher URI: %s", e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - LOG.info("Created DMaaP MR Publisher URI: {}", publisherURI); - return publisherURI; - } - - - /** - * Creates Subscriber URI for given {@link DMaaPMRSubscriberConfig} - * - * @param subscriberConfig subscriber settings - * - * @return DMaaP MR Subscriber Topic URI that can be used to fetch messages from MR topic - */ - protected static URI createSubscriberURI(final DMaaPMRSubscriberConfig subscriberConfig) { - final String hostName = subscriberConfig.getHostName(); - final Integer portNumber = subscriberConfig.getPortNumber(); - final String getProtocol = subscriberConfig.getProtocol(); - final String topicName = subscriberConfig.getTopicName(); - final String consumerId = subscriberConfig.getConsumerId(); - final String consumerGroup = subscriberConfig.getConsumerGroup(); - final Integer timeoutMS = subscriberConfig.getTimeoutMS(); - final Integer messageLimit = subscriberConfig.getMessageLimit(); - URI subscriberURI = null; - try { - URIBuilder uriBuilder = new URIBuilder().setScheme(getProtocol).setHost(hostName).setPort(portNumber) - .setPath(AnalyticsConstants.DMAAP_URI_PATH_PREFIX - + topicName + "/" - + consumerGroup + "/" + - consumerId); - // add query params if present - if (timeoutMS > 0) { - uriBuilder.addParameter(AnalyticsConstants.SUBSCRIBER_TIMEOUT_QUERY_PARAM_NAME, timeoutMS.toString()); - } - if (messageLimit > 0) { - uriBuilder.addParameter(AnalyticsConstants.SUBSCRIBER_MSG_LIMIT_QUERY_PARAM_NAME, - messageLimit.toString()); - } - subscriberURI = uriBuilder.build(); - - } catch (URISyntaxException e) { - final String errorMessage = format("Error while creating subscriber URI: %s", e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - LOG.info("Created DMaaP MR Subscriber URI: {}", subscriberURI); - return subscriberURI; - } - - - /** - * Creates 202 (Accepted) Response code message - * - * @param batchQueueSize batch Queue size - * - * @return response with 202 message code - */ - protected static DMaaPMRPublisherResponse createPublisherAcceptedResponse(int batchQueueSize) { - return createPublisherResponse(HTTPUtils.HTTP_ACCEPTED_RESPONSE_CODE, - "Accepted - Messages queued for batch publishing to MR Topic", batchQueueSize); - } - - - /** - * Creates 204 (No Content) Response code message - * - * @return response with 204 message code - */ - protected static DMaaPMRPublisherResponse createPublisherNoContentResponse() { - return createPublisherResponse(HTTPUtils.HTTP_NO_CONTENT_RESPONSE_CODE, - "No Content - No Messages in batch queue for flushing to MR Topic", 0); - } - - - /** - * Creates Publisher Response for given response code, response Message and pending Message Count - * - * @param responseCode HTTP Status Code - * @param responseMessage response message - * @param pendingMessages pending messages in batch queue - * - * @return DMaaP MR Publisher Response - */ - protected static DMaaPMRPublisherResponse createPublisherResponse(int responseCode, String - responseMessage, int pendingMessages) { - return new DMaaPMRPublisherResponseImpl(responseCode, responseMessage, pendingMessages); - } - - - /** - * Returns weekly consistent pending messages in batch queue - * - * @param publisherQueue batch queue - * @param publisherConfig publisher settings - * - * @return pending messages to be published - */ - protected static int getPendingMessages(@Nonnull final DMaaPMRPublisherQueue publisherQueue, - @Nonnull final DMaaPMRPublisherConfig publisherConfig) { - return publisherConfig.getMaxBatchSize() - publisherQueue.getBatchQueueRemainingSize(); - } - - - /** - * Creates Subscriber Response for give response Code, response Message and fetch messages - * - * @param responseCode response Code - * @param responseMessage response Message - * @param fetchedMessages fetched messages - * - * @return DMaaP MR Subscriber Response - */ - protected static DMaaPMRSubscriberResponse createSubscriberResponse(int responseCode, String - responseMessage, List fetchedMessages) { - if (fetchedMessages == null) { - return new DMaaPMRSubscriberResponseImpl(responseCode, responseMessage); - } else { - return new DMaaPMRSubscriberResponseImpl(responseCode, responseMessage, fetchedMessages); - } - } - - - /** - * Custom response handler which extract status code and response body - * - * @return Pair containing Response code and response body - */ - protected static ResponseHandler> responseHandler() { - return new ResponseHandler>() { - @Override - public Pair handleResponse(HttpResponse response) throws IOException { - // Get Response status code - final int status = response.getStatusLine().getStatusCode(); - final HttpEntity responseEntity = response.getEntity(); - // If response entity is not null - extract response body as string - String responseEntityString = ""; - if (responseEntity != null) { - responseEntityString = EntityUtils.toString(responseEntity); - } - return new ImmutablePair<>(status, responseEntityString); - } - }; - } - - - /** - * Adds message to Publisher recovery queue. If recovery queue is full throws an error as messages will - * be lost - * - * @param publisherQueue publisher queue - * @param messages recoverable messages to be published to recovery queue - */ - protected static void addMessagesToRecoveryQueue(DMaaPMRPublisherQueue publisherQueue, - List messages) { - try { - publisherQueue.addRecoverableMessages(messages); - - LOG.debug("Messages Added to Recovery Queue. Messages Size: {}, Recovery Queue Remaining Size: {}", - messages.size(), publisherQueue.getBatchQueueRemainingSize()); - - } catch (IllegalStateException e) { - final String errorMessage = format("Unable to put messages in recovery queue. Messages will be lost. " + - "Recovery Queue might be full. Message Size: %d, Recovery Queue Remaining Capacity: %d", - messages.size(), publisherQueue.getRecoveryQueueRemainingSize()); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - - - /** - * Converts List of messages to Json String Array which can be published to DMaaP MR topic. - * - * @param messages messages that need to parsed to Json Array representation - * @return json string representation of message - */ - protected static String convertToJsonString(@Nullable final List messages) { - // If messages are null or empty just return empty array - if (messages == null || messages.isEmpty()) { - return "[]"; - } - - - List jsonMessageObjectsList = new LinkedList<>(); - - try { - for (String message : messages) { - final JsonNode jsonNode = objectMapper.readTree(message); - jsonMessageObjectsList.add(jsonNode); - } - return objectMapper.writeValueAsString(jsonMessageObjectsList); - } catch (JsonProcessingException e) { - final String errorMessage = - format("Unable to convert publisher messages to Json. Messages: %s, Json Error: %s", - messages, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - - } catch (IOException e) { - final String errorMessage = - format("IO Exception while converting publisher messages to Json. Messages: %s, Json Error: %s", - messages, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - } - - - /** - * Converts subscriber messages json string to List of messages. If message Json String is empty - * or null - * - * @param messagesJsonString json messages String - * - * @return List containing DMaaP MR Messages - */ - protected static List convertJsonToStringMessages(@Nullable final String messagesJsonString) { - - final LinkedList messages = new LinkedList<>(); - - // If message string is not null or not empty parse json message array to List of string messages - if (messagesJsonString != null && !messagesJsonString.trim().isEmpty() - && !("[]").equals(messagesJsonString.trim())) { - - try { - // get root node - final JsonNode rootNode = objectMapper.readTree(messagesJsonString); - // iterate over root node and parse arrays messages - for (JsonNode jsonNode : rootNode) { - // if array parse it is array of messages - final String incomingMessageString = jsonNode.toString(); - if (jsonNode.isArray()) { - final List messageList = objectMapper.readValue(incomingMessageString, List.class); - for (Object message : messageList) { - final String jsonMessageString = objectMapper.writeValueAsString(message); - addUnescapedJsonToMessage(messages, jsonMessageString); - } - } else { - // parse it as object - addUnescapedJsonToMessage(messages, incomingMessageString); - } - } - - } catch (IOException e) { - final String errorMessage = - format("Unable to convert subscriber Json String to Messages. Subscriber Response String: %s," + - " Json Error: %s", messagesJsonString, e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - } - return messages; - } - - /** - * Adds unescaped Json messages to given messages list - * - * @param messages message list in which unescaped messages will be added - * @param incomingMessageString incoming message string that may need to be escaped - */ - private static void addUnescapedJsonToMessage(List messages, String incomingMessageString) { - if (incomingMessageString.startsWith("\"") && incomingMessageString.endsWith("\"")) { - messages.add(StringEscapeUtils.unescapeJson( - incomingMessageString.substring(1, incomingMessageString.length() - 1))); - } else { - messages.add(StringEscapeUtils.unescapeJson(incomingMessageString)); - } - } - - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java deleted file mode 100644 index 5c0df09..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/DMaaPMRComponent.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service; - -/** - * Marker interface for all DMaaP MR Components e.g. MR Publishers, MR Subscribers - * - * @author Rajiv Singla . Creation Date: 11/1/2016. - */ -public interface DMaaPMRComponent { -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java deleted file mode 100644 index 48b0a70..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisher.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; - -import java.util.Date; -import java.util.List; - -/** - *

- * DMaaP MR Publisher can be used to publish messages to DMaaP MR Topics. - *

- * - * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public interface DMaaPMRPublisher extends AutoCloseable { - - - /** - *

- * Adds collection of messages to DMaaP MR Topic Publishing Queue. - *

- * Note: Invoking this method may or may not cause publishing immediately - * as publishing in done is batch mode by default. Parameter maxBatchSize - * in {@link DMaaPMRPublisherConfig} is used to determine max batch queue size. - * If the maxBatchSize is reached all message will be published automatically - * during subsequent call. - *

- * - * @param messages messages to publish to DMaaP MR Publisher - * @return response which may contain Http Response code 202 (Accepted) as publishing - * will proceed when max batch size is reached. Throws {@link DCAEAnalyticsRuntimeException} - * if publishing fails - */ - DMaaPMRPublisherResponse publish(List messages); - - - /** - *

- * Forces publishing of messages to DMaaP MR Topic and returns {@link DMaaPMRPublisherResponse} - * which can be inspected for HTTP status code of publishing call to DMaaP MR Topic. - *

- * - * @param messages messages to publish to DMaaP MR Publisher - * @return DMaaP Message Router Publisher Response. Throws {@link DCAEAnalyticsRuntimeException} - * if force publishing fails - * - */ - DMaaPMRPublisherResponse forcePublish(List messages); - - - /** - *

- * Forces publishing of messages in Publisher queue to DMaaP MR Topic and returns - * {@link DMaaPMRPublisherResponse}.If there are no messages were in the queue to - * be flushed response code 304 (Not Modified) will be returned - *

- * - * @return DMaaP Message Router Publisher Response - */ - DMaaPMRPublisherResponse flush(); - - - /** - *

- * Returns the creation time when Publisher instance was created. - *

- * - * @return creation time of Subscriber instance - */ - Date getPublisherCreationTime(); - - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java deleted file mode 100644 index 5d6dfa1..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; - -/** - *

- * Factory to initialize instance of {@link DMaaPMRPublisher} for Guice DI injection purposes. - *

- * - * NOTE: Client should not use this Factory to initialize {@link DMaaPMRPublisher} unless they - * are wiring dependencies using Guice. Client must use {@link DMaaPMRFactory} to initialize - * guice injected Publisher instances - * - *

- * @author Rajiv Singla . Creation Date: 10/20/2016. - */ -public interface DMaaPMRPublisherFactory { - - /** - * Guice Factory to create DMaaP MR Publisher - * - * @param publisherConfig publisher config - * - * @return DMaaP MR Publisher instance - */ - DMaaPMRPublisher create(DMaaPMRPublisherConfig publisherConfig); - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java deleted file mode 100644 index 32e09fa..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImpl.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import com.google.common.base.Optional; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.inject.Inject; -import com.google.inject.assistedinject.Assisted; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.http.HttpHeaders; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.BaseDMaaPMRComponent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.URI; -import java.util.Date; -import java.util.List; - -import static org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils.isSuccessfulResponseCode; -import static java.lang.String.format; - -/** - * Concrete Implementation of {@link DMaaPMRPublisher} which uses {@link HttpClient} - * - * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public class DMaaPMRPublisherImpl extends BaseDMaaPMRComponent implements DMaaPMRPublisher { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRPublisherImpl.class); - - private final DMaaPMRPublisherConfig publisherConfig; - private final CloseableHttpClient closeableHttpClient; - private final DMaaPMRPublisherQueue publisherQueue; - private final Date publisherCreationTime; - private URI publisherUri; - - @Inject - public DMaaPMRPublisherImpl(@Assisted DMaaPMRPublisherConfig publisherConfig, - DMaaPMRPublisherQueueFactory dMaaPMRPublisherQueueFactory, - CloseableHttpClient closeableHttpClient) { - - this.publisherConfig = publisherConfig; - final int maxBatchSize = publisherConfig.getMaxBatchSize() > 0 ? publisherConfig.getMaxBatchSize() : 1; - this.publisherQueue = dMaaPMRPublisherQueueFactory.create( - maxBatchSize, publisherConfig.getMaxRecoveryQueueSize()); - this.closeableHttpClient = closeableHttpClient; - this.publisherUri = createPublisherURI(publisherConfig); - this.publisherCreationTime = new Date(); - } - - - @Override - public DMaaPMRPublisherResponse publish(List messages) { - - final int batchQueueRemainingSize = publisherQueue.getBatchQueueRemainingSize(); - - // if messages size is less than batch queue size - just queue them for batch publishing - if (batchQueueRemainingSize > messages.size()) { - LOG.debug("Adding messages to batch Queue. No flushing required. Messages Size:{}. Batch Queue Size:{}", - messages.size(), batchQueueRemainingSize); - final int batchQueueSize = publisherQueue.addBatchMessages(messages); - return createPublisherAcceptedResponse(batchQueueSize); - - } else { - - // grab all already queued messages, append current messages and force publish them to DMaaP MR topic - final List queueMessages = publisherQueue.getMessageForPublishing(); - LOG.debug("Batch Queue capacity exceeds messages size. Flushing of all pending messages to DMaaP MR " + - "Publisher Topic."); - return forcePublish(Lists.newLinkedList(Iterables.concat(queueMessages, messages))); - } - - } - - @Override - public DMaaPMRPublisherResponse forcePublish(List messages) { - - LOG.debug("Force publishing messages to DMaaP MR Topic. Messages Size: {}", messages.size()); - - final String contentType = publisherConfig.getContentType(); - final String userName = publisherConfig.getUserName(); - final String userPassword = publisherConfig.getUserPassword(); - final HttpPost postRequest = new HttpPost(publisherUri); - - // add Authorization Header if username and password are present - final Optional authHeader = getAuthHeader(userName, userPassword); - if (authHeader.isPresent()) { - postRequest.addHeader(HttpHeaders.AUTHORIZATION, authHeader.get()); - } else { - LOG.debug("DMaaP MR Publisher Authentication is disabled as username or password is not present."); - } - - // Create post string entity - final String messagesJson = convertToJsonString(messages); - final StringEntity requestEntity = - new StringEntity(messagesJson, ContentType.create(contentType, "UTF-8")); - postRequest.setEntity(requestEntity); - - try { - final Pair responsePair = closeableHttpClient.execute(postRequest, responseHandler()); - final Integer responseCode = responsePair.getLeft(); - final String responseBody = responsePair.getRight(); - // if messages were published successfully, return successful response - if (isSuccessfulResponseCode(responseCode)) { - LOG.debug("DMaaP MR Messages published successfully. DMaaP Response Code: {}. DMaaP Response " + - "Body: {}, Number of Messages published: {}", - responseCode, responseBody, messages.size()); - - } else { - LOG.warn("Unable to publish messages to DMaaP MR Topic. DMaaP Response Code: {}, DMaaP Response " + - "Body: {}. Messages will be queued in recovery queue", responseCode, responseBody); - addMessagesToRecoveryQueue(publisherQueue, messages); - } - - return createPublisherResponse(responseCode, responseBody, - getPendingMessages(publisherQueue, publisherConfig)); - - } catch (IOException e) { - // If IO Error then we need to also put messages in recovery queue - addMessagesToRecoveryQueue(publisherQueue, messages); - final String errorMessage = format("IO Exception while publishing messages to DMaaP Topic. " + - "Messages will be queued in recovery queue. Messages Size: %d", messages.size()); - - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - } - - - @Override - public DMaaPMRPublisherResponse flush() { - final List queueMessages = publisherQueue.getMessageForPublishing(); - // If there are no message return 204 (No Content) response code - if (queueMessages.isEmpty()) { - LOG.debug("No messages to publish to batch queue. Returning 204 status code"); - return createPublisherNoContentResponse(); - } else { - // force publish messages in queue - return forcePublish(queueMessages); - } - } - - @Override - public Date getPublisherCreationTime() { - return new Date(publisherCreationTime.getTime()); - } - - @Override - public void close() throws Exception { - - // flush current message in the queue - int retrialNumber = 0; - int flushResponseCode; - - // automatic retries if messages cannot be flushed - do { - retrialNumber++; - DMaaPMRPublisherResponse flushResponse = flush(); - flushResponseCode = flushResponse.getResponseCode(); - - if (!isSuccessfulResponseCode(flushResponseCode)) { - LOG.warn("Unable to flush batch messages to publisher due to DMaaP MR invalid Response: {}. " + - "Retrial No: {} of Max {} Retries", flushResponseCode, retrialNumber, - AnalyticsConstants.PUBLISHER_MAX_FLUSH_RETRIES_ON_CLOSE); - - Thread.sleep(AnalyticsConstants.PUBLISHER_DELAY_MS_ON_RETRIES_ON_CLOSE); - } - } while (retrialNumber <= AnalyticsConstants.PUBLISHER_MAX_FLUSH_RETRIES_ON_CLOSE && - !isSuccessfulResponseCode(flushResponseCode)); - - if (!isSuccessfulResponseCode(flushResponseCode)) { - LOG.error("Unable to flush batch messages to publisher. Messages loss cannot be prevented"); - } else { - LOG.info("Successfully published all batched messages to publisher."); - } - - // close http client - closeableHttpClient.close(); - - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java deleted file mode 100644 index 3877f0b..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueue.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import java.util.List; - -/** - *

- * DMaaP MR Publisher Queue handles back pressure in case DMaaP MR Publisher topic - * is offline for some reason. It does so by having a recovery queue which keeps - * messages in order in case there is temporary interruption in DMaaP Publisher - *

- * - * @author Rajiv Singla . Creation Date: 11/1/2016. - */ -public interface DMaaPMRPublisherQueue { - - /** - *

- * Add batchMessages to Batch Queue - *

- * - * @param batchMessages messages that needs to be added to batch queue - * @return current size of batch queue. Throws {@link IllegalStateException} - * if batch queue does not have enough space - */ - int addBatchMessages(List batchMessages); - - - /** - *

- * Add recoverable messages to Recoverable Queue - *

- * - * @param recoverableMessages messages that needs to be added to recoverable queue - * @return current size of the recoverable queue. Throws {@link IllegalStateException} - * if recoverable queue does not have enough space - */ - int addRecoverableMessages(List recoverableMessages); - - /** - *

- * Get messages that need to be published to DMaaP topic. Messages in recoverable - * queue are appended if present. - *

- * - * @return List of messages from both batch and recovery queue - */ - List getMessageForPublishing(); - - /** - *

- * Remaining capacity of Batch Queue - *

- * - * @return Remaining Batch Queue Size - */ - int getBatchQueueRemainingSize(); - - /** - *

- * Remaining capacity of Recovery Queue - *

- * - * @return Remaining Recovery Queue Size - */ - int getRecoveryQueueRemainingSize(); - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java deleted file mode 100644 index 8d44f93..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import com.google.inject.assistedinject.Assisted; - -/** - *

- * Factory to initialize instance of {@link DMaaPMRPublisherQueue} for Guice DI injection purposes. - *

- * - * @author Rajiv Singla . Creation Date: 11/1/2016. - */ -public interface DMaaPMRPublisherQueueFactory { - - /** - * Guice Factory to create DMaaP MR Publisher Queue - * - * @param batchQueueSize batch queue size - * @param recoveryQueueSize recovery queue size - * - * @return instance of DMaaP MR Publisher Queue - */ - DMaaPMRPublisherQueue create(@Assisted("batchQueueSize") int batchQueueSize, - @Assisted("recoveryQueueSize") int recoveryQueueSize); - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java deleted file mode 100644 index e42b6b0..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import com.google.inject.Inject; -import com.google.inject.assistedinject.Assisted; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.LinkedBlockingDeque; - -import static com.google.common.collect.Iterables.concat; -import static com.google.common.collect.Lists.newLinkedList; -import static java.util.Collections.unmodifiableList; - -/** - *

- * An implementation of {@link DMaaPMRPublisherQueue} which uses {@link java.util.concurrent.BlockingDeque} - * for batch and recovery queues - *

- * - * - * @author Rajiv Singla . Creation Date: 11/1/2016. - */ -public class DMaaPMRPublisherQueueImpl implements DMaaPMRPublisherQueue { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRPublisherQueueImpl.class); - - private final LinkedBlockingDeque batchQueue; - private final LinkedBlockingDeque recoveryQueue; - - @Inject - public DMaaPMRPublisherQueueImpl(@Assisted("batchQueueSize") int batchQueueSize, - @Assisted("recoveryQueueSize") int recoveryQueueSize) { - batchQueue = new LinkedBlockingDeque<>(batchQueueSize); - recoveryQueue = new LinkedBlockingDeque<>(recoveryQueueSize); - LOG.debug("Creating Instance of DMaaP Publisher Queue. BatchQueueSize: {}, RecoveryQueueSize: {}", - batchQueueSize, recoveryQueueSize); - } - - @Override - public synchronized int addBatchMessages(List batchMessages) { - - // checks if batchMessages size does not exceed batch queue capacity - if (batchMessages.size() > batchQueue.remainingCapacity()) { - throw new IllegalStateException("Not enough capacity to add batchMessages in batch queue"); - } - - // Add batchMessages to batch queue - for (String message : batchMessages) { - batchQueue.add(message); - } - - // returns current elements size in batch queue - return batchQueue.size(); - } - - @Override - public synchronized int addRecoverableMessages(List recoverableMessages) { - - // checks if messages size does not exceed recovery queue size - if (recoverableMessages.size() > recoveryQueue.remainingCapacity()) { - throw new IllegalStateException("Not enough capacity to add messages in recovery queue"); - } - - // add messages to recovery queue - for (String recoverableMessage : recoverableMessages) { - recoveryQueue.add(recoverableMessage); - } - - // returns current size of recovery queue - return recoveryQueue.size(); - } - - @Override - public synchronized List getMessageForPublishing() { - - final List recoveryMessageList = new LinkedList<>(); - final List batchMessagesList = new LinkedList<>(); - - // get messages from recovery queue if present - if (!recoveryQueue.isEmpty()) { - final int recoveryQueueSize = recoveryQueue.drainTo(recoveryMessageList); - LOG.debug("Drained Recovery Queue elements for flushing: {}", recoveryQueueSize); - } - - // get messages from batch queue if present - if (!batchQueue.isEmpty()) { - final int batchQueueSize = batchQueue.drainTo(batchMessagesList); - LOG.debug("Drained Batch Queue elements for flushing: {}", batchQueueSize); - } - - // concat recovery and batch queue elements - return unmodifiableList(newLinkedList(concat(recoveryMessageList, batchMessagesList))); - } - - @Override - public synchronized int getBatchQueueRemainingSize() { - return batchQueue.remainingCapacity(); - } - - @Override - public synchronized int getRecoveryQueueRemainingSize() { - return recoveryQueue.remainingCapacity(); - } -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java deleted file mode 100644 index f193b2c..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriber.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.subscriber; - -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; - -import java.util.Date; - -/** - *

- * DMaaP MR Subscriber can be used to subscribe messages from DMaaP MR Topics. - *

- * - * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public interface DMaaPMRSubscriber extends AutoCloseable { - - /** - * Fetches Messages from DMaaP MR Topic. {@link DMaaPMRPublisherConfig} settings parameters - * for messageLimit and message timeout are used - * - * @return DMaaP Message Router Subscriber Response - */ - DMaaPMRSubscriberResponse fetchMessages(); - - - /** - * Returns the Subscriber instance creation time - *

- * NOTE: Due to DMaaP API Design - Subscribers can only fetch messages which - * are published to the topic after the creation of the Subscriber. - * - * @return creation time of Subscriber instance - */ - Date getSubscriberCreationTime(); - - -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java deleted file mode 100644 index b7f5ada..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.subscriber; - -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; - -/** - * Factory to initialize instance of {@link DMaaPMRSubscriber} for Guice DI injection purposes. - *

- * - * NOTE: Client should not use this Factory to initialize {@link DMaaPMRSubscriber} unless they - * are wiring dependencies using Guice. Client must use {@link DMaaPMRFactory} to initialize - * guice injected Subscriber instances - * - *

- * @author Rajiv Singla . Creation Date: 10/20/2016. - */ -public interface DMaaPMRSubscriberFactory { - - /** - * Guice Factory to create DMaaP MR Subscriber Instance - * - * @param subscriberConfig subscriber config - * - * @return DMaaP MR Subscriber instance - */ - DMaaPMRSubscriber create(DMaaPMRSubscriberConfig subscriberConfig); -} diff --git a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java b/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java deleted file mode 100644 index 678ff76..0000000 --- a/dcae-analytics-dmaap/src/main/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImpl.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.subscriber; - -import com.google.common.base.Optional; -import com.google.inject.Inject; -import com.google.inject.assistedinject.Assisted; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.http.HttpHeaders; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.BaseDMaaPMRComponent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.URI; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -import static org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils.isSuccessfulResponseCode; -import static java.lang.String.format; - -/** - * Concrete Implementation of {@link DMaaPMRSubscriber} which uses {@link HttpClient} - * - * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public class DMaaPMRSubscriberImpl extends BaseDMaaPMRComponent implements DMaaPMRSubscriber { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSubscriberImpl.class); - - private final DMaaPMRSubscriberConfig subscriberConfig; - private final CloseableHttpClient closeableHttpClient; - private final URI subscriberUri; - private final Date subscriberCreationTime; - - @Inject - public DMaaPMRSubscriberImpl(@Assisted DMaaPMRSubscriberConfig subscriberConfig, - CloseableHttpClient closeableHttpClient) { - this.subscriberConfig = subscriberConfig; - this.closeableHttpClient = closeableHttpClient; - this.subscriberUri = createSubscriberURI(subscriberConfig); - this.subscriberCreationTime = new Date(); - } - - @Override - public DMaaPMRSubscriberResponse fetchMessages() { - - final String userName = subscriberConfig.getUserName(); - final String userPassword = subscriberConfig.getUserPassword(); - - final HttpGet getRequest = new HttpGet(subscriberUri); - - // add Authorization Header if username and password are present - final Optional authHeader = getAuthHeader(userName, userPassword); - if (authHeader.isPresent()) { - getRequest.addHeader(HttpHeaders.AUTHORIZATION, authHeader.get()); - } else { - LOG.debug("DMaaP MR Subscriber Authentication is disabled as username or password is not present."); - } - - try { - - final Pair responsePair = closeableHttpClient.execute(getRequest, responseHandler()); - final Integer responseCode = responsePair.getLeft(); - final String responseBody = responsePair.getRight(); - - List fetchedMessages = new LinkedList<>(); - String responseMessage = responseBody; - - // if messages were published successfully, return successful response - if (isSuccessfulResponseCode(responseCode)) { - if (responseBody != null) { - fetchedMessages = convertJsonToStringMessages(responseBody); - responseMessage = "Messages Fetched Successfully"; - } else { - responseMessage = "DMaaP Response Body had no messages"; - } - } else { - LOG.error("Unable to fetch messages to DMaaP MR Topic. DMaaP MR unsuccessful Response Code: {}, " + - "DMaaP Response Body: {}", responseCode, responseBody); - } - - return createSubscriberResponse(responseCode, responseMessage, fetchedMessages); - - } catch (IOException e) { - - final String errorMessage = - format("IO Exception while fetching messages from DMaaP Topic. Exception %s", e); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - - } - - @Override - public Date getSubscriberCreationTime() { - return new Date(subscriberCreationTime.getTime()); - } - - @Override - public void close() throws Exception { - closeableHttpClient.close(); - } -} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java new file mode 100644 index 0000000..4cb7d85 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java @@ -0,0 +1,31 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap; + +import org.junit.runner.RunWith; +import org.onap.dcae.apod.analytics.test.runner.GuiceJUnitRunner; + +/** + * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +@RunWith(GuiceJUnitRunner.class) +public abstract class BaseAnalyticsDMaaPGuiceUnitTest extends BaseAnalyticsDMaaPUnitTest { +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java new file mode 100644 index 0000000..31714cc --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java @@ -0,0 +1,99 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap; + +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; + +import java.util.List; + +import static com.google.common.collect.ImmutableList.of; + +/** + * @author Rajiv Singla . Creation Date: 10/14/2016. + */ +public abstract class BaseAnalyticsDMaaPUnitTest extends BaseDCAEAnalyticsUnitTest { + + // Unit Test Settings + protected static final String HOST_NAME = "testHostName"; + protected static final Integer PORT_NUMBER = 8080; + protected static final String TOPIC_NAME = "testTopicName"; + protected static final String USERNAME = "testUserName"; + protected static final String PASSWORD = "testPassword"; + protected static final String HTTP_PROTOCOL = "https"; + protected static final String CONTENT_TYPE = "application/json"; + + protected static final int PUBLISHER_MAX_BATCH_QUEUE_SIZE = 200; + protected static final int PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 2000; + + protected static final String SUBSCRIBER_CONSUMER_ID = "123"; + protected static final String SUBSCRIBER_CONSUMER_GROUP_NAME = "testGonsumerName-" + SUBSCRIBER_CONSUMER_ID; + protected static final int SUBSCRIBER_TIMEOUT_MS = 2000; + protected static final int SUBSCRIBER_MESSAGE_LIMIT = 20; + + /** + * Creates Sample Publisher settings for unit testing purposes + * + * @return sample publisher settings for testing + */ + protected static DMaaPMRPublisherConfig getPublisherConfig() { + return new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setProtocol(HTTP_PROTOCOL) + .setUserName(USERNAME) + .setUserPassword(PASSWORD) + .setContentType(CONTENT_TYPE) + .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) + .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE).build(); + } + + /** + * Creates Sample Subscriber settings for unit testing purposes + * + * @return sample subscriber settings for testing + */ + protected static DMaaPMRSubscriberConfig getSubscriberConfig(String consumerId, String consumerGroup) { + return new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setUserName(USERNAME) + .setUserPassword(PASSWORD) + .setProtocol(HTTP_PROTOCOL) + .setContentType(CONTENT_TYPE) + .setConsumerGroup(consumerGroup != null ? consumerGroup : SUBSCRIBER_CONSUMER_GROUP_NAME) + .setConsumerId(consumerId != null ? consumerId : SUBSCRIBER_CONSUMER_ID) + .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) + .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT).build(); + } + + /** + * Creates two sample message for publishing + * + * @return sample publish message list + */ + protected static List getTwoSampleMessages() { + String message1 = "{ \"message\" : \"Test Message1\"}"; + String message2 = "{ \"message\" : \"Test Message2\"}"; + return of(message1, message2); + } + + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java new file mode 100644 index 0000000..2c296aa --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java @@ -0,0 +1,67 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap; + +import org.junit.Before; +import org.junit.Test; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.module.AnalyticsDMaaPTestModule; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.onap.dcae.apod.analytics.test.annotation.GuiceModules; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Manjesh Gowda. Creation Date: 11/7/2016. + */ +@GuiceModules(AnalyticsDMaaPTestModule.class) +public class DMaaPMRFactoryTest extends BaseAnalyticsDMaaPGuiceUnitTest { + + private DMaaPMRFactory dmaapMRFactory; + + @Before + public void setUp() throws Exception { + dmaapMRFactory = new DMaaPMRFactory(new AnalyticsDMaaPTestModule()); + } + + @Test + public void createPublisher() throws Exception { + DMaaPMRPublisher publisher = dmaapMRFactory.createPublisher(getPublisherConfig()); + DMaaPMRPublisherResponse response = publisher.publish(null); + assertThat(response.getResponseCode(), is(102)); + } + + @Test + public void createSubscriber() throws Exception { + DMaaPMRSubscriber dmaapMRSubscriber = dmaapMRFactory.createSubscriber(getSubscriberConfig("", "")); + DMaaPMRSubscriberResponse response = dmaapMRSubscriber.fetchMessages(); + assertThat(response.getResponseCode(), is(102)); + } + + @Test + public void create() throws Exception { + + } + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java new file mode 100644 index 0000000..dfdb427 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java @@ -0,0 +1,78 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.config; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; + +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 10/14/2016. + */ +public class DMaaPMRPublisherConfigTest extends BaseAnalyticsDMaaPUnitTest { + + + @Test + public void testPublisherConfigDefaults() throws Exception { + + final DMaaPMRPublisherConfig actualDefaultPublisherConfig = + new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME).build(); + + final DMaaPMRPublisherConfig expectedDefaultPublisherConfig = + new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(AnalyticsConstants.DEFAULT_PORT_NUMBER) + .setContentType(AnalyticsConstants.DEFAULT_CONTENT_TYPE) + .setProtocol(AnalyticsConstants.DEFAULT_PROTOCOL) + .setMaxBatchSize(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_BATCH_SIZE) + .setMaxRecoveryQueueSize(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) + .build(); + + assertTrue("Default Publisher Config parameters must match", + actualDefaultPublisherConfig.equals(expectedDefaultPublisherConfig)); + + } + + + @Test + public void testPublisherCustomConfig() throws Exception { + + + final DMaaPMRPublisherConfig actualCustomPublisherConfig = getPublisherConfig(); + + final DMaaPMRPublisherConfig expectedCustomPublisherConfig = + new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setUserName(USERNAME) + .setUserPassword(PASSWORD) + .setContentType(CONTENT_TYPE) + .setProtocol(HTTP_PROTOCOL) + .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE) + .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) + .build(); + + assertTrue("Custom Publisher Config parameters must match", + actualCustomPublisherConfig.equals(expectedCustomPublisherConfig)); + } + + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java new file mode 100644 index 0000000..20e7e16 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java @@ -0,0 +1,84 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.domain.config; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.common.AnalyticsConstants; +import org.onap.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; + +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 10/14/2016. + */ +public class DMaaPMRSubscriberConfigTest extends BaseAnalyticsDMaaPUnitTest { + + @Test + public void testSubscriberConfigDefaults() throws Exception { + + DMaaPMRSubscriberConfig actualDefaultSubscriberConfig = + new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) + .setConsumerGroup(AnalyticsConstants.DEFAULT_SUBSCRIBER_GROUP_PREFIX + SUBSCRIBER_CONSUMER_ID) + .setConsumerId(SUBSCRIBER_CONSUMER_ID).build(); + + DMaaPMRSubscriberConfig expectedSubscriberConfig = + new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(AnalyticsConstants.DEFAULT_PORT_NUMBER) + .setContentType(AnalyticsConstants.DEFAULT_CONTENT_TYPE) + .setProtocol(AnalyticsConstants.DEFAULT_PROTOCOL) + .setConsumerGroup(AnalyticsConstants.DEFAULT_SUBSCRIBER_GROUP_PREFIX + SUBSCRIBER_CONSUMER_ID) + .setConsumerId(SUBSCRIBER_CONSUMER_ID) + .setMessageLimit(AnalyticsConstants.DEFAULT_SUBSCRIBER_MESSAGE_LIMIT) + .setTimeoutMS(AnalyticsConstants.DEFAULT_SUBSCRIBER_TIMEOUT_MS) + .build(); + + assertTrue("Default Subscriber Config parameters must match", + actualDefaultSubscriberConfig.equals(expectedSubscriberConfig)); + + } + + + @Test + public void testSubscriberCustomConfig() throws Exception { + + DMaaPMRSubscriberConfig actualSubscriberCustomConfig = getSubscriberConfig(SUBSCRIBER_CONSUMER_ID, + SUBSCRIBER_CONSUMER_GROUP_NAME); + + DMaaPMRSubscriberConfig expectedSubscriberCustomConfig = + new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setUserName(USERNAME) + .setUserPassword(PASSWORD) + .setContentType(CONTENT_TYPE) + .setProtocol(HTTP_PROTOCOL) + .setConsumerGroup(SUBSCRIBER_CONSUMER_GROUP_NAME) + .setConsumerId(SUBSCRIBER_CONSUMER_ID) + .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT) + .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) + .build(); + + assertTrue("Custom Subscriber Config parameters must match", + actualSubscriberCustomConfig.equals(expectedSubscriberCustomConfig)); + + } + + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java new file mode 100644 index 0000000..5b5d0c1 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java @@ -0,0 +1,109 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.it; + +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; + +import java.util.List; + +import static com.google.common.collect.ImmutableList.of; + +/** + * Base class for all DCAE DMaaP Integration Tests + *

+ * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +public abstract class BaseAnalyticsDMaaPIT extends BaseDCAEAnalyticsIT { + + // Integration Test Settings + protected static final String HOST_NAME = "mrlocal-mtnjftle01.homer.com"; + protected static final Integer PORT_NUMBER = 3905; + protected static final String TOPIC_NAME = "com.dcae.dmaap.mtnje2.DcaeTestVESPub"; + + protected static final String USERNAME = "USER"; + protected static final String PASSWORD = "PASSWORD"; + protected static final String HTTP_PROTOCOL = "https"; + protected static final String CONTENT_TYPE = "application/json"; + + protected static final int PUBLISHER_MAX_BATCH_QUEUE_SIZE = 20; + protected static final int PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 200; + + protected static final String SUBSCRIBER_CONSUMER_ID = "123"; + protected static final String SUBSCRIBER_CONSUMER_GROUP_NAME = "testGonsumerName-" + SUBSCRIBER_CONSUMER_ID; + protected static final int SUBSCRIBER_TIMEOUT_MS = 2000; + protected static final int SUBSCRIBER_MESSAGE_LIMIT = 20; + + /** + * Creates Sample Publisher settings for integration testing purposes + * + * @return DMaaP MR Publisher Config + */ + protected static DMaaPMRPublisherConfig getPublisherConfig() { + return new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setProtocol(HTTP_PROTOCOL) + .setContentType(CONTENT_TYPE) + .setUserName(USERNAME) + .setUserPassword(PASSWORD) + .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE) + .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) + .build(); + } + + /** + * Creates Sample Subscriber settings for integration testing purposes + * + * @return DMaaP MR Subscriber Config + */ + protected static DMaaPMRSubscriberConfig getSubscriberConfig(String consumerId) { + return new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setProtocol(HTTP_PROTOCOL) + .setContentType(CONTENT_TYPE) + .setUserName(USERNAME) + .setUserPassword(PASSWORD) + .setConsumerGroup(SUBSCRIBER_CONSUMER_GROUP_NAME) + .setConsumerId(consumerId != null ? consumerId : SUBSCRIBER_CONSUMER_ID) + .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) + .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT).build(); + } + + /** + * Publishes 2 sample message to DMaaP Topic for integration test purposes + * + * @param dMaaPMRPublisher DMaaP MR Publisher + * @return DMaaP MR Publisher Response + */ + protected static DMaaPMRPublisherResponse publishTwoSampleMessages(DMaaPMRPublisher dMaaPMRPublisher) { + return dMaaPMRPublisher.publish(getTwoSampleMessage()); + } + + protected static List getTwoSampleMessage() { + String message1 = "{ \"message\" : \"Test Message1\"}"; + String message2 = "{ \"message\" : \"Test Message2\"}"; + return of(message1, message2); + } + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java new file mode 100644 index 0000000..aad4f67 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java @@ -0,0 +1,58 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.it; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; + +/** + * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +@Ignore +public class DMaaPMRPublisherImplIT extends BaseAnalyticsDMaaPIT { + + private DMaaPMRPublisher dMaaPMRPublisher; + + @Before + public void before() throws Exception { + DMaaPMRFactory dMaaPMRFactory = DMaaPMRFactory.create(); + dMaaPMRPublisher = dMaaPMRFactory.createPublisher(getPublisherConfig()); + } + + @Test + public void testPublish() throws Exception { + long pendingMessageCount = publishTwoSampleMessages(dMaaPMRPublisher).getPendingMessagesCount(); + Assert.assertTrue("Published Message Count must be 2", pendingMessageCount == 2); + } + + @Test + public void testFlush() throws Exception { + publishTwoSampleMessages(dMaaPMRPublisher); + DMaaPMRPublisherResponse publisherResponse = dMaaPMRPublisher.flush(); + Integer responseCode = publisherResponse.getResponseCode(); + Assert.assertTrue("Server Response code must be 200", responseCode == 200); + } +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java new file mode 100644 index 0000000..3d6657f --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java @@ -0,0 +1,87 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.it; + +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; + +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 10/13/2016. + */ +@Ignore +public class DMaaPMRSubscriberImplIT extends BaseAnalyticsDMaaPIT { + + private DMaaPMRPublisher dMaaPMRPublisher; + private DMaaPMRSubscriber dMaaPMRSubscriber; + + @Before + public void before() throws Exception { + String randomConsumerID = UUID.randomUUID().toString(); + DMaaPMRFactory dMaaPMRFactory = DMaaPMRFactory.create(); + dMaaPMRSubscriber = dMaaPMRFactory.createSubscriber(getSubscriberConfig(randomConsumerID)); + dMaaPMRPublisher = dMaaPMRFactory.createPublisher(getPublisherConfig()); + } + + @After + public void after() throws Exception { + dMaaPMRSubscriber.close(); + dMaaPMRPublisher.close(); + } + + + @Test + public void testFetchMessages() throws Exception { + + // This call is used to just register a brand new subscriber with DMaaP + DMaaPMRSubscriberResponse subscriberRegistrationResponse = dMaaPMRSubscriber.fetchMessages(); + assertTrue("Subscriber Registration Response code must be 200 confirming subscriber was registered " + + "successfully", subscriberRegistrationResponse.getResponseCode() == 200); + assertTrue("Subscriber Registration Response must not contain any messages", subscriberRegistrationResponse + .getFetchedMessages().size() == 0); + + // Force push couple of test messages + DMaaPMRPublisherResponse publisherResponse = dMaaPMRPublisher.forcePublish(getTwoSampleMessage()); + assertTrue("Message must be posted successfully before subscriber can fetch it", publisherResponse + .getResponseCode() == 200); + + // Now fetch messages from DMaaP + DMaaPMRSubscriberResponse subscriberResponse = dMaaPMRSubscriber.fetchMessages(); + List messageList = new LinkedList<>(); + for (String message : subscriberResponse.getFetchedMessages()) { + messageList.add(message); + } + assertTrue("Subscriber message count must be 2", messageList.size() == 2); + } + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java new file mode 100644 index 0000000..e467cb2 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java @@ -0,0 +1,60 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.module; + +import com.google.inject.AbstractModule; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherFactory; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherMockImpl; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueFactory; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueImpl; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberFactory; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberMockImpl; + +/** + * DMaaP Guice Test Module + *

+ * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +public class AnalyticsDMaaPTestModule extends AbstractModule { + + + @Override + protected void configure() { +// Bind Http Client + bind(CloseableHttpClient.class).toInstance(HttpClients.createDefault()); + + // Bind Publishing queue + install(new FactoryModuleBuilder().implement(DMaaPMRPublisherQueue.class, DMaaPMRPublisherQueueImpl.class) + .build(DMaaPMRPublisherQueueFactory.class)); + + install(new FactoryModuleBuilder().implement(DMaaPMRPublisher.class, DMaaPMRPublisherMockImpl.class) + .build(DMaaPMRPublisherFactory.class)); + + install(new FactoryModuleBuilder().implement(DMaaPMRSubscriber.class, DMaaPMRSubscriberMockImpl.class) + .build(DMaaPMRSubscriberFactory.class)); + } +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java new file mode 100644 index 0000000..f83af60 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java @@ -0,0 +1,300 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.google.common.base.Optional; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; +import org.apache.http.client.ResponseHandler; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.mockito.Mockito; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isA; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; + +/** + * @author Manjesh Gowda. Creation Date: 11/4/2016. + */ +public class BaseDMaaPMRComponentTest extends BaseAnalyticsDMaaPUnitTest { + + @Test + public void testGetAuthHeaderWithGoodValues() { + String expectedEncodedString = "Basic bTAwNTAyQHRjYS5hZi5kY2FlLmNvbTpUZTUwMjFhYmM="; + Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader("USER", "PASSWORD"); + assertTrue(" Authentication Header has value ", actualOutput.isPresent()); +// assertEquals(" Authentication Header has value ", expectedEncodedString, actualOutput.get()); + } + + @Test + public void testGetAuthHeaderWithNullValues() { + Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader(null, null); + assertFalse(" Authentication Header has value ", actualOutput.isPresent()); + } + + @Test + public void testGetAuthHeaderWithUserNullValue() { + Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader("USER", null); + assertFalse(" Authentication Header has value ", actualOutput.isPresent()); + } + + @Test + public void testGetAuthHeaderWithPasswordNullValue() { + Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader(null, "PASSWORD"); + assertFalse(" Authentication Header has value ", actualOutput.isPresent()); + } + + @Test + public void testCreatePublishURIWithGoodValues() { + URI actualURI = BaseDMaaPMRComponent.createPublisherURI(getPublisherConfig()); + String test = actualURI.toString(); + assertEquals("Generated Publisher URL is correct", + "https://testHostName:8080/events/testTopicName", actualURI.toString()); + } + + @Test(expected = DCAEAnalyticsRuntimeException.class) + public void testCreatePublishURIWithURISyntaxException() { + DMaaPMRPublisherConfig badPublisherConfig = new DMaaPMRPublisherConfig + .Builder(" dav /gh. ss/ asd ", "///@$%#-htps:<>!##") + .setPortNumber(0) + .setProtocol("https").build(); + + BaseDMaaPMRComponent.createPublisherURI(badPublisherConfig); + } + + @Test + public void testCreateSubscribeURIWithGoodValues() { + URI actualURI = BaseDMaaPMRComponent.createSubscriberURI( + getSubscriberConfig("test-consumer-group", "test-consumer-id")); + assertEquals("Generated Subscriber URL is correct", + "https://testHostName:8080/events/testTopicName/" + + "test-consumer-id/test-consumer-group?timeout=2000&limit=20", + actualURI.toString()); + } + + @Test(expected = DCAEAnalyticsRuntimeException.class) + public void testCreateSubscribeURIWithURISyntaxException() { + DMaaPMRSubscriberConfig badSubscriberConfig = new DMaaPMRSubscriberConfig + .Builder(" dav /gh. ss/ asd ", "") + .setPortNumber(PORT_NUMBER) + .setProtocol(HTTP_PROTOCOL) + .setContentType(CONTENT_TYPE).build(); + + URI actualURI = BaseDMaaPMRComponent.createSubscriberURI(badSubscriberConfig); + } + + @Test + public void testConvertToJsonStringGoodJsonStringList() { + List jsonMessage = Arrays.asList( + "{\"message\":\"I'm Object 1 Message\"}", + "{\"message\":\"I'm Object 2 Message\"}"); + + String actualJSONMsg = BaseDMaaPMRComponent.convertToJsonString(jsonMessage); + + String expectedJSONMsg = "[{\"message\":\"I'm Object 1 Message\"}," + + "{\"message\":\"I'm Object 2 Message\"}]"; + assertEquals("Convert a List of Strings to JSON is working fine", expectedJSONMsg, actualJSONMsg); + + } + + @Rule + public ExpectedException expectedJsonProcessingException = ExpectedException.none(); + + @Test + public void testConvertToJsonStringBadJsonStringList() { + expectedJsonProcessingException.expect(DCAEAnalyticsRuntimeException.class); + expectedJsonProcessingException.expectCause(isA(JsonProcessingException.class)); + + List jsonMessage = Arrays.asList( + "{\"message\":\"I'm Object 1 Message\"", + "\"message\":\"I'm Object 2 Message\""); + + BaseDMaaPMRComponent.convertToJsonString(jsonMessage); + } + + @Test + public void testConvertToJsonStringWithEmptyList() { + List jsonMessage = Arrays.asList(); + String actualJSONMsg = BaseDMaaPMRComponent.convertToJsonString(jsonMessage); + String expectedJSONMsg = "[]"; + assertEquals("Convert a List of Strings to JSON is working fine", expectedJSONMsg, actualJSONMsg); + } + + @Test + public void testConvertToJsonStringWithNullList() { + String actualJSONMsg = BaseDMaaPMRComponent.convertToJsonString(null); + String expectedJSONMsg = "[]"; + assertEquals("Convert a List of Strings to JSON is working fine", expectedJSONMsg, actualJSONMsg); + } + + + @Test + public void testConvertJsonToStringMessagesGoodValues() { + String inputJSONMsg = "[{\"message\":\"I'm Object 1 Message\"}," + + "{\"message\":\"I'm Object 2 Message\"}]"; + List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(inputJSONMsg); + assertThat(actualList, hasSize(2)); + assertThat(actualList, containsInAnyOrder( + "{\"message\":\"I'm Object 1 Message\"}", + "{\"message\":\"I'm Object 2 Message\"}" + )); + } + + @Test + public void testConvertJsonToStringMessagesNoValues() { + String inputJSONMsg = "[]"; + List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(inputJSONMsg); + assertThat(actualList, hasSize(0)); + } + + @Test + public void testConvertJsonToStringMessagesNullValues() { + List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(null); + assertThat(actualList, hasSize(0)); + } + + @Test + public void testConvertJsonToStringMessagesEmptyValues() { + List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(" "); + assertThat(actualList, hasSize(0)); + } + + @Rule + public ExpectedException convertToJSONIOException = ExpectedException.none(); + + @Test + public void testConvertJsonToStringMessagesException() { + convertToJSONIOException.expect(DCAEAnalyticsRuntimeException.class); + convertToJSONIOException.expectCause(isA(IOException.class)); + + String inputJSONMsg = "[\"{\"message\":\"I'm Object 1 Message\"}\"," + + "\"{\"message\":\"I'm Object 2 Message\"}\"]"; + List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(inputJSONMsg); + assertThat(actualList, hasSize(2)); + assertThat(actualList, containsInAnyOrder( + "{\"message\":\"I'm Object 1 Message\"}", + "{\"message\":\"I'm Object 2 Message\"}" + )); + } + + @Test + public void testAddMessagesToRecoveryQueueAllGood() { + DMaaPMRPublisherQueue dmaapMRPublisherQueue = mock(DMaaPMRPublisherQueue.class); + given(dmaapMRPublisherQueue.addRecoverableMessages(Mockito.anyList())).willReturn(0); + given(dmaapMRPublisherQueue.getBatchQueueRemainingSize()).willReturn(0); + List messages = new ArrayList(); + BaseDMaaPMRComponent.addMessagesToRecoveryQueue(dmaapMRPublisherQueue, messages); + } + + @Rule + public ExpectedException addQueueIllegalException = ExpectedException.none(); + + @Test + public void testAddMessagesToRecoveryQueueException() { + addQueueIllegalException.expect(isA(DCAEAnalyticsRuntimeException.class)); + addQueueIllegalException.expectCause(isA(IllegalStateException.class)); + + DMaaPMRPublisherQueue dmaapMRPublisherQueue = mock(DMaaPMRPublisherQueue.class); + + given(dmaapMRPublisherQueue.addRecoverableMessages(Mockito.anyList())) + .willThrow(IllegalStateException.class); + List messages = new ArrayList(); + + BaseDMaaPMRComponent.addMessagesToRecoveryQueue(dmaapMRPublisherQueue, messages); + } + + + @Test + public void testResponseHandler() { + HttpResponse mockHttpResponse = mock(HttpResponse.class); + StatusLine mockStatusLine = mock(StatusLine.class); + HttpEntity mockHttpEntity = mock(HttpEntity.class); + // Could not mock EntityUtils as it's final class + //EntityUtils mockEntityUtils = mock(EntityUtils.class); + + given(mockHttpResponse.getStatusLine()).willReturn(mockStatusLine); + given(mockStatusLine.getStatusCode()).willReturn(200); + given(mockHttpResponse.getEntity()).willReturn(null); + //given(mockEntityUtils.toString()).willReturn("Test value"); + + ResponseHandler> responseHandler = BaseDMaaPMRComponent.responseHandler(); + try { + Pair mappedResponse = responseHandler.handleResponse(mockHttpResponse); + assertTrue("Http response code returned properly ", mappedResponse.getLeft().equals(200)); + assertTrue("Http response body returned properly ", mappedResponse.getRight().equals("")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + @Test + public void testCreateSubscriberResponse() { + DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = + BaseDMaaPMRComponent.createSubscriberResponse(200, "Test Message", getTwoSampleMessages()); + + assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); + assertEquals(dmaapMRSubscriberResponse.getResponseMessage(), "Test Message"); + assertThat(dmaapMRSubscriberResponse.getFetchedMessages().size(), is(2)); + + } + + @Test + public void testCreateSubscriberResponse_no_message() { + DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = + BaseDMaaPMRComponent.createSubscriberResponse(200, "Test Message", null); + + assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); + assertEquals(dmaapMRSubscriberResponse.getResponseMessage(), "Test Message"); + assertThat(dmaapMRSubscriberResponse.getFetchedMessages().size(), is(0)); + + } + +} + + + + + diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java new file mode 100644 index 0000000..c798743 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java @@ -0,0 +1,210 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.client.CloseableHttpClient; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; + +import java.io.IOException; +import java.util.ArrayList; + +import static org.hamcrest.CoreMatchers.isA; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * @author Rajiv Singla . Creation Date: 10/21/2016. + */ +@RunWith(MockitoJUnitRunner.class) +public class DMaaPMRPublisherImplTest extends BaseAnalyticsDMaaPUnitTest { + + @Mock + private DMaaPMRPublisherQueueFactory dmaapMRPublisherQueueFactory; + @Mock + private CloseableHttpClient closeableHttpClient; + @Mock + private DMaaPMRPublisherQueue dmaapMRPublisherQueue; + + @Before + public void setUp() throws Exception { + given(dmaapMRPublisherQueueFactory.create(Mockito.anyInt(), Mockito.anyInt())) + .willReturn(dmaapMRPublisherQueue); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPublishSmallMessageList() throws Exception { + given(dmaapMRPublisherQueue.getBatchQueueRemainingSize()).willReturn(10); + given(dmaapMRPublisherQueue.addBatchMessages(Mockito.anyList())).willReturn(2); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + + DMaaPMRPublisherResponse dmaapMRPublisherResponse = dmaapMRPublisherImpl.publish(getTwoSampleMessages()); + + assertThat(dmaapMRPublisherResponse.getResponseCode(), is(202)); + assertThat(dmaapMRPublisherResponse.getPendingMessagesCount(), is(2)); + assertThat(dmaapMRPublisherResponse.getResponseMessage(), + is("Accepted - Messages queued for batch publishing to MR Topic")); + } + + @Test + public void testPublishBigMessageList() throws Exception { + + given(dmaapMRPublisherQueue.getBatchQueueRemainingSize()).willReturn(0); + given(dmaapMRPublisherQueue.getMessageForPublishing()).willReturn(getTwoSampleMessages()); + Mockito.when( + closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + + DMaaPMRPublisherResponse dmaapMRPublisherResponse = dmaapMRPublisherImpl.publish(getTwoSampleMessages()); + + assertThat(dmaapMRPublisherResponse.getResponseCode(), is(200)); + assertThat(dmaapMRPublisherResponse.getPendingMessagesCount(), is(200)); + assertThat(dmaapMRPublisherResponse.getResponseMessage(), is("Message successfully posted")); + } + + @Test + public void testForcePublishSuccessful() throws Exception { + DMaaPMRPublisherConfig dmaapMRPublisherConfig = new + DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setProtocol(HTTP_PROTOCOL) + .setContentType(CONTENT_TYPE) + .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) + .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE).build(); + + Mockito.when(closeableHttpClient.execute( + Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + dmaapMRPublisherConfig, dmaapMRPublisherQueueFactory, closeableHttpClient); + DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.forcePublish(getTwoSampleMessages()); + assertThat(response.getResponseCode(), is(200)); + } + + @Test + public void testForcePublishFailure() throws Exception { + Mockito.when(closeableHttpClient.execute( + Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(503, "Message successfully posted")); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.forcePublish(getTwoSampleMessages()); + assertThat(response.getResponseCode(), is(503)); + } + + @Rule + public ExpectedException httpIOException = ExpectedException.none(); + + @Test + public void testForcePublishHttpFailure() throws Exception { + + httpIOException.expect(DCAEAnalyticsRuntimeException.class); + httpIOException.expectCause(isA(IOException.class)); + + given(closeableHttpClient.execute( + Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))).willThrow(IOException.class); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + dmaapMRPublisherImpl.forcePublish(getTwoSampleMessages()); + } + + @Test + public void testFlushSuccessful() throws Exception { + Mockito.when(closeableHttpClient.execute( + Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); + + Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(getTwoSampleMessages()); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.flush(); + assertThat(response.getResponseCode(), is(200)); + } + + @Test + public void testFlushEmptyList() throws Exception { + Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(new ArrayList()); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.flush(); + assertThat(response.getResponseCode(), is(204)); + } + + @Test + public void testClose() throws Exception { + Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(new ArrayList()); + Mockito.when(closeableHttpClient.execute( + Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); + Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(getTwoSampleMessages()); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + dmaapMRPublisherImpl.close(); + verify(closeableHttpClient).execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class)); + } + + @Test + public void testCloseUnsuccessful() throws Exception { + Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(new ArrayList()); + Mockito.when(closeableHttpClient.execute( + Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(400, "Message successfully posted")); + Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(getTwoSampleMessages()); + + DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( + getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); + dmaapMRPublisherImpl.close(); + verify(closeableHttpClient, times(6)).execute(Mockito.any(HttpUriRequest.class), + Mockito.any(ResponseHandler.class)); + } +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java new file mode 100644 index 0000000..3e84430 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java @@ -0,0 +1,59 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponseImpl; + +import java.util.Date; +import java.util.List; + +/** + * @author Rajiv Singla . Creation Date: 10/21/2016. + */ +public class DMaaPMRPublisherMockImpl implements DMaaPMRPublisher { + + @Override + public DMaaPMRPublisherResponse publish(List messages) throws DCAEAnalyticsRuntimeException { + return new DMaaPMRPublisherResponseImpl(102, "Mock Response", 100); + } + + @Override + public DMaaPMRPublisherResponse forcePublish(List messages) throws DCAEAnalyticsRuntimeException { + return null; + } + + @Override + public DMaaPMRPublisherResponse flush() { + return null; + } + + @Override + public Date getPublisherCreationTime() { + return null; + } + + @Override + public void close() throws Exception { + + } +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java new file mode 100644 index 0000000..d5d0b7b --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java @@ -0,0 +1,189 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import org.junit.Test; +import org.onap.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; + +import java.util.List; + +import static org.junit.Assert.assertTrue; + +/** + * + * @author Rajiv Singla . Creation Date: 11/2/2016. + */ +public class DMaaPMRPublisherQueueImplTest extends BaseAnalyticsDMaaPUnitTest { + + + @Test + public void testAddBatchMessages() throws Exception { + DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); + // add two messages to batch queue + final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); + // add two more message to batch queue + final int batchMessagesSizeAfterSecondInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 4", batchMessagesSizeAfterSecondInsert == 4); + // Now get all messages which must drain out batch queue + final List messagesToPublish = publisherQueue.getMessageForPublishing(); + assertTrue("There must be 4 messages to publish", messagesToPublish.size() == 4); + assertTrue("Batch Queue must be empty", publisherQueue.getBatchQueueRemainingSize() == 10); + + } + + @Test(expected = IllegalStateException.class) + public void testAddBatchMessagesWhenQueueSizeIsFull() throws Exception { + DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(2, 20); + // add two messages to batch queue + final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); + // add 2 more messages should now throw IllegalStateException + publisherQueue.addBatchMessages(getTwoSampleMessages()); + } + + @Test + public void testAddRecoverableMessages() throws Exception { + DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); + // add two messages to batch queue + final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); + // add two recoverable messages + final int recoverableMessageSizeAfterFirstInsert = + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + assertTrue("Recovery Message Queue size must be 2 after first insert", + recoverableMessageSizeAfterFirstInsert == 2); + // add two more recoverable messages + final int recoverableMessageSizeAfterSecondInsert = + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + assertTrue("Recovery Message Queue size must be 4 after second insert", + recoverableMessageSizeAfterSecondInsert == 4); + // Now get all messages which must drain out batch queue + final List messagesToPublish = publisherQueue.getMessageForPublishing(); + assertTrue("There must be 6 messages to publish", messagesToPublish.size() == 6); + assertTrue("Batch Queue must be empty", publisherQueue.getBatchQueueRemainingSize() == 10); + assertTrue("Recovery Queue must be empty", publisherQueue.getRecoveryQueueRemainingSize() == 20); + } + + + @Test(expected = IllegalStateException.class) + public void testAddRecoverableMessagesWhenRecoveryQueueIsFull() throws Exception { + DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 2); + // add two messages to batch queue + final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); + // add two recoverable messages + final int recoverableMessageSizeAfterFirstInsert = + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + assertTrue("Recovery Message Queue size must be 2 after first insert", + recoverableMessageSizeAfterFirstInsert == 2); + // add two more recoverable messages which should throw IllegalStateException + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + } + + @Test + public void testGetMessageForPublishing() throws Exception { + DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); + // add two messages to batch queue + final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); + // add two recoverable messages + final int recoverableMessageSizeAfterFirstInsert = + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + assertTrue("Recovery Message Queue size must be 2 after first insert", + recoverableMessageSizeAfterFirstInsert == 2); + // add two more recoverable messages + final int recoverableMessageSizeAfterSecondInsert = + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + assertTrue("Recovery Message Queue size must be 4 after second insert", + recoverableMessageSizeAfterSecondInsert == 4); + // Now get all messages which must drain out batch queue + final List messagesToPublish = publisherQueue.getMessageForPublishing(); + assertTrue("There must be 6 messages to publish", messagesToPublish.size() == 6); + // add two more batch and recovery messages + final int batchQueueSize = publisherQueue.addBatchMessages(getTwoSampleMessages()); + final int recoveryQueueSize = publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + final int messagePublishCount = publisherQueue.getMessageForPublishing().size(); + assertTrue("Batch Queue + Recovery Queue message total must batch publish message count", + messagePublishCount == (batchQueueSize + recoveryQueueSize)); + assertTrue("Batch Queue must be empty", publisherQueue.getBatchQueueRemainingSize() == 10); + assertTrue("Recovery Queue must be empty", publisherQueue.getRecoveryQueueRemainingSize() == 20); + + } + + @Test + public void testGetBatchQueueRemainingSize() throws Exception { + + DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); + // add two messages to batch queue + final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); + assertTrue("Batch remaining capacity should be reduced by 2", + publisherQueue.getBatchQueueRemainingSize() == 8); + + // add two recoverable messages + final int recoverableMessageSizeAfterFirstInsert = + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + assertTrue("Recovery Message Queue size must be 2 after first insert", + recoverableMessageSizeAfterFirstInsert == 2); + + // recoverable message should not change batch queue capacity + assertTrue("Adding recoverable Message must not have any impact on batch queue remaining capacity ", + publisherQueue.getBatchQueueRemainingSize() == 8); + // Now get all messages which must drain out batch queue + final List messagesToPublish = publisherQueue.getMessageForPublishing(); + assertTrue("There must be exactly 4 messages to publish", messagesToPublish.size() == 4); + + // Batch queue remaining capacity should now match original batch size + assertTrue("Batch Queue remaining capacity must match original batch queue size", publisherQueue + .getBatchQueueRemainingSize() == 10); + } + + @Test + public void testGetRecoveryQueueRemainingSize() throws Exception { + DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); + + // add two recoverable messages + final int recoverableMessageSizeAfterFirstInsert = + publisherQueue.addRecoverableMessages(getTwoSampleMessages()); + assertTrue("Recovery Message Queue size must be 2 after first insert", + recoverableMessageSizeAfterFirstInsert == 2); + assertTrue("Recovery Queue remaining capacity should be reduced by 2", + publisherQueue.getRecoveryQueueRemainingSize() == 18); + + // add two messages to batch queue + final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); + assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); + + // batch message should not change recoverable queue capacity + assertTrue("Adding batch queue Message must not have any impact on recovery queue remaining capacity ", + publisherQueue.getRecoveryQueueRemainingSize() == 18); + + // Now get all messages which must drain out recovery queue + final List messagesToPublish = publisherQueue.getMessageForPublishing(); + assertTrue("There must be exactly 4 messages to publish", messagesToPublish.size() == 4); + + // Recoverable queue remaining capacity should now match original recovery queue size + assertTrue("Recoverable Queue remaining capacity must match original batch queue size", publisherQueue + .getRecoveryQueueRemainingSize() == 20); + } + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java new file mode 100644 index 0000000..7af0454 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java @@ -0,0 +1,53 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.publisher; + +import java.util.List; + +/** + * @author Manjesh Gowda. Creation Date: 11/7/2016. + */ +public class DMaaPMRPublisherQueueMockImpl implements DMaaPMRPublisherQueue { + @Override + public int addBatchMessages(List batchMessages) throws IllegalStateException { + return 100; + } + + @Override + public int addRecoverableMessages(List recoverableMessages) throws IllegalStateException { + return 0; + } + + @Override + public List getMessageForPublishing() { + return null; + } + + @Override + public int getBatchQueueRemainingSize() { + return 0; + } + + @Override + public int getRecoveryQueueRemainingSize() { + return 0; + } +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java new file mode 100644 index 0000000..892cbd0 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java @@ -0,0 +1,158 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.subscriber; + +import com.jayway.jsonassert.impl.matcher.IsCollectionWithSize; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.client.CloseableHttpClient; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; + +import java.io.IOException; +import java.util.Random; +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.isA; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.mockito.BDDMockito.given; + +/** + * @author Rajiv Singla . Creation Date: 10/21/2016. + */ +@RunWith(MockitoJUnitRunner.class) +public class DMaaPMRSubscriberImplTest extends BaseAnalyticsDMaaPUnitTest { + + @Mock + private CloseableHttpClient closeableHttpClient; + + private String consumerGroup, consumerId; + + @Before + public void setUp() throws Exception { + Random random = new Random(10000L); + consumerGroup = "Test-Consumer-Group" + Long.toString(random.nextLong()); + consumerId = UUID.randomUUID().toString(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testSubscriberSuccessfullyReceiveDmaapMessage() throws Exception { + + String testMessages = "[{\"message\":\"I'm Object 1 Message\"}," + + "{\"message\":\"I'm Object 2 Message\"}]"; + Mockito.when( + closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(200, testMessages)); + + DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( + getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); + DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); + assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); + assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(2)); + } + + @Test + public void testSubscriberSuccessfullyReceiveDmaapMessageWithNoUsername() throws Exception { + + DMaaPMRSubscriberConfig dmaapMRSubscriberConfig = new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) + .setPortNumber(PORT_NUMBER) + .setProtocol(HTTP_PROTOCOL) + .setContentType(CONTENT_TYPE) + .setConsumerGroup(consumerGroup != null ? consumerGroup : SUBSCRIBER_CONSUMER_GROUP_NAME) + .setConsumerId(consumerId != null ? consumerId : SUBSCRIBER_CONSUMER_ID) + .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) + .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT).build(); + + String testMessages = "[{\"message\":\"I'm Object 1 Message\"}," + + "{\"message\":\"I'm Object 2 Message\"}]"; + Mockito.when( + closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(200, testMessages)); + + DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( + dmaapMRSubscriberConfig, closeableHttpClient); + DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); + assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); + assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(2)); + } + + @Test + public void testSubscriberSuccessfullyReceiveNoDmaapMessage() throws Exception { + Mockito.when( + closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(200, null)); + + DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( + getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); + DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); + assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); + assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(0)); + } + + @Test + public void testSubscriberSuccessfullyReceiveErrorMessage() throws Exception { + Mockito.when( + closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) + .thenReturn(new ImmutablePair<>(400, "Bad Request")); + + DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( + getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); + DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); + assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(400)); + assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(0)); + } + + @Rule + public ExpectedException httpIOException = ExpectedException.none(); + + @Test + public void testSubscriberSuccessfullyReceiveException() throws Exception { + + httpIOException.expect(DCAEAnalyticsRuntimeException.class); + httpIOException.expectCause(isA(IOException.class)); + + given(closeableHttpClient.execute( + Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))).willThrow(IOException.class); + + DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( + getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); + dmaapMRSubscriberImpl.fetchMessages(); + } + +} diff --git a/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java new file mode 100644 index 0000000..6f348a5 --- /dev/null +++ b/dcae-analytics-dmaap/src/test/java/org/onap/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java @@ -0,0 +1,48 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.dmaap.service.subscriber; + +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponseImpl; + +import java.util.Date; + +/** + * @author Rajiv Singla . Creation Date: 10/21/2016. + */ +public class DMaaPMRSubscriberMockImpl implements DMaaPMRSubscriber { + + @Override + public DMaaPMRSubscriberResponse fetchMessages() throws DCAEAnalyticsRuntimeException { + return new DMaaPMRSubscriberResponseImpl(102, "Mock Response", null); + } + + @Override + public Date getSubscriberCreationTime() { + return null; + } + + @Override + public void close() throws Exception { + + } +} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java deleted file mode 100644 index d4ce67e..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPGuiceUnitTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap; - -import org.junit.runner.RunWith; -import org.openecomp.dcae.apod.analytics.test.runner.GuiceJUnitRunner; - -/** - * @author Rajiv Singla . Creation Date: 10/20/2016. - */ -@RunWith(GuiceJUnitRunner.class) -public abstract class BaseAnalyticsDMaaPGuiceUnitTest extends BaseAnalyticsDMaaPUnitTest { -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java deleted file mode 100644 index 9b5f1d1..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/BaseAnalyticsDMaaPUnitTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap; - -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest; - -import java.util.List; - -import static com.google.common.collect.ImmutableList.of; - -/** - * @author Rajiv Singla . Creation Date: 10/14/2016. - */ -public abstract class BaseAnalyticsDMaaPUnitTest extends BaseDCAEAnalyticsUnitTest { - - // Unit Test Settings - protected static final String HOST_NAME = "testHostName"; - protected static final Integer PORT_NUMBER = 8080; - protected static final String TOPIC_NAME = "testTopicName"; - protected static final String USERNAME = "testUserName"; - protected static final String PASSWORD = "testPassword"; - protected static final String HTTP_PROTOCOL = "https"; - protected static final String CONTENT_TYPE = "application/json"; - - protected static final int PUBLISHER_MAX_BATCH_QUEUE_SIZE = 200; - protected static final int PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 2000; - - protected static final String SUBSCRIBER_CONSUMER_ID = "123"; - protected static final String SUBSCRIBER_CONSUMER_GROUP_NAME = "testGonsumerName-" + SUBSCRIBER_CONSUMER_ID; - protected static final int SUBSCRIBER_TIMEOUT_MS = 2000; - protected static final int SUBSCRIBER_MESSAGE_LIMIT = 20; - - /** - * Creates Sample Publisher settings for unit testing purposes - * - * @return sample publisher settings for testing - */ - protected static DMaaPMRPublisherConfig getPublisherConfig() { - return new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setProtocol(HTTP_PROTOCOL) - .setUserName(USERNAME) - .setUserPassword(PASSWORD) - .setContentType(CONTENT_TYPE) - .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) - .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE).build(); - } - - /** - * Creates Sample Subscriber settings for unit testing purposes - * - * @return sample subscriber settings for testing - */ - protected static DMaaPMRSubscriberConfig getSubscriberConfig(String consumerId, String consumerGroup) { - return new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setUserName(USERNAME) - .setUserPassword(PASSWORD) - .setProtocol(HTTP_PROTOCOL) - .setContentType(CONTENT_TYPE) - .setConsumerGroup(consumerGroup != null ? consumerGroup : SUBSCRIBER_CONSUMER_GROUP_NAME) - .setConsumerId(consumerId != null ? consumerId : SUBSCRIBER_CONSUMER_ID) - .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) - .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT).build(); - } - - /** - * Creates two sample message for publishing - * - * @return sample publish message list - */ - protected static List getTwoSampleMessages() { - String message1 = "{ \"message\" : \"Test Message1\"}"; - String message2 = "{ \"message\" : \"Test Message2\"}"; - return of(message1, message2); - } - - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java deleted file mode 100644 index 5388d0b..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/DMaaPMRFactoryTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap; - -import org.junit.Before; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.module.AnalyticsDMaaPTestModule; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.openecomp.dcae.apod.analytics.test.annotation.GuiceModules; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -/** - * @author Manjesh Gowda. Creation Date: 11/7/2016. - */ -@GuiceModules(AnalyticsDMaaPTestModule.class) -public class DMaaPMRFactoryTest extends BaseAnalyticsDMaaPGuiceUnitTest { - - private DMaaPMRFactory dmaapMRFactory; - - @Before - public void setUp() throws Exception { - dmaapMRFactory = new DMaaPMRFactory(new AnalyticsDMaaPTestModule()); - } - - @Test - public void createPublisher() throws Exception { - DMaaPMRPublisher publisher = dmaapMRFactory.createPublisher(getPublisherConfig()); - DMaaPMRPublisherResponse response = publisher.publish(null); - assertThat(response.getResponseCode(), is(102)); - } - - @Test - public void createSubscriber() throws Exception { - DMaaPMRSubscriber dmaapMRSubscriber = dmaapMRFactory.createSubscriber(getSubscriberConfig("", "")); - DMaaPMRSubscriberResponse response = dmaapMRSubscriber.fetchMessages(); - assertThat(response.getResponseCode(), is(102)); - } - - @Test - public void create() throws Exception { - - } - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java deleted file mode 100644 index 9787295..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRPublisherConfigTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.config; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; - -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 10/14/2016. - */ -public class DMaaPMRPublisherConfigTest extends BaseAnalyticsDMaaPUnitTest { - - - @Test - public void testPublisherConfigDefaults() throws Exception { - - final DMaaPMRPublisherConfig actualDefaultPublisherConfig = - new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME).build(); - - final DMaaPMRPublisherConfig expectedDefaultPublisherConfig = - new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(AnalyticsConstants.DEFAULT_PORT_NUMBER) - .setContentType(AnalyticsConstants.DEFAULT_CONTENT_TYPE) - .setProtocol(AnalyticsConstants.DEFAULT_PROTOCOL) - .setMaxBatchSize(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_BATCH_SIZE) - .setMaxRecoveryQueueSize(AnalyticsConstants.DEFAULT_PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) - .build(); - - assertTrue("Default Publisher Config parameters must match", - actualDefaultPublisherConfig.equals(expectedDefaultPublisherConfig)); - - } - - - @Test - public void testPublisherCustomConfig() throws Exception { - - - final DMaaPMRPublisherConfig actualCustomPublisherConfig = getPublisherConfig(); - - final DMaaPMRPublisherConfig expectedCustomPublisherConfig = - new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setUserName(USERNAME) - .setUserPassword(PASSWORD) - .setContentType(CONTENT_TYPE) - .setProtocol(HTTP_PROTOCOL) - .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE) - .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) - .build(); - - assertTrue("Custom Publisher Config parameters must match", - actualCustomPublisherConfig.equals(expectedCustomPublisherConfig)); - } - - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java deleted file mode 100644 index 296c42f..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/domain/config/DMaaPMRSubscriberConfigTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.domain.config; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.common.AnalyticsConstants; -import org.openecomp.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; - -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 10/14/2016. - */ -public class DMaaPMRSubscriberConfigTest extends BaseAnalyticsDMaaPUnitTest { - - @Test - public void testSubscriberConfigDefaults() throws Exception { - - DMaaPMRSubscriberConfig actualDefaultSubscriberConfig = - new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) - .setConsumerGroup(AnalyticsConstants.DEFAULT_SUBSCRIBER_GROUP_PREFIX + SUBSCRIBER_CONSUMER_ID) - .setConsumerId(SUBSCRIBER_CONSUMER_ID).build(); - - DMaaPMRSubscriberConfig expectedSubscriberConfig = - new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(AnalyticsConstants.DEFAULT_PORT_NUMBER) - .setContentType(AnalyticsConstants.DEFAULT_CONTENT_TYPE) - .setProtocol(AnalyticsConstants.DEFAULT_PROTOCOL) - .setConsumerGroup(AnalyticsConstants.DEFAULT_SUBSCRIBER_GROUP_PREFIX + SUBSCRIBER_CONSUMER_ID) - .setConsumerId(SUBSCRIBER_CONSUMER_ID) - .setMessageLimit(AnalyticsConstants.DEFAULT_SUBSCRIBER_MESSAGE_LIMIT) - .setTimeoutMS(AnalyticsConstants.DEFAULT_SUBSCRIBER_TIMEOUT_MS) - .build(); - - assertTrue("Default Subscriber Config parameters must match", - actualDefaultSubscriberConfig.equals(expectedSubscriberConfig)); - - } - - - @Test - public void testSubscriberCustomConfig() throws Exception { - - DMaaPMRSubscriberConfig actualSubscriberCustomConfig = getSubscriberConfig(SUBSCRIBER_CONSUMER_ID, - SUBSCRIBER_CONSUMER_GROUP_NAME); - - DMaaPMRSubscriberConfig expectedSubscriberCustomConfig = - new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setUserName(USERNAME) - .setUserPassword(PASSWORD) - .setContentType(CONTENT_TYPE) - .setProtocol(HTTP_PROTOCOL) - .setConsumerGroup(SUBSCRIBER_CONSUMER_GROUP_NAME) - .setConsumerId(SUBSCRIBER_CONSUMER_ID) - .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT) - .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) - .build(); - - assertTrue("Custom Subscriber Config parameters must match", - actualSubscriberCustomConfig.equals(expectedSubscriberCustomConfig)); - - } - - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java deleted file mode 100644 index 840d356..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/BaseAnalyticsDMaaPIT.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.it; - -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; - -import java.util.List; - -import static com.google.common.collect.ImmutableList.of; - -/** - * Base class for all DCAE DMaaP Integration Tests - *

- * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -public abstract class BaseAnalyticsDMaaPIT extends BaseDCAEAnalyticsIT { - - // Integration Test Settings - protected static final String HOST_NAME = "mrlocal-mtnjftle01.homer.com"; - protected static final Integer PORT_NUMBER = 3905; - protected static final String TOPIC_NAME = "com.dcae.dmaap.mtnje2.DcaeTestVESPub"; - - protected static final String USERNAME = "USER"; - protected static final String PASSWORD = "PASSWORD"; - protected static final String HTTP_PROTOCOL = "https"; - protected static final String CONTENT_TYPE = "application/json"; - - protected static final int PUBLISHER_MAX_BATCH_QUEUE_SIZE = 20; - protected static final int PUBLISHER_MAX_RECOVERY_QUEUE_SIZE = 200; - - protected static final String SUBSCRIBER_CONSUMER_ID = "123"; - protected static final String SUBSCRIBER_CONSUMER_GROUP_NAME = "testGonsumerName-" + SUBSCRIBER_CONSUMER_ID; - protected static final int SUBSCRIBER_TIMEOUT_MS = 2000; - protected static final int SUBSCRIBER_MESSAGE_LIMIT = 20; - - /** - * Creates Sample Publisher settings for integration testing purposes - * - * @return DMaaP MR Publisher Config - */ - protected static DMaaPMRPublisherConfig getPublisherConfig() { - return new DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setProtocol(HTTP_PROTOCOL) - .setContentType(CONTENT_TYPE) - .setUserName(USERNAME) - .setUserPassword(PASSWORD) - .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE) - .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) - .build(); - } - - /** - * Creates Sample Subscriber settings for integration testing purposes - * - * @return DMaaP MR Subscriber Config - */ - protected static DMaaPMRSubscriberConfig getSubscriberConfig(String consumerId) { - return new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setProtocol(HTTP_PROTOCOL) - .setContentType(CONTENT_TYPE) - .setUserName(USERNAME) - .setUserPassword(PASSWORD) - .setConsumerGroup(SUBSCRIBER_CONSUMER_GROUP_NAME) - .setConsumerId(consumerId != null ? consumerId : SUBSCRIBER_CONSUMER_ID) - .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) - .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT).build(); - } - - /** - * Publishes 2 sample message to DMaaP Topic for integration test purposes - * - * @param dMaaPMRPublisher DMaaP MR Publisher - * @return DMaaP MR Publisher Response - */ - protected static DMaaPMRPublisherResponse publishTwoSampleMessages(DMaaPMRPublisher dMaaPMRPublisher) { - return dMaaPMRPublisher.publish(getTwoSampleMessage()); - } - - protected static List getTwoSampleMessage() { - String message1 = "{ \"message\" : \"Test Message1\"}"; - String message2 = "{ \"message\" : \"Test Message2\"}"; - return of(message1, message2); - } - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java deleted file mode 100644 index 0d09f3b..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRPublisherImplIT.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.it; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; - -/** - * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -@Ignore -public class DMaaPMRPublisherImplIT extends BaseAnalyticsDMaaPIT { - - private DMaaPMRPublisher dMaaPMRPublisher; - - @Before - public void before() throws Exception { - DMaaPMRFactory dMaaPMRFactory = DMaaPMRFactory.create(); - dMaaPMRPublisher = dMaaPMRFactory.createPublisher(getPublisherConfig()); - } - - @Test - public void testPublish() throws Exception { - long pendingMessageCount = publishTwoSampleMessages(dMaaPMRPublisher).getPendingMessagesCount(); - Assert.assertTrue("Published Message Count must be 2", pendingMessageCount == 2); - } - - @Test - public void testFlush() throws Exception { - publishTwoSampleMessages(dMaaPMRPublisher); - DMaaPMRPublisherResponse publisherResponse = dMaaPMRPublisher.flush(); - Integer responseCode = publisherResponse.getResponseCode(); - Assert.assertTrue("Server Response code must be 200", responseCode == 200); - } -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java deleted file mode 100644 index a336ef5..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/it/DMaaPMRSubscriberImplIT.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.it; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; - -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; - -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 10/13/2016. - */ -@Ignore -public class DMaaPMRSubscriberImplIT extends BaseAnalyticsDMaaPIT { - - private DMaaPMRPublisher dMaaPMRPublisher; - private DMaaPMRSubscriber dMaaPMRSubscriber; - - @Before - public void before() throws Exception { - String randomConsumerID = UUID.randomUUID().toString(); - DMaaPMRFactory dMaaPMRFactory = DMaaPMRFactory.create(); - dMaaPMRSubscriber = dMaaPMRFactory.createSubscriber(getSubscriberConfig(randomConsumerID)); - dMaaPMRPublisher = dMaaPMRFactory.createPublisher(getPublisherConfig()); - } - - @After - public void after() throws Exception { - dMaaPMRSubscriber.close(); - dMaaPMRPublisher.close(); - } - - - @Test - public void testFetchMessages() throws Exception { - - // This call is used to just register a brand new subscriber with DMaaP - DMaaPMRSubscriberResponse subscriberRegistrationResponse = dMaaPMRSubscriber.fetchMessages(); - assertTrue("Subscriber Registration Response code must be 200 confirming subscriber was registered " + - "successfully", subscriberRegistrationResponse.getResponseCode() == 200); - assertTrue("Subscriber Registration Response must not contain any messages", subscriberRegistrationResponse - .getFetchedMessages().size() == 0); - - // Force push couple of test messages - DMaaPMRPublisherResponse publisherResponse = dMaaPMRPublisher.forcePublish(getTwoSampleMessage()); - assertTrue("Message must be posted successfully before subscriber can fetch it", publisherResponse - .getResponseCode() == 200); - - // Now fetch messages from DMaaP - DMaaPMRSubscriberResponse subscriberResponse = dMaaPMRSubscriber.fetchMessages(); - List messageList = new LinkedList<>(); - for (String message : subscriberResponse.getFetchedMessages()) { - messageList.add(message); - } - assertTrue("Subscriber message count must be 2", messageList.size() == 2); - } - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java deleted file mode 100644 index e7e536e..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/module/AnalyticsDMaaPTestModule.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.module; - -import com.google.inject.AbstractModule; -import com.google.inject.assistedinject.FactoryModuleBuilder; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherMockImpl; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueueImpl; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberFactory; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriberMockImpl; - -/** - * DMaaP Guice Test Module - *

- * @author Rajiv Singla . Creation Date: 10/20/2016. - */ -public class AnalyticsDMaaPTestModule extends AbstractModule { - - - @Override - protected void configure() { -// Bind Http Client - bind(CloseableHttpClient.class).toInstance(HttpClients.createDefault()); - - // Bind Publishing queue - install(new FactoryModuleBuilder().implement(DMaaPMRPublisherQueue.class, DMaaPMRPublisherQueueImpl.class) - .build(DMaaPMRPublisherQueueFactory.class)); - - install(new FactoryModuleBuilder().implement(DMaaPMRPublisher.class, DMaaPMRPublisherMockImpl.class) - .build(DMaaPMRPublisherFactory.class)); - - install(new FactoryModuleBuilder().implement(DMaaPMRSubscriber.class, DMaaPMRSubscriberMockImpl.class) - .build(DMaaPMRSubscriberFactory.class)); - } -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java deleted file mode 100644 index 4265c46..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/BaseDMaaPMRComponentTest.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.common.base.Optional; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.StatusLine; -import org.apache.http.client.ResponseHandler; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.Mockito; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisherQueue; - -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.isA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -/** - * @author Manjesh Gowda. Creation Date: 11/4/2016. - */ -public class BaseDMaaPMRComponentTest extends BaseAnalyticsDMaaPUnitTest { - - @Test - public void testGetAuthHeaderWithGoodValues() { - String expectedEncodedString = "Basic bTAwNTAyQHRjYS5hZi5kY2FlLmNvbTpUZTUwMjFhYmM="; - Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader("USER", "PASSWORD"); - assertTrue(" Authentication Header has value ", actualOutput.isPresent()); -// assertEquals(" Authentication Header has value ", expectedEncodedString, actualOutput.get()); - } - - @Test - public void testGetAuthHeaderWithNullValues() { - Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader(null, null); - assertFalse(" Authentication Header has value ", actualOutput.isPresent()); - } - - @Test - public void testGetAuthHeaderWithUserNullValue() { - Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader("USER", null); - assertFalse(" Authentication Header has value ", actualOutput.isPresent()); - } - - @Test - public void testGetAuthHeaderWithPasswordNullValue() { - Optional actualOutput = BaseDMaaPMRComponent.getAuthHeader(null, "PASSWORD"); - assertFalse(" Authentication Header has value ", actualOutput.isPresent()); - } - - @Test - public void testCreatePublishURIWithGoodValues() { - URI actualURI = BaseDMaaPMRComponent.createPublisherURI(getPublisherConfig()); - String test = actualURI.toString(); - assertEquals("Generated Publisher URL is correct", - "https://testHostName:8080/events/testTopicName", actualURI.toString()); - } - - @Test(expected = DCAEAnalyticsRuntimeException.class) - public void testCreatePublishURIWithURISyntaxException() { - DMaaPMRPublisherConfig badPublisherConfig = new DMaaPMRPublisherConfig - .Builder(" dav /gh. ss/ asd ", "///@$%#-htps:<>!##") - .setPortNumber(0) - .setProtocol("https").build(); - - BaseDMaaPMRComponent.createPublisherURI(badPublisherConfig); - } - - @Test - public void testCreateSubscribeURIWithGoodValues() { - URI actualURI = BaseDMaaPMRComponent.createSubscriberURI( - getSubscriberConfig("test-consumer-group", "test-consumer-id")); - assertEquals("Generated Subscriber URL is correct", - "https://testHostName:8080/events/testTopicName/" + - "test-consumer-id/test-consumer-group?timeout=2000&limit=20", - actualURI.toString()); - } - - @Test(expected = DCAEAnalyticsRuntimeException.class) - public void testCreateSubscribeURIWithURISyntaxException() { - DMaaPMRSubscriberConfig badSubscriberConfig = new DMaaPMRSubscriberConfig - .Builder(" dav /gh. ss/ asd ", "") - .setPortNumber(PORT_NUMBER) - .setProtocol(HTTP_PROTOCOL) - .setContentType(CONTENT_TYPE).build(); - - URI actualURI = BaseDMaaPMRComponent.createSubscriberURI(badSubscriberConfig); - } - - @Test - public void testConvertToJsonStringGoodJsonStringList() { - List jsonMessage = Arrays.asList( - "{\"message\":\"I'm Object 1 Message\"}", - "{\"message\":\"I'm Object 2 Message\"}"); - - String actualJSONMsg = BaseDMaaPMRComponent.convertToJsonString(jsonMessage); - - String expectedJSONMsg = "[{\"message\":\"I'm Object 1 Message\"}," + - "{\"message\":\"I'm Object 2 Message\"}]"; - assertEquals("Convert a List of Strings to JSON is working fine", expectedJSONMsg, actualJSONMsg); - - } - - @Rule - public ExpectedException expectedJsonProcessingException = ExpectedException.none(); - - @Test - public void testConvertToJsonStringBadJsonStringList() { - expectedJsonProcessingException.expect(DCAEAnalyticsRuntimeException.class); - expectedJsonProcessingException.expectCause(isA(JsonProcessingException.class)); - - List jsonMessage = Arrays.asList( - "{\"message\":\"I'm Object 1 Message\"", - "\"message\":\"I'm Object 2 Message\""); - - BaseDMaaPMRComponent.convertToJsonString(jsonMessage); - } - - @Test - public void testConvertToJsonStringWithEmptyList() { - List jsonMessage = Arrays.asList(); - String actualJSONMsg = BaseDMaaPMRComponent.convertToJsonString(jsonMessage); - String expectedJSONMsg = "[]"; - assertEquals("Convert a List of Strings to JSON is working fine", expectedJSONMsg, actualJSONMsg); - } - - @Test - public void testConvertToJsonStringWithNullList() { - String actualJSONMsg = BaseDMaaPMRComponent.convertToJsonString(null); - String expectedJSONMsg = "[]"; - assertEquals("Convert a List of Strings to JSON is working fine", expectedJSONMsg, actualJSONMsg); - } - - - @Test - public void testConvertJsonToStringMessagesGoodValues() { - String inputJSONMsg = "[{\"message\":\"I'm Object 1 Message\"}," + - "{\"message\":\"I'm Object 2 Message\"}]"; - List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(inputJSONMsg); - assertThat(actualList, hasSize(2)); - assertThat(actualList, containsInAnyOrder( - "{\"message\":\"I'm Object 1 Message\"}", - "{\"message\":\"I'm Object 2 Message\"}" - )); - } - - @Test - public void testConvertJsonToStringMessagesNoValues() { - String inputJSONMsg = "[]"; - List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(inputJSONMsg); - assertThat(actualList, hasSize(0)); - } - - @Test - public void testConvertJsonToStringMessagesNullValues() { - List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(null); - assertThat(actualList, hasSize(0)); - } - - @Test - public void testConvertJsonToStringMessagesEmptyValues() { - List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(" "); - assertThat(actualList, hasSize(0)); - } - - @Rule - public ExpectedException convertToJSONIOException = ExpectedException.none(); - - @Test - public void testConvertJsonToStringMessagesException() { - convertToJSONIOException.expect(DCAEAnalyticsRuntimeException.class); - convertToJSONIOException.expectCause(isA(IOException.class)); - - String inputJSONMsg = "[\"{\"message\":\"I'm Object 1 Message\"}\"," + - "\"{\"message\":\"I'm Object 2 Message\"}\"]"; - List actualList = BaseDMaaPMRComponent.convertJsonToStringMessages(inputJSONMsg); - assertThat(actualList, hasSize(2)); - assertThat(actualList, containsInAnyOrder( - "{\"message\":\"I'm Object 1 Message\"}", - "{\"message\":\"I'm Object 2 Message\"}" - )); - } - - @Test - public void testAddMessagesToRecoveryQueueAllGood() { - DMaaPMRPublisherQueue dmaapMRPublisherQueue = mock(DMaaPMRPublisherQueue.class); - given(dmaapMRPublisherQueue.addRecoverableMessages(Mockito.anyList())).willReturn(0); - given(dmaapMRPublisherQueue.getBatchQueueRemainingSize()).willReturn(0); - List messages = new ArrayList(); - BaseDMaaPMRComponent.addMessagesToRecoveryQueue(dmaapMRPublisherQueue, messages); - } - - @Rule - public ExpectedException addQueueIllegalException = ExpectedException.none(); - - @Test - public void testAddMessagesToRecoveryQueueException() { - addQueueIllegalException.expect(isA(DCAEAnalyticsRuntimeException.class)); - addQueueIllegalException.expectCause(isA(IllegalStateException.class)); - - DMaaPMRPublisherQueue dmaapMRPublisherQueue = mock(DMaaPMRPublisherQueue.class); - - given(dmaapMRPublisherQueue.addRecoverableMessages(Mockito.anyList())) - .willThrow(IllegalStateException.class); - List messages = new ArrayList(); - - BaseDMaaPMRComponent.addMessagesToRecoveryQueue(dmaapMRPublisherQueue, messages); - } - - - @Test - public void testResponseHandler() { - HttpResponse mockHttpResponse = mock(HttpResponse.class); - StatusLine mockStatusLine = mock(StatusLine.class); - HttpEntity mockHttpEntity = mock(HttpEntity.class); - // Could not mock EntityUtils as it's final class - //EntityUtils mockEntityUtils = mock(EntityUtils.class); - - given(mockHttpResponse.getStatusLine()).willReturn(mockStatusLine); - given(mockStatusLine.getStatusCode()).willReturn(200); - given(mockHttpResponse.getEntity()).willReturn(null); - //given(mockEntityUtils.toString()).willReturn("Test value"); - - ResponseHandler> responseHandler = BaseDMaaPMRComponent.responseHandler(); - try { - Pair mappedResponse = responseHandler.handleResponse(mockHttpResponse); - assertTrue("Http response code returned properly ", mappedResponse.getLeft().equals(200)); - assertTrue("Http response body returned properly ", mappedResponse.getRight().equals("")); - } catch (IOException e) { - e.printStackTrace(); - } - } - - - @Test - public void testCreateSubscriberResponse() { - DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = - BaseDMaaPMRComponent.createSubscriberResponse(200, "Test Message", getTwoSampleMessages()); - - assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); - assertEquals(dmaapMRSubscriberResponse.getResponseMessage(), "Test Message"); - assertThat(dmaapMRSubscriberResponse.getFetchedMessages().size(), is(2)); - - } - - @Test - public void testCreateSubscriberResponse_no_message() { - DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = - BaseDMaaPMRComponent.createSubscriberResponse(200, "Test Message", null); - - assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); - assertEquals(dmaapMRSubscriberResponse.getResponseMessage(), "Test Message"); - assertThat(dmaapMRSubscriberResponse.getFetchedMessages().size(), is(0)); - - } - -} - - - - - diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java deleted file mode 100644 index d38d59c..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherImplTest.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.impl.client.CloseableHttpClient; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; - -import java.io.IOException; -import java.util.ArrayList; - -import static org.hamcrest.CoreMatchers.isA; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -/** - * @author Rajiv Singla . Creation Date: 10/21/2016. - */ -@RunWith(MockitoJUnitRunner.class) -public class DMaaPMRPublisherImplTest extends BaseAnalyticsDMaaPUnitTest { - - @Mock - private DMaaPMRPublisherQueueFactory dmaapMRPublisherQueueFactory; - @Mock - private CloseableHttpClient closeableHttpClient; - @Mock - private DMaaPMRPublisherQueue dmaapMRPublisherQueue; - - @Before - public void setUp() throws Exception { - given(dmaapMRPublisherQueueFactory.create(Mockito.anyInt(), Mockito.anyInt())) - .willReturn(dmaapMRPublisherQueue); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testPublishSmallMessageList() throws Exception { - given(dmaapMRPublisherQueue.getBatchQueueRemainingSize()).willReturn(10); - given(dmaapMRPublisherQueue.addBatchMessages(Mockito.anyList())).willReturn(2); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - - DMaaPMRPublisherResponse dmaapMRPublisherResponse = dmaapMRPublisherImpl.publish(getTwoSampleMessages()); - - assertThat(dmaapMRPublisherResponse.getResponseCode(), is(202)); - assertThat(dmaapMRPublisherResponse.getPendingMessagesCount(), is(2)); - assertThat(dmaapMRPublisherResponse.getResponseMessage(), - is("Accepted - Messages queued for batch publishing to MR Topic")); - } - - @Test - public void testPublishBigMessageList() throws Exception { - - given(dmaapMRPublisherQueue.getBatchQueueRemainingSize()).willReturn(0); - given(dmaapMRPublisherQueue.getMessageForPublishing()).willReturn(getTwoSampleMessages()); - Mockito.when( - closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - - DMaaPMRPublisherResponse dmaapMRPublisherResponse = dmaapMRPublisherImpl.publish(getTwoSampleMessages()); - - assertThat(dmaapMRPublisherResponse.getResponseCode(), is(200)); - assertThat(dmaapMRPublisherResponse.getPendingMessagesCount(), is(200)); - assertThat(dmaapMRPublisherResponse.getResponseMessage(), is("Message successfully posted")); - } - - @Test - public void testForcePublishSuccessful() throws Exception { - DMaaPMRPublisherConfig dmaapMRPublisherConfig = new - DMaaPMRPublisherConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setProtocol(HTTP_PROTOCOL) - .setContentType(CONTENT_TYPE) - .setMaxRecoveryQueueSize(PUBLISHER_MAX_RECOVERY_QUEUE_SIZE) - .setMaxBatchSize(PUBLISHER_MAX_BATCH_QUEUE_SIZE).build(); - - Mockito.when(closeableHttpClient.execute( - Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - dmaapMRPublisherConfig, dmaapMRPublisherQueueFactory, closeableHttpClient); - DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.forcePublish(getTwoSampleMessages()); - assertThat(response.getResponseCode(), is(200)); - } - - @Test - public void testForcePublishFailure() throws Exception { - Mockito.when(closeableHttpClient.execute( - Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(503, "Message successfully posted")); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.forcePublish(getTwoSampleMessages()); - assertThat(response.getResponseCode(), is(503)); - } - - @Rule - public ExpectedException httpIOException = ExpectedException.none(); - - @Test - public void testForcePublishHttpFailure() throws Exception { - - httpIOException.expect(DCAEAnalyticsRuntimeException.class); - httpIOException.expectCause(isA(IOException.class)); - - given(closeableHttpClient.execute( - Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))).willThrow(IOException.class); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - dmaapMRPublisherImpl.forcePublish(getTwoSampleMessages()); - } - - @Test - public void testFlushSuccessful() throws Exception { - Mockito.when(closeableHttpClient.execute( - Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); - - Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(getTwoSampleMessages()); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.flush(); - assertThat(response.getResponseCode(), is(200)); - } - - @Test - public void testFlushEmptyList() throws Exception { - Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(new ArrayList()); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - DMaaPMRPublisherResponse response = dmaapMRPublisherImpl.flush(); - assertThat(response.getResponseCode(), is(204)); - } - - @Test - public void testClose() throws Exception { - Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(new ArrayList()); - Mockito.when(closeableHttpClient.execute( - Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(200, "Message successfully posted")); - Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(getTwoSampleMessages()); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - dmaapMRPublisherImpl.close(); - verify(closeableHttpClient).execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class)); - } - - @Test - public void testCloseUnsuccessful() throws Exception { - Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(new ArrayList()); - Mockito.when(closeableHttpClient.execute( - Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(400, "Message successfully posted")); - Mockito.when(dmaapMRPublisherQueue.getMessageForPublishing()).thenReturn(getTwoSampleMessages()); - - DMaaPMRPublisherImpl dmaapMRPublisherImpl = new DMaaPMRPublisherImpl( - getPublisherConfig(), dmaapMRPublisherQueueFactory, closeableHttpClient); - dmaapMRPublisherImpl.close(); - verify(closeableHttpClient, times(6)).execute(Mockito.any(HttpUriRequest.class), - Mockito.any(ResponseHandler.class)); - } -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java deleted file mode 100644 index 6902d1d..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherMockImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponseImpl; - -import java.util.Date; -import java.util.List; - -/** - * @author Rajiv Singla . Creation Date: 10/21/2016. - */ -public class DMaaPMRPublisherMockImpl implements DMaaPMRPublisher { - - @Override - public DMaaPMRPublisherResponse publish(List messages) throws DCAEAnalyticsRuntimeException { - return new DMaaPMRPublisherResponseImpl(102, "Mock Response", 100); - } - - @Override - public DMaaPMRPublisherResponse forcePublish(List messages) throws DCAEAnalyticsRuntimeException { - return null; - } - - @Override - public DMaaPMRPublisherResponse flush() { - return null; - } - - @Override - public Date getPublisherCreationTime() { - return null; - } - - @Override - public void close() throws Exception { - - } -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java deleted file mode 100644 index 518765d..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueImplTest.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; - -import java.util.List; - -import static org.junit.Assert.assertTrue; - -/** - * - * @author Rajiv Singla . Creation Date: 11/2/2016. - */ -public class DMaaPMRPublisherQueueImplTest extends BaseAnalyticsDMaaPUnitTest { - - - @Test - public void testAddBatchMessages() throws Exception { - DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); - // add two messages to batch queue - final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); - // add two more message to batch queue - final int batchMessagesSizeAfterSecondInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 4", batchMessagesSizeAfterSecondInsert == 4); - // Now get all messages which must drain out batch queue - final List messagesToPublish = publisherQueue.getMessageForPublishing(); - assertTrue("There must be 4 messages to publish", messagesToPublish.size() == 4); - assertTrue("Batch Queue must be empty", publisherQueue.getBatchQueueRemainingSize() == 10); - - } - - @Test(expected = IllegalStateException.class) - public void testAddBatchMessagesWhenQueueSizeIsFull() throws Exception { - DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(2, 20); - // add two messages to batch queue - final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); - // add 2 more messages should now throw IllegalStateException - publisherQueue.addBatchMessages(getTwoSampleMessages()); - } - - @Test - public void testAddRecoverableMessages() throws Exception { - DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); - // add two messages to batch queue - final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); - // add two recoverable messages - final int recoverableMessageSizeAfterFirstInsert = - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - assertTrue("Recovery Message Queue size must be 2 after first insert", - recoverableMessageSizeAfterFirstInsert == 2); - // add two more recoverable messages - final int recoverableMessageSizeAfterSecondInsert = - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - assertTrue("Recovery Message Queue size must be 4 after second insert", - recoverableMessageSizeAfterSecondInsert == 4); - // Now get all messages which must drain out batch queue - final List messagesToPublish = publisherQueue.getMessageForPublishing(); - assertTrue("There must be 6 messages to publish", messagesToPublish.size() == 6); - assertTrue("Batch Queue must be empty", publisherQueue.getBatchQueueRemainingSize() == 10); - assertTrue("Recovery Queue must be empty", publisherQueue.getRecoveryQueueRemainingSize() == 20); - } - - - @Test(expected = IllegalStateException.class) - public void testAddRecoverableMessagesWhenRecoveryQueueIsFull() throws Exception { - DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 2); - // add two messages to batch queue - final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); - // add two recoverable messages - final int recoverableMessageSizeAfterFirstInsert = - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - assertTrue("Recovery Message Queue size must be 2 after first insert", - recoverableMessageSizeAfterFirstInsert == 2); - // add two more recoverable messages which should throw IllegalStateException - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - } - - @Test - public void testGetMessageForPublishing() throws Exception { - DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); - // add two messages to batch queue - final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); - // add two recoverable messages - final int recoverableMessageSizeAfterFirstInsert = - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - assertTrue("Recovery Message Queue size must be 2 after first insert", - recoverableMessageSizeAfterFirstInsert == 2); - // add two more recoverable messages - final int recoverableMessageSizeAfterSecondInsert = - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - assertTrue("Recovery Message Queue size must be 4 after second insert", - recoverableMessageSizeAfterSecondInsert == 4); - // Now get all messages which must drain out batch queue - final List messagesToPublish = publisherQueue.getMessageForPublishing(); - assertTrue("There must be 6 messages to publish", messagesToPublish.size() == 6); - // add two more batch and recovery messages - final int batchQueueSize = publisherQueue.addBatchMessages(getTwoSampleMessages()); - final int recoveryQueueSize = publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - final int messagePublishCount = publisherQueue.getMessageForPublishing().size(); - assertTrue("Batch Queue + Recovery Queue message total must batch publish message count", - messagePublishCount == (batchQueueSize + recoveryQueueSize)); - assertTrue("Batch Queue must be empty", publisherQueue.getBatchQueueRemainingSize() == 10); - assertTrue("Recovery Queue must be empty", publisherQueue.getRecoveryQueueRemainingSize() == 20); - - } - - @Test - public void testGetBatchQueueRemainingSize() throws Exception { - - DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); - // add two messages to batch queue - final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); - assertTrue("Batch remaining capacity should be reduced by 2", - publisherQueue.getBatchQueueRemainingSize() == 8); - - // add two recoverable messages - final int recoverableMessageSizeAfterFirstInsert = - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - assertTrue("Recovery Message Queue size must be 2 after first insert", - recoverableMessageSizeAfterFirstInsert == 2); - - // recoverable message should not change batch queue capacity - assertTrue("Adding recoverable Message must not have any impact on batch queue remaining capacity ", - publisherQueue.getBatchQueueRemainingSize() == 8); - // Now get all messages which must drain out batch queue - final List messagesToPublish = publisherQueue.getMessageForPublishing(); - assertTrue("There must be exactly 4 messages to publish", messagesToPublish.size() == 4); - - // Batch queue remaining capacity should now match original batch size - assertTrue("Batch Queue remaining capacity must match original batch queue size", publisherQueue - .getBatchQueueRemainingSize() == 10); - } - - @Test - public void testGetRecoveryQueueRemainingSize() throws Exception { - DMaaPMRPublisherQueue publisherQueue = new DMaaPMRPublisherQueueImpl(10, 20); - - // add two recoverable messages - final int recoverableMessageSizeAfterFirstInsert = - publisherQueue.addRecoverableMessages(getTwoSampleMessages()); - assertTrue("Recovery Message Queue size must be 2 after first insert", - recoverableMessageSizeAfterFirstInsert == 2); - assertTrue("Recovery Queue remaining capacity should be reduced by 2", - publisherQueue.getRecoveryQueueRemainingSize() == 18); - - // add two messages to batch queue - final int batchMessagesSizeAfterFirstInsert = publisherQueue.addBatchMessages(getTwoSampleMessages()); - assertTrue("Batch Message Queue size must be 2", batchMessagesSizeAfterFirstInsert == 2); - - // batch message should not change recoverable queue capacity - assertTrue("Adding batch queue Message must not have any impact on recovery queue remaining capacity ", - publisherQueue.getRecoveryQueueRemainingSize() == 18); - - // Now get all messages which must drain out recovery queue - final List messagesToPublish = publisherQueue.getMessageForPublishing(); - assertTrue("There must be exactly 4 messages to publish", messagesToPublish.size() == 4); - - // Recoverable queue remaining capacity should now match original recovery queue size - assertTrue("Recoverable Queue remaining capacity must match original batch queue size", publisherQueue - .getRecoveryQueueRemainingSize() == 20); - } - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java deleted file mode 100644 index 4de8f1b..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/publisher/DMaaPMRPublisherQueueMockImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.publisher; - -import java.util.List; - -/** - * @author Manjesh Gowda. Creation Date: 11/7/2016. - */ -public class DMaaPMRPublisherQueueMockImpl implements DMaaPMRPublisherQueue { - @Override - public int addBatchMessages(List batchMessages) throws IllegalStateException { - return 100; - } - - @Override - public int addRecoverableMessages(List recoverableMessages) throws IllegalStateException { - return 0; - } - - @Override - public List getMessageForPublishing() { - return null; - } - - @Override - public int getBatchQueueRemainingSize() { - return 0; - } - - @Override - public int getRecoveryQueueRemainingSize() { - return 0; - } -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java deleted file mode 100644 index 20902b0..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberImplTest.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.subscriber; - -import com.jayway.jsonassert.impl.matcher.IsCollectionWithSize; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.impl.client.CloseableHttpClient; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.BaseAnalyticsDMaaPUnitTest; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; - -import java.io.IOException; -import java.util.Random; -import java.util.UUID; - -import static org.hamcrest.CoreMatchers.isA; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static org.mockito.BDDMockito.given; - -/** - * @author Rajiv Singla . Creation Date: 10/21/2016. - */ -@RunWith(MockitoJUnitRunner.class) -public class DMaaPMRSubscriberImplTest extends BaseAnalyticsDMaaPUnitTest { - - @Mock - private CloseableHttpClient closeableHttpClient; - - private String consumerGroup, consumerId; - - @Before - public void setUp() throws Exception { - Random random = new Random(10000L); - consumerGroup = "Test-Consumer-Group" + Long.toString(random.nextLong()); - consumerId = UUID.randomUUID().toString(); - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void testSubscriberSuccessfullyReceiveDmaapMessage() throws Exception { - - String testMessages = "[{\"message\":\"I'm Object 1 Message\"}," + - "{\"message\":\"I'm Object 2 Message\"}]"; - Mockito.when( - closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(200, testMessages)); - - DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( - getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); - DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); - assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); - assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(2)); - } - - @Test - public void testSubscriberSuccessfullyReceiveDmaapMessageWithNoUsername() throws Exception { - - DMaaPMRSubscriberConfig dmaapMRSubscriberConfig = new DMaaPMRSubscriberConfig.Builder(HOST_NAME, TOPIC_NAME) - .setPortNumber(PORT_NUMBER) - .setProtocol(HTTP_PROTOCOL) - .setContentType(CONTENT_TYPE) - .setConsumerGroup(consumerGroup != null ? consumerGroup : SUBSCRIBER_CONSUMER_GROUP_NAME) - .setConsumerId(consumerId != null ? consumerId : SUBSCRIBER_CONSUMER_ID) - .setTimeoutMS(SUBSCRIBER_TIMEOUT_MS) - .setMessageLimit(SUBSCRIBER_MESSAGE_LIMIT).build(); - - String testMessages = "[{\"message\":\"I'm Object 1 Message\"}," + - "{\"message\":\"I'm Object 2 Message\"}]"; - Mockito.when( - closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(200, testMessages)); - - DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( - dmaapMRSubscriberConfig, closeableHttpClient); - DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); - assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); - assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(2)); - } - - @Test - public void testSubscriberSuccessfullyReceiveNoDmaapMessage() throws Exception { - Mockito.when( - closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(200, null)); - - DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( - getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); - DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); - assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(200)); - assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(0)); - } - - @Test - public void testSubscriberSuccessfullyReceiveErrorMessage() throws Exception { - Mockito.when( - closeableHttpClient.execute(Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))) - .thenReturn(new ImmutablePair<>(400, "Bad Request")); - - DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( - getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); - DMaaPMRSubscriberResponse dmaapMRSubscriberResponse = dmaapMRSubscriberImpl.fetchMessages(); - assertThat(dmaapMRSubscriberResponse.getResponseCode(), is(400)); - assertThat(dmaapMRSubscriberResponse.getFetchedMessages(), IsCollectionWithSize.hasSize(0)); - } - - @Rule - public ExpectedException httpIOException = ExpectedException.none(); - - @Test - public void testSubscriberSuccessfullyReceiveException() throws Exception { - - httpIOException.expect(DCAEAnalyticsRuntimeException.class); - httpIOException.expectCause(isA(IOException.class)); - - given(closeableHttpClient.execute( - Mockito.any(HttpUriRequest.class), Mockito.any(ResponseHandler.class))).willThrow(IOException.class); - - DMaaPMRSubscriberImpl dmaapMRSubscriberImpl = new DMaaPMRSubscriberImpl( - getSubscriberConfig(consumerId, consumerGroup), closeableHttpClient); - dmaapMRSubscriberImpl.fetchMessages(); - } - -} diff --git a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java b/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java deleted file mode 100644 index 05b8ba6..0000000 --- a/dcae-analytics-dmaap/src/test/java/org/openecomp/dcae/apod/analytics/dmaap/service/subscriber/DMaaPMRSubscriberMockImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.dmaap.service.subscriber; - -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponseImpl; - -import java.util.Date; - -/** - * @author Rajiv Singla . Creation Date: 10/21/2016. - */ -public class DMaaPMRSubscriberMockImpl implements DMaaPMRSubscriber { - - @Override - public DMaaPMRSubscriberResponse fetchMessages() throws DCAEAnalyticsRuntimeException { - return new DMaaPMRSubscriberResponseImpl(102, "Mock Response", null); - } - - @Override - public Date getSubscriberCreationTime() { - return null; - } - - @Override - public void close() throws Exception { - - } -} diff --git a/dcae-analytics-dmaap/src/test/resources/logback-test.xml b/dcae-analytics-dmaap/src/test/resources/logback-test.xml index 4857522..78cbdfa 100644 --- a/dcae-analytics-dmaap/src/test/resources/logback-test.xml +++ b/dcae-analytics-dmaap/src/test/resources/logback-test.xml @@ -1,55 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + + + + + + + + + + diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java new file mode 100644 index 0000000..d459f36 --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java @@ -0,0 +1,40 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.cucumber; + +import cucumber.api.CucumberOptions; +import cucumber.api.SnippetType; +import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; + +/** + * @author Rajiv Singla . Creation Date: 2/1/2017. + */ + +@RunWith(Cucumber.class) +@CucumberOptions( + plugin = {"pretty", "json:target/cucumber/cucumber.json", "html:target/cucumber"}, + features = {"src/test/resources/cucumber/features/dmaap"}, + glue = {"org.onap.dcae.apod.analytics.it.cucumber.steps"}, + snippets = SnippetType.CAMELCASE +) +public class CucumberRunnerIT { +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java new file mode 100644 index 0000000..c74cc8d --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java @@ -0,0 +1,129 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.cucumber.steps; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import cucumber.api.java.en.And; +import cucumber.api.java.en.Given; +import cucumber.api.java.en.Then; +import cucumber.api.java.en.When; +import org.onap.dcae.apod.analytics.common.utils.HTTPUtils; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; +import org.onap.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; +import org.onap.dcae.apod.analytics.it.dmaap.DMaaPMRCreator; +import org.onap.dcae.apod.analytics.it.util.StepUtils; +import org.onap.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author Rajiv Singla . Creation Date: 2/1/2017. + */ +public class DMaaPMRSteps extends BaseDCAEAnalyticsIT { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSteps.class); + + private final DMaaPMRCreator dMaaPMRCreator; + private final String defaultPublisherTopicName; + + private static DMaaPMRSubscriberResponse subscriberResponse; + private static String messageToPublish; + private static String fetchedMessage; + + @Inject + public DMaaPMRSteps(DMaaPMRCreator dMaaPMRCreator, + @Named("dmaap.mr.publisher.topicName") String defaultPublisherTopicName) { + this.dMaaPMRCreator = dMaaPMRCreator; + this.defaultPublisherTopicName = defaultPublisherTopicName; + } + + + @Given("^DMaaP MR Service is up$") + public void dmaapMRServiceIsUp() throws Throwable { + final DMaaPMRSubscriber subscriber = + dMaaPMRCreator.getDMaaPMRSubscriberWithTopicName(defaultPublisherTopicName); + final DMaaPMRSubscriberResponse subscriberResponse = subscriber.fetchMessages(); + assertNotNull(subscriberResponse.getResponseCode()); + assertTrue(HTTPUtils.isSuccessfulResponseCode(subscriberResponse.getResponseCode())); + LOG.info("Subscriber is able to fetch messages successfully - Verified DMaaP MR Service is UP"); + } + + @When("^I publish json message to publisher topic name \"([^\"]*)\" in file \"([^\"]*)\"$") + public void iPublishJsonMessageToPublisherTopicNameInFile(String publisherTopicName, String fileLocation) + throws Throwable { + String publisherTopic; + if (StepUtils.isDefaultPublisherTopic(publisherTopicName)) { + publisherTopic = defaultPublisherTopicName; + } else { + publisherTopic = publisherTopicName; + } + final DMaaPMRPublisher publisher = dMaaPMRCreator.getDMaaPMRPublisherWithTopicName(publisherTopic); + messageToPublish = fromStream(fileLocation); + final DMaaPMRPublisherResponse publisherResponse = publisher.publish(Arrays.asList(messageToPublish)); + LOG.info("Publisher published messages to DMaaP MR Topic - Response: {}", publisherResponse); + assertTrue(HTTPUtils.isSuccessfulResponseCode(publisherResponse.getResponseCode())); + } + + @And("^wait for \"([^\"]*)\" seconds$") + public void waitForSeconds(Integer waitInSeconds) throws Throwable { + TimeUnit.SECONDS.sleep(waitInSeconds); + LOG.info("Waking up after sleep: {} seconds", waitInSeconds); + } + + @And("^subscriber fetch message from publisher topic name \"([^\"]*)\"$") + public void fetchMessageFrom(String publisherTopicName) throws Throwable { + String publisherTopic; + if (StepUtils.isDefaultPublisherTopic(publisherTopicName)) { + publisherTopic = defaultPublisherTopicName; + } else { + publisherTopic = publisherTopicName; + } + final DMaaPMRSubscriber subscriber = dMaaPMRCreator.getDMaaPMRSubscriberWithTopicName(publisherTopic); + subscriberResponse = subscriber.fetchMessages(); + LOG.info("Subscriber fetched messages to DMaaP MR Topic - Response: {}", subscriberResponse); + assertTrue(HTTPUtils.isSuccessfulResponseCode(subscriberResponse.getResponseCode())); + } + + @And("^compare fetched json message with published message$") + public void compareFetchedJsonMessageWithPublishedMessage() throws Throwable { + + fetchedMessage = subscriberResponse.getFetchedMessages().get(0); + LOG.info("Fetched Json Message: {}", fetchedMessage); + LOG.info("Published Json Message: {}", messageToPublish); + } + + @Then("^fetched message must be same as published message$") + public void fetchedMessageMustBeSameAsPublishedMessage() throws Throwable { + assertJson(messageToPublish, fetchedMessage); + } + + + +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java new file mode 100644 index 0000000..6bae6bc --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java @@ -0,0 +1,83 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.dmaap; + +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; + +import java.util.Map; + +/** + * Creates DMaaP MR Publisher and Subscriber Instances for Integration Testing purposes + *

+ * @author Rajiv Singla . Creation Date: 2/1/2017. + */ +public interface DMaaPMRCreator { + + /** + * Provides {@link DMaaPMRSubscriber} instance for Integration testing configured for the specific test + * environment + * + * @return DMaaP MR Subscriber instance for integration testing + */ + DMaaPMRSubscriber getDMaaPMRSubscriber(); + + + /** + * Provides {@link DMaaPMRSubscriber} instance for Integration testing configured with given topic name + * + * @param subscriberTopicName DMaaP MR Subscriber Topic Name + * @return DMaaP MR Subscriber instance which is subscriber to given subscriber topic + */ + DMaaPMRSubscriber getDMaaPMRSubscriberWithTopicName(String subscriberTopicName); + + /** + * Provides {@link DMaaPMRPublisher} instance for Integration testing configured for the specific test + * environment + * + * @return DMaaP MR Publisher instance for integration testing + */ + DMaaPMRPublisher getDMaaPMRPublisher(); + + + /** + * Provides {@link DMaaPMRPublisher} instance for Integration testing configured with given topic name + * + * @param publisherTopicName DMaaP MR publisher topic name + * @return DMaaP MR Publisher instance for integration testing + */ + DMaaPMRPublisher getDMaaPMRPublisherWithTopicName(String publisherTopicName); + + /** + * Provides a map of DMaaP subscriber config for Integration testing configured with given topic name + * + * @return Map of key-value pair of subscriber config + */ + Map getDMaaPMRSubscriberConfig(); + + /** + * Provides a map of DMaaP publisher config for Integration testing configured with given topic name + * + * @return Map of key-value pair of publisher config + */ + Map getDMaaPMRPublisherConfig(); + +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java new file mode 100644 index 0000000..1055fe2 --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java @@ -0,0 +1,225 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.dmaap; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import org.onap.dcae.apod.analytics.dmaap.DMaaPMRFactory; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; +import org.onap.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; +import org.onap.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; +import org.onap.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Rajiv Singla . Creation Date: 2/1/2017. + */ +public class DMaaPMRCreatorImpl implements DMaaPMRCreator { + + private final String subscriberHostName; + + private final Integer subscriberHostPort; + + private final String subscriberTopicName; + + private final String subscriberProtocol; + + private final String subscriberUserName; + + private final String subscriberUserPassword; + + private final String subscriberContentType; + + private final String subscriberConsumerId; + + private final String subscriberConsumerGroup; + + private final Integer subscriberTimeoutMS; + + private final Integer subscriberMessageLimit; + + private final Integer subscriberPollingInterval; + + // publisher preferences + private final String publisherHostName; + + private final Integer publisherHostPort; + + private final String publisherTopicName; + + private final String publisherProtocol; + + private final String publisherUserName; + + private final String publisherUserPassword; + + private final String publisherContentType; + + private final Integer publisherPollingInterval; + + private final Integer publisherMaxBatchSize; + + private final Integer publisherMaxRecoveryQueueSize; + + + private final DMaaPMRFactory dMaaPMRFactory; + + @Inject + public DMaaPMRCreatorImpl(@Named("dmaap.mr.subscriber.hostname") String subscriberHostName, + @Named("dmaap.mr.subscriber.portNumber") Integer subscriberHostPort, + @Named("dmaap.mr.subscriber.topicName") String subscriberTopicName, + @Named("dmaap.mr.subscriber.protocol") String subscriberProtocol, + @Named("dmaap.mr.subscriber.username") String subscriberUserName, + @Named("dmaap.mr.subscriber.userPassword") String subscriberUserPassword, + @Named("dmaap.mr.subscriber.contentType") String subscriberContentType, + @Named("dmaap.mr.subscriber.consumerId") String subscriberConsumerId, + @Named("dmaap.mr.subscriber.consumerGroup") String subscriberConsumerGroup, + @Named("dmaap.mr.subscriber.timeoutMS") Integer subscriberTimeoutMS, + @Named("dmaap.mr.subscriber.messageLimit") Integer subscriberMessageLimit, + @Named("dmaap.mr.subscriber.pollingInterval") Integer subscriberPollingInterval, + @Named("dmaap.mr.publisher.hostname") String publisherHostName, + @Named("dmaap.mr.publisher.portNumber") Integer publisherHostPort, + @Named("dmaap.mr.publisher.topicName") String publisherTopicName, + @Named("dmaap.mr.publisher.protocol") String publisherProtocol, + @Named("dmaap.mr.publisher.username") String publisherUserName, + @Named("dmaap.mr.publisher.userPassword") String publisherUserPassword, + @Named("dmaap.mr.publisher.contentType") String publisherContentType, + @Named("dmaap.mr.publisher.pollingInterval") Integer publisherPollingInterval, + @Named("dmaap.mr.publisher.maxBatchSize") Integer publisherMaxBatchSize, + @Named("dmaap.mr.publisher.maxRecoveryQueueSize") Integer publisherMaxRecoveryQueueSize) { + this.subscriberHostName = subscriberHostName; + this.subscriberHostPort = subscriberHostPort; + this.subscriberTopicName = subscriberTopicName; + this.subscriberProtocol = subscriberProtocol; + this.subscriberUserName = subscriberUserName; + this.subscriberUserPassword = subscriberUserPassword; + this.subscriberContentType = subscriberContentType; + this.subscriberConsumerId = subscriberConsumerId; + this.subscriberConsumerGroup = subscriberConsumerGroup; + this.subscriberTimeoutMS = subscriberTimeoutMS; + this.subscriberMessageLimit = subscriberMessageLimit; + this.subscriberPollingInterval = subscriberPollingInterval; + this.publisherHostName = publisherHostName; + this.publisherHostPort = publisherHostPort; + this.publisherTopicName = publisherTopicName; + this.publisherProtocol = publisherProtocol; + this.publisherUserName = publisherUserName; + this.publisherUserPassword = publisherUserPassword; + this.publisherContentType = publisherContentType; + this.publisherPollingInterval = publisherPollingInterval; + this.publisherMaxBatchSize = publisherMaxBatchSize; + this.publisherMaxRecoveryQueueSize = publisherMaxRecoveryQueueSize; + + this.dMaaPMRFactory = DMaaPMRFactory.create(); + } + + + @Override + public DMaaPMRSubscriber getDMaaPMRSubscriber() { + final DMaaPMRSubscriberConfig subscriberConfig = + new DMaaPMRSubscriberConfig.Builder(subscriberHostName, subscriberTopicName) + .setPortNumber(subscriberHostPort) + .setProtocol(subscriberProtocol) + .setUserName(subscriberUserName) + .setUserPassword(subscriberUserPassword) + .setContentType(subscriberContentType) + .setMessageLimit(subscriberMessageLimit) + .setTimeoutMS(subscriberTimeoutMS) + .setConsumerId(subscriberConsumerId) + .setConsumerGroup(subscriberConsumerGroup) + .build(); + return dMaaPMRFactory.createSubscriber(subscriberConfig); + } + + @Override + public DMaaPMRPublisher getDMaaPMRPublisher() { + final DMaaPMRPublisherConfig publisherConfig = + new DMaaPMRPublisherConfig.Builder(publisherHostName, publisherTopicName) + .setPortNumber(publisherHostPort) + .setProtocol(publisherProtocol) + .setUserName(publisherUserName) + .setUserPassword(publisherUserPassword) + .setContentType(publisherContentType) + .setMaxBatchSize(publisherMaxBatchSize) + .setMaxRecoveryQueueSize(publisherMaxRecoveryQueueSize) + .build(); + return dMaaPMRFactory.createPublisher(publisherConfig); + } + + @Override + public DMaaPMRSubscriber getDMaaPMRSubscriberWithTopicName(String subscriberTopicName) { + final DMaaPMRSubscriberConfig subscriberConfig = + new DMaaPMRSubscriberConfig.Builder(subscriberHostName, subscriberTopicName) + .setPortNumber(subscriberHostPort) + .setProtocol(subscriberProtocol) + .setUserName(subscriberUserName) + .setUserPassword(subscriberUserPassword) + .setContentType(subscriberContentType) + .setMessageLimit(subscriberMessageLimit) + .setTimeoutMS(subscriberTimeoutMS) + .setConsumerId(subscriberConsumerId) + .setConsumerGroup(subscriberConsumerGroup) + .build(); + return dMaaPMRFactory.createSubscriber(subscriberConfig); + } + + + @Override + public DMaaPMRPublisher getDMaaPMRPublisherWithTopicName(String publisherTopicName) { + final DMaaPMRPublisherConfig publisherConfig = + new DMaaPMRPublisherConfig.Builder(publisherHostName, publisherTopicName) + .setPortNumber(publisherHostPort) + .setProtocol(publisherProtocol) + .setUserName(publisherUserName) + .setUserPassword(publisherUserPassword) + .setContentType(publisherContentType) + .setMaxBatchSize(publisherMaxBatchSize) + .setMaxRecoveryQueueSize(publisherMaxRecoveryQueueSize) + .build(); + return dMaaPMRFactory.createPublisher(publisherConfig); + } + + @Override + public Map getDMaaPMRSubscriberConfig() { + Map sourceConfigurationMap = new HashMap<>(); + sourceConfigurationMap.put("referenceName", "source-referenceName"); + sourceConfigurationMap.put("hostName", subscriberHostName); + sourceConfigurationMap.put("portNumber", subscriberHostPort.toString()); + sourceConfigurationMap.put("topicName", subscriberTopicName); + sourceConfigurationMap.put("pollingInterval", subscriberPollingInterval.toString()); + sourceConfigurationMap.put("protocol", subscriberProtocol); + sourceConfigurationMap.put("userName", subscriberUserName); + sourceConfigurationMap.put("userPassword", subscriberUserPassword); + sourceConfigurationMap.put("contentType", subscriberContentType); + sourceConfigurationMap.put("consumerId", subscriberConsumerId); + sourceConfigurationMap.put("consumerGroup", subscriberConsumerGroup); + sourceConfigurationMap.put("timeoutMS", subscriberTimeoutMS.toString()); + sourceConfigurationMap.put("messageLimit", subscriberMessageLimit.toString()); + return sourceConfigurationMap; + } + + @Override + public Map getDMaaPMRPublisherConfig() { + return null; + } +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java new file mode 100644 index 0000000..6f3b303 --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java @@ -0,0 +1,41 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.module; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Stage; +import cucumber.api.guice.CucumberModules; +import cucumber.runtime.java.guice.InjectorSource; + +/** + * Provides Injector for Analytics Integration testing + * + * @author Rajiv Singla . Creation Date: 2/1/2017. + */ +public class AnalyticsITInjectorSource implements InjectorSource { + + @Override + public Injector getInjector() { + return Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO, new IntegrationTestModule()); + } + +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/IntegrationTestModule.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/IntegrationTestModule.java new file mode 100644 index 0000000..08ddf6d --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/module/IntegrationTestModule.java @@ -0,0 +1,126 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.module; + +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.name.Names; +import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; +import org.onap.dcae.apod.analytics.it.dmaap.DMaaPMRCreator; +import org.onap.dcae.apod.analytics.it.dmaap.DMaaPMRCreatorImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Properties; + +/** + * @author Rajiv Singla . Creation Date: 2/1/2017. + */ +public class IntegrationTestModule implements Module { + + private static final Logger LOG = LoggerFactory.getLogger(IntegrationTestModule.class); + + public static final String ANALYTICS_SYSTEM_VARIABLE_KEY_NAME = "analytics.it.env"; + public static final String DEFAULT_ENVIRONMENT = "dev"; + public static final String ENVIRONMENT_PROPERTIES_FILE_LOCATION = "env"; + + @Override + public void configure(Binder binder) { + final Properties envProperties = loadPropertiesFile(); + Names.bindProperties(binder, envProperties); + binder.bind(DMaaPMRCreator.class).to(DMaaPMRCreatorImpl.class); + } + + + /** + * Load environment specific properties file + * + * @return environment properties + */ + private Properties loadPropertiesFile() { + final String currentEnvironment = getCurrentEnvironment().toLowerCase(); + final String envPropertiesFileName = currentEnvironment + ".properties"; + final Properties envProperties = new Properties(); + final String fileLocation = ENVIRONMENT_PROPERTIES_FILE_LOCATION + "/" + envPropertiesFileName; + LOG.info("===>>> EFFECTIVE ENV: {}, EFFECTIVE PROPERTIES FILE: {} <<<====", currentEnvironment, fileLocation); + try { + final InputStream propertiesFileInputStream = + IntegrationTestModule.class.getClassLoader().getResourceAsStream(fileLocation); + envProperties.load(propertiesFileInputStream); + } catch (FileNotFoundException e) { + final String errorMessage = String.format("Unable to find env properties file: %s.", fileLocation); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } catch (IOException e) { + final String errorMessage = String.format("I/O Exception during loading env properties file: %s", + fileLocation); + throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); + } + + final Properties systemProperties = System.getProperties(); + for (Object envProperty : envProperties.keySet()) { + final String systemPropertyValue = systemProperties.getProperty(envProperty.toString()); + if (systemPropertyValue != null) { + LOG.info("Overriding System property name: {} with env property value: {}", + envProperty.toString(), systemPropertyValue); + envProperties.setProperty(envProperty.toString(), systemPropertyValue); + } + } + + LOG.info("Printing Effective Environment Properties =============== >>>"); + for (Map.Entry envPropertyEntry : envProperties.entrySet()) { + LOG.info("{}={}", envPropertyEntry.getKey(), envPropertyEntry.getValue()); + } + + return envProperties; + } + + + private static String getCurrentEnvironment() { + // First look in environment variables + LOG.info("Looking for IT variable name: {} in Environment variables", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); + final String itEnvironmentVariable = System.getenv(ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); + if (itEnvironmentVariable != null) { + LOG.info("Found value in Environment variables: {} for IT Environment variable", itEnvironmentVariable); + return itEnvironmentVariable; + } else { + LOG.info("Unable to find IT variable name: {} in Environment variable", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); + } + + // Second look inside system properties + LOG.info("Looking for IT variable name: {} in System variables", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); + + final String itSystemProperty = System.getProperty(ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); + if (itSystemProperty != null) { + LOG.info("Found value for System variables: {} in System variable", itSystemProperty); + return itSystemProperty; + } else { + LOG.info("Unable to find IT variable name: {} in System variable", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); + } + + // return default enviroment + LOG.warn("Unable to find IT environment variable. Choosing default environment: {}", DEFAULT_ENVIRONMENT); + return DEFAULT_ENVIRONMENT; + } +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java new file mode 100644 index 0000000..f8097f4 --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java @@ -0,0 +1,51 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.plugins; + +import co.cask.cdap.etl.mock.test.HydratorTestBase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +import static com.google.common.collect.ImmutableList.of; + +/** + * Base class for all the Hydrator test base , where the utility and common code for integration testing is written + *

+ * @author Manjesh Gowda. Creation Date: 2/3/2017. + */ + +public abstract class BaseAnalyticsPluginsIT extends HydratorTestBase { + private static final Logger LOG = LoggerFactory.getLogger(BaseAnalyticsPluginsIT.class); + + /** + * Provides two simple messages for testing of Plugin + *

+ * + * @return + */ + protected static List getTwoSampleMessage() { + String message1 = "{ \"message\" : \"Test Message 1 from DMaaP source Plugin\"}"; + String message2 = "{ \"message\" : \"Test Message 2 from DMaaP source Plugin\"}"; + return of(message1, message2); + } +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java new file mode 100644 index 0000000..fbfac7f --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java @@ -0,0 +1,204 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.plugins; + +import co.cask.cdap.api.data.format.StructuredRecord; +import co.cask.cdap.api.dataset.table.Table; +import co.cask.cdap.api.plugin.PluginClass; +import co.cask.cdap.api.plugin.PluginPropertyField; +import co.cask.cdap.common.utils.Tasks; +import co.cask.cdap.datastreams.DataStreamsApp; +import co.cask.cdap.datastreams.DataStreamsSparkLauncher; +import co.cask.cdap.etl.api.streaming.StreamingSource; +import co.cask.cdap.etl.mock.batch.MockSink; +import co.cask.cdap.etl.proto.v2.DataStreamsConfig; +import co.cask.cdap.etl.proto.v2.ETLPlugin; +import co.cask.cdap.etl.proto.v2.ETLStage; +import co.cask.cdap.proto.artifact.AppRequest; +import co.cask.cdap.proto.artifact.ArtifactSummary; +import co.cask.cdap.proto.id.ApplicationId; +import co.cask.cdap.proto.id.ArtifactId; +import co.cask.cdap.proto.id.NamespaceId; +import co.cask.cdap.test.ApplicationManager; +import co.cask.cdap.test.DataSetManager; +import co.cask.cdap.test.SparkManager; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableSet; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; +import org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap.DMaaPMRReceiver; +import org.onap.dcae.apod.analytics.cdap.plugins.streaming.dmaap.DMaaPMRSource; +import org.onap.dcae.apod.analytics.it.dmaap.DMaaPMRCreator; +import org.onap.dcae.apod.analytics.it.module.AnalyticsITInjectorSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +/** + * Performs integration testing on DMaaP source plugin , where 2 sample messages are posted and verified + *

+ * @author Manjesh Gowda. Creation Date: 2/3/2017. + */ +public class DMaaPMRSourcePluginIT extends BaseAnalyticsPluginsIT { + + private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSourcePluginIT.class); + protected static final ArtifactId DATASTREAMS_ARTIFACT_ID = NamespaceId.DEFAULT.artifact("data-streams", "3.2.0"); + protected static final ArtifactSummary DATASTREAMS_ARTIFACT = new ArtifactSummary("data-streams", "3.2.0"); + + /** + * Streaming artifacts are added to the hydrator pipeline. Important. Make sure you explicitly add all the custom + * class that you have written in the plugin artifact, if not you will get incompatible type error + * + * @throws Exception + */ + @BeforeClass + public static void setupTest() throws Exception { + setupStreamingArtifacts(DATASTREAMS_ARTIFACT_ID, DataStreamsApp.class); + +// Set parents = ImmutableSet.of( +// new ArtifactRange(NamespaceId.DEFAULT.toId(), DATASTREAMS_ARTIFACT_ID.getArtifact(), +// new ArtifactVersion(DATASTREAMS_ARTIFACT_ID.getVersion()), true, +// new ArtifactVersion(DATASTREAMS_ARTIFACT_ID.getVersion()), true) +// ); + + ArtifactId dcaeAnalyticsCdapPluginsArtifact = NamespaceId.DEFAULT.artifact( + "dcae-analytics-cdap-plugins", "2.0-SNAPSHOT"); + addPluginArtifact(dcaeAnalyticsCdapPluginsArtifact, DATASTREAMS_ARTIFACT_ID, ImmutableSet.of(getPluginClass()), + DMaaPMRSource.class, DMaaPMRSourcePluginConfig.class, DMaaPMRReceiver.class); + +// addPluginArtifact(NamespaceId.DEFAULT.artifact("spark-plugins", "1.0.0"), parents, +// DMaaPMRSource.class, DMaaPMRReceiver.class, DMaaPMRSourcePluginConfig.class); + } + + private static PluginClass getPluginClass() { + HashMap properties = new HashMap<>(); + properties.put("referenceName", new PluginPropertyField("referenceName", "", "string", false, false)); + properties.put("hostName", new PluginPropertyField("hostName", "", "string", false, false)); + properties.put("topicName", new PluginPropertyField("topicName", "", "string", false, false)); + properties.put("protocol", new PluginPropertyField("protocol", "", "string", false, false)); + properties.put("userName", new PluginPropertyField("userName", "", "string", false, false)); + properties.put("userPassword", new PluginPropertyField("userPassword", "", "string", false, false)); + properties.put("contentType", new PluginPropertyField("contentType", "", "string", false, false)); + properties.put("consumerId", new PluginPropertyField("consumerId", "", "string", false, false)); + properties.put("consumerGroup", new PluginPropertyField("consumerGroup", "", "string", false, false)); + + properties.put("portNumber", new PluginPropertyField("portNumber", "", "long", false, false)); + properties.put("timeoutMS", new PluginPropertyField("timeoutMS", "", "long", false, false)); + properties.put("messageLimit", new PluginPropertyField("messageLimit", "", "long", false, false)); + properties.put("pollingInterval", new PluginPropertyField("pollingInterval", "", "long", false, false)); + + return new PluginClass("streamingsource", "DMaaPMRSource", "", DMaaPMRSource.class.getName(), + "pluginConfig", properties); + } + + @AfterClass + public static void cleanup() { + } + + /** + * Build a pipeline with a mock-sink. After that publish coupe of messages to the subscriber topic, and verify in + * the mock sink + * + * @throws Exception + */ + @Test + public void testDMaaPMRSourcePlugin() throws Exception { + AnalyticsITInjectorSource analyticsITInjectorSource = new AnalyticsITInjectorSource(); + + final DMaaPMRCreator dMaaPMRCreator = analyticsITInjectorSource.getInjector().getInstance(DMaaPMRCreator.class); + Map dmaapSourceProperties = dMaaPMRCreator.getDMaaPMRSubscriberConfig(); + dmaapSourceProperties.put("consumerId", UUID.randomUUID().toString().replace("-", "")); + dmaapSourceProperties.put("consumerGroup", UUID.randomUUID().toString().replace("-", "")); + final String subscriberTopicName = dmaapSourceProperties.get("topicName"); + + DataStreamsConfig dmaaPMRSourcePipeline = DataStreamsConfig.builder() + .addStage(new ETLStage("source", new ETLPlugin( + "DMaaPMRSource", StreamingSource.PLUGIN_TYPE, dmaapSourceProperties, null))) + .addStage(new ETLStage("sink", MockSink.getPlugin("dmaapOutput"))) + .addConnection("source", "sink") + .setBatchInterval("20s") + .build(); + + AppRequest appRequest = new AppRequest<>(DATASTREAMS_ARTIFACT, dmaaPMRSourcePipeline); + ApplicationId appId = NamespaceId.DEFAULT.app("DMaaPMRSourceIntegrationTestingApp"); + ApplicationManager appManager = deployApplication(appId.toId(), appRequest); + + SparkManager sparkManager = appManager.getSparkManager(DataStreamsSparkLauncher.NAME); + sparkManager.start(); + sparkManager.waitForStatus(true, 1, 100); + + final DataSetManager

outputManager = getDataset("dmaapOutput"); + final List dmaapContents = new LinkedList<>(); + + // Publish message to source + + new Thread() { + @Override + public void run() { + try { + TimeUnit.MILLISECONDS.sleep(30000); + dMaaPMRCreator.getDMaaPMRPublisherWithTopicName(subscriberTopicName).publish(getTwoSampleMessage()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }.start(); + + try { + Tasks.waitFor(true, new Callable() { + boolean initialized = false; + + @Override + public Boolean call() throws Exception { + try { + outputManager.flush(); + for (StructuredRecord record : MockSink.readOutput(outputManager)) { + dmaapContents.add((String) record.get("message")); + } + return dmaapContents.size() >= 2; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + }, + 90, TimeUnit.SECONDS); + } catch (Exception e) { + e.printStackTrace(); + } + sparkManager.stop(); + + Assert.assertTrue(dmaapContents.size() == 2); + String allMessages = Joiner.on(",").join(dmaapContents); + Assert.assertTrue(allMessages.contains("Message 1")); + Assert.assertTrue(allMessages.contains("Message 2")); + } +} diff --git a/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/util/StepUtils.java b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/util/StepUtils.java new file mode 100644 index 0000000..3de3771 --- /dev/null +++ b/dcae-analytics-it/src/test/java/org/onap/dcae/apod/analytics/it/util/StepUtils.java @@ -0,0 +1,43 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.it.util; + +/** + * @author Rajiv Singla . Creation Date: 2/2/2017. + */ +public abstract class StepUtils { + + + /** + * Determines if step should use default publisher topic as configured in environment properties file + * + * @param topicName step passed topic name + * @return true if default publisher topic + */ + public static boolean isDefaultPublisherTopic(final String topicName) { + if (topicName.equalsIgnoreCase("default")) { + return true; + } else { + return false; + } + } + +} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java deleted file mode 100644 index 83153a0..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/CucumberRunnerIT.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.cucumber; - -import cucumber.api.CucumberOptions; -import cucumber.api.SnippetType; -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -/** - * @author Rajiv Singla . Creation Date: 2/1/2017. - */ - -@RunWith(Cucumber.class) -@CucumberOptions( - plugin = {"pretty", "json:target/cucumber/cucumber.json", "html:target/cucumber"}, - features = {"src/test/resources/cucumber/features/dmaap"}, - glue = {"org.openecomp.dcae.apod.analytics.it.cucumber.steps"}, - snippets = SnippetType.CAMELCASE -) -public class CucumberRunnerIT { -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java deleted file mode 100644 index c341c2a..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/cucumber/steps/DMaaPMRSteps.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.cucumber.steps; - -import com.google.inject.Inject; -import com.google.inject.name.Named; -import cucumber.api.java.en.And; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; -import org.openecomp.dcae.apod.analytics.common.utils.HTTPUtils; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRPublisherResponse; -import org.openecomp.dcae.apod.analytics.dmaap.domain.response.DMaaPMRSubscriberResponse; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; -import org.openecomp.dcae.apod.analytics.it.dmaap.DMaaPMRCreator; -import org.openecomp.dcae.apod.analytics.it.util.StepUtils; -import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsIT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.concurrent.TimeUnit; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -/** - * @author Rajiv Singla . Creation Date: 2/1/2017. - */ -public class DMaaPMRSteps extends BaseDCAEAnalyticsIT { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSteps.class); - - private final DMaaPMRCreator dMaaPMRCreator; - private final String defaultPublisherTopicName; - - private static DMaaPMRSubscriberResponse subscriberResponse; - private static String messageToPublish; - private static String fetchedMessage; - - @Inject - public DMaaPMRSteps(DMaaPMRCreator dMaaPMRCreator, - @Named("dmaap.mr.publisher.topicName") String defaultPublisherTopicName) { - this.dMaaPMRCreator = dMaaPMRCreator; - this.defaultPublisherTopicName = defaultPublisherTopicName; - } - - - @Given("^DMaaP MR Service is up$") - public void dmaapMRServiceIsUp() throws Throwable { - final DMaaPMRSubscriber subscriber = - dMaaPMRCreator.getDMaaPMRSubscriberWithTopicName(defaultPublisherTopicName); - final DMaaPMRSubscriberResponse subscriberResponse = subscriber.fetchMessages(); - assertNotNull(subscriberResponse.getResponseCode()); - assertTrue(HTTPUtils.isSuccessfulResponseCode(subscriberResponse.getResponseCode())); - LOG.info("Subscriber is able to fetch messages successfully - Verified DMaaP MR Service is UP"); - } - - @When("^I publish json message to publisher topic name \"([^\"]*)\" in file \"([^\"]*)\"$") - public void iPublishJsonMessageToPublisherTopicNameInFile(String publisherTopicName, String fileLocation) - throws Throwable { - String publisherTopic; - if (StepUtils.isDefaultPublisherTopic(publisherTopicName)) { - publisherTopic = defaultPublisherTopicName; - } else { - publisherTopic = publisherTopicName; - } - final DMaaPMRPublisher publisher = dMaaPMRCreator.getDMaaPMRPublisherWithTopicName(publisherTopic); - messageToPublish = fromStream(fileLocation); - final DMaaPMRPublisherResponse publisherResponse = publisher.publish(Arrays.asList(messageToPublish)); - LOG.info("Publisher published messages to DMaaP MR Topic - Response: {}", publisherResponse); - assertTrue(HTTPUtils.isSuccessfulResponseCode(publisherResponse.getResponseCode())); - } - - @And("^wait for \"([^\"]*)\" seconds$") - public void waitForSeconds(Integer waitInSeconds) throws Throwable { - TimeUnit.SECONDS.sleep(waitInSeconds); - LOG.info("Waking up after sleep: {} seconds", waitInSeconds); - } - - @And("^subscriber fetch message from publisher topic name \"([^\"]*)\"$") - public void fetchMessageFrom(String publisherTopicName) throws Throwable { - String publisherTopic; - if (StepUtils.isDefaultPublisherTopic(publisherTopicName)) { - publisherTopic = defaultPublisherTopicName; - } else { - publisherTopic = publisherTopicName; - } - final DMaaPMRSubscriber subscriber = dMaaPMRCreator.getDMaaPMRSubscriberWithTopicName(publisherTopic); - subscriberResponse = subscriber.fetchMessages(); - LOG.info("Subscriber fetched messages to DMaaP MR Topic - Response: {}", subscriberResponse); - assertTrue(HTTPUtils.isSuccessfulResponseCode(subscriberResponse.getResponseCode())); - } - - @And("^compare fetched json message with published message$") - public void compareFetchedJsonMessageWithPublishedMessage() throws Throwable { - - fetchedMessage = subscriberResponse.getFetchedMessages().get(0); - LOG.info("Fetched Json Message: {}", fetchedMessage); - LOG.info("Published Json Message: {}", messageToPublish); - } - - @Then("^fetched message must be same as published message$") - public void fetchedMessageMustBeSameAsPublishedMessage() throws Throwable { - assertJson(messageToPublish, fetchedMessage); - } - - - -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java deleted file mode 100644 index 12a31a5..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreator.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.dmaap; - -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; - -import java.util.Map; - -/** - * Creates DMaaP MR Publisher and Subscriber Instances for Integration Testing purposes - *

- * @author Rajiv Singla . Creation Date: 2/1/2017. - */ -public interface DMaaPMRCreator { - - /** - * Provides {@link DMaaPMRSubscriber} instance for Integration testing configured for the specific test - * environment - * - * @return DMaaP MR Subscriber instance for integration testing - */ - DMaaPMRSubscriber getDMaaPMRSubscriber(); - - - /** - * Provides {@link DMaaPMRSubscriber} instance for Integration testing configured with given topic name - * - * @param subscriberTopicName DMaaP MR Subscriber Topic Name - * @return DMaaP MR Subscriber instance which is subscriber to given subscriber topic - */ - DMaaPMRSubscriber getDMaaPMRSubscriberWithTopicName(String subscriberTopicName); - - /** - * Provides {@link DMaaPMRPublisher} instance for Integration testing configured for the specific test - * environment - * - * @return DMaaP MR Publisher instance for integration testing - */ - DMaaPMRPublisher getDMaaPMRPublisher(); - - - /** - * Provides {@link DMaaPMRPublisher} instance for Integration testing configured with given topic name - * - * @param publisherTopicName DMaaP MR publisher topic name - * @return DMaaP MR Publisher instance for integration testing - */ - DMaaPMRPublisher getDMaaPMRPublisherWithTopicName(String publisherTopicName); - - /** - * Provides a map of DMaaP subscriber config for Integration testing configured with given topic name - * - * @return Map of key-value pair of subscriber config - */ - Map getDMaaPMRSubscriberConfig(); - - /** - * Provides a map of DMaaP publisher config for Integration testing configured with given topic name - * - * @return Map of key-value pair of publisher config - */ - Map getDMaaPMRPublisherConfig(); - -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java deleted file mode 100644 index fed16ee..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/dmaap/DMaaPMRCreatorImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.dmaap; - -import com.google.inject.Inject; -import com.google.inject.name.Named; -import org.openecomp.dcae.apod.analytics.dmaap.DMaaPMRFactory; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRPublisherConfig; -import org.openecomp.dcae.apod.analytics.dmaap.domain.config.DMaaPMRSubscriberConfig; -import org.openecomp.dcae.apod.analytics.dmaap.service.publisher.DMaaPMRPublisher; -import org.openecomp.dcae.apod.analytics.dmaap.service.subscriber.DMaaPMRSubscriber; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author Rajiv Singla . Creation Date: 2/1/2017. - */ -public class DMaaPMRCreatorImpl implements DMaaPMRCreator { - - private final String subscriberHostName; - - private final Integer subscriberHostPort; - - private final String subscriberTopicName; - - private final String subscriberProtocol; - - private final String subscriberUserName; - - private final String subscriberUserPassword; - - private final String subscriberContentType; - - private final String subscriberConsumerId; - - private final String subscriberConsumerGroup; - - private final Integer subscriberTimeoutMS; - - private final Integer subscriberMessageLimit; - - private final Integer subscriberPollingInterval; - - // publisher preferences - private final String publisherHostName; - - private final Integer publisherHostPort; - - private final String publisherTopicName; - - private final String publisherProtocol; - - private final String publisherUserName; - - private final String publisherUserPassword; - - private final String publisherContentType; - - private final Integer publisherPollingInterval; - - private final Integer publisherMaxBatchSize; - - private final Integer publisherMaxRecoveryQueueSize; - - - private final DMaaPMRFactory dMaaPMRFactory; - - @Inject - public DMaaPMRCreatorImpl(@Named("dmaap.mr.subscriber.hostname") String subscriberHostName, - @Named("dmaap.mr.subscriber.portNumber") Integer subscriberHostPort, - @Named("dmaap.mr.subscriber.topicName") String subscriberTopicName, - @Named("dmaap.mr.subscriber.protocol") String subscriberProtocol, - @Named("dmaap.mr.subscriber.username") String subscriberUserName, - @Named("dmaap.mr.subscriber.userPassword") String subscriberUserPassword, - @Named("dmaap.mr.subscriber.contentType") String subscriberContentType, - @Named("dmaap.mr.subscriber.consumerId") String subscriberConsumerId, - @Named("dmaap.mr.subscriber.consumerGroup") String subscriberConsumerGroup, - @Named("dmaap.mr.subscriber.timeoutMS") Integer subscriberTimeoutMS, - @Named("dmaap.mr.subscriber.messageLimit") Integer subscriberMessageLimit, - @Named("dmaap.mr.subscriber.pollingInterval") Integer subscriberPollingInterval, - @Named("dmaap.mr.publisher.hostname") String publisherHostName, - @Named("dmaap.mr.publisher.portNumber") Integer publisherHostPort, - @Named("dmaap.mr.publisher.topicName") String publisherTopicName, - @Named("dmaap.mr.publisher.protocol") String publisherProtocol, - @Named("dmaap.mr.publisher.username") String publisherUserName, - @Named("dmaap.mr.publisher.userPassword") String publisherUserPassword, - @Named("dmaap.mr.publisher.contentType") String publisherContentType, - @Named("dmaap.mr.publisher.pollingInterval") Integer publisherPollingInterval, - @Named("dmaap.mr.publisher.maxBatchSize") Integer publisherMaxBatchSize, - @Named("dmaap.mr.publisher.maxRecoveryQueueSize") Integer publisherMaxRecoveryQueueSize) { - this.subscriberHostName = subscriberHostName; - this.subscriberHostPort = subscriberHostPort; - this.subscriberTopicName = subscriberTopicName; - this.subscriberProtocol = subscriberProtocol; - this.subscriberUserName = subscriberUserName; - this.subscriberUserPassword = subscriberUserPassword; - this.subscriberContentType = subscriberContentType; - this.subscriberConsumerId = subscriberConsumerId; - this.subscriberConsumerGroup = subscriberConsumerGroup; - this.subscriberTimeoutMS = subscriberTimeoutMS; - this.subscriberMessageLimit = subscriberMessageLimit; - this.subscriberPollingInterval = subscriberPollingInterval; - this.publisherHostName = publisherHostName; - this.publisherHostPort = publisherHostPort; - this.publisherTopicName = publisherTopicName; - this.publisherProtocol = publisherProtocol; - this.publisherUserName = publisherUserName; - this.publisherUserPassword = publisherUserPassword; - this.publisherContentType = publisherContentType; - this.publisherPollingInterval = publisherPollingInterval; - this.publisherMaxBatchSize = publisherMaxBatchSize; - this.publisherMaxRecoveryQueueSize = publisherMaxRecoveryQueueSize; - - this.dMaaPMRFactory = DMaaPMRFactory.create(); - } - - - @Override - public DMaaPMRSubscriber getDMaaPMRSubscriber() { - final DMaaPMRSubscriberConfig subscriberConfig = - new DMaaPMRSubscriberConfig.Builder(subscriberHostName, subscriberTopicName) - .setPortNumber(subscriberHostPort) - .setProtocol(subscriberProtocol) - .setUserName(subscriberUserName) - .setUserPassword(subscriberUserPassword) - .setContentType(subscriberContentType) - .setMessageLimit(subscriberMessageLimit) - .setTimeoutMS(subscriberTimeoutMS) - .setConsumerId(subscriberConsumerId) - .setConsumerGroup(subscriberConsumerGroup) - .build(); - return dMaaPMRFactory.createSubscriber(subscriberConfig); - } - - @Override - public DMaaPMRPublisher getDMaaPMRPublisher() { - final DMaaPMRPublisherConfig publisherConfig = - new DMaaPMRPublisherConfig.Builder(publisherHostName, publisherTopicName) - .setPortNumber(publisherHostPort) - .setProtocol(publisherProtocol) - .setUserName(publisherUserName) - .setUserPassword(publisherUserPassword) - .setContentType(publisherContentType) - .setMaxBatchSize(publisherMaxBatchSize) - .setMaxRecoveryQueueSize(publisherMaxRecoveryQueueSize) - .build(); - return dMaaPMRFactory.createPublisher(publisherConfig); - } - - @Override - public DMaaPMRSubscriber getDMaaPMRSubscriberWithTopicName(String subscriberTopicName) { - final DMaaPMRSubscriberConfig subscriberConfig = - new DMaaPMRSubscriberConfig.Builder(subscriberHostName, subscriberTopicName) - .setPortNumber(subscriberHostPort) - .setProtocol(subscriberProtocol) - .setUserName(subscriberUserName) - .setUserPassword(subscriberUserPassword) - .setContentType(subscriberContentType) - .setMessageLimit(subscriberMessageLimit) - .setTimeoutMS(subscriberTimeoutMS) - .setConsumerId(subscriberConsumerId) - .setConsumerGroup(subscriberConsumerGroup) - .build(); - return dMaaPMRFactory.createSubscriber(subscriberConfig); - } - - - @Override - public DMaaPMRPublisher getDMaaPMRPublisherWithTopicName(String publisherTopicName) { - final DMaaPMRPublisherConfig publisherConfig = - new DMaaPMRPublisherConfig.Builder(publisherHostName, publisherTopicName) - .setPortNumber(publisherHostPort) - .setProtocol(publisherProtocol) - .setUserName(publisherUserName) - .setUserPassword(publisherUserPassword) - .setContentType(publisherContentType) - .setMaxBatchSize(publisherMaxBatchSize) - .setMaxRecoveryQueueSize(publisherMaxRecoveryQueueSize) - .build(); - return dMaaPMRFactory.createPublisher(publisherConfig); - } - - @Override - public Map getDMaaPMRSubscriberConfig() { - Map sourceConfigurationMap = new HashMap<>(); - sourceConfigurationMap.put("referenceName", "source-referenceName"); - sourceConfigurationMap.put("hostName", subscriberHostName); - sourceConfigurationMap.put("portNumber", subscriberHostPort.toString()); - sourceConfigurationMap.put("topicName", subscriberTopicName); - sourceConfigurationMap.put("pollingInterval", subscriberPollingInterval.toString()); - sourceConfigurationMap.put("protocol", subscriberProtocol); - sourceConfigurationMap.put("userName", subscriberUserName); - sourceConfigurationMap.put("userPassword", subscriberUserPassword); - sourceConfigurationMap.put("contentType", subscriberContentType); - sourceConfigurationMap.put("consumerId", subscriberConsumerId); - sourceConfigurationMap.put("consumerGroup", subscriberConsumerGroup); - sourceConfigurationMap.put("timeoutMS", subscriberTimeoutMS.toString()); - sourceConfigurationMap.put("messageLimit", subscriberMessageLimit.toString()); - return sourceConfigurationMap; - } - - @Override - public Map getDMaaPMRPublisherConfig() { - return null; - } -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java deleted file mode 100644 index ae0e8bc..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/AnalyticsITInjectorSource.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.module; - -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Stage; -import cucumber.api.guice.CucumberModules; -import cucumber.runtime.java.guice.InjectorSource; - -/** - * Provides Injector for Analytics Integration testing - * - * @author Rajiv Singla . Creation Date: 2/1/2017. - */ -public class AnalyticsITInjectorSource implements InjectorSource { - - @Override - public Injector getInjector() { - return Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO, new IntegrationTestModule()); - } - -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/IntegrationTestModule.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/IntegrationTestModule.java deleted file mode 100644 index c1f8a4e..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/module/IntegrationTestModule.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.module; - -import com.google.inject.Binder; -import com.google.inject.Module; -import com.google.inject.name.Names; -import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException; -import org.openecomp.dcae.apod.analytics.it.dmaap.DMaaPMRCreator; -import org.openecomp.dcae.apod.analytics.it.dmaap.DMaaPMRCreatorImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.Properties; - -/** - * @author Rajiv Singla . Creation Date: 2/1/2017. - */ -public class IntegrationTestModule implements Module { - - private static final Logger LOG = LoggerFactory.getLogger(IntegrationTestModule.class); - - public static final String ANALYTICS_SYSTEM_VARIABLE_KEY_NAME = "analytics.it.env"; - public static final String DEFAULT_ENVIRONMENT = "dev"; - public static final String ENVIRONMENT_PROPERTIES_FILE_LOCATION = "env"; - - @Override - public void configure(Binder binder) { - final Properties envProperties = loadPropertiesFile(); - Names.bindProperties(binder, envProperties); - binder.bind(DMaaPMRCreator.class).to(DMaaPMRCreatorImpl.class); - } - - - /** - * Load environment specific properties file - * - * @return environment properties - */ - private Properties loadPropertiesFile() { - final String currentEnvironment = getCurrentEnvironment().toLowerCase(); - final String envPropertiesFileName = currentEnvironment + ".properties"; - final Properties envProperties = new Properties(); - final String fileLocation = ENVIRONMENT_PROPERTIES_FILE_LOCATION + "/" + envPropertiesFileName; - LOG.info("===>>> EFFECTIVE ENV: {}, EFFECTIVE PROPERTIES FILE: {} <<<====", currentEnvironment, fileLocation); - try { - final InputStream propertiesFileInputStream = - IntegrationTestModule.class.getClassLoader().getResourceAsStream(fileLocation); - envProperties.load(propertiesFileInputStream); - } catch (FileNotFoundException e) { - final String errorMessage = String.format("Unable to find env properties file: %s.", fileLocation); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } catch (IOException e) { - final String errorMessage = String.format("I/O Exception during loading env properties file: %s", - fileLocation); - throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e); - } - - final Properties systemProperties = System.getProperties(); - for (Object envProperty : envProperties.keySet()) { - final String systemPropertyValue = systemProperties.getProperty(envProperty.toString()); - if (systemPropertyValue != null) { - LOG.info("Overriding System property name: {} with env property value: {}", - envProperty.toString(), systemPropertyValue); - envProperties.setProperty(envProperty.toString(), systemPropertyValue); - } - } - - LOG.info("Printing Effective Environment Properties =============== >>>"); - for (Map.Entry envPropertyEntry : envProperties.entrySet()) { - LOG.info("{}={}", envPropertyEntry.getKey(), envPropertyEntry.getValue()); - } - - return envProperties; - } - - - private static String getCurrentEnvironment() { - // First look in environment variables - LOG.info("Looking for IT variable name: {} in Environment variables", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); - final String itEnvironmentVariable = System.getenv(ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); - if (itEnvironmentVariable != null) { - LOG.info("Found value in Environment variables: {} for IT Environment variable", itEnvironmentVariable); - return itEnvironmentVariable; - } else { - LOG.info("Unable to find IT variable name: {} in Environment variable", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); - } - - // Second look inside system properties - LOG.info("Looking for IT variable name: {} in System variables", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); - - final String itSystemProperty = System.getProperty(ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); - if (itSystemProperty != null) { - LOG.info("Found value for System variables: {} in System variable", itSystemProperty); - return itSystemProperty; - } else { - LOG.info("Unable to find IT variable name: {} in System variable", ANALYTICS_SYSTEM_VARIABLE_KEY_NAME); - } - - // return default enviroment - LOG.warn("Unable to find IT environment variable. Choosing default environment: {}", DEFAULT_ENVIRONMENT); - return DEFAULT_ENVIRONMENT; - } -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java deleted file mode 100644 index a052c63..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/BaseAnalyticsPluginsIT.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.plugins; - -import co.cask.cdap.etl.mock.test.HydratorTestBase; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -import static com.google.common.collect.ImmutableList.of; - -/** - * Base class for all the Hydrator test base , where the utility and common code for integration testing is written - *

- * @author Manjesh Gowda. Creation Date: 2/3/2017. - */ - -public abstract class BaseAnalyticsPluginsIT extends HydratorTestBase { - private static final Logger LOG = LoggerFactory.getLogger(BaseAnalyticsPluginsIT.class); - - /** - * Provides two simple messages for testing of Plugin - *

- * - * @return - */ - protected static List getTwoSampleMessage() { - String message1 = "{ \"message\" : \"Test Message 1 from DMaaP source Plugin\"}"; - String message2 = "{ \"message\" : \"Test Message 2 from DMaaP source Plugin\"}"; - return of(message1, message2); - } -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java deleted file mode 100644 index abffdb7..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/plugins/DMaaPMRSourcePluginIT.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.plugins; - -import co.cask.cdap.api.data.format.StructuredRecord; -import co.cask.cdap.api.dataset.table.Table; -import co.cask.cdap.api.plugin.PluginClass; -import co.cask.cdap.api.plugin.PluginPropertyField; -import co.cask.cdap.common.utils.Tasks; -import co.cask.cdap.datastreams.DataStreamsApp; -import co.cask.cdap.datastreams.DataStreamsSparkLauncher; -import co.cask.cdap.etl.api.streaming.StreamingSource; -import co.cask.cdap.etl.mock.batch.MockSink; -import co.cask.cdap.etl.proto.v2.DataStreamsConfig; -import co.cask.cdap.etl.proto.v2.ETLPlugin; -import co.cask.cdap.etl.proto.v2.ETLStage; -import co.cask.cdap.proto.artifact.AppRequest; -import co.cask.cdap.proto.artifact.ArtifactSummary; -import co.cask.cdap.proto.id.ApplicationId; -import co.cask.cdap.proto.id.ArtifactId; -import co.cask.cdap.proto.id.NamespaceId; -import co.cask.cdap.test.ApplicationManager; -import co.cask.cdap.test.DataSetManager; -import co.cask.cdap.test.SparkManager; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableSet; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.openecomp.dcae.apod.analytics.cdap.plugins.domain.config.dmaap.DMaaPMRSourcePluginConfig; -import org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap.DMaaPMRReceiver; -import org.openecomp.dcae.apod.analytics.cdap.plugins.streaming.dmaap.DMaaPMRSource; -import org.openecomp.dcae.apod.analytics.it.dmaap.DMaaPMRCreator; -import org.openecomp.dcae.apod.analytics.it.module.AnalyticsITInjectorSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; - -/** - * Performs integration testing on DMaaP source plugin , where 2 sample messages are posted and verified - *

- * @author Manjesh Gowda. Creation Date: 2/3/2017. - */ -public class DMaaPMRSourcePluginIT extends BaseAnalyticsPluginsIT { - - private static final Logger LOG = LoggerFactory.getLogger(DMaaPMRSourcePluginIT.class); - protected static final ArtifactId DATASTREAMS_ARTIFACT_ID = NamespaceId.DEFAULT.artifact("data-streams", "3.2.0"); - protected static final ArtifactSummary DATASTREAMS_ARTIFACT = new ArtifactSummary("data-streams", "3.2.0"); - - /** - * Streaming artifacts are added to the hydrator pipeline. Important. Make sure you explicitly add all the custom - * class that you have written in the plugin artifact, if not you will get incompatible type error - * - * @throws Exception - */ - @BeforeClass - public static void setupTest() throws Exception { - setupStreamingArtifacts(DATASTREAMS_ARTIFACT_ID, DataStreamsApp.class); - -// Set parents = ImmutableSet.of( -// new ArtifactRange(NamespaceId.DEFAULT.toId(), DATASTREAMS_ARTIFACT_ID.getArtifact(), -// new ArtifactVersion(DATASTREAMS_ARTIFACT_ID.getVersion()), true, -// new ArtifactVersion(DATASTREAMS_ARTIFACT_ID.getVersion()), true) -// ); - - ArtifactId dcaeAnalyticsCdapPluginsArtifact = NamespaceId.DEFAULT.artifact( - "dcae-analytics-cdap-plugins", "2.0-SNAPSHOT"); - addPluginArtifact(dcaeAnalyticsCdapPluginsArtifact, DATASTREAMS_ARTIFACT_ID, ImmutableSet.of(getPluginClass()), - DMaaPMRSource.class, DMaaPMRSourcePluginConfig.class, DMaaPMRReceiver.class); - -// addPluginArtifact(NamespaceId.DEFAULT.artifact("spark-plugins", "1.0.0"), parents, -// DMaaPMRSource.class, DMaaPMRReceiver.class, DMaaPMRSourcePluginConfig.class); - } - - private static PluginClass getPluginClass() { - HashMap properties = new HashMap<>(); - properties.put("referenceName", new PluginPropertyField("referenceName", "", "string", false, false)); - properties.put("hostName", new PluginPropertyField("hostName", "", "string", false, false)); - properties.put("topicName", new PluginPropertyField("topicName", "", "string", false, false)); - properties.put("protocol", new PluginPropertyField("protocol", "", "string", false, false)); - properties.put("userName", new PluginPropertyField("userName", "", "string", false, false)); - properties.put("userPassword", new PluginPropertyField("userPassword", "", "string", false, false)); - properties.put("contentType", new PluginPropertyField("contentType", "", "string", false, false)); - properties.put("consumerId", new PluginPropertyField("consumerId", "", "string", false, false)); - properties.put("consumerGroup", new PluginPropertyField("consumerGroup", "", "string", false, false)); - - properties.put("portNumber", new PluginPropertyField("portNumber", "", "long", false, false)); - properties.put("timeoutMS", new PluginPropertyField("timeoutMS", "", "long", false, false)); - properties.put("messageLimit", new PluginPropertyField("messageLimit", "", "long", false, false)); - properties.put("pollingInterval", new PluginPropertyField("pollingInterval", "", "long", false, false)); - - return new PluginClass("streamingsource", "DMaaPMRSource", "", DMaaPMRSource.class.getName(), - "pluginConfig", properties); - } - - @AfterClass - public static void cleanup() { - } - - /** - * Build a pipeline with a mock-sink. After that publish coupe of messages to the subscriber topic, and verify in - * the mock sink - * - * @throws Exception - */ - @Test - public void testDMaaPMRSourcePlugin() throws Exception { - AnalyticsITInjectorSource analyticsITInjectorSource = new AnalyticsITInjectorSource(); - - final DMaaPMRCreator dMaaPMRCreator = analyticsITInjectorSource.getInjector().getInstance(DMaaPMRCreator.class); - Map dmaapSourceProperties = dMaaPMRCreator.getDMaaPMRSubscriberConfig(); - dmaapSourceProperties.put("consumerId", UUID.randomUUID().toString().replace("-", "")); - dmaapSourceProperties.put("consumerGroup", UUID.randomUUID().toString().replace("-", "")); - final String subscriberTopicName = dmaapSourceProperties.get("topicName"); - - DataStreamsConfig dmaaPMRSourcePipeline = DataStreamsConfig.builder() - .addStage(new ETLStage("source", new ETLPlugin( - "DMaaPMRSource", StreamingSource.PLUGIN_TYPE, dmaapSourceProperties, null))) - .addStage(new ETLStage("sink", MockSink.getPlugin("dmaapOutput"))) - .addConnection("source", "sink") - .setBatchInterval("20s") - .build(); - - AppRequest appRequest = new AppRequest<>(DATASTREAMS_ARTIFACT, dmaaPMRSourcePipeline); - ApplicationId appId = NamespaceId.DEFAULT.app("DMaaPMRSourceIntegrationTestingApp"); - ApplicationManager appManager = deployApplication(appId.toId(), appRequest); - - SparkManager sparkManager = appManager.getSparkManager(DataStreamsSparkLauncher.NAME); - sparkManager.start(); - sparkManager.waitForStatus(true, 1, 100); - - final DataSetManager

outputManager = getDataset("dmaapOutput"); - final List dmaapContents = new LinkedList<>(); - - // Publish message to source - - new Thread() { - @Override - public void run() { - try { - TimeUnit.MILLISECONDS.sleep(30000); - dMaaPMRCreator.getDMaaPMRPublisherWithTopicName(subscriberTopicName).publish(getTwoSampleMessage()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }.start(); - - try { - Tasks.waitFor(true, new Callable() { - boolean initialized = false; - - @Override - public Boolean call() throws Exception { - try { - outputManager.flush(); - for (StructuredRecord record : MockSink.readOutput(outputManager)) { - dmaapContents.add((String) record.get("message")); - } - return dmaapContents.size() >= 2; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - }, - 90, TimeUnit.SECONDS); - } catch (Exception e) { - e.printStackTrace(); - } - sparkManager.stop(); - - Assert.assertTrue(dmaapContents.size() == 2); - String allMessages = Joiner.on(",").join(dmaapContents); - Assert.assertTrue(allMessages.contains("Message 1")); - Assert.assertTrue(allMessages.contains("Message 2")); - } -} diff --git a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/util/StepUtils.java b/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/util/StepUtils.java deleted file mode 100644 index 45324a7..0000000 --- a/dcae-analytics-it/src/test/java/org/openecomp/dcae/apod/analytics/it/util/StepUtils.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * ===============================LICENSE_START====================================== - * dcae-analytics - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================LICENSE_END=========================================== - */ - -package org.openecomp.dcae.apod.analytics.it.util; - -/** - * @author Rajiv Singla . Creation Date: 2/2/2017. - */ -public abstract class StepUtils { - - - /** - * Determines if step should use default publisher topic as configured in environment properties file - * - * @param topicName step passed topic name - * @return true if default publisher topic - */ - public static boolean isDefaultPublisherTopic(final String topicName) { - if (topicName.equalsIgnoreCase("default")) { - return true; - } else { - return false; - } - } - -} diff --git a/dcae-analytics-it/src/test/resources/cucumber.properties b/dcae-analytics-it/src/test/resources/cucumber.properties index 0773e97..be4ab61 100644 --- a/dcae-analytics-it/src/test/resources/cucumber.properties +++ b/dcae-analytics-it/src/test/resources/cucumber.properties @@ -18,4 +18,4 @@ # ============================LICENSE_END=========================================== # -guice.injector-source=org.openecomp.dcae.apod.analytics.it.module.AnalyticsITInjectorSource +guice.injector-source=org.onap.dcae.apod.analytics.it.module.AnalyticsITInjectorSource diff --git a/dcae-analytics-it/src/test/resources/logback-test.xml b/dcae-analytics-it/src/test/resources/logback-test.xml index 255532f..54c8fef 100644 --- a/dcae-analytics-it/src/test/resources/logback-test.xml +++ b/dcae-analytics-it/src/test/resources/logback-test.xml @@ -38,7 +38,7 @@ - + diff --git a/dcae-analytics-model/pom.xml b/dcae-analytics-model/pom.xml index 0e54923..e130edd 100644 --- a/dcae-analytics-model/pom.xml +++ b/dcae-analytics-model/pom.xml @@ -1,129 +1,129 @@ - - - - - - 4.0.0 - - - dcae-analytics - org.onap.dcaegen2.analytics.tca - 2.1.0-SNAPSHOT - - - dcae-analytics-model - jar - - - DCAE Analytics Model - Contains models (e.g. Common Event Format) which are common to DCAE Analytics - - - - ${project.parent.basedir} - target/generated-sources/delombok - - - - - - - org.slf4j - slf4j-api - - - - ch.qos.logback - logback-core - - - - ch.qos.logback - logback-classic - - - - - com.google.guava - guava - - - com.google.code.findbugs - jsr305 - - - com.google.code.findbugs - annotations - - - - - - org.projectlombok - lombok - - - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-annotations - - - - - - com.jayway.jsonpath - json-path - - - - - org.onap.dcaegen2.analytics.tca - dcae-analytics-test - 2.1.0-SNAPSHOT - test - - - - - - ${project.build.directory}/generated-sources/delombok - - - org.projectlombok - lombok-maven-plugin - - - - - - + + + + + + 4.0.0 + + + dcae-analytics + org.onap.dcaegen2.analytics.tca + 2.1.0-SNAPSHOT + + + dcae-analytics-model + jar + + + DCAE Analytics Model + Contains models (e.g. Common Event Format) which are common to DCAE Analytics + + + + ${project.parent.basedir} + target/generated-sources/delombok + + + + + + + org.slf4j + slf4j-api + + + + ch.qos.logback + logback-core + + + + ch.qos.logback + logback-classic + + + + + com.google.guava + guava + + + com.google.code.findbugs + jsr305 + + + com.google.code.findbugs + annotations + + + + + + org.projectlombok + lombok + + + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + + + + com.jayway.jsonpath + json-path + + + + + org.onap.dcaegen2.analytics.tca + dcae-analytics-test + 2.1.0-SNAPSHOT + test + + + + + + ${project.build.directory}/generated-sources/delombok + + + org.projectlombok + lombok-maven-plugin + + + + + + diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/BaseDynamicPropertiesProvider.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/BaseDynamicPropertiesProvider.java new file mode 100644 index 0000000..f50b859 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/BaseDynamicPropertiesProvider.java @@ -0,0 +1,69 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model; + +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + *

+ * Base Dynamic Provider provide functionality so that all the + * additional dynamic Properties can be accumalated in a map. + *

+ * + * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +@Data +public abstract class BaseDynamicPropertiesProvider implements DynamicPropertiesProvider { + + /** + * All non-required properties should be captured in additional properties + * + * @param dynamicProperties Dynamic properties + * @return dynamic properties + */ + private Map dynamicProperties = new LinkedHashMap<>(); + + + /** + * Add a dynamic property to Common Event Format Entity + * + * @param propertyName property name + * @param propertyValue property value + */ + @Override + public void addDynamicProperties(String propertyName, Object propertyValue) { + dynamicProperties.put(propertyName, propertyValue); + } + + /** + * Determines if dynamic properties are present for the CEF Entity + * + * @return return true if Dynamic Properties are present + */ + public boolean isDynamicPropertiesPresent() { + return dynamicProperties.size() == 0; + } + + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DCAEAnalyticsModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DCAEAnalyticsModel.java new file mode 100644 index 0000000..06fbea7 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DCAEAnalyticsModel.java @@ -0,0 +1,32 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model; + +import java.io.Serializable; + +/** + *

+ * Marker Interface for all DCAE Analytics Model implementations + *

+ * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +public interface DCAEAnalyticsModel extends Serializable { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DynamicPropertiesProvider.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DynamicPropertiesProvider.java new file mode 100644 index 0000000..24b4fae --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/DynamicPropertiesProvider.java @@ -0,0 +1,56 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model; + +import java.util.Map; + +/** + *

+ * Problem: Many Entities have dynamic properties as well as known properties. + * Known properites can be binded explicitly with all dynamic properties need + * to be captured also ensuring that there must not be any loss in information + * during deserialization / serialization process. + *

+ *

+ * This contract allows the deserialization mechanism to catch those dynamic properties + * in a Map so that deserialization mechanism will not loose any information and + * can be serialized back with no loss in dynamic properties information + *

+ * @author Rajiv Singla . Creation Date: 10/18/2016. + */ +public interface DynamicPropertiesProvider extends DCAEAnalyticsModel { + + + /** + * Adds dynamic properties in a Map object + * + * @param propertyName property name + * @param propertyValue property value + */ + void addDynamicProperties(String propertyName, Object propertyValue); + + /** + * Provides dynamic properties map + * + * @return dynamic properties map object + */ + Map getDynamicProperties(); +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/ConfigModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/ConfigModel.java new file mode 100644 index 0000000..baa5e59 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/ConfigModel.java @@ -0,0 +1,33 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config; + +import org.onap.dcae.apod.analytics.model.DCAEAnalyticsModel; + +/** + *

+ * Marker Interface for all Configuration Model Objects + *

+ * + * @author Rajiv Singla . Creation Date: 08/25/2017. + */ +public interface ConfigModel extends DCAEAnalyticsModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAAppConfigModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAAppConfigModel.java new file mode 100644 index 0000000..7887756 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAAppConfigModel.java @@ -0,0 +1,37 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.onap.dcae.apod.analytics.model.BaseDynamicPropertiesProvider; + +/** + *

+ * Base TCA App Config model class + *

+ * + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class BaseTCAAppConfigModel extends BaseDynamicPropertiesProvider implements TCAAppConfigModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAHandle.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAHandle.java new file mode 100644 index 0000000..fa1a1c8 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/BaseTCAHandle.java @@ -0,0 +1,38 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class BaseTCAHandle extends BaseTCAAppConfigModel { + + private String aafPassword; + private String aafUserName; + private DMAAPInfo dmaapInfo; + private String type; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/DMAAPInfo.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/DMAAPInfo.java new file mode 100644 index 0000000..57b9007 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/DMAAPInfo.java @@ -0,0 +1,45 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * DMaaP Information nested inside DMaaP Controller config + * + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DMAAPInfo extends BaseTCAAppConfigModel { + + private static final long serialVersionUID = 1L; + + /** + * DMaaP Topic URL + * + * @param topicUrl new value for DMaaP topic URL + * @return DMaaP Topic URL + */ + private String topicUrl; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsPublishes.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsPublishes.java new file mode 100644 index 0000000..03f65c4 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsPublishes.java @@ -0,0 +1,37 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class StreamsPublishes extends BaseTCAAppConfigModel { + + private static final long serialVersionUID = 1L; + + private TCAHandleOut tcaHandleOut; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsSubscribes.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsSubscribes.java new file mode 100644 index 0000000..7f55a7c --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/StreamsSubscribes.java @@ -0,0 +1,37 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class StreamsSubscribes extends BaseTCAAppConfigModel { + + private static final long serialVersionUID = 1L; + + private TCAHandleIn tcaHandleIn; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAAppConfigModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAAppConfigModel.java new file mode 100644 index 0000000..c0206ef --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAAppConfigModel.java @@ -0,0 +1,34 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import org.onap.dcae.apod.analytics.model.config.ConfigModel; + +/** + *

+ * Marker Interface for all TCA Facade Models + *

+ * + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +public interface TCAAppConfigModel extends ConfigModel { + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAControllerAppConfig.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAControllerAppConfig.java new file mode 100644 index 0000000..51eb6fe --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAControllerAppConfig.java @@ -0,0 +1,42 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Model Object Representing the App Config passed in by the controller + * + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TCAControllerAppConfig extends BaseTCAAppConfigModel { + + private static final long serialVersionUID = 1L; + + private String appName; + private String appDescription; + private StreamsPublishes streamsPublishes; + private StreamsSubscribes streamsSubscribes; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleIn.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleIn.java new file mode 100644 index 0000000..e035b85 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleIn.java @@ -0,0 +1,39 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * TCA Controller App Config - TCA Handle In + *

+ * + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TCAHandleIn extends BaseTCAHandle { + + private static final long serialVersionUID = 1L; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleOut.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleOut.java new file mode 100644 index 0000000..c3c1f54 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/config/tca/TCAHandleOut.java @@ -0,0 +1,39 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.config.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * TCA Controller App Config - TCA Handle Out + *

+ * + * @author Rajiv Singla . Creation Date: 8/25/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TCAHandleOut extends BaseTCAHandle { + + private static final long serialVersionUID = 1L; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertAction.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertAction.java new file mode 100644 index 0000000..09ff85a --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertAction.java @@ -0,0 +1,32 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +/** + * Common Event Format Alert Action + * + * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +public enum AlertAction implements CEFModel { + + CLEAR, CONT, SET + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertType.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertType.java new file mode 100644 index 0000000..f42c331 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/AlertType.java @@ -0,0 +1,44 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +/** + * + * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +public enum AlertType implements CEFModel { + + CARD_ANOMALY("CARD-ANOMALY"), + ELEMENT_ANOMALY("ELEMENT-ANOMALY"), + INTERFACE_ANOMALY("INTERFACE-ANOMALY"), + SERVICE_ANOMALY("SERVICE-ANOMALY"), + UNKNOWN(null); + + private final String name; + + AlertType(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/BaseCEFModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/BaseCEFModel.java new file mode 100644 index 0000000..641db1e --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/BaseCEFModel.java @@ -0,0 +1,39 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.onap.dcae.apod.analytics.model.BaseDynamicPropertiesProvider; + +/** + *

+ * Base CEF Model should be extended by all CEF Model Entities. + * By extending CEF Model all the additional dynamic Properties + * can be accumalated in a map. + *

+ * + * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class BaseCEFModel extends BaseDynamicPropertiesProvider implements CEFModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CEFModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CEFModel.java new file mode 100644 index 0000000..665bd38 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CEFModel.java @@ -0,0 +1,32 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import org.onap.dcae.apod.analytics.model.DCAEAnalyticsModel; + +/** + *

+ * Marker interface for all DCAE Analytics Common Event Format Model implementations + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +public interface CEFModel extends DCAEAnalyticsModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CommonEventHeader.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CommonEventHeader.java new file mode 100644 index 0000000..468ab91 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/CommonEventHeader.java @@ -0,0 +1,181 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Fields common to all Events + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class CommonEventHeader extends BaseCEFModel { + + + private static final long serialVersionUID = 1L; + + /** + * The eventing domain associated with this event + * + * @param domain New value for domain + * @return The eventing domain associated with this event + */ + private Domain domain; + + /** + * Event key that is unique to the event source + * + * @param eventId New value for event key + * @return Event key that is unique to the event source + */ + private String eventId; + + /** + * Unique event name + * + * @param eventName New value for event name + * @return Unique event name + */ + private String eventName; + + + /** + * Event type e.g. applicationVnf, guestOS, hostOS, platform + * + * @param eventType New value for event type + * @return Event type e.g. applicationVnf, guestOS, hostOS, platform + */ + private String eventType; + + + /** + * Enrichment fields for internal VES Event Listener service use only, not supplied by event sources + * + * @param internalHeaderFields new value for internal Header Fields + * @return Enrichment fields for internal VES Event Listener service use only, not supplied by event sources + */ + private InternalHeaderFields internalHeaderFields; + + + /** + * The latest unix time aka epoch time associated with the event from any component--as microseconds elapsed since + * 1 Jan 1970 not including leap seconds + * + * @param lastEpochMicrosec New value for last Epoc Microsec + * @return The latest unix time associated with the event from any component + */ + private Long lastEpochMicrosec; + + + /** + * Three character network function component type as aligned with vfc naming standards + * + * @param nfcNamingCode New value for nfc naming code + * @return Three character network function component type as aligned with vfc naming standards + */ + private String nfcNamingCode; + + + /** + * Four character network function type as aligned with vnf naming standards + * + * @param nfNamingCode New value for nf naming code + * @return Four character network function type as aligned with vnf naming standards + */ + private String nfNamingCode; + + + /** + * Processing Priority + * + * @param priority New value for processing Priority + * @return Processing Priority + */ + private Priority priority; + + + /** + * UUID identifying the entity reporting the event, for example an OAM VM; must be populated by the + * enrichment process + * + * @param reportingEntityId New value for reporting entity Id. Must be populated by the enrichment process + * @return UUID identifying the entity reporting the event populated by the enrichment process + */ + private String reportingEntityId; + + + /** + * Name of the entity reporting the event, for example, an EMS name; may be the same as sourceName + * + * @param reportingEntityName New value for reporting Entity Name + * @return Name of the entity reporting the event, may be the same as sourceName + */ + private String reportingEntityName; + + + /** + * Ordering of events communicated by an event source instance or 0 if not needed + * + * @param sequence New value for Sequence + * @return Ordering of events communicated by an event source instance or 0 if not needed + */ + private Integer sequence; + + + /** + * UUID identifying the entity experiencing the event issue; must be populated by the enrichment process + * + * @param sourceId New value for source id. Must be populated by the enrichment process + * @return UUID identifying the entity experiencing the event issue + */ + private String sourceId; + + + /** + * Name of the entity experiencing the event issue + * + * @param sourceName New value for source name + * @return Name of the entity experiencing the event issue + */ + private String sourceName; + + + /** + * the earliest unix time aka epoch time associated with the event from any component--as microseconds elapsed + * since 1 Jan 1970 not including leap seconds + * + * @param startEpochMicrosec New value for start Epoc Microsec + * @return The earliest unix time associated with the event from any component + */ + private Long startEpochMicrosec; + + + /** + * Version of the event header + * + * @param version New value for version of the event header + * @return Version of the event header + */ + private Float version; +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Criticality.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Criticality.java new file mode 100644 index 0000000..c48159a --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Criticality.java @@ -0,0 +1,31 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +/** + * Performance Criticality + * + * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +public enum Criticality implements CEFModel { + + CRIT, MAJ, UNKNOWN +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Domain.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Domain.java new file mode 100644 index 0000000..1cee639 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Domain.java @@ -0,0 +1,41 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +/** + * Eventing domain associated with the event + *

+ * @author Rajiv Singla . Creation Date: 08/15/2017. + */ +public enum Domain implements CEFModel { + + fault, + heartbeat, + measurementsForVfScaling, + mobileFlow, + other, + sipSignaling, + stateChange, + syslog, + thresholdCrossingAlert, + voiceQuality; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Event.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Event.java new file mode 100644 index 0000000..9f13075 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Event.java @@ -0,0 +1,61 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Generic Event Format + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class Event extends BaseCEFModel { + + + private static final long serialVersionUID = 1L; + + /** + * Fields common to all Events + * + * @param commonEventHeader New value for common Event Header + * @return Fields common to all Events + */ + private CommonEventHeader commonEventHeader; + + /** + * Measurements for Vf scaling fields + * + * @param measurementsForVfScalingFields New value for MeasurementsForVfScaling + * @return MeasurementsForVfScaling fields + */ + private MeasurementsForVfScalingFields measurementsForVfScalingFields; + + /** + * Threshold crossing alert Fields. + * + * @param thresholdCrossingAlertFields New value for Threshold crossing Fields + * @return Threshold crossing Fields + */ + private ThresholdCrossingAlertFields thresholdCrossingAlertFields; +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventListener.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventListener.java new file mode 100644 index 0000000..06cee58 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventListener.java @@ -0,0 +1,45 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Common Event Format - Base Event Listener + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class EventListener extends BaseCEFModel { + + + private static final long serialVersionUID = 1L; + + /** + * Common Event Format - Event + * + * @param event New value for Event + * @return Common Event Format Event + */ + private Event event; +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventSeverity.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventSeverity.java new file mode 100644 index 0000000..340d0de --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/EventSeverity.java @@ -0,0 +1,36 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +/** + * CEF Event severity or priority + * + * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +public enum EventSeverity implements CEFModel { + + //NOTE: enum order must not be changed. Events severity is ordered from high to low + CRITICAL, + MAJOR, + MINOR, + WARNING, + NORMAL +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Field.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Field.java new file mode 100644 index 0000000..2f2a2f0 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Field.java @@ -0,0 +1,53 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Name Value Pair + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class Field extends BaseCEFModel { + + private static final long serialVersionUID = 1L; + + /** + * Name of the Field + * + * @param name New name for the Field + * @return Name of the Field + */ + private String name; + + /** + * Value of the Field + * + * @param value New value for the Field + * @return Value of the Field + */ + private String value; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/InternalHeaderFields.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/InternalHeaderFields.java new file mode 100644 index 0000000..4007a42 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/InternalHeaderFields.java @@ -0,0 +1,38 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Enrichment fields for internal VES Event Listener service use only, not supplied by event sources + *

+ * + * @author Rajiv Singla . Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class InternalHeaderFields extends BaseCEFModel { + + private static final long serialVersionUID = 1L; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/MeasurementsForVfScalingFields.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/MeasurementsForVfScalingFields.java new file mode 100644 index 0000000..73b8df2 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/MeasurementsForVfScalingFields.java @@ -0,0 +1,81 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * Common Event Format - MeasurementsForVfScaling fields + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MeasurementsForVfScalingFields extends BaseCEFModel { + + private static final long serialVersionUID = 1L; + + /** + * Additional name-value-pair fields + * + * @param additionalFields New value for additional name-value-pair fields + * @return Additional name-value-pair fields + */ + private List additionalFields; + + + /** + * Array of named name-value-pair arrays for additional Measurements + * + * @param additionalMeasurements New value for array of named name-value-pair arrays for additional Measurements + * @return Array of named name-value-pair arrays for additional Measurements + */ + private List additionalMeasurements; + + /** + * Interval over which measurements are being reported in seconds + * + * @param measurementInterval New value for measurement Interval + * @return Interval over which measurements are being reported in seconds + */ + private Long measurementInterval; + + /** + * Version of the measurementsForVfScaling block + * + * @param measurementsForVfScalingVersion New value for measurementsForVfScaling block + * @return Version of the measurementsForVfScaling block + */ + private Float measurementsForVfScalingVersion; + + /** + * Usage of an array of virtual network interface cards + * + * @param vNicPerformanceArray New value for Usage of an array of virtual network interface cards + * @return Usage of an array of virtual network interface cards + */ + private List vNicPerformanceArray; + + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/NamedArrayOfFields.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/NamedArrayOfFields.java new file mode 100644 index 0000000..6ab9e58 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/NamedArrayOfFields.java @@ -0,0 +1,55 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * An array of name value pairs along with a name for the array + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class NamedArrayOfFields extends BaseCEFModel { + + private static final long serialVersionUID = 1L; + + /** + * Name of the NamedArrayOfFields + * + * @param name New name for the Field + * @return Name of the Field + */ + private String name; + + /** + * Array of name value pairs + * + * @param arrayOfFields New value for array of name value pairs + * @return Array of name value pairs + */ + private List arrayOfFields; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/PerformanceCounter.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/PerformanceCounter.java new file mode 100644 index 0000000..5ab1ef8 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/PerformanceCounter.java @@ -0,0 +1,68 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Common Event Format - Performance PerformanceCounter + * + * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PerformanceCounter extends BaseCEFModel { + + private static final long serialVersionUID = 1L; + + /** + * Performance Counter Criticality. + * + * @param criticality New value for Criticality + * @return Performance Counter Criticality + */ + private Criticality criticality; + + /** + * Performance Counter Name + * + * @param name New value for Performance counter name + * @return Performance Counter Name + */ + private String name; + + /** + * Performance Counter for Threshold Crossed. + * + * @param thresholdCrossed New value for Performance Counter Threshold Crossed + * @return Performance Counter Threshold Crossed + */ + private String thresholdCrossed; + + /** + * Performance Counter Value. + * + * @param value New Performance Counter Value + * @return Performance Counter Value + */ + private String value; +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Priority.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Priority.java new file mode 100644 index 0000000..8b5304b --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/Priority.java @@ -0,0 +1,34 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +/** + * Common Event Format - Event processing priority + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +public enum Priority implements CEFModel { + + High, + Medium, + Normal, + Low +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/ThresholdCrossingAlertFields.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/ThresholdCrossingAlertFields.java new file mode 100644 index 0000000..39adbdd --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/ThresholdCrossingAlertFields.java @@ -0,0 +1,158 @@ +/* + * ============LICENSE_START========================================================= + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import java.util.List; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Common Event Format - Fields Specific to threshold crossing alert events + * + * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ThresholdCrossingAlertFields extends BaseCEFModel { + + private static final long serialVersionUID = 1L; + + /** + * Additional Performance counters parameters. + * + * @param additionalParameters New value for Additional Performance counters + * @return Additional Performance counters + */ + private List additionalParameters; + + /** + * Event alert action + * + * @param alertAction New Event Action + * @return Event alert action + */ + private AlertAction alertAction; + + /** + * Unique short alert description such as IF-SHUB-ERRDROP + * + * @param alertDescription New value for Unique short alert description + * @return Unique short alert description + */ + private String alertDescription; + + /** + * Alert type + * + * @param alertType New value for Alert Type + * @return Alert Type + */ + private AlertType alertType; + + /** + * Calculated API value (if applicable) + * + * @param alertValue New Calculated API value + * @return Calculated API value (if applicable) + */ + private String alertValue; + + /** + * List of eventIds associated with the event being reported + * + * @param associatedAlertIdList New value for eventIds associated with the event + * @return List of eventIds associated with the event being reported + */ + private List associatedAlertIdList; + + /** + * Time when the performance collector picked up the data; with RFC 2822 compliant format: + * ‘Sat, 13 Mar 2010 11:29:05 -0800’ + * + * @param collectionTimestamp Set new value for time when the performance collector picked up the data + * @return Time when the performance collector picked up the data + */ + private String collectionTimestamp; + + /** + * Specific performance collector instance used + * + * @param dataCollector New value for specific performance collector instance used + * @return Specific performance collector instance used + */ + private String dataCollector; + + /** + * Type of network element + * + * @param elementType New value for type of network element + * @return Type of network element + */ + private String elementType; + + /** + * Event severity or priority + * + * @param eventSeverity New value for event severity or priority + * @return Event severity or priority + */ + private EventSeverity eventSeverity; + + /** + * Time closest to when the measurement was made; with RFC 2822 compliant format: ‘Sat, 13 Mar 2010 11:29:05 -0800’ + * + * @param eventStartTimestamp New value for time closest to when the measurement was made + * @return Time closest to when the measurement was made + */ + private String eventStartTimestamp; + + /** + * Physical or logical port or card (if applicable) + * + * @param interfaceName New value for Physical or logical port or card (if applicable) + * @return Physical or logical port or card (if applicable) + */ + private String interfaceName; + + /** + * Network name + * + * @param networkService New value for network name + * @return Network name + */ + private String networkService; + + /** + * Possible Root Cause (reserved for future use) + * + * @param possibleRootCause New value for possible root cause (reserved for future) + * @return Possible Root Cause (reserved for future use) + */ + private String possibleRootCause; + + /** + * Version of the thresholdCrossingAlertFields block + * + * @param thresholdCrossingFieldsVersion New value for version of the thresholdCrossingAlertFields block + * @return Version of the thresholdCrossingAlertFields block + */ + private Integer thresholdCrossingFieldsVersion; +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/VNicPerformance.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/VNicPerformance.java new file mode 100644 index 0000000..b5b7a59 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/cef/VNicPerformance.java @@ -0,0 +1,308 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.cef; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Describes the performance and errors of an identified virtual network interface card + *

+ * @author Rajiv Singla. Creation Date: 08/15/2017. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class VNicPerformance extends BaseCEFModel { + + + private static final long serialVersionUID = 1L; + + /** + * Cumulative count of broadcast packets received as read at the end of the measurement interval + * + * @param receivedBroadcastPacketsAccumulated New value for cumulative count of broadcast packets received as + * read at the end of the measurement interval + * @return Cumulative count of broadcast packets received as read at the end of the measurement interval + */ + private Long receivedBroadcastPacketsAccumulated; + + /** + * Count of broadcast packets received within the measurement interval + * + * @param receivedBroadcastPacketsDelta New value for count of broadcast packets received within the measurement + * interval + * @return Count of broadcast packets received within the measurement interval + */ + private Long receivedBroadcastPacketsDelta; + + /** + * Cumulative count of discarded packets received as read at the end of the measurement interval + * + * @param receivedDiscardedPacketsAccumulated New value for cumulative count of discarded packets received as read + * at the end of the measurement interval + * @return Cumulative count of discarded packets received as read at the end of the measurement interval + */ + private Long receivedDiscardedPacketsAccumulated; + + /** + * Count of discarded packets received within the measurement interval + * + * @param receivedDiscardedPacketsDelta New value for count of discarded packets received within the measurement + * interval + * @return Count of discarded packets received within the measurement interval + */ + private Long receivedDiscardedPacketsDelta; + + /** + * Cumulative count of error packets received as read at the end of the measurement interval + * + * @param receivedErrorPacketsAccumulated New value for cumulative count of error packets received as read at the + * end of the measurement interval + * @return Cumulative count of error packets received as read at the end of the measurement interval + */ + private Long receivedErrorPacketsAccumulated; + + /** + * Count of error packets received within the measurement interval + * + * @param receivedErrorPacketsDelta New value for count of error packets received within the measurement interval + * @return Count of error packets received within the measurement interval + */ + private Long receivedErrorPacketsDelta; + + /** + * Cumulative count of multicast packets received as read at the end of the measurement interval + * + * @param receivedMulticastPacketsAccumulated New value for cumulative count of multicast packets received as + * read at the end of the measurement interval + * @return Cumulative count of multicast packets received as read at the end of the measurement interval + */ + private Long receivedMulticastPacketsAccumulated; + + /** + * Count of multicast packets received within the measurement interval + * + * @param receivedMulticastPacketsDelta New value for count of multicast packets received within the measurement + * interval + * @return Count of multicast packets received within the measurement interval + */ + private Long receivedMulticastPacketsDelta; + + /** + * Cumulative count of octets received as read at the end of the measurement interval + * + * @param receivedOctetsAccumulated New value for cumulative count of octets received as read at the end of the + * measurement interval + * @return Cumulative count of octets received as read at the end of the measurement interval + */ + private Long receivedOctetsAccumulated; + + /** + * Count of octets received within the measurement interval + * + * @param receivedOctetsDelta New value for count of octets received within the measurement interval + * @return Count of octets received within the measurement interval + */ + private Long receivedOctetsDelta; + + /** + * Cumulative count of all packets received as read at the end of the measurement interval + * + * @param receivedTotalPacketsAccumulated New value for cumulative count of all packets received as read at the + * end of the measurement interval + * @return Cumulative count of all packets received as read at the end of the measurement interval + */ + private Long receivedTotalPacketsAccumulated; + + /** + * Count of all packets received within the measurement interval + * + * @param receivedTotalPacketsDelta New value for count of all packets received within the measurement interval + * @return Count of all packets received within the measurement interval + */ + private Long receivedTotalPacketsDelta; + + /** + * Cumulative count of unicast packets received as read at the end of the measurement interval + * + * @param receivedUnicastPacketsAccumulated New value for cumulative count of unicast packets received as read at + * the end of the measurement interval + * @return Cumulative count of unicast packets received as read at the end of the measurement interval + */ + private Long receivedUnicastPacketsAccumulated; + + /** + * Count of unicast packets received within the measurement interval + * + * @param receivedUnicastPacketsDelta New value for count of unicast packets received within the measurement + * interval + * @return Count of unicast packets received within the measurement interval + */ + private Long receivedUnicastPacketsDelta; + + /** + * Cumulative count of broadcast packets transmitted as read at the end of the measurement interval + * + * @param transmittedBroadcastPacketsAccumulated New value for cumulative count of broadcast packets transmitted + * as read at the end of the measurement interval + * @return Cumulative count of broadcast packets transmitted as read at the end of the measurement interval + */ + private Long transmittedBroadcastPacketsAccumulated; + + /** + * Count of broadcast packets transmitted within the measurement interval + * + * @param transmittedBroadcastPacketsDelta New value for count of broadcast packets transmitted within the + * measurement interval + * @return Count of broadcast packets transmitted within the measurement interval + */ + private Long transmittedBroadcastPacketsDelta; + + /** + * Cumulative count of discarded packets transmitted as read at the end of the measurement interval + * + * @param transmittedDiscardedPacketsAccumulated New value for cumulative count of discarded packets transmitted + * as read at the end of the measurement interval + * @return Cumulative count of discarded packets transmitted as read at the end of the measurement interval + */ + private Long transmittedDiscardedPacketsAccumulated; + + /** + * Count of discarded packets transmitted within the measurement interval + * + * @param transmittedDiscardedPacketsDelta New value for count of discarded packets transmitted within the + * measurement interval + * @return Count of discarded packets transmitted within the measurement interval + */ + private Long transmittedDiscardedPacketsDelta; + + /** + * Cumulative count of error packets transmitted as read at the end of the measurement interval + * + * @param transmittedErrorPacketsAccumulated New value for cumulative count of error packets transmitted as read + * at the end of the measurement interval + * @return Cumulative count of error packets transmitted as read at the end of the measurement interval + */ + private Long transmittedErrorPacketsAccumulated; + + /** + * Count of error packets transmitted within the measurement interval + * + * @param transmittedErrorPacketsDelta New value for count of error packets transmitted within the measurement + * interval + * @return Count of error packets transmitted within the measurement interval + */ + private Long transmittedErrorPacketsDelta; + + /** + * Cumulative count of multicast packets transmitted as read at the end of the measurement interval + * + * @param transmittedMulticastPacketsAccumulated New value for cumulative count of multicast packets transmitted + * as read at the end of the measurement interval + * @return Cumulative count of multicast packets transmitted as read at the end of the measurement interval + */ + private Long transmittedMulticastPacketsAccumulated; + + /** + * Count of multicast packets transmitted within the measurement interval + * + * @param transmittedMulticastPacketsDelta New value for count of multicast packets transmitted within the + * measurement interval + * @return Count of multicast packets transmitted within the measurement interval + */ + private Long transmittedMulticastPacketsDelta; + + /** + * Cumulative count of octets transmitted as read at the end of the measurement interval + * + * @param transmittedOctetsAccumulated New value for cumulative count of octets transmitted as read at the end of + * the measurement interval + * @return Cumulative count of octets transmitted as read at the end of the measurement interval + */ + private Long transmittedOctetsAccumulated; + + /** + * Count of octets transmitted within the measurement interval + * + * @param transmittedOctetsDelta New value for count of octets transmitted within the measurement interval + * @return Count of octets transmitted within the measurement interval + */ + private Long transmittedOctetsDelta; + + /** + * Cumulative count of all packets transmitted as read at the end of the measurement interval + * + * @param transmittedTotalPacketsAccumulated New value for cumulative count of all packets transmitted as read at + * the end of the measurement interval + * @return Cumulative count of all packets transmitted as read at the end of the measurement interval + */ + private Long transmittedTotalPacketsAccumulated; + + /** + * Count of all packets transmitted within the measurement interval + * + * @param transmittedTotalPacketsDelta New value for count of all packets transmitted within the measurement + * interval + * @return Count of all packets transmitted within the measurement interval + */ + private Long transmittedTotalPacketsDelta; + + /** + * Cumulative count of unicast packets transmitted as read at the end of the measurement interval + * + * @param transmittedUnicastPacketsAccumulated New value for cumulative count of unicast packets transmitted as + * read at the end of the measurement interval + * @return Cumulative count of unicast packets transmitted as read at the end of the measurement interval + */ + private Long transmittedUnicastPacketsAccumulated; + + + /** + * Count of unicast packets transmitted within the measurement interval + * + * @param transmittedUnicastPacketsDelta New value for count of unicast packets transmitted within the + * measurement interval + * @return Count of unicast packets transmitted within the measurement interval + */ + private Long transmittedUnicastPacketsDelta; + + + /** + * Indicates whether vNicPerformance values are likely inaccurate due to counter overflow or other conditions + * + * @param valuesAreSuspect New value to indicate whether vNicPerformance values are likely inaccurate due to + * counter overflow or other conditions + * @return Indicates whether vNicPerformance values are likely inaccurate due to counter overflow or other + * conditions + */ + private Boolean valuesAreSuspect; + + + /** + * Virtual Network Card Identifier + * + * @param vNicIdentifier New value for Virtual Network Card Identifier + * @return Virtual Network Card Identifier + */ + private String vNicIdentifier; + + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/PolicyModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/PolicyModel.java new file mode 100644 index 0000000..697d966 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/PolicyModel.java @@ -0,0 +1,33 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy; + +import org.onap.dcae.apod.analytics.model.DCAEAnalyticsModel; + +/** + *

+ * Marker Interface all DCAE Analytics Policy Model implementations + *

+ * + * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +public interface PolicyModel extends DCAEAnalyticsModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/BaseTCAPolicyModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/BaseTCAPolicyModel.java new file mode 100644 index 0000000..016e585 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/BaseTCAPolicyModel.java @@ -0,0 +1,37 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.onap.dcae.apod.analytics.model.BaseDynamicPropertiesProvider; + +/** + *

+ * A Base TCA Policy Model which accumulates all dynamic properties in a dynamicProperties Map + *

+ * + * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class BaseTCAPolicyModel extends BaseDynamicPropertiesProvider implements TCAPolicyModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ClosedLoopEventStatus.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ClosedLoopEventStatus.java new file mode 100644 index 0000000..4459fc3 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ClosedLoopEventStatus.java @@ -0,0 +1,34 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +/** + * TCA Policy Closed Loop Event Status + * + * @author Rajiv Singla . Creation Date: 9/11/2017. + */ +public enum ClosedLoopEventStatus implements TCAPolicyModel { + + ONSET, + ABATED, + CONTINUE; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ControlLoopSchemaType.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ControlLoopSchemaType.java new file mode 100644 index 0000000..b913703 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/ControlLoopSchemaType.java @@ -0,0 +1,33 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +import org.onap.dcae.apod.analytics.model.domain.policy.PolicyModel; + +/** + * Control Loop Schema Type + * + * @author Rajiv Singla . Creation Date: 8/24/2017. + */ +public enum ControlLoopSchemaType implements PolicyModel { + + VNF, VM; +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Direction.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Direction.java new file mode 100644 index 0000000..a787c4d --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Direction.java @@ -0,0 +1,76 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +import java.math.BigDecimal; + +import javax.annotation.Nonnull; + +/** + *

+ * Enum for Threshold Direction + *

+ * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +public enum Direction implements TCAPolicyModel { + + EQUAL { + @Override + public Boolean operate(@Nonnull BigDecimal value1, @Nonnull BigDecimal value2) { + return value1.compareTo(value2) == 0; + } + }, + LESS { + @Override + public Boolean operate(@Nonnull BigDecimal value1, @Nonnull BigDecimal value2) { + return value1.compareTo(value2) < 0; + } + }, + LESS_OR_EQUAL { + @Override + public Boolean operate(@Nonnull BigDecimal value1, @Nonnull BigDecimal value2) { + return value1.compareTo(value2) <= 0; + } + }, + GREATER { + @Override + public Boolean operate(@Nonnull BigDecimal value1, @Nonnull BigDecimal value2) { + return value1.compareTo(value2) > 0; + } + }, + GREATER_OR_EQUAL { + @Override + public Boolean operate(@Nonnull BigDecimal value1, @Nonnull BigDecimal value2) { + return value1.compareTo(value2) >= 0; + } + }; + + /** + * Configure logic for a particular Direction + * + * @param value1 left operand for Direction operation + * @param value2 right operand for Direction operation + * + * @return result of operation for the direction logic + */ + public abstract Boolean operate(@Nonnull BigDecimal value1, @Nonnull BigDecimal value2); + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/MetricsPerEventName.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/MetricsPerEventName.java new file mode 100644 index 0000000..1b54d0a --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/MetricsPerEventName.java @@ -0,0 +1,115 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.List; + +/** + * TCA Metrics that need to applied to each Event Name + * + * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MetricsPerEventName extends BaseTCAPolicyModel{ + + + private static final long serialVersionUID = 1L; + + /** + * Event Name to which TCA Policy needs to applied. + * + * @param eventName New value for eventName to which TCA Policy needs to applied + * @return Event Name to which TCA Policy needs to applied + */ + private String eventName; + + /** + * Control Loop Schema Type + * + * @param controlLoopSchemaType New value for Control Loop Schema Type + * @return Control Loop Schema Type + */ + private ControlLoopSchemaType controlLoopSchemaType; + + /** + * Policy Scope + * + * @param policyScope New value for Policy Scope + * @return Policy Scope + */ + private String policyScope; + + /** + * Policy Name + * + * @param policyName New value for Policy Name + * @return Policy Name + */ + private String policyName; + + /** + * Policy Version + * + * @param policyVersion New value for Policy Version + * @return Policy Version + */ + private String policyVersion; + + /** + * Policy Thresholds + * + * @param thresholds New value for Policy Thresholds + * @return Policy Thresholds + */ + private List thresholds; + + + /** + * Creates a deep copy of given {@link MetricsPerEventName} + * + * @param metricsPerEventName metrics Per Event Name that need to copied + * + * @return copy of new metrics per event Name with values copied from given metrics per Event Name + */ + public static MetricsPerEventName copy(final MetricsPerEventName metricsPerEventName) { + final MetricsPerEventName newMetricsPerEventName = new MetricsPerEventName(); + newMetricsPerEventName.setEventName(metricsPerEventName.getEventName()); + newMetricsPerEventName.setControlLoopSchemaType(metricsPerEventName.getControlLoopSchemaType()); + newMetricsPerEventName.setPolicyScope(metricsPerEventName.getPolicyScope()); + newMetricsPerEventName.setPolicyName(metricsPerEventName.getPolicyName()); + newMetricsPerEventName.setPolicyVersion(metricsPerEventName.getPolicyVersion()); + if (metricsPerEventName.getThresholds() != null) { + List newThresholds = new ArrayList<>(metricsPerEventName.getThresholds().size()); + for( Threshold threshold : metricsPerEventName.getThresholds()) { + newThresholds.add(Threshold.copy(threshold)); + } + newMetricsPerEventName.setThresholds(newThresholds); + } + return newMetricsPerEventName; + } + + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicy.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicy.java new file mode 100644 index 0000000..45559e3 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicy.java @@ -0,0 +1,58 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + *

+ * TCA (Threshold Crossing Alert) Root + *

+ * + * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TCAPolicy extends BaseTCAPolicyModel { + + private static final long serialVersionUID = 1L; + + /** + * TCA Policy domain which is associated with TCA incoming CEF message domain + * + * @param domain New value for domain + * @return Policy domain which is associated with incoming CEF message + */ + private String domain; + + /** + * Contains TCA Policy metrics that needs to be applied to each Functional Role + * + * @param metricsPerEventName New value for metrics that needs to be applied to each Functional Role + * @return Contains TCA Policy metrics that needs to be applied to each Functional Role + */ + private List metricsPerEventName; + + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicyModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicyModel.java new file mode 100644 index 0000000..fefef3c --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/TCAPolicyModel.java @@ -0,0 +1,35 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +import org.onap.dcae.apod.analytics.model.domain.policy.PolicyModel; + +/** + *

+ * Marker interface for all TCA Policy Models + *

+ * + * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +public interface TCAPolicyModel extends PolicyModel { + + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Threshold.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Threshold.java new file mode 100644 index 0000000..60da70d --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/domain/policy/tca/Threshold.java @@ -0,0 +1,127 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.domain.policy.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.onap.dcae.apod.analytics.model.domain.cef.EventSeverity; + +import java.math.BigDecimal; + +/** + * + * @author Rajiv Singla . Creation Date: 11/5/2016. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class Threshold extends BaseTCAPolicyModel { + + private static final long serialVersionUID = 1L; + + /** + * Closed Loop Control Name + * + * @param closedLoopControlName New value for Closed Loop Control Name + * @return Closed Loop Control Name + */ + private String closedLoopControlName; + + + /** + * Closed Loop Event Status + * + * @param closedLoopEventStatus New value for Closed Loop Event Status + * @return Closed Loop Event Status + */ + private ClosedLoopEventStatus closedLoopEventStatus; + + /** + * Threshold Version + * + * @param version New value for Threshold Version + * @return Threshold Version + */ + private String version; + + /** + * Path of the field inside Common Event Format which needs to be monitored by TCA App + * for threshold crossing + * + * @param fieldPath New value for Path of the field inside CEF which needs to be monitored for TCA + * @return Path of the field inside Common Event Format which needs to be monitored by TCA App + */ + private String fieldPath; + + /** + * Threshold Value + * + * @param thresholdValue New value for Threshold Value + * @return Threshold Value + */ + private Long thresholdValue; + + /** + * Direction of threshold + * + * @param direction New value for Direction of threshold + * @return Direction of threshold + */ + private Direction direction; + + /** + * Severity of Event based on CEF Convention + * + * @param severity New value for Severity of Event based on CEF Convention + * @return Severity of Event based on CEF Convention + */ + private EventSeverity severity; + + + /** + * Actual Field value that caused the threshold violation. Note: Ignored for serialization / deserialization + * + * + * @param actualFieldValue new value for actual Field value that caused the violation + * @return actual field value that caused the violation + */ + private BigDecimal actualFieldValue; + + /** + * Creates a deep copy of give {@link Threshold} + * + * @param threshold threshold that need to be copied + * + * @return new instance of threshold with copied value for give threshold + */ + public static Threshold copy(final Threshold threshold) { + final Threshold newThreshold = new Threshold(); + newThreshold.setClosedLoopControlName(threshold.getClosedLoopControlName()); + newThreshold.setClosedLoopEventStatus(threshold.getClosedLoopEventStatus()); + newThreshold.setFieldPath(threshold.getFieldPath()); + newThreshold.setThresholdValue(threshold.getThresholdValue()); + newThreshold.setDirection(threshold.getDirection()); + newThreshold.setSeverity(threshold.getSeverity()); + newThreshold.setVersion(threshold.getVersion()); + newThreshold.setActualFieldValue(threshold.getActualFieldValue()); + return newThreshold; + } + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/FacadeModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/FacadeModel.java new file mode 100644 index 0000000..195a6c2 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/FacadeModel.java @@ -0,0 +1,33 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.facade; + +import org.onap.dcae.apod.analytics.model.DCAEAnalyticsModel; + +/** + *

+ * Marker Interface for all Facade (outgoing) DCAE Analytics Model + *

+ * + * @author Rajiv Singla . Creation Date: 11/9/2016. + */ +public interface FacadeModel extends DCAEAnalyticsModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/AAI.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/AAI.java new file mode 100644 index 0000000..f878917 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/AAI.java @@ -0,0 +1,41 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.facade.tca; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.onap.dcae.apod.analytics.model.BaseDynamicPropertiesProvider; + +/** + * + * @author Rajiv Singla . Creation Date: 11/9/2016. + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class AAI extends BaseDynamicPropertiesProvider implements TCAFacadeModel { + + private static final long serialVersionUID = 1L; + + private String genericVNFName; + + private String genericServerName; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAFacadeModel.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAFacadeModel.java new file mode 100644 index 0000000..8b8b88c --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAFacadeModel.java @@ -0,0 +1,31 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.facade.tca; + +import org.onap.dcae.apod.analytics.model.facade.FacadeModel; + +/** + * Marker Interface for all TCA Facade Models + * + * @author Rajiv Singla . Creation Date: 11/9/2016. + */ +public interface TCAFacadeModel extends FacadeModel { +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAVESResponse.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAVESResponse.java new file mode 100644 index 0000000..6e8024f --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/facade/tca/TCAVESResponse.java @@ -0,0 +1,50 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.facade.tca; + +import lombok.Data; + +/** + * Response generated by TCA for VES Message + * + * @author Rajiv Singla . Creation Date: 11/9/2016. + */ +@Data +public class TCAVESResponse implements TCAFacadeModel { + + private static final long serialVersionUID = 1L; + + private AAI aai; + private Long closedLoopAlarmEnd; + private Long closedLoopAlarmStart; + private String closedLoopControlName; + private String closedLoopEventClient; + private String closedLoopEventStatus; + private String from; + private String policyName; + private String policyScope; + private String policyVersion; + private String requestID; + private String target; + private String targetType; + private String version; + +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelIOUtils.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelIOUtils.java new file mode 100644 index 0000000..a0f374c --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelIOUtils.java @@ -0,0 +1,132 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.util; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Utility class containing methods for IO related operations + *

+ * @author Rajiv Singla . Creation Date: 10/17/2016. + */ +public abstract class AnalyticsModelIOUtils extends AnalyticsModelJsonUtils { + + private static final Logger LOG = LoggerFactory.getLogger(AnalyticsModelIOUtils.class); + + /** + * Parses given valid JSON file Location to object of given binding class type. + * + * @param fileLocation valid JSON File Location + * @param bindingClass class Type of Binding object + * + * @param binding Class Type + * + * @return binding Class Object which properties populated from JSON File Location + * @throws IOException when fails to do IO operations + */ + public static final T convertToJsonObject(String fileLocation, Class bindingClass) throws IOException { + + // Load Resource from give path + final InputStream resourceAsStream = loadResourceAsStream(fileLocation); + + // If resource is null throw an exception + if (resourceAsStream == null) { + final String errorMessage = String.format("Invalid File location: %s", fileLocation); + throw new IOException(errorMessage, new FileNotFoundException(errorMessage)); + } + + // Parse input stream + try (InputStreamReader inputStreamReader = new InputStreamReader(resourceAsStream, Charset.forName("UTF-8"))) { + + return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(inputStreamReader, bindingClass); + } catch (JsonMappingException | JsonParseException e) { + + // If parsing fails due to Invalid Json or Json IO Issues throw an exception + final String errorMessage = String.format("Json parsing error while parsing Json File location: %s", + fileLocation); + + LOG.error(errorMessage); + throw new IOException(errorMessage, e); + } catch (IOException e) { + + // If parsing fails due to IO Issues throw an exception + final String errorMessage = String.format("IO Error while parsing Json File location: %s", fileLocation); + LOG.error(errorMessage); + throw new IOException(errorMessage, e); + } + } + + /** + * Loads properties from a given file location. Throws {@link RuntimeException} if file location is invalid + * or there were exception when loading properties + * + * @param propertiesFileLocation path string for properties file + * @param properties properties object that needs to be populated with give file properties + * + * @return properties object with populated properties from properties file + * + */ + public static Properties loadPropertiesFile(String propertiesFileLocation, final Properties properties) { + + // Load Resource from give properties file path + final InputStream propertiesFileInputStream = loadResourceAsStream(propertiesFileLocation); + + // If properties file is not present throw an exception + if (propertiesFileInputStream == null) { + final String errorMessage = String.format("Invalid Properties File at location: %s", + propertiesFileLocation); + //TODO: discuss and change this excpeiton as well. + throw new RuntimeException(errorMessage, new FileNotFoundException(errorMessage)); + } + + try { + properties.load(propertiesFileInputStream); + } catch (IOException e) { + final String errorMessage = String.format("IO Exception while reading Properties File at location: %s", + propertiesFileLocation); + throw new RuntimeException(errorMessage, e); + } + + return properties; + + } + + /** + * Loads Input file from the given classpath file location and returns file InputStream + * + * @param fileLocation classpath file location + * + * @return {@link InputStream} for classpath file + */ + public static InputStream loadResourceAsStream(String fileLocation) { + // Load Resource from give path + return Thread.currentThread().getContextClassLoader().getResourceAsStream(fileLocation); + } +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelJsonUtils.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelJsonUtils.java new file mode 100644 index 0000000..35834d1 --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/AnalyticsModelJsonUtils.java @@ -0,0 +1,104 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Suppliers; +import org.onap.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier; + +import java.io.IOException; +import java.io.InputStream; + +/** + * + * @author Rajiv Singla . Creation Date: 11/7/2016. + */ +public abstract class AnalyticsModelJsonUtils { + + /** + * Object mapper to be used for all TCA Json Parsing + */ + protected static final ObjectMapper ANALYTICS_MODEL_OBJECT_MAPPER = + Suppliers.memoize(new AnalyticsModelObjectMapperSupplier()).get(); + + + /** + * Converts Input Stream to given type reference object + * + * @param inputStream input stream + * @param valueTypeRef type reference + * @param type of type reference + * + * @return parsed json object + * + * @throws IOException IO Exception + */ + public static T readValue(InputStream inputStream, TypeReference valueTypeRef) throws IOException { + return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(inputStream, valueTypeRef); + } + + + /** + * Converts Input Stream to given target class object + * + * @param inputStream input stream + * @param targetClass target class type + * @param type of class + * + * @return parsed json object + * + * @throws IOException IO Exception + */ + public static T readValue(InputStream inputStream, Class targetClass) throws IOException { + return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(inputStream, targetClass); + } + + + /** + * Converts given object to JSON string + * + * @param value object that needs to converted to json string + * + * @return json string + * @throws JsonProcessingException Json Processing exception + */ + public static String writeValueAsString(Object value) throws JsonProcessingException { + return ANALYTICS_MODEL_OBJECT_MAPPER.writeValueAsString(value); + } + + + /** + * Method to deserialize JSON content from given JSON content String. + * + * @param jsonString JSON String + * @param objectClass target object class + * @param object class type + * + * @return converted Object from JSON String + * + * @throws IOException IO Exception + */ + public static T readValue(final String jsonString, final Class objectClass) throws IOException { + return ANALYTICS_MODEL_OBJECT_MAPPER.readValue(jsonString, objectClass); + } +} diff --git a/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/AnalyticsModelObjectMapperSupplier.java b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/AnalyticsModelObjectMapperSupplier.java new file mode 100644 index 0000000..d5e2d9f --- /dev/null +++ b/dcae-analytics-model/src/main/java/org/onap/dcae/apod/analytics/model/util/json/AnalyticsModelObjectMapperSupplier.java @@ -0,0 +1,115 @@ +/* + * ===============================LICENSE_START====================================== + * dcae-analytics + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================LICENSE_END=========================================== + */ + +package org.onap.dcae.apod.analytics.model.util.json; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Supplier; +import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.Option; +import com.jayway.jsonpath.spi.json.JacksonJsonProvider; +import com.jayway.jsonpath.spi.json.JsonProvider; +import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; +import com.jayway.jsonpath.spi.mapper.MappingProvider; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + +import java.util.EnumSet; +import java.util.Set; + +/** + *

+ * {@link Supplier} that can be used by clients to get Object Mapper which specializes + * in serialize and deserialize - DCAE Analytics Model JSON Objects. Clients can + * choose to memoize this Supplier for performance enhancements + *
+ * NOTE: This supplier also setups up {@link JsonPath} default + * config to make use of this Supplier object mapper + *

+ * @author Rajiv Singla . Creation Date: 11/10/2016. + */ +@SuppressFBWarnings("SIC_INNER_SHOULD_BE_STATIC_ANON") +public class AnalyticsModelObjectMapperSupplier implements Supplier { + + @Override + public ObjectMapper get() { + + final ObjectMapper objectMapper = new ObjectMapper(); + + // Serialize null values + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + + // Don't fail on unknown properties + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + + // Register Common Event Format Module + objectMapper.registerModule(new CommonEventFormatModule()); + // Register TCA Policy Module + objectMapper.registerModule(new TCAPolicyModule()); + // Register TCA Facade Module + objectMapper.registerModule(new TCAFacadeModelModule()); + // Register TCA Controller App Config Module + objectMapper.registerModule(new TCAControllerConfigModule()); + + + // Setup JsonPath default config + setupJsonPathDefaultConfig(objectMapper); + + return objectMapper; + } + + + /** + * Setups up default Config for {@link JsonPath} + * + * @param objectMapper Jackson object mapper + */ + private void setupJsonPathDefaultConfig(final ObjectMapper objectMapper) { + + Configuration.setDefaults(new Configuration.Defaults() { + + private final JsonProvider jsonProvider = new JacksonJsonProvider(objectMapper); + private final MappingProvider mappingProvider = new JacksonMappingProvider(objectMapper); + + @Override + public JsonProvider jsonProvider() { + return jsonProvider; + } + + @Override + public MappingProvider mappingProvider() { + return mappingProvider; + } + + @Override + public Set