2 * ===============================LICENSE_START======================================
\r
4 * ================================================================================
\r
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * ================================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============================LICENSE_END===========================================
\r
21 package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet;
\r
23 import co.cask.cdap.api.dataset.lib.ObjectMappedTable;
\r
24 import co.cask.cdap.api.flow.flowlet.FlowletContext;
\r
25 import co.cask.cdap.api.flow.flowlet.OutputEmitter;
\r
26 import com.google.common.collect.ImmutableList;
\r
27 import org.junit.Test;
\r
28 import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants;
\r
29 import org.openecomp.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput;
\r
30 import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException;
\r
31 import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementEntity;
\r
32 import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest;
\r
33 import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences;
\r
34 import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus;
\r
35 import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName;
\r
36 import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold;
\r
37 import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils;
\r
39 import java.util.Date;
\r
40 import java.util.List;
\r
42 import static org.mockito.ArgumentMatchers.any;
\r
43 import static org.mockito.ArgumentMatchers.eq;
\r
44 import static org.mockito.Mockito.doNothing;
\r
45 import static org.mockito.Mockito.mock;
\r
46 import static org.mockito.Mockito.times;
\r
47 import static org.mockito.Mockito.verify;
\r
48 import static org.mockito.Mockito.when;
\r
51 * @author Rajiv Singla . Creation Date: 9/12/2017.
\r
53 @SuppressWarnings("unchecked")
\r
54 public class TCAVESAlertsAbatementFlowletTest extends BaseAnalyticsCDAPTCAUnitTest {
\r
56 private static final TCAPolicyPreferences sampleTCAPolicyPreferences = getSampleTCAPolicyPreferences();
\r
57 private static final List<MetricsPerEventName> metricsPerEventNames = sampleTCAPolicyPreferences
\r
58 .getMetricsPerEventName();
\r
59 private final OutputEmitter<String> mockOutputEmitter = mock(OutputEmitter.class);
\r
61 private class TestTCAVESAlertsAbatementFlowlet extends TCAVESAlertsAbatementFlowlet {
\r
63 public TestTCAVESAlertsAbatementFlowlet(String tcaAlertsAbatementTableName) {
\r
64 super(tcaAlertsAbatementTableName);
\r
65 this.alertsAbatementOutputEmitter = mockOutputEmitter;
\r
66 doNothing().when(mockOutputEmitter).emit(any(String.class));
\r
71 public void testConfigure() throws Exception {
\r
72 final TCAVESAlertsAbatementFlowlet tcavesAlertsAbatementFlowlet =
\r
73 new TCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");
\r
74 assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET,
\r
75 CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET,
\r
76 tcavesAlertsAbatementFlowlet);
\r
79 @Test(expected = CDAPSettingsException.class)
\r
80 public void testDetermineAbatementAlertsWhenViolatedMetricsEventNameIsBlank() throws Exception {
\r
82 final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =
\r
83 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");
\r
84 final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET);
\r
85 final ThresholdCalculatorOutput mockThresholdCalculatorOutput =
\r
86 getMockThresholdCalculatorOutput(violatedThreshold);
\r
87 when(mockThresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn("");
\r
89 tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);
\r
93 public void testDetermineAbatementAlertsWhenControlLoopTypeIsONSET() throws Exception {
\r
95 final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";
\r
96 final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =
\r
97 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");
\r
99 final FlowletContext mockFlowletContext = mock(FlowletContext.class);
\r
100 final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);
\r
101 when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);
\r
102 tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);
\r
104 doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
106 final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET);
\r
107 final ThresholdCalculatorOutput mockThresholdCalculatorOutput =
\r
108 getMockThresholdCalculatorOutput(violatedThreshold);
\r
110 tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);
\r
111 verify(mockObjectMappedTable,
\r
112 times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
113 verify(mockOutputEmitter, times(1)).emit(any(String.class));
\r
119 public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousAlertWasSent() throws Exception {
\r
121 final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";
\r
122 final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =
\r
123 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");
\r
125 final FlowletContext mockFlowletContext = mock(FlowletContext.class);
\r
126 final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);
\r
127 when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);
\r
128 tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);
\r
130 doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
131 final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class);
\r
132 when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity);
\r
133 when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(null);
\r
135 final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED);
\r
136 final ThresholdCalculatorOutput mockThresholdCalculatorOutput =
\r
137 getMockThresholdCalculatorOutput(violatedThreshold);
\r
139 tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);
\r
140 verify(mockObjectMappedTable,
\r
141 times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
142 verify(mockOutputEmitter, times(1)).emit(any(String.class));
\r
147 public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndPreviousAlertWasAlreadySent() throws
\r
150 final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";
\r
151 final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =
\r
152 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");
\r
154 final FlowletContext mockFlowletContext = mock(FlowletContext.class);
\r
155 final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);
\r
156 when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);
\r
157 tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);
\r
159 doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
160 final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class);
\r
161 when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity);
\r
162 final long time = new Date().getTime();
\r
163 when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(Long.toString(time));
\r
165 final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED);
\r
166 final ThresholdCalculatorOutput mockThresholdCalculatorOutput =
\r
167 getMockThresholdCalculatorOutput(violatedThreshold);
\r
169 tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);
\r
170 verify(mockObjectMappedTable,
\r
171 times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
172 verify(mockOutputEmitter, times(0)).emit(any(String.class));
\r
178 public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousONSETEventFound() throws
\r
181 final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";
\r
182 final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =
\r
183 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");
\r
185 final FlowletContext mockFlowletContext = mock(FlowletContext.class);
\r
186 final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);
\r
187 when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);
\r
188 tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);
\r
190 doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
191 when(mockObjectMappedTable.read(any(String.class))).thenReturn(null);
\r
193 final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED);
\r
194 final ThresholdCalculatorOutput mockThresholdCalculatorOutput =
\r
195 getMockThresholdCalculatorOutput(violatedThreshold);
\r
197 tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);
\r
198 verify(mockObjectMappedTable,
\r
199 times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class));
\r
200 verify(mockOutputEmitter, times(0)).emit(any(String.class));
\r
204 @Test(expected = CDAPSettingsException.class)
\r
205 public void testDetermineAbatementAlertsWhenControlLoopTypeIsNotOnsetOrAbated() throws
\r
207 final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =
\r
208 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");
\r
209 final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.CONTINUE);
\r
210 final ThresholdCalculatorOutput mockThresholdCalculatorOutput =
\r
211 getMockThresholdCalculatorOutput(violatedThreshold);
\r
213 tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);
\r
217 private static Threshold getViolatedThreshold(final ClosedLoopEventStatus closedLoopEventStatus) {
\r
218 final Threshold violatedThreshold = Threshold.copy(metricsPerEventNames.get(0).getThresholds().get(0));
\r
219 violatedThreshold.setClosedLoopEventStatus(closedLoopEventStatus);
\r
220 return violatedThreshold;
\r
224 private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final Threshold violatedThreshold) throws
\r
227 final MetricsPerEventName violatedMetricsPerEventName =
\r
228 MetricsPerEventName.copy(metricsPerEventNames.get(0));
\r
229 violatedMetricsPerEventName.setThresholds(ImmutableList.of(violatedThreshold));
\r
230 return getMockThresholdCalculatorOutput(
\r
231 fromStream(CEF_MESSAGE_JSON_FILE_LOCATION),
\r
232 fromStream(TCA_POLICY_JSON_FILE_LOCATION),
\r
233 TCAUtils.writeValueAsString(violatedMetricsPerEventName),
\r
234 fromStream(TCA_ALERT_JSON_FILE_LOCATION)
\r
239 private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final String cefMessage,
\r
240 final String tcaPolicy,
\r
241 final String violatedMetricsPerEventName,
\r
242 final String alertMessage) {
\r
243 final ThresholdCalculatorOutput thresholdCalculatorOutput = mock(ThresholdCalculatorOutput.class);
\r
244 when(thresholdCalculatorOutput.getCefMessage()).thenReturn(cefMessage);
\r
245 when(thresholdCalculatorOutput.getTcaPolicy()).thenReturn(tcaPolicy);
\r
246 when(thresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn(violatedMetricsPerEventName);
\r
247 when(thresholdCalculatorOutput.getAlertMessage()).thenReturn(alertMessage);
\r
248 return thresholdCalculatorOutput;
\r