Search in sources :

Example 1 with ReportGenerationInfo

use of io.cdap.cdap.report.proto.ReportGenerationInfo in project cdap by caskdata.

the class ReportGenerationAppTest method testGenerateReport.

@Test
public void testGenerateReport() throws Exception {
    Map<String, String> runTimeArguments = new HashMap<>();
    // disable tms subscriber thread as the RunMetaFileSet avro files are written directly by the test case
    // if the tms subscriber thread is enabled, in order to find the latest message id to start fetching from,
    // we read the latest RunMetaFileSet avro file's content
    // whereas the derived message_id will be invalid in TMS as these runs aren't in TMS,
    // in order to avoid the exception we disable the tms subscriber thread for the test case
    runTimeArguments.put(Constants.DISABLE_TMS_SUBSCRIBER_THREAD, "true");
    Long currentTimeMillis = System.currentTimeMillis();
    DatasetId metaFileset = createAndInitializeDataset(NamespaceId.DEFAULT, currentTimeMillis);
    SparkManager sparkManager = deployAndStartReportingApplication(NamespaceId.DEFAULT, runTimeArguments);
    URL url = sparkManager.getServiceURL(1, TimeUnit.MINUTES);
    Assert.assertNotNull(url);
    URL reportURL = url.toURI().resolve("reports/").toURL();
    List<Filter> filters = ImmutableList.of(// white list filter
    new ValueFilter<>(Constants.NAMESPACE, ImmutableSet.of("ns1", "ns2"), null), new RangeFilter<>(Constants.DURATION, new RangeFilter.Range<>(null, 500L)), // black list filter
    new ValueFilter<>(Constants.ARTIFACT_NAME, null, ImmutableSet.of("cdap-data-streams", "cdap-data-pipeline")));
    long startSecs = TimeUnit.MILLISECONDS.toSeconds(currentTimeMillis);
    ReportGenerationRequest request = new ReportGenerationRequest("ns1_ns2_report", startSecs, startSecs + 30, new ArrayList<>(ReportField.FIELD_NAME_MAP.keySet()), ImmutableList.of(new Sort(Constants.DURATION, Sort.Order.DESCENDING)), filters);
    HttpURLConnection urlConn = (HttpURLConnection) reportURL.openConnection();
    urlConn.setDoOutput(true);
    urlConn.setRequestMethod("POST");
    urlConn.getOutputStream().write(GSON.toJson(request).getBytes(StandardCharsets.UTF_8));
    if (urlConn.getErrorStream() != null) {
        Assert.fail(Bytes.toString(ByteStreams.toByteArray(urlConn.getErrorStream())));
    }
    Assert.assertEquals(200, urlConn.getResponseCode());
    Map<String, String> reportIdMap = getResponseObject(urlConn, STRING_STRING_MAP);
    String reportId = reportIdMap.get("id");
    Assert.assertNotNull(reportId);
    URL reportIdURL = reportURL.toURI().resolve("info?report-id=" + reportId).toURL();
    validateReportSummary(reportIdURL, startSecs);
    // share the report to get the share id
    URL shareReportURL = reportURL.toURI().resolve(reportId + "/share").toURL();
    HttpURLConnection shareURLConnection = (HttpURLConnection) shareReportURL.openConnection();
    shareURLConnection.setRequestMethod("POST");
    ShareId shareId = getResponseObject(shareURLConnection, ShareId.class);
    // test if we are able to get summary and read the summary using share id
    URL shareIdSummaryURL = reportURL.toURI().resolve("info?share-id=" + shareId.getShareId()).toURL();
    validateReportSummary(shareIdSummaryURL, startSecs);
    // assert the number of report details is correct
    URL reportRunsURL = reportURL.toURI().resolve("download?report-id=" + reportId).toURL();
    validateReportContent(reportRunsURL);
    // test if we are able to download and read the report using share id
    URL shareIdRunsURL = reportURL.toURI().resolve("download?share-id=" + shareId.getShareId()).toURL();
    validateReportContent(shareIdRunsURL);
    // save the report with a new name and description
    URL reportSaveURL = reportURL.toURI().resolve(reportId + "/" + "save").toURL();
    urlConn = (HttpURLConnection) reportSaveURL.openConnection();
    urlConn.setDoOutput(true);
    urlConn.setRequestMethod("POST");
    urlConn.getOutputStream().write(GSON.toJson(new ReportSaveRequest("newName", "newDescription")).getBytes(StandardCharsets.UTF_8));
    if (urlConn.getErrorStream() != null) {
        Assert.fail(Bytes.toString(ByteStreams.toByteArray(urlConn.getErrorStream())));
    }
    Assert.assertEquals(200, urlConn.getResponseCode());
    // verify that the name and description of the report have been updated, and the expiry time is null
    ReportGenerationInfo reportGenerationInfo = getResponseObject(reportIdURL.openConnection(), REPORT_GEN_INFO_TYPE);
    Assert.assertEquals("newName", reportGenerationInfo.getName());
    Assert.assertEquals("newDescription", reportGenerationInfo.getDescription());
    Assert.assertNull(reportGenerationInfo.getExpiry());
    // save the report again should fail
    urlConn = (HttpURLConnection) reportSaveURL.openConnection();
    urlConn.setDoOutput(true);
    urlConn.setRequestMethod("POST");
    urlConn.getOutputStream().write(GSON.toJson(new ReportSaveRequest("anotherNewName", "anotherNewDescription")).getBytes(StandardCharsets.UTF_8));
    if (urlConn.getErrorStream() != null) {
        Assert.fail(Bytes.toString(ByteStreams.toByteArray(urlConn.getErrorStream())));
    }
    Assert.assertEquals(403, urlConn.getResponseCode());
    // delete the report
    URL reportDeleteURL = reportURL.toURI().resolve(reportId).toURL();
    urlConn = (HttpURLConnection) reportDeleteURL.openConnection();
    urlConn.setRequestMethod("DELETE");
    Assert.assertEquals(200, urlConn.getResponseCode());
    // getting status of a deleted report will get 404
    Assert.assertEquals(404, ((HttpURLConnection) reportIdURL.openConnection()).getResponseCode());
    // deleting a deleted report again will get 404
    urlConn = (HttpURLConnection) reportDeleteURL.openConnection();
    urlConn.setRequestMethod("DELETE");
    Assert.assertEquals(404, urlConn.getResponseCode());
    // test querying for time range before the start secs, to verify empty results contents
    validateEmptyReports(reportURL, startSecs - TimeUnit.HOURS.toSeconds(2), startSecs - 30, filters);
    // test querying for time range after the start secs, but with filter that doesnt match any records
    // to verify empty results contents
    List<Filter> filters2 = ImmutableList.of(new ValueFilter<>(Constants.NAMESPACE, ImmutableSet.of("ns1", "ns2"), null), // all the programs are run by user alice, user bob will match no records.
    new ValueFilter<>(Constants.USER, ImmutableSet.of(USER_BOB), null));
    validateEmptyReports(reportURL, startSecs, startSecs + 30, filters2);
    List<Filter> filters3 = ImmutableList.of(new ValueFilter<>(Constants.NAMESPACE, ImmutableSet.of("ns1", "ns2"), null), // all the programs have the same test artifact name, blacklisting that will provide empty results
    new ValueFilter<>(Constants.ARTIFACT_NAME, null, ImmutableSet.of(TEST_ARTIFACT_NAME)));
    validateEmptyReports(reportURL, startSecs, startSecs + 30, filters3);
    sparkManager.stop();
    sparkManager.waitForStopped(60, TimeUnit.SECONDS);
    deleteDatasetInstance(metaFileset);
}
Also used : SparkManager(io.cdap.cdap.test.SparkManager) HashMap(java.util.HashMap) ReportGenerationRequest(io.cdap.cdap.report.proto.ReportGenerationRequest) ReportSaveRequest(io.cdap.cdap.report.proto.ReportSaveRequest) URL(java.net.URL) DatasetId(io.cdap.cdap.proto.id.DatasetId) HttpURLConnection(java.net.HttpURLConnection) ShareId(io.cdap.cdap.report.proto.ShareId) ValueFilter(io.cdap.cdap.report.proto.ValueFilter) RangeFilter(io.cdap.cdap.report.proto.RangeFilter) Filter(io.cdap.cdap.report.proto.Filter) ReportGenerationInfo(io.cdap.cdap.report.proto.ReportGenerationInfo) Sort(io.cdap.cdap.report.proto.Sort) Test(org.junit.Test)

