/*
* Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.tsdr.dataquery;
import com.google.common.base.Throwables;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.core.DefaultResourceConfig;
import com.sun.jersey.test.framework.AppDescriptor;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.LowLevelAppDescriptor;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.opendaylight.controller.config.yang.config.TSDR_dataquery.impl.TSDRDataqueryModule;
import org.opendaylight.tsdr.dataquery.rest.nbi.TSDRNBIRestAPI;
import org.opendaylight.tsdr.dataquery.rest.query.TSDRLogQueryAPI;
import org.opendaylight.tsdr.dataquery.rest.query.TSDRMetricsQueryAPI;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.GetTSDRLogRecordsInput;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.GetTSDRLogRecordsOutput;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.GetTSDRLogRecordsOutputBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.TsdrLogDataService;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.gettsdrlogrecords.output.Logs;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.gettsdrlogrecords.output.LogsBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.tsdrlog.RecordAttributes;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.tsdrlog.RecordAttributesBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.*;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.gettsdraggregatedmetrics.output.AggregatedMetrics;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.gettsdraggregatedmetrics.output.AggregatedMetricsBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.gettsdrmetrics.output.Metrics;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.gettsdrmetrics.output.MetricsBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.DataCategory;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.tsdrrecord.RecordKeys;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.tsdrrecord.RecordKeysBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* @author Sharon Aicler(saichler@gmail.com)
**/
public class TSDRQueryAndNBITest extends JerseyTest{
private QueryResourceConfig config;
private static final String NBI_RESPONSE = "[{\"datapoints\":[[10.0,";
public static GetTSDRMetricsOutput createMetricRecords(boolean emptyResult){
MetricsBuilder rb = new MetricsBuilder();
rb.setMetricValue(new BigDecimal(10D));
rb.setTSDRDataCategory(DataCategory.EXTERNAL);
rb.setMetricName("Test");
rb.setNodeID("NodeTest");
rb.setTimeStamp(System.currentTimeMillis());
List<RecordKeys> recordKeys = new ArrayList<>();
RecordKeysBuilder rkb = new RecordKeysBuilder();
rkb.setKeyValue("TestV");
rkb.setKeyName("TestK");
recordKeys.add(rkb.build());
rb.setRecordKeys(recordKeys);
List<Metrics> result = new ArrayList<>();
if(!emptyResult) {
result.add(rb.build());
}
GetTSDRMetricsOutputBuilder b = new GetTSDRMetricsOutputBuilder();
b.setMetrics(result);
return b.build();
}
public static GetTSDRAggregatedMetricsOutput createAggregatedMetricRecords(boolean emptyResult){
AggregatedMetricsBuilder rb = new AggregatedMetricsBuilder();
rb.setMetricValue(new BigDecimal(10D));
rb.setTimeStamp(System.currentTimeMillis());
List<AggregatedMetrics> result = new ArrayList<>();
if(!emptyResult) {
result.add(rb.build());
}
return new GetTSDRAggregatedMetricsOutputBuilder().setAggregatedMetrics(result).build();
}
public static GetTSDRLogRecordsOutput createLogRecords(){
LogsBuilder rb = new LogsBuilder();
rb.setTSDRDataCategory(DataCategory.EXTERNAL);
rb.setRecordFullText("Record full text test");
rb.setNodeID("NodeTest");
rb.setTimeStamp(System.currentTimeMillis());
List<RecordKeys> recordKeys = new ArrayList<>();
RecordKeysBuilder rkb = new RecordKeysBuilder();
rkb.setKeyValue("TestV");
rkb.setKeyName("TestK");
recordKeys.add(rkb.build());
rb.setRecordKeys(recordKeys);
RecordAttributesBuilder rab = new RecordAttributesBuilder();
rab.setValue("RATestV");
rab.setName("RATestN");
List<RecordAttributes> raList = new ArrayList<>();
raList.add(rab.build());
rb.setRecordAttributes(raList);
List<Logs> result = new ArrayList<>();
result.add(rb.build());
GetTSDRLogRecordsOutputBuilder b = new GetTSDRLogRecordsOutputBuilder();
b.setLogs(result);
return b.build();
}
@Override
protected AppDescriptor configure() {
config = new QueryResourceConfig();
TSDRDataqueryModule.metricDataService = Mockito.mock(TsdrMetricDataService.class);
TSDRDataqueryModule.logDataService = Mockito.mock(TsdrLogDataService.class);
Future<RpcResult<GetTSDRMetricsOutput>> metric = Mockito.mock(Future.class);
Future<RpcResult<GetTSDRAggregatedMetricsOutput>> metricAggregated = Mockito.mock(Future.class);
Future<RpcResult<GetTSDRLogRecordsOutput>> metric2 = Mockito.mock(Future.class);
RpcResult<GetTSDRMetricsOutput> rpcResult = Mockito.mock(RpcResult.class);
RpcResult<GetTSDRAggregatedMetricsOutput> rpcResultAggregated = Mockito.mock(RpcResult.class);
RpcResult<GetTSDRLogRecordsOutput> rpcResult2 = Mockito.mock(RpcResult.class);
Mockito.when(TSDRDataqueryModule.metricDataService.getTSDRMetrics(Mockito.any(GetTSDRMetricsInput.class))).thenReturn(metric);
Mockito.when(TSDRDataqueryModule.metricDataService.getTSDRAggregatedMetrics(Mockito.any(GetTSDRAggregatedMetricsInput.class))).thenReturn(metricAggregated);
Mockito.when(TSDRDataqueryModule.logDataService.getTSDRLogRecords(Mockito.any(GetTSDRLogRecordsInput.class))).thenReturn(metric2);
try {
Mockito.when(metric.get()).thenReturn(rpcResult);
Mockito.when(metricAggregated.get()).thenReturn(rpcResultAggregated);
Mockito.when(metric2.get()).thenReturn(rpcResult2);
} catch (Exception e) {
throw Throwables.propagate(e);
}
Mockito.when(rpcResult.getResult()).thenReturn(createMetricRecords(false));
Mockito.when(rpcResultAggregated.getResult()).thenReturn(createAggregatedMetricRecords(false));
Mockito.when(rpcResult2.getResult()).thenReturn(createLogRecords());
return new LowLevelAppDescriptor.Builder(config).build();
}
@Test
public void testQueryForMetrics(){
WebResource webResource = resource();
String result = webResource.path("/metrics/query").queryParam("tsdrkey", "[NID=127.0.0.1]")
.queryParam("from","0")
.queryParam("until",""+Long.MAX_VALUE).get(String.class);
Assert.assertTrue(result.indexOf("NodeTest")!=-1);
}
@Test
public void testQueryForLogs(){
WebResource webResource = resource();
String result = webResource.path("/logs/query").queryParam("tsdrkey", "[NID=127.0.0.1]")
.queryParam("from","0")
.queryParam("until",""+Long.MAX_VALUE).get(String.class);
Assert.assertTrue(result.indexOf("NodeTest")!=-1);
}
@Test
public void testNBIForMetrics(){
WebResource webResource = resource();
String result = webResource.path("/nbi/render").queryParam("tsdrkey", "[NID=127.0.0.1]")
.queryParam("from","0")
.queryParam("until",""+Long.MAX_VALUE)
.queryParam("format","json")
.queryParam("maxDataPoints","960")
.get(String.class);
Assert.assertNotNull(result);
Assert.assertTrue(result.startsWith(NBI_RESPONSE));
}
@Test
public void testNBIEmptyResponseForMetrics() throws InterruptedException, ExecutionException{
TSDRDataqueryModule.metricDataService = Mockito.mock(TsdrMetricDataService.class);
Future<RpcResult<GetTSDRAggregatedMetricsOutput>> metric = Mockito.mock(Future.class);
RpcResult<GetTSDRAggregatedMetricsOutput> rpcResult = Mockito.mock(RpcResult.class);
Mockito.when(TSDRDataqueryModule.metricDataService.getTSDRAggregatedMetrics(Mockito.any(GetTSDRAggregatedMetricsInput.class))).thenReturn(metric);
Mockito.when(metric.get()).thenReturn(rpcResult);
Mockito.when(rpcResult.getResult()).thenReturn(createAggregatedMetricRecords(true));
WebResource webResource = resource();
String result = webResource.path("/nbi/render").queryParam("tsdrkey", "[NID=128.0.0.1]")
.queryParam("from","0")
.queryParam("until",""+Long.MAX_VALUE)
.queryParam("format","json")
.queryParam("maxDataPoints","960")
.get(String.class);
Assert.assertNotNull(result);
Assert.assertEquals("{}",result);
configure();
}
@Test
public void testTimeConvertion(){
Long time = TSDRNBIRestAPI.getTimeFromString(null);
Assert.assertNotNull(time);
time = TSDRNBIRestAPI.getTimeFromString("now");
Assert.assertTrue(time>System.currentTimeMillis()-2000);
time = TSDRNBIRestAPI.getTimeFromString("-5min");
Assert.assertTrue(time>System.currentTimeMillis()-302000);
time = TSDRNBIRestAPI.getTimeFromString("-1h");
Assert.assertTrue(time>System.currentTimeMillis()-(60000*60+2000));
time = TSDRNBIRestAPI.getTimeFromString("-1d");
Assert.assertTrue(time>System.currentTimeMillis()-(60000*60*24+2000));
time = TSDRNBIRestAPI.getTimeFromString("1");
Assert.assertTrue(time==1000);
}
private class QueryResourceConfig extends DefaultResourceConfig {
public Set<Object> getSingletons() {
HashSet<Object> set = new HashSet<>(1);
TSDRMetricsQueryAPI qapi = new TSDRMetricsQueryAPI();
TSDRLogQueryAPI lapi = new TSDRLogQueryAPI();
TSDRNBIRestAPI nbi = new TSDRNBIRestAPI();
set.add(qapi);
set.add(lapi);
set.add(nbi);
return set;
}
}
}