2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017-2018 Amdocs
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.aai.sparky.autosuggestion.sync;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
33 import javax.inject.Inject;
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 import org.mockito.Matchers;
39 import org.mockito.Mockito;
40 import org.onap.aai.nodes.NodeIngestor;
41 import org.onap.aai.restclient.client.OperationResult;
42 import org.onap.aai.sparky.config.oxm.OxmEntityDescriptor;
43 import org.onap.aai.sparky.config.oxm.OxmEntityLookup;
44 import org.onap.aai.sparky.config.oxm.OxmModelLoader;
45 import org.onap.aai.sparky.config.oxm.OxmModelProcessor;
46 import org.onap.aai.sparky.config.oxm.SuggestionEntityDescriptor;
47 import org.onap.aai.sparky.config.oxm.SuggestionEntityLookup;
48 import org.onap.aai.sparky.dal.ActiveInventoryAdapter;
49 import org.onap.aai.sparky.search.SearchServiceAdapter;
50 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
51 import org.onap.aai.sparky.search.filters.config.FiltersDetailsConfig;
52 import org.onap.aai.sparky.search.filters.config.FiltersForViewsConfig;
53 import org.onap.aai.sparky.sync.config.ElasticSearchSchemaConfig;
54 import org.onap.aai.sparky.sync.config.NetworkStatisticsConfig;
55 import org.onap.aai.sparky.sync.enumeration.OperationState;
56 import org.onap.aai.sparky.util.TestResourceLoader;
57 import org.springframework.test.context.ContextConfiguration;
58 import org.springframework.test.context.TestPropertySource;
59 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
61 import com.fasterxml.jackson.databind.ObjectMapper;
63 @RunWith(SpringJUnit4ClassRunner.class)
64 @TestPropertySource(properties = {
65 "schemaIngestPropLoc = src/test/resources/oxm-reader/schema-ingest-single-oxm.properties",
66 "CONFIG_HOME = ./config" })
67 @ContextConfiguration(locations = { "classpath:oxm-reader/oxm-reader-bean.xml" })
70 public class AutosuggestionSynchronizerTest {
73 private static ObjectMapper mapper = new ObjectMapper();
75 private AutosuggestionSynchronizer suggestionSynchronizer;
77 private ElasticSearchSchemaConfig esSchemaConfig;
78 private NetworkStatisticsConfig aaiStatConfig;
79 private NetworkStatisticsConfig esStatConfig;
82 private SearchServiceAdapter searchServiceAdapter;
83 private ActiveInventoryAdapter aaiAdapter;
86 private FiltersConfig filtersConfig;
89 private OxmModelLoader oxmModelLoader;
92 private NodeIngestor nodeInjest;
95 private Set<OxmModelProcessor> processors;
98 private OxmEntityLookup oxmEntityLookup;
104 private SuggestionEntityLookup suggestionEntityLookup;
108 public void init() throws Exception {
110 esSchemaConfig = new ElasticSearchSchemaConfig();
111 esSchemaConfig.setIndexDocType("default");
112 esSchemaConfig.setIndexMappingsFileName(null);
113 esSchemaConfig.setIndexName("aggregation-index-name");
114 esSchemaConfig.setIndexSettingsFileName(null);
117 aaiStatConfig = new NetworkStatisticsConfig();
119 aaiStatConfig.setNumSamplesPerThreadForRunningAverage(100);
121 aaiStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
122 aaiStatConfig.setBytesHistogramMaxYAxis(1000000L);
123 aaiStatConfig.setBytesHistogramNumBins(20);
124 aaiStatConfig.setBytesHistogramNumDecimalPoints(2);
126 aaiStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
127 aaiStatConfig.setQueueLengthHistogramMaxYAxis(20000);
128 aaiStatConfig.setQueueLengthHistogramNumBins(20);
129 aaiStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
131 aaiStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
132 aaiStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
133 aaiStatConfig.setTaskAgeHistogramNumBins(20);
134 aaiStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
136 aaiStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
137 aaiStatConfig.setResponseTimeHistogramMaxYAxis(1000L);
138 aaiStatConfig.setResponseTimeHistogramNumBins(20);
139 aaiStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
141 aaiStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
142 aaiStatConfig.setTpsHistogramMaxYAxis(100);
143 aaiStatConfig.setTpsHistogramNumBins(20);
144 aaiStatConfig.setTpsHistogramNumDecimalPoints(2);
146 esStatConfig = new NetworkStatisticsConfig();
148 esStatConfig.setNumSamplesPerThreadForRunningAverage(100);
150 esStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
151 esStatConfig.setBytesHistogramMaxYAxis(1000000L);
152 esStatConfig.setBytesHistogramNumBins(20);
153 esStatConfig.setBytesHistogramNumDecimalPoints(2);
155 esStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
156 esStatConfig.setQueueLengthHistogramMaxYAxis(20000);
157 esStatConfig.setQueueLengthHistogramNumBins(20);
158 esStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
160 esStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
161 esStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
162 esStatConfig.setTaskAgeHistogramNumBins(20);
163 esStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
165 esStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
166 esStatConfig.setResponseTimeHistogramMaxYAxis(10000L);
167 esStatConfig.setResponseTimeHistogramNumBins(20);
168 esStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
170 esStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
171 esStatConfig.setTpsHistogramMaxYAxis(100);
172 esStatConfig.setTpsHistogramNumBins(20);
173 esStatConfig.setTpsHistogramNumDecimalPoints(2);
177 searchServiceAdapter = Mockito.mock(SearchServiceAdapter.class);
178 aaiAdapter = Mockito.mock(ActiveInventoryAdapter.class);
183 FiltersDetailsConfig filtersDetailsConfig = mapper.readValue(
184 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_filters_testConfig.json"),
185 FiltersDetailsConfig.class);
186 FiltersForViewsConfig filtersForViewsConfig = mapper.readValue(
187 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_views_testConfig.json"),
188 FiltersForViewsConfig.class);
190 filtersConfig.setFiltersConfig(filtersDetailsConfig);
191 filtersConfig.setViewsConfig(filtersForViewsConfig);
193 suggestionEntityLookup = new SuggestionEntityLookup(filtersConfig);
195 processors.add(suggestionEntityLookup);
196 OxmModelLoader oxmModelLoader = new OxmModelLoader("v11", processors);
197 oxmModelLoader.setNodeIngestor(nodeInjest);
198 oxmModelLoader.loadModel();
202 Map<String, OxmEntityDescriptor> oxmEntityDescriptors =
203 new HashMap<String, OxmEntityDescriptor>();
205 OxmEntityDescriptor genericVnfDescriptor = new OxmEntityDescriptor();
206 genericVnfDescriptor.setEntityName("generic-vnf");
207 List<String> pkeyNames = new ArrayList<String>();
208 pkeyNames.add("vnf-name");
210 genericVnfDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
212 oxmEntityDescriptors.put("generic-vnf", genericVnfDescriptor);
219 SuggestionEntityDescriptor genericVnfSuggestionDescriptor = new SuggestionEntityDescriptor();
220 genericVnfSuggestionDescriptor.setEntityName("generic-vnf");
221 genericVnfSuggestionDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
226 * SuggestionSearchEntity sse = new SuggestionSearchEntity(filtersConfig);
228 * sse.setEntityType("generic-vnf"); sse.setSuggestionPropertyTypes( Arrays.asList("vnf-name"));
230 * genericVnfSuggestionDescriptor.setSuggestionSearchEntity(sse);
232 * suggestionEntityDescriptors.put("generic-vnf", genericVnfSuggestionDescriptor);
239 public void validateBasicConstruction() throws Exception {
241 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
242 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
244 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
245 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
247 assertNotNull(suggestionSynchronizer.getAaiAdapter());
248 assertNotNull(suggestionSynchronizer.getSearchServiceAdapter());
253 public void validateSmallSync() throws Exception {
255 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
256 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
259 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
260 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
262 String nodesQueryResponse = TestResourceLoader
263 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
265 OperationResult genericVnfSelfLinks = new OperationResult();
267 genericVnfSelfLinks.setResultCode(200);
268 genericVnfSelfLinks.setResult(nodesQueryResponse);
270 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
271 .thenReturn(genericVnfSelfLinks);
274 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
275 Mockito.anyString()))
277 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
280 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
281 Mockito.anyString()))
283 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
287 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
289 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
292 .when(aaiAdapter.queryActiveInventoryWithRetries(
293 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
294 Mockito.anyInt(),Mockito.anyString()))
295 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
296 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
299 .when(aaiAdapter.queryActiveInventoryWithRetries(
300 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
301 Mockito.anyInt(),Mockito.anyString()))
302 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
303 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
306 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
307 Mockito.anyString(), Mockito.anyInt(),Mockito.anyString()))
308 .thenReturn(new OperationResult(200, TestResourceLoader
309 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
311 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
312 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
313 "http://server.proxy:9200/myindex/mytype/doc2",
314 "http://server.proxy:9200/myindex/mytype/doc3");
317 * Our initial gets from elastic search should be record-not-found
319 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
320 .thenReturn(new OperationResult(404, null));
321 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
322 .thenReturn(new OperationResult(404, null));
323 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
324 .thenReturn(new OperationResult(404, null));
327 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
328 .thenReturn(new OperationResult(200, null));
330 OperationState syncState = suggestionSynchronizer.doSync();
331 assertEquals(OperationState.OK, syncState);
333 assertNotNull(suggestionSynchronizer.getStatReport(false));
334 assertNotNull(suggestionSynchronizer.getStatReport(true));
336 suggestionSynchronizer.clearCache();
337 suggestionSynchronizer.shutdown();
343 public void validateSmallSyncWithRetries() throws Exception {
345 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
346 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
349 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
350 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
352 String nodesQueryResponse = TestResourceLoader
353 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
355 OperationResult genericVnfSelfLinks = new OperationResult();
357 genericVnfSelfLinks.setResultCode(200);
358 genericVnfSelfLinks.setResult(nodesQueryResponse);
360 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
361 .thenReturn(genericVnfSelfLinks);
364 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
365 Mockito.anyString()))
367 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
370 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
371 Mockito.anyString()))
373 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
377 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
379 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
382 .when(aaiAdapter.queryActiveInventoryWithRetries(
383 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
384 Mockito.anyInt(),Mockito.anyString()))
385 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
386 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
389 .when(aaiAdapter.queryActiveInventoryWithRetries(
390 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
391 Mockito.anyInt(),Mockito.anyString()))
392 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
393 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
396 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
397 Mockito.anyString(), Mockito.anyInt(),Mockito.anyString()))
398 .thenReturn(new OperationResult(200, TestResourceLoader
399 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
401 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
402 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
403 "http://server.proxy:9200/myindex/mytype/doc2",
404 "http://server.proxy:9200/myindex/mytype/doc3");
407 * Our initial gets from elastic search should be record-not-found
409 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
410 .thenReturn(new OperationResult(404, null));
411 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
412 .thenReturn(new OperationResult(404, null));
413 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
414 .thenReturn(new OperationResult(404, null));
418 * Elastic Search puts always fail with a version conflict = 409
421 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
422 .thenReturn(new OperationResult(409, null));
424 OperationState syncState = suggestionSynchronizer.doSync();
425 assertEquals(OperationState.OK, syncState);
427 assertNotNull(suggestionSynchronizer.getStatReport(false));
428 assertNotNull(suggestionSynchronizer.getStatReport(true));
430 suggestionSynchronizer.clearCache();
431 suggestionSynchronizer.shutdown();