269e867a563de75eb53764dff5734df1d331f3a5
[aai/sparky-be.git] / sparkybe-onap-service / src / test / java / org / onap / aai / sparky / autosuggestion / sync / AutosuggestionSynchronizerTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  */
21
22 package org.onap.aai.sparky.autosuggestion.sync;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Set;
32
33 import javax.inject.Inject;
34
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;
60
61 import com.fasterxml.jackson.databind.ObjectMapper;
62
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" })
68
69
70 public class AutosuggestionSynchronizerTest {
71
72   
73   private static ObjectMapper mapper = new ObjectMapper();
74
75   private AutosuggestionSynchronizer suggestionSynchronizer;
76
77   private ElasticSearchSchemaConfig esSchemaConfig;
78   private NetworkStatisticsConfig aaiStatConfig;
79   private NetworkStatisticsConfig esStatConfig;
80
81  
82   private SearchServiceAdapter searchServiceAdapter;
83   private ActiveInventoryAdapter aaiAdapter;
84
85   @Inject
86   private FiltersConfig filtersConfig;
87   
88
89    private OxmModelLoader oxmModelLoader;
90   
91    @Inject 
92    private NodeIngestor nodeInjest;
93    
94   @Inject
95   private Set<OxmModelProcessor> processors;
96   
97   @Inject
98   private OxmEntityLookup oxmEntityLookup;
99   
100   
101
102
103
104   private SuggestionEntityLookup suggestionEntityLookup;
105   
106  
107   @Before
108   public void init() throws Exception {
109
110     esSchemaConfig = new ElasticSearchSchemaConfig();
111     esSchemaConfig.setIndexDocType("default");
112     esSchemaConfig.setIndexMappingsFileName(null);
113     esSchemaConfig.setIndexName("aggregation-index-name");
114     esSchemaConfig.setIndexSettingsFileName(null);
115
116
117     aaiStatConfig = new NetworkStatisticsConfig();
118
119     aaiStatConfig.setNumSamplesPerThreadForRunningAverage(100);
120
121     aaiStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
122     aaiStatConfig.setBytesHistogramMaxYAxis(1000000L);
123     aaiStatConfig.setBytesHistogramNumBins(20);
124     aaiStatConfig.setBytesHistogramNumDecimalPoints(2);
125
126     aaiStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
127     aaiStatConfig.setQueueLengthHistogramMaxYAxis(20000);
128     aaiStatConfig.setQueueLengthHistogramNumBins(20);
129     aaiStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
130
131     aaiStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
132     aaiStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
133     aaiStatConfig.setTaskAgeHistogramNumBins(20);
134     aaiStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
135
136     aaiStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
137     aaiStatConfig.setResponseTimeHistogramMaxYAxis(1000L);
138     aaiStatConfig.setResponseTimeHistogramNumBins(20);
139     aaiStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
140
141     aaiStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
142     aaiStatConfig.setTpsHistogramMaxYAxis(100);
143     aaiStatConfig.setTpsHistogramNumBins(20);
144     aaiStatConfig.setTpsHistogramNumDecimalPoints(2);
145
146     esStatConfig = new NetworkStatisticsConfig();
147
148     esStatConfig.setNumSamplesPerThreadForRunningAverage(100);
149
150     esStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
151     esStatConfig.setBytesHistogramMaxYAxis(1000000L);
152     esStatConfig.setBytesHistogramNumBins(20);
153     esStatConfig.setBytesHistogramNumDecimalPoints(2);
154
155     esStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
156     esStatConfig.setQueueLengthHistogramMaxYAxis(20000);
157     esStatConfig.setQueueLengthHistogramNumBins(20);
158     esStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
159
160     esStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
161     esStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
162     esStatConfig.setTaskAgeHistogramNumBins(20);
163     esStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
164
165     esStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
166     esStatConfig.setResponseTimeHistogramMaxYAxis(10000L);
167     esStatConfig.setResponseTimeHistogramNumBins(20);
168     esStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
169
170     esStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
171     esStatConfig.setTpsHistogramMaxYAxis(100);
172     esStatConfig.setTpsHistogramNumBins(20);
173     esStatConfig.setTpsHistogramNumDecimalPoints(2);
174
175     
176
177     searchServiceAdapter = Mockito.mock(SearchServiceAdapter.class);
178     aaiAdapter = Mockito.mock(ActiveInventoryAdapter.class);
179
180
181
182     
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);
189
190     filtersConfig.setFiltersConfig(filtersDetailsConfig);
191     filtersConfig.setViewsConfig(filtersForViewsConfig);
192     
193     suggestionEntityLookup = new SuggestionEntityLookup(filtersConfig);
194
195     processors.add(suggestionEntityLookup);
196     OxmModelLoader oxmModelLoader = new OxmModelLoader("v11", processors);
197     oxmModelLoader.setNodeIngestor(nodeInjest);
198     oxmModelLoader.loadModel();
199     
200     
201
202     Map<String, OxmEntityDescriptor> oxmEntityDescriptors =
203         new HashMap<String, OxmEntityDescriptor>();
204
205     OxmEntityDescriptor genericVnfDescriptor = new OxmEntityDescriptor();
206     genericVnfDescriptor.setEntityName("generic-vnf");
207     List<String> pkeyNames = new ArrayList<String>();
208     pkeyNames.add("vnf-name");
209
210     genericVnfDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
211
212     oxmEntityDescriptors.put("generic-vnf", genericVnfDescriptor);
213
214
215    
216
217
218   
219     SuggestionEntityDescriptor genericVnfSuggestionDescriptor = new SuggestionEntityDescriptor();
220     genericVnfSuggestionDescriptor.setEntityName("generic-vnf");
221     genericVnfSuggestionDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
222
223
224
225     /*
226      * SuggestionSearchEntity sse = new SuggestionSearchEntity(filtersConfig);
227      * 
228      * sse.setEntityType("generic-vnf"); sse.setSuggestionPropertyTypes( Arrays.asList("vnf-name"));
229      * 
230      * genericVnfSuggestionDescriptor.setSuggestionSearchEntity(sse);
231      * 
232      * suggestionEntityDescriptors.put("generic-vnf", genericVnfSuggestionDescriptor);
233      */
234
235   
236   }
237
238   @Test
239   public void validateBasicConstruction() throws Exception {
240
241     suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
242         esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
243
244     suggestionSynchronizer.setAaiAdapter(aaiAdapter);
245     suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
246
247     assertNotNull(suggestionSynchronizer.getAaiAdapter());
248     assertNotNull(suggestionSynchronizer.getSearchServiceAdapter());
249
250   }
251
252   @Test
253   public void validateSmallSync() throws Exception {
254
255     suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
256         esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
257
258
259     suggestionSynchronizer.setAaiAdapter(aaiAdapter);
260     suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
261
262     String nodesQueryResponse = TestResourceLoader
263         .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
264
265     OperationResult genericVnfSelfLinks = new OperationResult();
266
267     genericVnfSelfLinks.setResultCode(200);
268     genericVnfSelfLinks.setResult(nodesQueryResponse);
269
270     Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
271         .thenReturn(genericVnfSelfLinks);
272
273     Mockito
274         .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
275             Mockito.anyString()))
276         .thenReturn(
277             "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
278
279     Mockito
280         .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
281             Mockito.anyString()))
282         .thenReturn(
283             "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
284
285     Mockito
286         .when(
287             aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
288         .thenReturn(
289             "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
290
291     Mockito
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")));
297
298     Mockito
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")));
304
305     Mockito
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")));
310
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");
315
316     /*
317      * Our initial gets from elastic search should be record-not-found
318      */
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));
325
326
327     Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
328         .thenReturn(new OperationResult(200, null));
329
330     OperationState syncState = suggestionSynchronizer.doSync();
331     assertEquals(OperationState.OK, syncState);
332
333     assertNotNull(suggestionSynchronizer.getStatReport(false));
334     assertNotNull(suggestionSynchronizer.getStatReport(true));
335
336     suggestionSynchronizer.clearCache();
337     suggestionSynchronizer.shutdown();
338
339
340   }
341
342   @Test
343   public void validateSmallSyncWithRetries() throws Exception {
344
345     suggestionSynchronizer = new AutosuggestionSynchronizer(esSchemaConfig, 5, 5, 5, aaiStatConfig,
346         esStatConfig, oxmEntityLookup, suggestionEntityLookup, filtersConfig);
347
348
349     suggestionSynchronizer.setAaiAdapter(aaiAdapter);
350     suggestionSynchronizer.setSearchServiceAdapter(searchServiceAdapter);
351
352     String nodesQueryResponse = TestResourceLoader
353         .getTestResourceDataJson("/sync/aai/activeInventory_generic-vnf_nodesQuery_response.json");
354
355     OperationResult genericVnfSelfLinks = new OperationResult();
356
357     genericVnfSelfLinks.setResultCode(200);
358     genericVnfSelfLinks.setResult(nodesQueryResponse);
359
360     Mockito.when(aaiAdapter.getSelfLinksByEntityType("generic-vnf"))
361         .thenReturn(genericVnfSelfLinks);
362
363     Mockito
364         .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-1"),
365             Mockito.anyString()))
366         .thenReturn(
367             "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-1");
368
369     Mockito
370         .when(aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-2"),
371             Mockito.anyString()))
372         .thenReturn(
373             "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-2");
374
375     Mockito
376         .when(
377             aaiAdapter.repairSelfLink(Matchers.contains("generic-vnf-3"), Mockito.anyString()))
378         .thenReturn(
379             "https://server.proxy:8443/aai/v11/network/generic-vnfs/generic-vnf/generic-vnf-3");
380
381     Mockito
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")));
387
388     Mockito
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")));
394
395     Mockito
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")));
400
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");
405
406     /*
407      * Our initial gets from elastic search should be record-not-found
408      */
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));
415
416
417     /*
418      * Elastic Search puts always fail with a version conflict = 409
419      */
420
421     Mockito.when(searchServiceAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
422         .thenReturn(new OperationResult(409, null));
423
424     OperationState syncState = suggestionSynchronizer.doSync();
425     assertEquals(OperationState.OK, syncState);
426
427     assertNotNull(suggestionSynchronizer.getStatReport(false));
428     assertNotNull(suggestionSynchronizer.getStatReport(true));
429
430     suggestionSynchronizer.clearCache();
431     suggestionSynchronizer.shutdown();
432
433
434   }
435 }