blob: fdd75f75979dcaa324a07f70e543ea04085facaa [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnInit, OnDestroy, Input } from '@angular/core';
import { PcapService } from '../service/pcap.service';
import { PcapStatusResponse } from '../model/pcap-status-response';
import { PcapRequest } from '../model/pcap.request';
import { Pdml } from '../model/pdml';
import { Subscription } from 'rxjs';
import { PcapPagination } from '../model/pcap-pagination';
import { RestError } from '../../model/rest-error';
@Component({
selector: 'app-pcap-panel',
templateUrl: './pcap-panel.component.html',
styleUrls: ['./pcap-panel.component.scss']
})
export class PcapPanelComponent implements OnInit, OnDestroy {
pdml: Pdml = null;
pcapRequest: PcapRequest;
resetPaginationForSearch: boolean;
queryRunning = false;
queryId: string;
progressWidth = 0;
pagination: PcapPagination = new PcapPagination();
savedPcapRequest: {};
errorMsg: string;
cancelConfirmMessage = 'Are you sure want to cancel the running query?';
subscriptions: {
[key: string]: Subscription
} = {};
constructor(private pcapService: PcapService) { }
ngOnInit() {
this.pcapRequest = new PcapRequest();
this.subscriptions['runningJobSubscription'] = this.pcapService.getRunningJob().subscribe((statusResponses: PcapStatusResponse[]) => {
if (statusResponses.length > 0) {
// Assume the first job in the list is the running job
this.queryRunning = true;
let statusResponse = statusResponses[0];
this.updateStatus(statusResponse);
this.startPolling(statusResponse.jobId);
this.subscriptions['pcapRequestSubscription'] = this.pcapService.getPcapRequest(statusResponse.jobId).subscribe(
(pcapRequest: PcapRequest) => {
this.pcapRequest = pcapRequest;
}
);
}
});
}
changePage(page) {
this.pagination.selectedPage = page;
this.subscriptions['packetSubscription'] = this.pcapService.getPackets(this.queryId, this.pagination.selectedPage).subscribe(pdml => {
this.pdml = pdml;
});
}
onSearch(pcapRequest) {
this.queryRunning = true;
this.queryId = '';
this.savedPcapRequest = pcapRequest;
this.pagination.selectedPage = 1;
this.pdml = null;
this.progressWidth = 0;
this.errorMsg = null;
this.subscriptions['submitSubscription'] = this.pcapService.submitRequest(pcapRequest).subscribe(
(submitResponse: PcapStatusResponse) => {
let id = submitResponse.jobId;
if (!id) {
this.errorMsg = submitResponse.description;
this.queryRunning = false;
} else {
this.startPolling(id);
}
}, (error: any) => {
this.errorMsg = `Response message: ${error.message}. Something went wrong with your query submission!`;
}
);
}
startPolling(id: string) {
this.queryId = id;
this.errorMsg = null;
this.subscriptions['statusSubscription'] = this.pcapService.pollStatus(id).subscribe((statusResponse: PcapStatusResponse) => {
this.updateStatus(statusResponse);
}, (error: any) => {
this.subscriptions['statusSubscription'].unsubscribe();
this.queryRunning = false;
this.errorMsg = `Response message: ${error.message}. Something went wrong with your status request!`;
});
}
updateStatus(statusResponse: PcapStatusResponse) {
if ('SUCCEEDED' === statusResponse.jobStatus) {
this.pagination.total = statusResponse.pageTotal;
this.subscriptions['statusSubscription'].unsubscribe();
this.queryRunning = false;
this.subscriptions['packetSubscription'] = this.pcapService.getPackets(this.queryId, this.pagination.selectedPage).subscribe(pdml => {
this.pdml = pdml;
}, (error: RestError) => {
if (error.status === 404) {
this.errorMsg = 'No results returned';
} else {
this.errorMsg = `Response message: ${error.message}. Something went wrong retrieving pdml results!`;
}
});
} else if ('FAILED' === statusResponse.jobStatus) {
this.subscriptions['statusSubscription'].unsubscribe();
this.queryRunning = false;
this.errorMsg = `Query status: ${statusResponse.jobStatus}. Check your filter criteria and try again!`;
} else if (this.progressWidth < 100) {
this.progressWidth = Math.trunc(statusResponse.percentComplete);
}
}
getDownloadUrl() {
return this.pcapService.getDownloadUrl(this.queryId, this.pagination.selectedPage);
}
unsubscribeAll() {
Object.keys(this.subscriptions).forEach((key) => {
this.subscriptions[key].unsubscribe();
});
this.subscriptions = {};
}
cancelQuery() {
this.subscriptions['cancelSubscription'] = this.pcapService.cancelQuery(this.queryId)
.subscribe(() => {
this.unsubscribeAll();
this.queryId = '';
this.queryRunning = false;
}, (error: any) => {
this.queryId = '';
this.errorMsg = `Response message: ${error.message}. Something went wrong with the cancellation!`;
this.queryRunning = false;
});
}
ngOnDestroy() {
this.unsubscribeAll();
}
}