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 @ContextConfiguration(locations = { "classpath:oxm-reader/oxm-reader-bean.xml" })
69 public class AutosuggestionSynchronizerTest {
72 private static ObjectMapper mapper = new ObjectMapper();
74 private AutosuggestionSynchronizer suggestionSynchronizer;
76 private ElasticSearchSchemaConfig esSchemaConfig;
77 private NetworkStatisticsConfig aaiStatConfig;
78 private NetworkStatisticsConfig esStatConfig;
81 private SearchServiceAdapter searchServiceAdapter;
82 private ActiveInventoryAdapter aaiAdapter;
85 private FiltersConfig filtersConfig;
88 private OxmModelLoader oxmModelLoader;
91 private NodeIngestor nodeInjest;
94 private Set<OxmModelProcessor> processors;
97 private OxmEntityLookup oxmEntityLookup;
103 private SuggestionEntityLookup suggestionEntityLookup;
107 public void init() throws Exception {
109 esSchemaConfig = new ElasticSearchSchemaConfig();
110 esSchemaConfig.setIndexDocType("default");
111 esSchemaConfig.setIndexMappingsFileName(null);
112 esSchemaConfig.setIndexName("aggregation-index-name");
113 esSchemaConfig.setIndexSettingsFileName(null);
116 aaiStatConfig = new NetworkStatisticsConfig();
118 aaiStatConfig.setNumSamplesPerThreadForRunningAverage(100);
120 aaiStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
121 aaiStatConfig.setBytesHistogramMaxYAxis(1000000L);
122 aaiStatConfig.setBytesHistogramNumBins(20);
123 aaiStatConfig.setBytesHistogramNumDecimalPoints(2);
125 aaiStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
126 aaiStatConfig.setQueueLengthHistogramMaxYAxis(20000);
127 aaiStatConfig.setQueueLengthHistogramNumBins(20);
128 aaiStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
130 aaiStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
131 aaiStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
132 aaiStatConfig.setTaskAgeHistogramNumBins(20);
133 aaiStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
135 aaiStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
136 aaiStatConfig.setResponseTimeHistogramMaxYAxis(1000L);
137 aaiStatConfig.setResponseTimeHistogramNumBins(20);
138 aaiStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
140 aaiStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
141 aaiStatConfig.setTpsHistogramMaxYAxis(100);
142 aaiStatConfig.setTpsHistogramNumBins(20);
143 aaiStatConfig.setTpsHistogramNumDecimalPoints(2);
145 esStatConfig = new NetworkStatisticsConfig();
147 esStatConfig.setNumSamplesPerThreadForRunningAverage(100);
149 esStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
150 esStatConfig.setBytesHistogramMaxYAxis(1000000L);
151 esStatConfig.setBytesHistogramNumBins(20);
152 esStatConfig.setBytesHistogramNumDecimalPoints(2);
154 esStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
155 esStatConfig.setQueueLengthHistogramMaxYAxis(20000);
156 esStatConfig.setQueueLengthHistogramNumBins(20);
157 esStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
159 esStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
160 esStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
161 esStatConfig.setTaskAgeHistogramNumBins(20);
162 esStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
164 esStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
165 esStatConfig.setResponseTimeHistogramMaxYAxis(10000L);
166 esStatConfig.setResponseTimeHistogramNumBins(20);
167 esStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
169 esStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
170 esStatConfig.setTpsHistogramMaxYAxis(100);
171 esStatConfig.setTpsHistogramNumBins(20);
172 esStatConfig.setTpsHistogramNumDecimalPoints(2);
176 searchServiceAdapter = Mockito.mock(SearchServiceAdapter.class);
177 aaiAdapter = Mockito.mock(ActiveInventoryAdapter.class);
182 FiltersDetailsConfig filtersDetailsConfig = mapper.readValue(
183 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_filters_testConfig.json"),
184 FiltersDetailsConfig.class);
185 FiltersForViewsConfig filtersForViewsConfig = mapper.readValue(
186 TestResourceLoader.getTestResourceDataJson("/filters/aaiui_views_testConfig.json"),
187 FiltersForViewsConfig.class);
189 filtersConfig.setFiltersConfig(filtersDetailsConfig);
190 filtersConfig.setViewsConfig(filtersForViewsConfig);
192 suggestionEntityLookup = new SuggestionEntityLookup(filtersConfig);
194 processors.add(suggestionEntityLookup);
195 OxmModelLoader oxmModelLoader = new OxmModelLoader("v11", processors);
196 oxmModelLoader.setNodeIngestor(nodeInjest);
197 oxmModelLoader.loadModel();
201 Map<String, OxmEntityDescriptor> oxmEntityDescriptors =
202 new HashMap<String, OxmEntityDescriptor>();
204 OxmEntityDescriptor genericVnfDescriptor = new OxmEntityDescriptor();
205 genericVnfDescriptor.setEntityName("generic-vnf");
206 List<String> pkeyNames = new ArrayList<String>();
207 pkeyNames.add("vnf-name");
209 genericVnfDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
211 oxmEntityDescriptors.put("generic-vnf", genericVnfDescriptor);
218 SuggestionEntityDescriptor genericVnfSuggestionDescriptor = new SuggestionEntityDescriptor();
219 genericVnfSuggestionDescriptor.setEntityName("generic-vnf");
220 genericVnfSuggestionDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
225 * SuggestionSearchEntity sse = new SuggestionSearchEntity(filtersConfig);
227 * sse.setEntityType("generic-vnf"); sse.setSuggestionPropertyTypes( Arrays.asList("vnf-name"));
229 * genericVnfSuggestionDescriptor.setSuggestionSearchEntity(sse);
231 * suggestionEntityDescriptors.put("generic-vnf", genericVnfSuggestionDescriptor);
238 public void validateBasicConstruction() throws Exception {
240 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
241 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
243 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
244 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
246 assertNotNull(suggestionSynchronizer.getAaiAdapter());
247 assertNotNull(suggestionSynchronizer.getSearchServiceAdapter());
252 public void validateSmallSync() throws Exception {
254 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
255 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
258 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
259 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
261 String nodesQueryResponse = TestResourceLoader
262 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
264 OperationResult genericVnfSelfLinks = new OperationResult();
266 genericVnfSelfLinks.setResultCode(200);
267 genericVnfSelfLinks.setResult(nodesQueryResponse);
269 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
270 .thenReturn(genericVnfSelfLinks);
273 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
274 Mockito.anyString()))
276 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
279 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
280 Mockito.anyString()))
282 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
286 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
288 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
291 .when(aaiAdapter.queryActiveInventoryWithRetries(
292 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
293 Mockito.anyInt(),Mockito.anyString()))
294 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
295 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
298 .when(aaiAdapter.queryActiveInventoryWithRetries(
299 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
300 Mockito.anyInt(),Mockito.anyString()))
301 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
302 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
305 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
306 Mockito.anyString(), Mockito.anyInt(),Mockito.anyString()))
307 .thenReturn(new OperationResult(200, TestResourceLoader
308 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
310 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
311 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
312 "http://server.proxy:9200/myindex/mytype/doc2",
313 "http://server.proxy:9200/myindex/mytype/doc3");
316 * Our initial gets from elastic search should be record-not-found
318 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
319 .thenReturn(new OperationResult(404, null));
320 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
321 .thenReturn(new OperationResult(404, null));
322 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
323 .thenReturn(new OperationResult(404, null));
326 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
327 .thenReturn(new OperationResult(200, null));
329 OperationState syncState = suggestionSynchronizer.doSync();
330 assertEquals(OperationState.OK, syncState);
332 assertNotNull(suggestionSynchronizer.getStatReport(false));
333 assertNotNull(suggestionSynchronizer.getStatReport(true));
335 suggestionSynchronizer.clearCache();
336 suggestionSynchronizer.shutdown();
342 public void validateSmallSyncWithRetries() throws Exception {
344 suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
345 esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
348 suggestionSynchronizer.setAaiAdapter(aaiAdapter);
349 suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
351 String nodesQueryResponse = TestResourceLoader
352 .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
354 OperationResult genericVnfSelfLinks = new OperationResult();
356 genericVnfSelfLinks.setResultCode(200);
357 genericVnfSelfLinks.setResult(nodesQueryResponse);
359 Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
360 .thenReturn(genericVnfSelfLinks);
363 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
364 Mockito.anyString()))
366 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
369 .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
370 Mockito.anyString()))
372 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
376 aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
378 "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
381 .when(aaiAdapter.queryActiveInventoryWithRetries(
382 Matchers.contains("generic-vnf-1"), Mockito.anyString(),
383 Mockito.anyInt(),Mockito.anyString()))
384 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
385 "/sync/aai/generic-vnf-generic-vnf-1_full_depth.json")));
388 .when(aaiAdapter.queryActiveInventoryWithRetries(
389 Matchers.contains("generic-vnf-2"), Mockito.anyString(),
390 Mockito.anyInt(),Mockito.anyString()))
391 .thenReturn(new OperationResult(200, TestResourceLoader.getTestResourceDataJson(
392 "/sync/aai/generic-vnf-generic-vnf-2_full_depth.json")));
395 .when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("generic-vnf-3"),
396 Mockito.anyString(), Mockito.anyInt(),Mockito.anyString()))
397 .thenReturn(new OperationResult(200, TestResourceLoader
398 .getTestResourceDataJson("/sync/aai/generic-vnf-generic-vnf-3_full_depth.json")));
400 Mockito.when(searchServiceAdapter.buildSearchServiceDocUrl(Mockito.anyString(), Mockito.anyString()))
401 .thenReturn("http://server.proxy:9200/myindex/mytype/doc1",
402 "http://server.proxy:9200/myindex/mytype/doc2",
403 "http://server.proxy:9200/myindex/mytype/doc3");
406 * Our initial gets from elastic search should be record-not-found
408 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc1"), Mockito.any()))
409 .thenReturn(new OperationResult(404, null));
410 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc2"), Mockito.any()))
411 .thenReturn(new OperationResult(404, null));
412 Mockito.when(searchServiceAdapter.doGet(Matchers.contains("doc3"), Mockito.any()))
413 .thenReturn(new OperationResult(404, null));
417 * Elastic Search puts always fail with a version conflict = 409
420 Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
421 .thenReturn(new OperationResult(409, null));
423 OperationState syncState = suggestionSynchronizer.doSync();
424 assertEquals(OperationState.OK, syncState);
426 assertNotNull(suggestionSynchronizer.getStatReport(false));
427 assertNotNull(suggestionSynchronizer.getStatReport(true));
429 suggestionSynchronizer.clearCache();
430 suggestionSynchronizer.shutdown();