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.setup.Version;
22 import org.onap.aai.sparky.config.oxm.OxmEntityDescriptor;
23 import org.onap.aai.sparky.config.oxm.OxmEntityLookup;
24 import org.onap.aai.sparky.config.oxm.OxmModelLoader;
25 import org.onap.aai.sparky.config.oxm.OxmModelProcessor;
26 import org.onap.aai.sparky.config.oxm.SuggestionEntityDescriptor;
27 import org.onap.aai.sparky.config.oxm.SuggestionEntityLookup;
28 import org.onap.aai.sparky.dal.ActiveInventoryAdapter;
29 import org.onap.aai.sparky.search.SearchServiceAdapter;
30 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
31 import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig;
32 import org.onap.aai.sparky.search.filters.config.FiltersForViewsConfig;
33 import org.onap.aai.sparky.sync.config.ElasticSearchSchemaConfig;
34 import org.onap.aai.sparky.sync.config.NetworkStatisticsConfig;
35 import org.onap.aai.sparky.sync.enumeration.OperationState;
36 import org.onap.aai.sparky.util.TestResourceLoader;
37 import org.springframework.test.context.ContextConfiguration;
38 import org.springframework.test.context.TestPropertySource;
39 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
41 import com.fasterxml.jackson.databind.ObjectMapper;
43 @RunWith(SpringJUnit4ClassRunner.class)
44 @TestPropertySource(properties = {
45 "schemaIngestPropLoc = src/test/resources/oxm-reader/schema-ingest-single-oxm.properties" })
46 @ContextConfiguration(locations = { "classpath:oxm-reader/oxm-reader-bean.xml" })
49 public class AutosuggestionSynchronizerTest {
52 private static ObjectMapper mapper = new ObjectMapper();
54 private AutosuggestionSynchronizer suggestionSynchronizer;
56 private ElasticSearchSchemaConfig esSchemaConfig;
57 private NetworkStatisticsConfig aaiStatConfig;
58 private NetworkStatisticsConfig esStatConfig;
61 private SearchServiceAdapter searchServiceAdapter;
62 private ActiveInventoryAdapter aaiAdapter;
65 private FiltersConfig filtersConfig;
68 private OxmModelLoader oxmModelLoader;
71 private NodeIngestor nodeInjest;
74 private Set<OxmModelProcessor> processors;
77 private OxmEntityLookup oxmEntityLookup;
83 private SuggestionEntityLookup suggestionEntityLookup;
87 public void init() throws Exception {
89 esSchemaConfig = new ElasticSearchSchemaConfig();
90 esSchemaConfig.setIndexDocType("default");
91 esSchemaConfig.setIndexMappingsFileName(null);
92 esSchemaConfig.setIndexName("aggregation-index-name");
93 esSchemaConfig.setIndexSettingsFileName(null);
96 aaiStatConfig = new NetworkStatisticsConfig();
98 aaiStatConfig.setNumSamplesPerThreadForRunningAverage(100);
100 aaiStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
101 aaiStatConfig.setBytesHistogramMaxYAxis(1000000L);
102 aaiStatConfig.setBytesHistogramNumBins(20);
103 aaiStatConfig.setBytesHistogramNumDecimalPoints(2);
105 aaiStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
106 aaiStatConfig.setQueueLengthHistogramMaxYAxis(20000);
107 aaiStatConfig.setQueueLengthHistogramNumBins(20);
108 aaiStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
110 aaiStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
111 aaiStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
112 aaiStatConfig.setTaskAgeHistogramNumBins(20);
113 aaiStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
115 aaiStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
116 aaiStatConfig.setResponseTimeHistogramMaxYAxis(1000L);
117 aaiStatConfig.setResponseTimeHistogramNumBins(20);
118 aaiStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
120 aaiStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
121 aaiStatConfig.setTpsHistogramMaxYAxis(100);
122 aaiStatConfig.setTpsHistogramNumBins(20);
123 aaiStatConfig.setTpsHistogramNumDecimalPoints(2);
125 esStatConfig = new NetworkStatisticsConfig();
127 esStatConfig.setNumSamplesPerThreadForRunningAverage(100);
129 esStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
130 esStatConfig.setBytesHistogramMaxYAxis(1000000L);
131 esStatConfig.setBytesHistogramNumBins(20);
132 esStatConfig.setBytesHistogramNumDecimalPoints(2);
134 esStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
135 esStatConfig.setQueueLengthHistogramMaxYAxis(20000);
136 esStatConfig.setQueueLengthHistogramNumBins(20);
137 esStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
139 esStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
140 esStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
141 esStatConfig.setTaskAgeHistogramNumBins(20);
142 esStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
144 esStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
145 esStatConfig.setResponseTimeHistogramMaxYAxis(10000L);
146 esStatConfig.setResponseTimeHistogramNumBins(20);
147 esStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
149 esStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
150 esStatConfig.setTpsHistogramMaxYAxis(100);
151 esStatConfig.setTpsHistogramNumBins(20);
152 esStatConfig.setTpsHistogramNumDecimalPoints(2);
156 searchServiceAdapter = Mockito.mock(SearchServiceAdapter.class);
157 aaiAdapter = Mockito.mock(ActiveInventoryAdapter.class);
162 FiltersDetailsConfig filtersDetailsConfig = mapper.readValue(
163 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_filters_testConfig.json"),
164 FiltersDetailsConfig.class);
165 FiltersForViewsConfig filtersForViewsConfig = mapper.readValue(
166 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_views_testConfig.json"),
167 FiltersForViewsConfig.class);
169 filtersConfig.setFiltersConfig(filtersDetailsConfig);
170 filtersConfig.setViewsConfig(filtersForViewsConfig);
172 suggestionEntityLookup = new SuggestionEntityLookup(filtersConfig);
174 processors.add(suggestionEntityLookup);
175 Version v = Version.V11;
176 OxmModelLoader oxmModelLoader = new OxmModelLoader(v, processors,nodeInjest);
177 oxmModelLoader.loadModel();
181 Map<String, OxmEntityDescriptor> oxmEntityDescriptors =
182 new HashMap<String, OxmEntityDescriptor>();
184 OxmEntityDescriptor genericVnfDescriptor = new OxmEntityDescriptor();
185 genericVnfDescriptor.setEntityName("generic-vnf");
186 List<String> pkeyNames = new ArrayList<String>();
187 pkeyNames.add("vnf-name");
189 genericVnfDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
191 oxmEntityDescriptors.put("generic-vnf", genericVnfDescriptor);
198 SuggestionEntityDescriptor genericVnfSuggestionDescriptor = new SuggestionEntityDescriptor();
199 genericVnfSuggestionDescriptor.setEntityName("generic-vnf");
200 genericVnfSuggestionDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
205 * SuggestionSearchEntity sse = new SuggestionSearchEntity(filtersConfig);
207 * sse.setEntityType("generic-vnf"); sse.setSuggestionPropertyTypes( Arrays.asList("vnf-name"));
209 * genericVnfSuggestionDescriptor.setSuggestionSearchEntity(sse);
211 * suggestionEntityDescriptors.put("generic-vnf", genericVnfSuggestionDescriptor);
218 public void validateBasicConstruction() throws Exception {
220 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
221 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
223 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
224 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
226 assertNotNull(suggestionSynchronizer.getAaiAdapter());
227 assertNotNull(suggestionSynchronizer.getSearchServiceAdapter());
232 public void validateSmallSync() throws Exception {
234 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
235 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
238 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
239 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
241 String nodesQueryResponse = TestResourceLoader
242 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
244 OperationResult genericVnfSelfLinks = new OperationResult();
246 genericVnfSelfLinks.setResultCode(200);
247 genericVnfSelfLinks.setResult(nodesQueryResponse);
249 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
250 .thenReturn(genericVnfSelfLinks);
253 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
254 Mockito.anyString()))
256 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
259 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
260 Mockito.anyString()))
262 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
266 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
268 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
271 .when(aaiAdapter.queryActiveInventoryWithRetries(
272 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
274 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
275 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
278 .when(aaiAdapter.queryActiveInventoryWithRetries(
279 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
281 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
282 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
285 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
286 Mockito.anyString(), Mockito.anyInt()))
287 .thenReturn(new OperationResult(200, TestResourceLoader
288 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
290 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
291 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
292 "http://server.proxy:9200/myindex/mytype/doc2",
293 "http://server.proxy:9200/myindex/mytype/doc3");
296 * Our initial gets from elastic search should be record-not-found
298 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
299 .thenReturn(new OperationResult(404, null));
300 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
301 .thenReturn(new OperationResult(404, null));
302 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
303 .thenReturn(new OperationResult(404, null));
306 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
307 .thenReturn(new OperationResult(200, null));
309 OperationState syncState = suggestionSynchronizer.doSync();
310 assertEquals(OperationState.OK, syncState);
312 assertNotNull(suggestionSynchronizer.getStatReport(false));
313 assertNotNull(suggestionSynchronizer.getStatReport(true));
315 suggestionSynchronizer.clearCache();
316 suggestionSynchronizer.shutdown();
322 public void validateSmallSyncWithRetries() throws Exception {
324 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
325 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
328 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
329 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
331 String nodesQueryResponse = TestResourceLoader
332 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
334 OperationResult genericVnfSelfLinks = new OperationResult();
336 genericVnfSelfLinks.setResultCode(200);
337 genericVnfSelfLinks.setResult(nodesQueryResponse);
339 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
340 .thenReturn(genericVnfSelfLinks);
343 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
344 Mockito.anyString()))
346 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
349 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
350 Mockito.anyString()))
352 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
356 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
358 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
361 .when(aaiAdapter.queryActiveInventoryWithRetries(
362 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
364 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
365 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
368 .when(aaiAdapter.queryActiveInventoryWithRetries(
369 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
371 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
372 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
375 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
376 Mockito.anyString(), Mockito.anyInt()))
377 .thenReturn(new OperationResult(200, TestResourceLoader
378 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
380 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
381 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
382 "http://server.proxy:9200/myindex/mytype/doc2",
383 "http://server.proxy:9200/myindex/mytype/doc3");
386 * Our initial gets from elastic search should be record-not-found
388 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
389 .thenReturn(new OperationResult(404, null));
390 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
391 .thenReturn(new OperationResult(404, null));
392 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
393 .thenReturn(new OperationResult(404, null));
397 * Elastic Search puts always fail with a version conflict = 409
400 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
401 .thenReturn(new OperationResult(409, null));
403 OperationState syncState = suggestionSynchronizer.doSync();
404 assertEquals(OperationState.OK, syncState);
406 assertNotNull(suggestionSynchronizer.getStatReport(false));
407 assertNotNull(suggestionSynchronizer.getStatReport(true));
409 suggestionSynchronizer.clearCache();
410 suggestionSynchronizer.shutdown();