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;
12 import javax.inject.Inject;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.junit.runner.RunWith;
17 import org.mockito.Matchers;
18 import org.mockito.Mockito;
19 import org.onap.aai.nodes.NodeIngestor;
20 import org.onap.aai.restclient.client.OperationResult;
21 import org.onap.aai.sparky.config.oxm.OxmEntityDescriptor;
22 import org.onap.aai.sparky.config.oxm.OxmEntityLookup;
23 import org.onap.aai.sparky.config.oxm.OxmModelLoader;
24 import org.onap.aai.sparky.config.oxm.OxmModelProcessor;
25 import org.onap.aai.sparky.config.oxm.SuggestionEntityDescriptor;
26 import org.onap.aai.sparky.config.oxm.SuggestionEntityLookup;
27 import org.onap.aai.sparky.dal.ActiveInventoryAdapter;
28 import org.onap.aai.sparky.search.SearchServiceAdapter;
29 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
30 import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig;
31 import org.onap.aai.sparky.search.filters.config.FiltersForViewsConfig;
32 import org.onap.aai.sparky.sync.config.ElasticSearchSchemaConfig;
33 import org.onap.aai.sparky.sync.config.NetworkStatisticsConfig;
34 import org.onap.aai.sparky.sync.enumeration.OperationState;
35 import org.onap.aai.sparky.util.TestResourceLoader;
36 import org.springframework.test.context.ContextConfiguration;
37 import org.springframework.test.context.TestPropertySource;
38 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
40 import com.fasterxml.jackson.databind.ObjectMapper;
42 @RunWith(SpringJUnit4ClassRunner.class)
43 @TestPropertySource(properties = {
44 "schemaIngestPropLoc = src/test/resources/oxm-reader/schema-ingest-single-oxm.properties" })
45 @ContextConfiguration(locations = { "classpath:oxm-reader/oxm-reader-bean.xml" })
48 public class AutosuggestionSynchronizerTest {
51 private static ObjectMapper mapper = new ObjectMapper();
53 private AutosuggestionSynchronizer suggestionSynchronizer;
55 private ElasticSearchSchemaConfig esSchemaConfig;
56 private NetworkStatisticsConfig aaiStatConfig;
57 private NetworkStatisticsConfig esStatConfig;
60 private SearchServiceAdapter searchServiceAdapter;
61 private ActiveInventoryAdapter aaiAdapter;
64 private FiltersConfig filtersConfig;
67 private OxmModelLoader oxmModelLoader;
70 private NodeIngestor nodeInjest;
73 private Set<OxmModelProcessor> processors;
76 private OxmEntityLookup oxmEntityLookup;
82 private SuggestionEntityLookup suggestionEntityLookup;
86 public void init() throws Exception {
88 esSchemaConfig = new ElasticSearchSchemaConfig();
89 esSchemaConfig.setIndexDocType("default");
90 esSchemaConfig.setIndexMappingsFileName(null);
91 esSchemaConfig.setIndexName("aggregation-index-name");
92 esSchemaConfig.setIndexSettingsFileName(null);
95 aaiStatConfig = new NetworkStatisticsConfig();
97 aaiStatConfig.setNumSamplesPerThreadForRunningAverage(100);
99 aaiStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
100 aaiStatConfig.setBytesHistogramMaxYAxis(1000000L);
101 aaiStatConfig.setBytesHistogramNumBins(20);
102 aaiStatConfig.setBytesHistogramNumDecimalPoints(2);
104 aaiStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
105 aaiStatConfig.setQueueLengthHistogramMaxYAxis(20000);
106 aaiStatConfig.setQueueLengthHistogramNumBins(20);
107 aaiStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
109 aaiStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
110 aaiStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
111 aaiStatConfig.setTaskAgeHistogramNumBins(20);
112 aaiStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
114 aaiStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
115 aaiStatConfig.setResponseTimeHistogramMaxYAxis(1000L);
116 aaiStatConfig.setResponseTimeHistogramNumBins(20);
117 aaiStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
119 aaiStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
120 aaiStatConfig.setTpsHistogramMaxYAxis(100);
121 aaiStatConfig.setTpsHistogramNumBins(20);
122 aaiStatConfig.setTpsHistogramNumDecimalPoints(2);
124 esStatConfig = new NetworkStatisticsConfig();
126 esStatConfig.setNumSamplesPerThreadForRunningAverage(100);
128 esStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
129 esStatConfig.setBytesHistogramMaxYAxis(1000000L);
130 esStatConfig.setBytesHistogramNumBins(20);
131 esStatConfig.setBytesHistogramNumDecimalPoints(2);
133 esStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
134 esStatConfig.setQueueLengthHistogramMaxYAxis(20000);
135 esStatConfig.setQueueLengthHistogramNumBins(20);
136 esStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
138 esStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
139 esStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
140 esStatConfig.setTaskAgeHistogramNumBins(20);
141 esStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
143 esStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
144 esStatConfig.setResponseTimeHistogramMaxYAxis(10000L);
145 esStatConfig.setResponseTimeHistogramNumBins(20);
146 esStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
148 esStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
149 esStatConfig.setTpsHistogramMaxYAxis(100);
150 esStatConfig.setTpsHistogramNumBins(20);
151 esStatConfig.setTpsHistogramNumDecimalPoints(2);
155 searchServiceAdapter = Mockito.mock(SearchServiceAdapter.class);
156 aaiAdapter = Mockito.mock(ActiveInventoryAdapter.class);
161 FiltersDetailsConfig filtersDetailsConfig = mapper.readValue(
162 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_filters_testConfig.json"),
163 FiltersDetailsConfig.class);
164 FiltersForViewsConfig filtersForViewsConfig = mapper.readValue(
165 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_views_testConfig.json"),
166 FiltersForViewsConfig.class);
168 filtersConfig.setFiltersConfig(filtersDetailsConfig);
169 filtersConfig.setViewsConfig(filtersForViewsConfig);
171 suggestionEntityLookup = new SuggestionEntityLookup(filtersConfig);
173 processors.add(suggestionEntityLookup);
174 OxmModelLoader oxmModelLoader = new OxmModelLoader("v11", processors,nodeInjest);
175 oxmModelLoader.loadModel();
179 Map<String, OxmEntityDescriptor> oxmEntityDescriptors =
180 new HashMap<String, OxmEntityDescriptor>();
182 OxmEntityDescriptor genericVnfDescriptor = new OxmEntityDescriptor();
183 genericVnfDescriptor.setEntityName("generic-vnf");
184 List<String> pkeyNames = new ArrayList<String>();
185 pkeyNames.add("vnf-name");
187 genericVnfDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
189 oxmEntityDescriptors.put("generic-vnf", genericVnfDescriptor);
196 SuggestionEntityDescriptor genericVnfSuggestionDescriptor = new SuggestionEntityDescriptor();
197 genericVnfSuggestionDescriptor.setEntityName("generic-vnf");
198 genericVnfSuggestionDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
203 * SuggestionSearchEntity sse = new SuggestionSearchEntity(filtersConfig);
205 * sse.setEntityType("generic-vnf"); sse.setSuggestionPropertyTypes( Arrays.asList("vnf-name"));
207 * genericVnfSuggestionDescriptor.setSuggestionSearchEntity(sse);
209 * suggestionEntityDescriptors.put("generic-vnf", genericVnfSuggestionDescriptor);
216 public void validateBasicConstruction() throws Exception {
218 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
219 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
221 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
222 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
224 assertNotNull(suggestionSynchronizer.getAaiAdapter());
225 assertNotNull(suggestionSynchronizer.getSearchServiceAdapter());
230 public void validateSmallSync() throws Exception {
232 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
233 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
236 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
237 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
239 String nodesQueryResponse = TestResourceLoader
240 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
242 OperationResult genericVnfSelfLinks = new OperationResult();
244 genericVnfSelfLinks.setResultCode(200);
245 genericVnfSelfLinks.setResult(nodesQueryResponse);
247 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
248 .thenReturn(genericVnfSelfLinks);
251 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
252 Mockito.anyString()))
254 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
257 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
258 Mockito.anyString()))
260 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
264 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
266 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
269 .when(aaiAdapter.queryActiveInventoryWithRetries(
270 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
271 Mockito.anyInt(),Mockito.anyString()))
272 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
273 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
276 .when(aaiAdapter.queryActiveInventoryWithRetries(
277 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
278 Mockito.anyInt(),Mockito.anyString()))
279 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
280 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
283 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
284 Mockito.anyString(), Mockito.anyInt(),Mockito.anyString()))
285 .thenReturn(new OperationResult(200, TestResourceLoader
286 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
288 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
289 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
290 "http://server.proxy:9200/myindex/mytype/doc2",
291 "http://server.proxy:9200/myindex/mytype/doc3");
294 * Our initial gets from elastic search should be record-not-found
296 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
297 .thenReturn(new OperationResult(404, null));
298 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
299 .thenReturn(new OperationResult(404, null));
300 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
301 .thenReturn(new OperationResult(404, null));
304 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
305 .thenReturn(new OperationResult(200, null));
307 OperationState syncState = suggestionSynchronizer.doSync();
308 assertEquals(OperationState.OK, syncState);
310 assertNotNull(suggestionSynchronizer.getStatReport(false));
311 assertNotNull(suggestionSynchronizer.getStatReport(true));
313 suggestionSynchronizer.clearCache();
314 suggestionSynchronizer.shutdown();
320 public void validateSmallSyncWithRetries() throws Exception {
322 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
323 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
326 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
327 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
329 String nodesQueryResponse = TestResourceLoader
330 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
332 OperationResult genericVnfSelfLinks = new OperationResult();
334 genericVnfSelfLinks.setResultCode(200);
335 genericVnfSelfLinks.setResult(nodesQueryResponse);
337 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
338 .thenReturn(genericVnfSelfLinks);
341 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
342 Mockito.anyString()))
344 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
347 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
348 Mockito.anyString()))
350 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
354 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
356 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
359 .when(aaiAdapter.queryActiveInventoryWithRetries(
360 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
361 Mockito.anyInt(),Mockito.anyString()))
362 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
363 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
366 .when(aaiAdapter.queryActiveInventoryWithRetries(
367 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
368 Mockito.anyInt(),Mockito.anyString()))
369 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
370 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
373 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
374 Mockito.anyString(), Mockito.anyInt(),Mockito.anyString()))
375 .thenReturn(new OperationResult(200, TestResourceLoader
376 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
378 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
379 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
380 "http://server.proxy:9200/myindex/mytype/doc2",
381 "http://server.proxy:9200/myindex/mytype/doc3");
384 * Our initial gets from elastic search should be record-not-found
386 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
387 .thenReturn(new OperationResult(404, null));
388 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
389 .thenReturn(new OperationResult(404, null));
390 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
391 .thenReturn(new OperationResult(404, null));
395 * Elastic Search puts always fail with a version conflict = 409
398 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
399 .thenReturn(new OperationResult(409, null));
401 OperationState syncState = suggestionSynchronizer.doSync();
402 assertEquals(OperationState.OK, syncState);
404 assertNotNull(suggestionSynchronizer.getStatReport(false));
405 assertNotNull(suggestionSynchronizer.getStatReport(true));
407 suggestionSynchronizer.clearCache();
408 suggestionSynchronizer.shutdown();