1 package org.onap.aai.sparky.sync;
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
6 import java.security.SecureRandom;
7 import java.util.ArrayList;
8 import java.util.HashMap;
12 import javax.ws.rs.core.MediaType;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.mockito.Matchers;
17 import org.mockito.Mockito;
18 import org.onap.aai.restclient.client.OperationResult;
19 import org.onap.aai.sparky.aggregation.sync.AggregationSynchronizer;
20 import org.onap.aai.sparky.config.oxm.OxmEntityDescriptor;
21 import org.onap.aai.sparky.config.oxm.OxmEntityLookup;
22 import org.onap.aai.sparky.dal.ActiveInventoryAdapter;
23 import org.onap.aai.sparky.dal.ElasticSearchAdapter;
24 import org.onap.aai.sparky.sync.config.ElasticSearchSchemaConfig;
25 import org.onap.aai.sparky.sync.config.NetworkStatisticsConfig;
26 import org.onap.aai.sparky.sync.enumeration.OperationState;
27 import org.onap.aai.sparky.sync.enumeration.SynchronizerState;
28 import org.onap.aai.sparky.util.TestResourceLoader;
30 public class AggregationSynchronizerTest {
32 //private static Logger LOG = LoggerFactory.getInstance().getLogger(AggregationSynchronizerTest.class);
33 private static SecureRandom secureRandom = new SecureRandom();
34 private AggregationSynchronizer aggregationSynchronizer;
36 private ElasticSearchSchemaConfig esSchemaConfig;
37 private NetworkStatisticsConfig aaiStatConfig;
38 private NetworkStatisticsConfig esStatConfig;
39 private OxmEntityLookup oxmEntityLookup;
40 private ElasticSearchAdapter esAdapter;
41 private ActiveInventoryAdapter aaiAdapter;
46 public void init() throws Exception {
48 esSchemaConfig = new ElasticSearchSchemaConfig();
49 esSchemaConfig.setIndexDocType("default");
50 esSchemaConfig.setIndexMappingsFileName(null);
51 esSchemaConfig.setIndexName("aggregation-index-name");
52 esSchemaConfig.setIndexSettingsFileName(null);
55 aaiStatConfig = new NetworkStatisticsConfig();
57 aaiStatConfig.setNumSamplesPerThreadForRunningAverage(100);
59 aaiStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
60 aaiStatConfig.setBytesHistogramMaxYAxis(1000000L);
61 aaiStatConfig.setBytesHistogramNumBins(20);
62 aaiStatConfig.setBytesHistogramNumDecimalPoints(2);
64 aaiStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
65 aaiStatConfig.setQueueLengthHistogramMaxYAxis(20000);
66 aaiStatConfig.setQueueLengthHistogramNumBins(20);
67 aaiStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
69 aaiStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
70 aaiStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
71 aaiStatConfig.setTaskAgeHistogramNumBins(20);
72 aaiStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
74 aaiStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
75 aaiStatConfig.setResponseTimeHistogramMaxYAxis(1000L);
76 aaiStatConfig.setResponseTimeHistogramNumBins(20);
77 aaiStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
79 aaiStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
80 aaiStatConfig.setTpsHistogramMaxYAxis(100);
81 aaiStatConfig.setTpsHistogramNumBins(20);
82 aaiStatConfig.setTpsHistogramNumDecimalPoints(2);
84 esStatConfig = new NetworkStatisticsConfig();
86 esStatConfig.setNumSamplesPerThreadForRunningAverage(100);
88 esStatConfig.setBytesHistogramLabel("[Response Size In Bytes]");
89 esStatConfig.setBytesHistogramMaxYAxis(1000000L);
90 esStatConfig.setBytesHistogramNumBins(20);
91 esStatConfig.setBytesHistogramNumDecimalPoints(2);
93 esStatConfig.setQueueLengthHistogramLabel("[Queue Item Length]");
94 esStatConfig.setQueueLengthHistogramMaxYAxis(20000);
95 esStatConfig.setQueueLengthHistogramNumBins(20);
96 esStatConfig.setQueueLengthHistogramNumDecimalPoints(2);
98 esStatConfig.setTaskAgeHistogramLabel("[Task Age In Ms]");
99 esStatConfig.setTaskAgeHistogramMaxYAxis(600000L);
100 esStatConfig.setTaskAgeHistogramNumBins(20);
101 esStatConfig.setTaskAgeHistogramNumDecimalPoints(2);
103 esStatConfig.setResponseTimeHistogramLabel("[Response Time In Ms]");
104 esStatConfig.setResponseTimeHistogramMaxYAxis(10000L);
105 esStatConfig.setResponseTimeHistogramNumBins(20);
106 esStatConfig.setResponseTimeHistogramNumDecimalPoints(2);
108 esStatConfig.setTpsHistogramLabel("[Transactions Per Second]");
109 esStatConfig.setTpsHistogramMaxYAxis(100);
110 esStatConfig.setTpsHistogramNumBins(20);
111 esStatConfig.setTpsHistogramNumDecimalPoints(2);
113 oxmEntityLookup = new OxmEntityLookup();
115 esAdapter = Mockito.mock(ElasticSearchAdapter.class);
116 aaiAdapter = Mockito.mock(ActiveInventoryAdapter.class);
118 Map<String,OxmEntityDescriptor> oxmEntityDescriptors = new HashMap<String,OxmEntityDescriptor>();
120 OxmEntityDescriptor complexDescriptor = new OxmEntityDescriptor();
121 complexDescriptor.setEntityName("complex");
122 List<String> pkeyNames = new ArrayList<String>();
123 pkeyNames.add("physical-location-id");
125 complexDescriptor.setPrimaryKeyAttributeNames(pkeyNames);
127 oxmEntityDescriptors.put("complex", complexDescriptor);
129 oxmEntityLookup.setEntityDescriptors(oxmEntityDescriptors);
136 public void validateBasicConstruction() throws Exception {
138 aggregationSynchronizer = new AggregationSynchronizer("complex", esSchemaConfig, 5, 5, 5, aaiStatConfig,
139 esStatConfig, oxmEntityLookup);
141 aggregationSynchronizer.setAaiAdapter(aaiAdapter);
142 aggregationSynchronizer.setElasticSearchAdapter(esAdapter);
144 assertNotNull(aggregationSynchronizer.getAaiAdapter());
145 assertNotNull(aggregationSynchronizer.getElasticSearchAdapter());
150 public void validateSmallSync() throws Exception {
152 aggregationSynchronizer = new AggregationSynchronizer("complex", esSchemaConfig, 5, 5, 5, aaiStatConfig,
153 esStatConfig, oxmEntityLookup);
155 aggregationSynchronizer.setAaiAdapter(aaiAdapter);
156 aggregationSynchronizer.setElasticSearchAdapter(esAdapter);
158 String nodesQueryResponse = TestResourceLoader
159 .getTestResourceDataJson("/sync/aai/activeInventory_complex_nodesQuery_response.json");
161 OperationResult complexSelfLinks = new OperationResult();
163 complexSelfLinks.setResultCode(200);
164 complexSelfLinks.setResult(nodesQueryResponse);
166 Mockito.when( aaiAdapter.getSelfLinksByEntityType("complex")).thenReturn(complexSelfLinks);
168 for (int x = 1; x <= 5; x++) {
170 Mockito.when(aaiAdapter.repairSelfLink(Matchers.contains("complex" + x), Mockito.anyString()))
171 .thenReturn("https://server.proxy:8443/aai/v11/cloud-infrastructure/complexes/complex" + x);
173 Mockito.when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("complex" + x),
174 Mockito.anyString(), Mockito.anyInt()))
175 .thenReturn(new OperationResult(200, TestResourceLoader
176 .getTestResourceDataJson("/sync/aai/complex" + x + "_fullDepth_aaiEntityRetrieval.json")));
180 Mockito.when(esAdapter.buildElasticSearchGetDocUrl(Mockito.anyString(), Mockito.anyString())).thenReturn(
181 "http://localhost:9200/myindex/mytype/doc1", "http://localhost:9200/myindex/mytype/doc2",
182 "http://localhost:9200/myindex/mytype/doc3", "http://localhost:9200/myindex/mytype/doc4",
183 "http://localhost:9200/myindex/mytype/doc5");
186 * Our initial gets from elastic search should be record-not-found
188 Mockito.when( esAdapter.doGet(Matchers.contains("doc1"), Mockito.any())).thenReturn(new OperationResult(404,null));
189 Mockito.when( esAdapter.doGet(Matchers.contains("doc2"), Mockito.any())).thenReturn(new OperationResult(404,null));
190 Mockito.when( esAdapter.doGet(Matchers.contains("doc3"), Mockito.any())).thenReturn(new OperationResult(404,null));
191 Mockito.when( esAdapter.doGet(Matchers.contains("doc4"), Mockito.any())).thenReturn(new OperationResult(404,null));
192 Mockito.when( esAdapter.doGet(Matchers.contains("doc5"), Mockito.any())).thenReturn(new OperationResult(404,null));
195 Mockito.when(esAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
196 .thenReturn(new OperationResult(200, null));
198 OperationState syncState = aggregationSynchronizer.doSync();
199 assertEquals(OperationState.OK, syncState);
201 assertEquals(SynchronizerState.IDLE, aggregationSynchronizer.getState());
202 assertNotNull(aggregationSynchronizer.getStatReport(false));
203 assertNotNull(aggregationSynchronizer.getStatReport(true));
205 aggregationSynchronizer.clearCache();
206 aggregationSynchronizer.shutdown();
212 public void validateSmallSyncWithRetries() throws Exception {
214 aggregationSynchronizer = new AggregationSynchronizer("complex", esSchemaConfig, 5, 5, 5, aaiStatConfig,
215 esStatConfig, oxmEntityLookup);
217 aggregationSynchronizer.setAaiAdapter(aaiAdapter);
218 aggregationSynchronizer.setElasticSearchAdapter(esAdapter);
220 String nodesQueryResponse = TestResourceLoader
221 .getTestResourceDataJson("/sync/aai/activeInventory_complex_nodesQuery_response.json");
223 OperationResult complexSelfLinks = new OperationResult();
225 complexSelfLinks.setResultCode(200);
226 complexSelfLinks.setResult(nodesQueryResponse);
228 Mockito.when( aaiAdapter.getSelfLinksByEntityType("complex")).thenReturn(complexSelfLinks);
230 for (int x = 1; x <= 5; x++) {
232 Mockito.when(aaiAdapter.repairSelfLink(Matchers.contains("complex" + x), Mockito.anyString()))
233 .thenReturn("https://server.proxy:8443/aai/v11/cloud-infrastructure/complexes/complex" + x);
235 Mockito.when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("complex" + x),
236 Mockito.anyString(), Mockito.anyInt()))
237 .thenReturn(new OperationResult(200, TestResourceLoader
238 .getTestResourceDataJson("/sync/aai/complex" + x + "_fullDepth_aaiEntityRetrieval.json")));
242 Mockito.when(esAdapter.buildElasticSearchGetDocUrl(Mockito.anyString(), Mockito.anyString())).thenReturn(
243 "http://localhost:9200/myindex/mytype/doc1", "http://localhost:9200/myindex/mytype/doc2",
244 "http://localhost:9200/myindex/mytype/doc3", "http://localhost:9200/myindex/mytype/doc4",
245 "http://localhost:9200/myindex/mytype/doc5");
248 * Our initial gets from elastic search should be record-not-found
250 Mockito.when( esAdapter.doGet(Matchers.contains("doc1"), Mockito.any())).thenReturn(new OperationResult(404,null));
251 Mockito.when( esAdapter.doGet(Matchers.contains("doc2"), Mockito.any())).thenReturn(new OperationResult(404,null));
252 Mockito.when( esAdapter.doGet(Matchers.contains("doc3"), Mockito.any())).thenReturn(new OperationResult(404,null));
253 Mockito.when( esAdapter.doGet(Matchers.contains("doc4"), Mockito.any())).thenReturn(new OperationResult(404,null));
254 Mockito.when( esAdapter.doGet(Matchers.contains("doc5"), Mockito.any())).thenReturn(new OperationResult(404,null));
257 // 409 is the elastic search version conflict code, which will result in the entries being added
258 // to our retry queue and re-attempted a couple times.
260 Mockito.when(esAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
261 .thenReturn(new OperationResult(409, null));
263 OperationState syncState = aggregationSynchronizer.doSync();
264 assertEquals(OperationState.OK, syncState);
266 assertEquals(SynchronizerState.IDLE, aggregationSynchronizer.getState());
267 assertNotNull(aggregationSynchronizer.getStatReport(false));
268 assertNotNull(aggregationSynchronizer.getStatReport(true));
270 aggregationSynchronizer.clearCache();
271 aggregationSynchronizer.shutdown();
276 public void validateSmallSyncWithDocumentElementMerges() throws Exception {
278 aggregationSynchronizer = new AggregationSynchronizer("complex", esSchemaConfig, 5, 5, 5, aaiStatConfig,
279 esStatConfig, oxmEntityLookup);
281 aggregationSynchronizer.setAaiAdapter(aaiAdapter);
282 aggregationSynchronizer.setElasticSearchAdapter(esAdapter);
284 String nodesQueryResponse = TestResourceLoader
285 .getTestResourceDataJson("/sync/aai/activeInventory_complex_nodesQuery_response.json");
287 OperationResult complexSelfLinks = new OperationResult();
289 complexSelfLinks.setResultCode(200);
290 complexSelfLinks.setResult(nodesQueryResponse);
292 Mockito.when( aaiAdapter.getSelfLinksByEntityType("complex")).thenReturn(complexSelfLinks);
294 for (int x = 1; x <= 5; x++) {
296 Mockito.when(aaiAdapter.repairSelfLink(Matchers.contains("complex" + x), Mockito.anyString()))
297 .thenReturn("https://server.proxy:8443/aai/v11/cloud-infrastructure/complexes/complex" + x);
299 Mockito.when(aaiAdapter.queryActiveInventoryWithRetries(Matchers.contains("complex" + x),
300 Mockito.anyString(), Mockito.anyInt()))
301 .thenReturn(new OperationResult(200, TestResourceLoader
302 .getTestResourceDataJson("/sync/aai/complex" + x + "_fullDepth_aaiEntityRetrieval.json")));
306 Mockito.when(esAdapter.buildElasticSearchGetDocUrl(Mockito.anyString(), Mockito.anyString())).thenReturn(
307 "http://localhost:9200/myindex/mytype/doc1", "http://localhost:9200/myindex/mytype/doc2",
308 "http://localhost:9200/myindex/mytype/doc3", "http://localhost:9200/myindex/mytype/doc4",
309 "http://localhost:9200/myindex/mytype/doc5");
312 * Our initial gets from elastic search return 200 ok with a found entity document requiring a doc update
314 Mockito.when(esAdapter.doGet(Matchers.contains("doc1"), Mockito.any())).thenReturn(new OperationResult(200,
315 TestResourceLoader.getTestResourceDataJson("/sync/ElasticSearch/docEntityFromElasticSearch1.json")));
317 Mockito.when(esAdapter.doGet(Matchers.contains("doc2"), Mockito.any())).thenReturn(new OperationResult(200,
318 TestResourceLoader.getTestResourceDataJson("/sync/ElasticSearch/docEntityFromElasticSearch2.json")));
320 Mockito.when(esAdapter.doGet(Matchers.contains("doc3"), Mockito.any())).thenReturn(new OperationResult(200,
321 TestResourceLoader.getTestResourceDataJson("/sync/ElasticSearch/docEntityFromElasticSearch3.json")));
323 Mockito.when(esAdapter.doGet(Matchers.contains("doc4"), Mockito.any())).thenReturn(new OperationResult(200,
324 TestResourceLoader.getTestResourceDataJson("/sync/ElasticSearch/docEntityFromElasticSearch4.json")));
326 Mockito.when(esAdapter.doGet(Matchers.contains("doc5"), Mockito.any())).thenReturn(new OperationResult(200,
327 TestResourceLoader.getTestResourceDataJson("/sync/ElasticSearch/docEntityFromElasticSearch5.json")));
329 Mockito.when(esAdapter.doPut(Matchers.contains("doc"), Mockito.any(), Mockito.any()))
330 .thenReturn(new OperationResult(200, null));
332 OperationState syncState = aggregationSynchronizer.doSync();
333 assertEquals(OperationState.OK, syncState);
335 assertEquals(SynchronizerState.IDLE, aggregationSynchronizer.getState());
336 assertNotNull(aggregationSynchronizer.getStatReport(false));
337 assertNotNull(aggregationSynchronizer.getStatReport(true));
339 aggregationSynchronizer.clearCache();
340 aggregationSynchronizer.shutdown();