Example 2 with ReportGenerationInfo

use of io.cdap.cdap.report.proto.ReportGenerationInfo in project cdap by caskdata.

the class ReportGenerationAppTest method validateReportSummary.

private void validateReportSummary(URL reportIdURL, long startSecs) throws InterruptedException, ExecutionException, TimeoutException, IOException {
    Tasks.waitFor(ReportStatus.COMPLETED, () -> {
        ReportGenerationInfo reportGenerationInfo = getResponseObject(reportIdURL.openConnection(), REPORT_GEN_INFO_TYPE);
        if (ReportStatus.FAILED.equals(reportGenerationInfo.getStatus())) {
            Assert.fail("Report generation failed");
        }
        return reportGenerationInfo.getStatus();
    }, 5, TimeUnit.MINUTES, 2, TimeUnit.SECONDS);
    ReportGenerationInfo reportGenerationInfo = getResponseObject(reportIdURL.openConnection(), REPORT_GEN_INFO_TYPE);
    // assert the summary content is expected
    ReportSummary summary = reportGenerationInfo.getSummary();
    Assert.assertNotNull(summary);
    Assert.assertEquals(ImmutableSet.of(new NamespaceAggregate("ns1", 1), new NamespaceAggregate("ns2", 1)), new HashSet<>(summary.getNamespaces()));
    Assert.assertEquals(ImmutableSet.of(new ArtifactAggregate(TEST_ARTIFACT_NAME, "1.0.0", "USER", 2)), new HashSet<>(summary.getArtifacts()));
    DurationStats durationStats = summary.getDurations();
    Assert.assertEquals(300L, durationStats.getMin());
    Assert.assertEquals(300L, durationStats.getMax());
    // averages with difference smaller than 0.01 are considered equal
    Assert.assertTrue(Math.abs(300.0 - durationStats.getAverage()) < 0.01);
    Assert.assertEquals(new StartStats(startSecs, startSecs), summary.getStarts());
    Assert.assertEquals(ImmutableSet.of(new UserAggregate(USER_ALICE, 2)), new HashSet<>(summary.getOwners()));
    Assert.assertEquals(ImmutableSet.of(new StartMethodAggregate(ProgramRunStartMethod.TRIGGERED, 2)), new HashSet<>(summary.getStartMethods()));
}
Also used : DurationStats(io.cdap.cdap.report.proto.summary.DurationStats) ArtifactAggregate(io.cdap.cdap.report.proto.summary.ArtifactAggregate) UserAggregate(io.cdap.cdap.report.proto.summary.UserAggregate) ReportSummary(io.cdap.cdap.report.proto.summary.ReportSummary) ReportGenerationInfo(io.cdap.cdap.report.proto.ReportGenerationInfo) StartStats(io.cdap.cdap.report.proto.summary.StartStats) NamespaceAggregate(io.cdap.cdap.report.proto.summary.NamespaceAggregate) StartMethodAggregate(io.cdap.cdap.report.proto.summary.StartMethodAggregate)

