1 package org.onap.aai.sparky.autosuggestion.sync;
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
6 import java.util.ArrayList;
7 import java.util.HashMap;
8 import java.util.HashSet;
13 import org.junit.Before;
14 import org.junit.Test;
15 import org.mockito.Matchers;
16 import org.mockito.Mockito;
17 import org.onap.aai.restclient.client.OperationResult;
18 import org.onap.aai.sparky.config.oxm.OxmEntityDescriptor;
19 import org.onap.aai.sparky.config.oxm.OxmEntityLookup;
20 import org.onap.aai.sparky.config.oxm.OxmModelLoader;
21 import org.onap.aai.sparky.config.oxm.OxmModelProcessor;
22 import org.onap.aai.sparky.config.oxm.SuggestionEntityDescriptor;
23 import org.onap.aai.sparky.config.oxm.SuggestionEntityLookup;
24 import org.onap.aai.sparky.dal.ActiveInventoryAdapter;
25 import org.onap.aai.sparky.dal.ElasticSearchAdapter;
26 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
27 import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig;
28 import org.onap.aai.sparky.search.filters.config.FiltersForViewsConfig;
29 import org.onap.aai.sparky.sync.config.ElasticSearchSchemaConfig;
30 import org.onap.aai.sparky.sync.config.NetworkStatisticsConfig;
31 import org.onap.aai.sparky.sync.enumeration.OperationState;
32 import org.onap.aai.sparky.util.TestResourceLoader;
34 import com.fasterxml.jackson.databind.ObjectMapper;
36 public class AutosuggestionSynchronizerTest {
38 private static ObjectMapper mapper = new ObjectMapper();
40 private AutosuggestionSynchronizer suggestionSynchronizer;
42 private ElasticSearchSchemaConfig esSchemaConfig;
43 private NetworkStatisticsConfig aaiStatConfig;
44 private NetworkStatisticsConfig esStatConfig;
45 private OxmEntityLookup oxmEntityLookup;
46 private SuggestionEntityLookup suggestionEntityLookup;
47 private ElasticSearchAdapter esAdapter;
48 private ActiveInventoryAdapter aaiAdapter;
51 private FiltersConfig filtersConfig;
56 public void init() throws Exception {
58 esSchemaConfig = new ElasticSearchSchemaConfig();
59 esSchemaConfig.setIndexDocType("default");
60 esSchemaConfig.setIndexMappingsFileName(null);
61 esSchemaConfig.setIndexName("aggregation-index-name");
62 esSchemaConfig.setIndexSettingsFileName(null);
65 aaiStatConfig = new NetworkStatisticsConfig();
67 aaiStatConfig.setNumSamplesPerThreadForRunningAverage(100);
69 aaiStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
70 aaiStatConfig.setBytesHistogramMaxYAxis(1000000L);
71 aaiStatConfig.setBytesHistogramNumBins(20);
72 aaiStatConfig.setBytesHistogramNumDecimalPoints(2);
74 aaiStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
75 aaiStatConfig.setQueueLengthHistogramMaxYAxis(20000);
76 aaiStatConfig.setQueueLengthHistogramNumBins(20);
77 aaiStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
79 aaiStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
80 aaiStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
81 aaiStatConfig.setTaskAgeHistogramNumBins(20);
82 aaiStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
84 aaiStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
85 aaiStatConfig.setResponseTimeHistogramMaxYAxis(1000L);
86 aaiStatConfig.setResponseTimeHistogramNumBins(20);
87 aaiStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
89 aaiStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
90 aaiStatConfig.setTpsHistogramMaxYAxis(100);
91 aaiStatConfig.setTpsHistogramNumBins(20);
92 aaiStatConfig.setTpsHistogramNumDecimalPoints(2);
94 esStatConfig = new NetworkStatisticsConfig();
96 esStatConfig.setNumSamplesPerThreadForRunningAverage(100);
98 esStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
99 esStatConfig.setBytesHistogramMaxYAxis(1000000L);
100 esStatConfig.setBytesHistogramNumBins(20);
101 esStatConfig.setBytesHistogramNumDecimalPoints(2);
103 esStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
104 esStatConfig.setQueueLengthHistogramMaxYAxis(20000);
105 esStatConfig.setQueueLengthHistogramNumBins(20);
106 esStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
108 esStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
109 esStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
110 esStatConfig.setTaskAgeHistogramNumBins(20);
111 esStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
113 esStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
114 esStatConfig.setResponseTimeHistogramMaxYAxis(10000L);
115 esStatConfig.setResponseTimeHistogramNumBins(20);
116 esStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
118 esStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
119 esStatConfig.setTpsHistogramMaxYAxis(100);
120 esStatConfig.setTpsHistogramNumBins(20);
121 esStatConfig.setTpsHistogramNumDecimalPoints(2);
123 oxmEntityLookup = new OxmEntityLookup();
125 esAdapter = Mockito.mock(ElasticSearchAdapter.class);
126 aaiAdapter = Mockito.mock(ActiveInventoryAdapter.class);
129 Set<OxmModelProcessor> processors = new HashSet<OxmModelProcessor>();
131 processors.add(oxmEntityLookup);
135 Map<String, OxmEntityDescriptor> oxmEntityDescriptors =
136 new HashMap<String, OxmEntityDescriptor>();
138 OxmEntityDescriptor genericVnfDescriptor = new OxmEntityDescriptor();
139 genericVnfDescriptor.setEntityName("generic-vnf");
140 List<String> pkeyNames = new ArrayList<String>();
141 pkeyNames.add("vnf-name");
143 genericVnfDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
145 oxmEntityDescriptors.put("generic-vnf", genericVnfDescriptor);
148 oxmEntityLookup.setEntityDescriptors(oxmEntityDescriptors);
151 Map<String, SuggestionEntityDescriptor> suggestionEntityDescriptors =
152 new HashMap<String, SuggestionEntityDescriptor>();
154 SuggestionEntityDescriptor genericVnfSuggestionDescriptor = new SuggestionEntityDescriptor();
155 genericVnfSuggestionDescriptor.setEntityName("generic-vnf");
156 genericVnfSuggestionDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
158 filtersConfig = new FiltersConfig(null, null, null);
160 FiltersDetailsConfig filtersDetailsConfig = mapper.readValue(
161 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_filters_testConfig.json"),
162 FiltersDetailsConfig.class);
163 FiltersForViewsConfig filtersForViewsConfig = mapper.readValue(
164 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_views_testConfig.json"),
165 FiltersForViewsConfig.class);
167 filtersConfig.setFiltersConfig(filtersDetailsConfig);
168 filtersConfig.setViewsConfig(filtersForViewsConfig);
171 * SuggestionSearchEntity sse = new SuggestionSearchEntity(filtersConfig);
173 * sse.setEntityType("generic-vnf"); sse.setSuggestionPropertyTypes( Arrays.asList("vnf-name"));
175 * genericVnfSuggestionDescriptor.setSuggestionSearchEntity(sse);
177 * suggestionEntityDescriptors.put("generic-vnf", genericVnfSuggestionDescriptor);
180 suggestionEntityLookup = new SuggestionEntityLookup(filtersConfig);
182 processors.add(suggestionEntityLookup);
184 OxmModelLoader oxmModelLoader = new OxmModelLoader(-1, processors);
185 oxmModelLoader.loadLatestOxmModel();
187 // suggestionEntityLookup.setSuggestionSearchEntityDescriptors(suggestionEntityDescriptors);
191 public void validateBasicConstruction() throws Exception {
193 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
194 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
196 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
197 suggestionSynchronizer.setElasticSearchAdapter(esAdapter);
199 assertNotNull(suggestionSynchronizer.getAaiAdapter());
200 assertNotNull(suggestionSynchronizer.getElasticSearchAdapter());
205 public void validateSmallSync() throws Exception {
207 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
208 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
211 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
212 suggestionSynchronizer.setElasticSearchAdapter(esAdapter);
214 String nodesQueryResponse = TestResourceLoader
215 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
217 OperationResult genericVnfSelfLinks = new OperationResult();
219 genericVnfSelfLinks.setResultCode(200);
220 genericVnfSelfLinks.setResult(nodesQueryResponse);
222 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
223 .thenReturn(genericVnfSelfLinks);
226 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
227 Mockito.anyString()))
229 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
232 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
233 Mockito.anyString()))
235 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
239 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
241 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
244 .when(aaiAdapter.queryActiveInventoryWithRetries(
245 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
247 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
248 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
251 .when(aaiAdapter.queryActiveInventoryWithRetries(
252 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
254 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
255 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
258 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
259 Mockito.anyString(), Mockito.anyInt()))
260 .thenReturn(new OperationResult(200, TestResourceLoader
261 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
263 Mockito.when(esAdapter.buildElasticSearchGetDocUrl(Mockito.anyString(), Mockito.anyString()))
264 .thenReturn("http://localhost:9200/myindex/mytype/doc1",
265 "http://localhost:9200/myindex/mytype/doc2",
266 "http://localhost:9200/myindex/mytype/doc3");
269 * Our initial gets from elastic search should be record-not-found
271 Mockito.when(esAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
272 .thenReturn(new OperationResult(404, null));
273 Mockito.when(esAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
274 .thenReturn(new OperationResult(404, null));
275 Mockito.when(esAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
276 .thenReturn(new OperationResult(404, null));
279 Mockito.when(esAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
280 .thenReturn(new OperationResult(200, null));
282 OperationState syncState = suggestionSynchronizer.doSync();
283 assertEquals(OperationState.OK, syncState);
285 assertNotNull(suggestionSynchronizer.getStatReport(false));
286 assertNotNull(suggestionSynchronizer.getStatReport(true));
288 suggestionSynchronizer.clearCache();
289 suggestionSynchronizer.shutdown();
295 public void validateSmallSyncWithRetries() throws Exception {
297 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
298 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
301 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
302 suggestionSynchronizer.setElasticSearchAdapter(esAdapter);
304 String nodesQueryResponse = TestResourceLoader
305 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
307 OperationResult genericVnfSelfLinks = new OperationResult();
309 genericVnfSelfLinks.setResultCode(200);
310 genericVnfSelfLinks.setResult(nodesQueryResponse);
312 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
313 .thenReturn(genericVnfSelfLinks);
316 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
317 Mockito.anyString()))
319 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
322 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
323 Mockito.anyString()))
325 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
329 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
331 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
334 .when(aaiAdapter.queryActiveInventoryWithRetries(
335 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
337 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
338 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
341 .when(aaiAdapter.queryActiveInventoryWithRetries(
342 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
344 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
345 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
348 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
349 Mockito.anyString(), Mockito.anyInt()))
350 .thenReturn(new OperationResult(200, TestResourceLoader
351 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
353 Mockito.when(esAdapter.buildElasticSearchGetDocUrl(Mockito.anyString(), Mockito.anyString()))
354 .thenReturn("http://localhost:9200/myindex/mytype/doc1",
355 "http://localhost:9200/myindex/mytype/doc2",
356 "http://localhost:9200/myindex/mytype/doc3");
359 * Our initial gets from elastic search should be record-not-found
361 Mockito.when(esAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
362 .thenReturn(new OperationResult(404, null));
363 Mockito.when(esAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
364 .thenReturn(new OperationResult(404, null));
365 Mockito.when(esAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
366 .thenReturn(new OperationResult(404, null));
370 * Elastic Search puts always fail with a version conflict = 409
373 Mockito.when(esAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
374 .thenReturn(new OperationResult(409, null));
376 OperationState syncState = suggestionSynchronizer.doSync();
377 assertEquals(OperationState.OK, syncState);
379 assertNotNull(suggestionSynchronizer.getStatReport(false));
380 assertNotNull(suggestionSynchronizer.getStatReport(true));
382 suggestionSynchronizer.clearCache();
383 suggestionSynchronizer.shutdown();