aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/test
diff options
context:
space:
mode:
authorasgar <ma926a@us.att.com>2019-03-08 19:52:33 +0530
committerAsgar Samiulla <ma926a@us.att.com>2019-03-15 10:53:58 +0000
commitaf56b68e030085aa523152e83811705636ead79c (patch)
tree088c8faafb77a79a5fcc4001877dc13af4ffe936 /src/app/test
parenteedac3e312c66499ca5ff9d72388c31b25813225 (diff)
added ansible server functionality
multiple ansible server for CDT Issue-ID: APPC-1510 Change-Id: I383bc63705418654efb596c617309821ebbeb9b4 Signed-off-by: Mohamed Asgar Samiulla <ma926a@us.att.com>
Diffstat (limited to 'src/app/test')
-rw-r--r--src/app/test/test.component.html18
-rw-r--r--src/app/test/test.component.ts234
2 files changed, 187 insertions, 65 deletions
diff --git a/src/app/test/test.component.html b/src/app/test/test.component.html
index 8147f05..26165d9 100644
--- a/src/app/test/test.component.html
+++ b/src/app/test/test.component.html
@@ -61,6 +61,13 @@ limitations under the License.
</div>
</div>
+ <div class="row" style="padding: 10px 15px">
+ <div class="col-lg-3 col-sm-6 col-md-4 col-xs-12">
+ <label>Force Flag </label>
+ <input [(ngModel)]="force" name="Force Flag" type="checkbox">
+ </div>
+ </div>
+
</div>
</div>
<br>
@@ -119,7 +126,9 @@ limitations under the License.
<div style="padding-left:60%;padding-bottom:0.5cm">
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary" type="button" [disabled]="!enableDownload" (click)="download()">Download Raw Request/Response
</button>
- <button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent" type="button" [disabled]="!enableAbort" (click)="abortTest()">Abandon Test</button>
+ <button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent" type="button" [disabled]="!enableAbort" (click)="abortTest()">Abandon Test
+ </button>
+
</div>
</div>
<br>
@@ -131,14 +140,15 @@ limitations under the License.
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="margin-left: 25%">
<input placeholder="Request Id" [(ngModel)]="requestId" class="mdl-textfield__input" id="requestId" required name="requestId">
</div><br/>
- <button style="margin-left: 30%" type="submit" [disabled]="!enablePollButton" class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary" (click)=pollTestStatus()>Poll Test Status
+ <button style="margin-left: 33%" type="submit" [disabled]="!enablePollButton" class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary"
+ (click)=pollTestStatus()>Poll Test Status
</button>
<br/><br/>
<div class="col-md-12">
- <span style="margin-left: 18.5%"><b>POLL TEST STATUS RESPONSE</b></span>
+ <span style="margin-left: 11%"><b>POLL TEST STATUS RESPONSE</b></span>
</div>
- <div style="margin-left: 18.5%;height:130px;width:60%;border:solid 2px grey;overflow:scroll;overflow-x:hidden;overflow-y:hidden;">
+ <div style="margin-left: 11%;height:150px;width:80%;border:solid 2px grey;overflow:scroll;overflow-x:hidden;overflow-y:hidden;">
<div *ngIf="showStatusResponseDiv">
<div *ngIf="enableCounterDiv"><b>Poll test no {{pollCounter}}</b></div>
diff --git a/src/app/test/test.component.ts b/src/app/test/test.component.ts
index f3f6a94..347bde6 100644
--- a/src/app/test/test.component.ts
+++ b/src/app/test/test.component.ts
@@ -25,6 +25,7 @@ import { NgxSpinnerService } from 'ngx-spinner';
import { saveAs } from 'file-saver';
import { Location } from '@angular/common';
import { ActivatedRoute, Router } from '@angular/router';
+import { NotificationService } from '.././shared/services/notification.service';
import { ParamShareService } from '.././shared/services/paramShare.service';
import { MappingEditorService } from '.././shared/services/mapping-editor.service';
import { NotificationsService } from 'angular2-notifications';
@@ -61,7 +62,7 @@ export class TestComponent implements OnInit {
vnfcType: any;
protocol: any;
mode: any = 'NORMAL';
- force: any = 'True';
+ public force = 'TRUE';
ttl: any;
public formattedNameValuePairs = {};
public requestId = '';
@@ -87,10 +88,11 @@ export class TestComponent implements OnInit {
public apiRequest = '';
public apiResponse = '';
public statusResponse;
+ public appcTimestampResponse;
public outputTimeStamp;
public status;
public statusReason;
- public errorResponse;
+ public errorResponse;
public timer;
public subscribe;
public enableTestButton: boolean = false;
@@ -101,30 +103,39 @@ export class TestComponent implements OnInit {
public enableCounterDiv: boolean = false;
public enableDownload: boolean = false;
private userId = localStorage['userId'];
- constructor (
- private location: Location,
- private activeRoutes: ActivatedRoute,
- private nService: NotificationsService,
- private router: Router,
- private paramShareService: ParamShareService,
- private mappingEditorService: MappingEditorService,
- private httpUtil: HttpUtilService,
- private utiltiy: UtilityService,
- private ngProgress: NgProgress,
- private spinner: NgxSpinnerService
- ) {
+ timeStampInt: number;
+ AppcTimeStampInt: number;
+ AppcTimeDiff: number;
+ isAppcTimestampReceived: boolean = false;
+
+ constructor (private location: Location, private activeRoutes: ActivatedRoute, private notificationService: NotificationService, private nService: NotificationsService, private router: Router, private paramShareService: ParamShareService, private mappingEditorService: MappingEditorService, private httpUtil: HttpUtilService,
+ private utiltiy: UtilityService, private ngProgress: NgProgress, private spinner: NgxSpinnerService) {
}
ngOnInit() {
+ let timeStampI = new Date();
+ console.log("ngOnInit: local timeStamp:[" + timeStampI + "]");
+ let timeStampS = timeStampI.toISOString();
+ console.log("ngOnInit: local ISO timestamp:[" + timeStampS + "]");
+ //.. send HTTP request to APPC
+ this.getAppcTimestamp();
+ }
- }
+ /*public download() {
+ let stringData: any;
+ stringData = JSON.stringify(this.paramShareService.getSessionParamData());
+ let paramsKeyValueFromEditor: JSON;
+ paramsKeyValueFromEditor = JSON.parse(stringData);
+ let fileName = 'param_' + this.action + '_' + this.type + '_' + "0.0.1" + 'V';
+ this.JSONToCSVConvertor([paramsKeyValueFromEditor], fileName, true);
+ }*/
public download() {
if (this.apiRequest) {
- var fileName = 'test_' + this.action + '_' + this.actionIdentifiers['vnf-id'] + '_request';
+ var fileName = 'test_' + this.action + '_' + this.actionIdentifiers['vnf-id'] + '_request.json';
var theJSON = this.apiRequest;
if (fileName != null || fileName != '') {
var blob = new Blob([theJSON], {
@@ -138,7 +149,7 @@ export class TestComponent implements OnInit {
}
if (this.apiResponse) {
- var fileName = 'test_' + this.action + '_' + this.actionIdentifiers['vnf-id'] + '_response';
+ var fileName = 'test_' + this.action + '_' + this.actionIdentifiers['vnf-id'] + '_response.json';
var theJSON = this.apiResponse;
if (fileName != null || fileName != '') {
var blob = new Blob([theJSON], {
@@ -157,6 +168,7 @@ export class TestComponent implements OnInit {
this.enableTestButton = true;
this.enablePollButton = true;
if (this.subscribe && this.subscribe != undefined) this.subscribe.unsubscribe();
+ this.apiResponse="Test has been abandoned and polling stopped";
this.nService.info("Information", "Test has been abandoned and polling stopped");
}
@@ -290,7 +302,7 @@ export class TestComponent implements OnInit {
constructTestPayload(listName2, listName3, key, value) {
- if (listName2 == undefined && listName3 == undefined) {
+ if ((listName2 == undefined || listName2 == '') && (listName3 == undefined || listName3 == '')) {
this.subPayload[key] = value;
}
if (listName2) {
@@ -305,7 +317,7 @@ export class TestComponent implements OnInit {
}
else {
this.vnfcJson[key] = value;
- this.vmJson['vnfc'] = this.vnfcJson;
+ this.vmJson['vnfc'] = [this.vnfcJson];
this.flag = 1;
}
if (this.vmJson) this.lastvmJson = this.vmJson;
@@ -317,7 +329,22 @@ export class TestComponent implements OnInit {
}
constructRequest() {
- let timeStamp = new Date().toISOString();
+ this.timeStampInt = Date.now(); //.. milliseconds
+ let timeStamp;
+ console.log("constructRequest: isAppcTimestampReceived:" +
+ (this.isAppcTimestampReceived ? "true" : "false"));
+ if (this.isAppcTimestampReceived) {
+ console.log("constructRequest: AppcTimeDiff:[" + this.AppcTimeDiff + "]");
+ this.timeStampInt += this.AppcTimeDiff;
+ timeStamp = new Date(this.timeStampInt).toISOString();
+ console.log("constructRequest: got timeStamp from APPC:[" + timeStamp + "]");
+ }
+ else { //.. still not received
+ console.log('constructRequest: Appc Timestamp is not ready (use local)');
+ this.timeStampInt -= 100000;
+ timeStamp = new Date(this.timeStampInt).toISOString();
+ };
+ console.log('constructRequest: timeStamp:[' + timeStamp + ']');
let reqId;
this.requestId = reqId = new Date().getTime().toString();
let data = {
@@ -330,7 +357,7 @@ export class TestComponent implements OnInit {
'sub-request-id': this.requestId,
'flags': {
'mode': 'NORMAL',
- 'force': 'TRUE',
+ 'force': this.force.toString().toUpperCase(),
'ttl': 3600
}
},
@@ -339,6 +366,15 @@ export class TestComponent implements OnInit {
'payload': JSON.stringify(this.payload)
}
};
+ if (this.action == 'Unlock') {
+ let payload = JSON.parse(data.input['payload']);
+ data.input['common-header']['request-id'] = payload['request-id'];
+ data.input['common-header']['sub-request-id'] = payload['request-id'];
+ }
+
+ if(this.action == 'Unlock' || this.action == 'Lock' || this.action == 'CheckLock') {
+ delete data.input['payload'];
+ }
return data;
}
@@ -348,13 +384,20 @@ export class TestComponent implements OnInit {
this.enableTestButton = false;
this.enablePollButton = false;
this.timer = Observable.interval(10000);
- this.subscribe = this.timer.subscribe((t) => this.pollTestStatus());
+ if(this.action == 'Unlock' || this.action == 'Lock' || this.action == 'CheckLock') {
+ this.enablePollButton = true;
+ this.enableBrowse = true;
+ this.enableTestButton = true;
+ this.requestId = '';
+ } else {
+ this.subscribe = this.timer.subscribe((t) => this.pollTestStatus());
+ }
this.ngProgress.start();
this.apiRequest = JSON.stringify(this.constructRequest());
this.httpUtil.post(
{
- url: environment.testVnf + "?urlAction=" + this.getUrlEndPoint(this.action.toLowerCase()),
+ url: environment.testVnf + "?urlAction=" + this.getUrlEndPoint(this.action),
data: this.apiRequest
})
.subscribe(resp => {
@@ -365,10 +408,11 @@ export class TestComponent implements OnInit {
},
error => {
this.nService.error('Error', 'Error in connecting to APPC Server');
- this.enableBrowse = true;
+ // this.enableBrowse = true;
this.enableTestButton = true;
this.enablePollButton = true;
this.enableCounterDiv = false;
+ this.enableBrowse = true;
if (this.subscribe && this.subscribe != undefined) this.subscribe.unsubscribe();
});
@@ -378,10 +422,98 @@ export class TestComponent implements OnInit {
}, 3500);
}
+ getAppcTimestamp() {
+ this.timeStampInt = Date.now(); //.. milliseconds
+ console.log("getAppcTimestamp: timeStampInt:[" + this.timeStampInt + "]");
+ let timeStampP = new Date(this.timeStampInt).toISOString();
+ console.log("getAppcTimestamp: from int timestamp:[" + timeStampP + "]");
+ this.isAppcTimestampReceived = false;
+ let reqId = new Date().getTime().toString();
+ try {
+ let data = {
+ 'input': {
+ 'design-request': {
+ 'request-id': reqId,
+ 'action': 'getAppcTimestampUTC',
+ 'payload': '{}'
+ }
+ }
+ };
+ console.log('getAppcTimestamp: sending httpUtil.post...');
+ this.httpUtil.post(
+ {
+ url: environment.getDesigns, data: data
+ })
+ .subscribe(resp => {
+ this.appcTimestampResponse = resp;
+ // this.appcTimestampResponse = JSON.stringify(resp);
+ console.log('appcTimestampResponse:[' + resp + ']');
+ this.parseAppcTimestamp(this.appcTimestampResponse);
+ });
+ }
+ catch (e) {
+ this.nService.warn('status',
+ 'Error while retrieving APPC Timestamp(using local by default)!');
+ }
+ }
+
+ parseAppcTimestamp(tstampStr: string) {
+ //.. parse the response to get timestamp as milliseconds
+ // input format: YYYY-MM-DDTHH:mm:ss.sssZ (24 chars)
+ var rexp =
+ new RegExp(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d{3})Z/);
+ var mresult = rexp.exec(tstampStr);
+ if (mresult[0]) {
+ console.log("parseAppcTimestamp: response format is OK...");
+ var aYearS = mresult[1];
+ var aYear = parseInt(aYearS, 10);
+ var aMonS = mresult[2];
+ var aMon = parseInt(aMonS, 10) - 1;
+ var aDayS = mresult[3];
+ var aDay = parseInt(aDayS, 10);
+ var aHrS = mresult[4];
+ var aHr = parseInt(aHrS, 10);
+ var aMntS = mresult[5];
+ var aMnt = parseInt(aMntS, 10);
+ var aSecS = mresult[6];
+ var aSec = parseInt(aSecS, 10);
+ var aMsecS = mresult[7];
+ var aMsec = parseInt(aMsecS, 10);
+ this.AppcTimeStampInt =
+ Date.UTC(aYear, aMon, aDay, aHr, aMnt, aSec, aMsec);
+ console.log(
+ "parseAppcTimestamp: AppcTimeStampInt:[" + this.AppcTimeStampInt + "]");
+ let timeStampP = new Date(this.AppcTimeStampInt).toISOString();
+ console.log("parseAppcTimestamp: from int timestamp:[" + timeStampP + "]");
+ //.. AppcTimeDiff - time difference in milliseconds
+ this.AppcTimeDiff = this.AppcTimeStampInt - this.timeStampInt;
+ console.log("parseAppcTimestamp: AppcTimeDiff:[" + this.AppcTimeDiff + "]");
+ this.isAppcTimestampReceived = true;
+ }
+ else {
+ throw new Error(
+ 'The received APPC Timestamp is not matching expected format: YYYY-MM-DDTHH:mm:ss.sssZ !');
+ }
+ }
pollTestStatus() {
if (this.requestId && this.actionIdentifiers['vnf-id']) {
- let timeStamp = new Date().toISOString();
+ // console.log("payload==" + JSON.stringify(this.payload))
+ this.timeStampInt = Date.now(); //.. milliseconds
+ let timeStamp;
+ console.log("pollTestStatus: isAppcTimestampReceived:" +
+ (this.isAppcTimestampReceived ? "true" : "false"));
+ if (this.isAppcTimestampReceived) {
+ this.timeStampInt += this.AppcTimeDiff;
+ timeStamp = new Date(this.timeStampInt).toISOString();
+ console.log("pollTestStatus: got timeStamp from APPC:[" + timeStamp + "]");
+ }
+ else { //.. still not received
+ console.log('pollTestStatus: Appc Timestamp is not ready (use local)');
+ this.timeStampInt -= 100000;
+ timeStamp = new Date(this.timeStampInt).toISOString();
+ };
+ console.log("pollTestStatus: timestamp:[" + timeStamp + "]");
let reqId = new Date().getTime().toString();
let data = {
'input': {
@@ -393,7 +525,7 @@ export class TestComponent implements OnInit {
'sub-request-id': reqId,
'flags': {
'mode': 'NORMAL',
- 'force': 'TRUE',
+ 'force': this.force.toString().toUpperCase(),
'ttl': 3600
}
},
@@ -435,10 +567,14 @@ export class TestComponent implements OnInit {
if (status.toUpperCase() === 'SUCCESS' || status.toUpperCase() === 'SUCCESSFUL') {
if (this.subscribe && this.subscribe != undefined) this.subscribe.unsubscribe();
this.enablePollButton = true;
+ this.enableBrowse = true;
+ this.enableTestButton = true;
}
if (status.toUpperCase() === 'FAILED') {
if (this.subscribe && this.subscribe != undefined) this.subscribe.unsubscribe();
this.enablePollButton = true;
+ this.enableBrowse = true;
+ this.enableTestButton = true;
}
}
else {
@@ -456,11 +592,14 @@ export class TestComponent implements OnInit {
this.showStatusResponseDiv = false;
this.errorResponse = 'Error Connecting to APPC server';
this.enableCounterDiv = false;
+ this.enableBrowse = true;
+ this.enableTestButton = true;
if (this.subscribe && this.subscribe != undefined) {
this.subscribe.unsubscribe();
this.enablePollButton = true;
}
});
+
}
else {
this.nService.error("Error", "Please enter vnf Id & request Id");
@@ -469,43 +608,16 @@ export class TestComponent implements OnInit {
}
getUrlEndPoint(action) {
- switch (action) {
- case 'configmodify':
- return 'config-modify';
- case 'configbackup':
- return 'config-backup';
- case 'configrestore':
- return 'config-restore';
- case 'healthcheck':
- return 'health-check';
- case 'quiescetraffic':
- return 'quiesce-traffic';
- case 'resumetraffic':
- return 'resume-traffic';
- case 'distributetraffic':
- return 'distribute-traffic';
- case 'startapplication':
- return 'start-application';
- case 'stopapplication':
- return 'stop-application';
- case 'upgradebackout':
- return 'upgrade-backout';
- case 'upgradepostcheck':
- return 'upgrade-post-check';
- case 'upgradeprecheck':
- return 'upgrade-pre-check';
- case 'upgradesoftware':
- return 'upgrade-software';
- case 'upgradebackup':
- return 'upgrade-backup';
- case 'attachvolume':
- return 'attach-volume';
- case 'detachvolume':
- return 'detach-volume';
- default:
- return action.toLowerCase();
+ let charArray = action.split('');
+ let url = '';
+ for (let i = 0; i < charArray.length; i++) {
+ if (charArray[i] == charArray[i].toUpperCase() && i != 0) {
+ url = url + '-';
+ }
+ url = url + charArray[i];
}
+ return url.toLowerCase();
}
setValuesOnFileUploadFailure() {