Example 3 with ReportGenerationInfo

use of io.cdap.cdap.report.proto.ReportGenerationInfo in project cdap by caskdata.

the class ReportGenerationAppTest method validateEmptyReportSummary.

private void validateEmptyReportSummary(URL reportIdURL) throws InterruptedException, ExecutionException, TimeoutException, IOException {
    Tasks.waitFor(ReportStatus.COMPLETED, () -> {
        ReportGenerationInfo reportGenerationInfo = getResponseObject(reportIdURL.openConnection(), REPORT_GEN_INFO_TYPE);
        if (ReportStatus.FAILED.equals(reportGenerationInfo.getStatus())) {
            Assert.fail("Report generation failed");
        }
        return reportGenerationInfo.getStatus();
    }, 5, TimeUnit.MINUTES, 2, TimeUnit.SECONDS);
    ReportGenerationInfo reportGenerationInfo = getResponseObject(reportIdURL.openConnection(), REPORT_GEN_INFO_TYPE);
    // assert the summary content is expected
    ReportSummary summary = reportGenerationInfo.getSummary();
    Assert.assertNotNull(summary);
    Assert.assertEquals(ImmutableSet.of(new NamespaceAggregate("ns1", 0), new NamespaceAggregate("ns2", 0)), new HashSet<>(summary.getNamespaces()));
    Assert.assertEquals(new DurationStats(0L, 0L, 0.0), summary.getDurations());
    Assert.assertEquals(new StartStats(0, 0), summary.getStarts());
    Assert.assertEquals(0, summary.getOwners().size());
    Assert.assertEquals(0, summary.getStartMethods().size());
}
Also used : DurationStats(io.cdap.cdap.report.proto.summary.DurationStats) ReportSummary(io.cdap.cdap.report.proto.summary.ReportSummary) ReportGenerationInfo(io.cdap.cdap.report.proto.ReportGenerationInfo) StartStats(io.cdap.cdap.report.proto.summary.StartStats) NamespaceAggregate(io.cdap.cdap.report.proto.summary.NamespaceAggregate)

Aggregations

ReportGenerationInfo (io.cdap.cdap.report.proto.ReportGenerationInfo)3 DurationStats (io.cdap.cdap.report.proto.summary.DurationStats)2 NamespaceAggregate (io.cdap.cdap.report.proto.summary.NamespaceAggregate)2 ReportSummary (io.cdap.cdap.report.proto.summary.ReportSummary)2 StartStats (io.cdap.cdap.report.proto.summary.StartStats)2 DatasetId (io.cdap.cdap.proto.id.DatasetId)1 Filter (io.cdap.cdap.report.proto.Filter)1 RangeFilter (io.cdap.cdap.report.proto.RangeFilter)1 ReportGenerationRequest (io.cdap.cdap.report.proto.ReportGenerationRequest)1 ReportSaveRequest (io.cdap.cdap.report.proto.ReportSaveRequest)1 ShareId (io.cdap.cdap.report.proto.ShareId)1 Sort (io.cdap.cdap.report.proto.Sort)1 ValueFilter (io.cdap.cdap.report.proto.ValueFilter)1 ArtifactAggregate (io.cdap.cdap.report.proto.summary.ArtifactAggregate)1 StartMethodAggregate (io.cdap.cdap.report.proto.summary.StartMethodAggregate)1 UserAggregate (io.cdap.cdap.report.proto.summary.UserAggregate)1 SparkManager (io.cdap.cdap.test.SparkManager)1 HttpURLConnection (java.net.HttpURLConnection)1 URL (java.net.URL)1 HashMap (java.util.HashMap)1