Compare commits
3 Commits
assignuser
...
virtual
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
456bd00d47 | ||
|
|
5a2a73a671 | ||
|
|
4fc3ea8ad2 |
2
dist/qmi-cloud/index.html
vendored
2
dist/qmi-cloud/index.html
vendored
@@ -9,5 +9,5 @@
|
||||
<link rel="stylesheet" href="styles.5de5451578cdd1ad7eb0.css"></head>
|
||||
<body>
|
||||
<app-root></app-root>
|
||||
<script src="runtime.689ba4fd6cadb82c1ac2.js" defer></script><script src="polyfills-es5.f752a17531a45fe93c1f.js" nomodule defer></script><script src="polyfills.06ba8d1a3d9dd3a8e8b9.js" defer></script><script src="scripts.5520a99f673924c17e00.js" defer></script><script src="main.e9f73c1cbb9915107acb.js" defer></script></body>
|
||||
<script src="runtime.689ba4fd6cadb82c1ac2.js" defer></script><script src="polyfills-es5.f752a17531a45fe93c1f.js" nomodule defer></script><script src="polyfills.06ba8d1a3d9dd3a8e8b9.js" defer></script><script src="scripts.5520a99f673924c17e00.js" defer></script><script src="main.42ac080a238003947ee6.js" defer></script></body>
|
||||
</html>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "qmi-cloud-app",
|
||||
"version": "1.1.5",
|
||||
"version": "1.1.4",
|
||||
"scripts": {
|
||||
"start": "node -r esm server/server.js",
|
||||
"start:dev": "nodemon -r esm server/server.js",
|
||||
|
||||
@@ -16,7 +16,10 @@ const provisionSchema = new mongoose.Schema({
|
||||
type: Date,
|
||||
default: Date.now
|
||||
},
|
||||
scenario: String,
|
||||
scenario: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
scenarioVersion: {
|
||||
type: String,
|
||||
default: "1.0"
|
||||
@@ -70,7 +73,18 @@ const provisionSchema = new mongoose.Schema({
|
||||
pendingNextAction: {
|
||||
type: String
|
||||
}
|
||||
},{
|
||||
toObject: {virtuals:true},
|
||||
toJSON: {virtuals:true}
|
||||
});
|
||||
|
||||
// Foreign keys definitions
|
||||
|
||||
provisionSchema.virtual('_scenarioDoc', {
|
||||
ref: 'Scenario',
|
||||
localField: 'scenario',
|
||||
foreignField: 'name',
|
||||
justOne: true // for many-to-1 relationships
|
||||
});
|
||||
|
||||
module.exports = mongoose.model('Provision', provisionSchema)
|
||||
@@ -15,12 +15,12 @@ const scenarioSchema = new mongoose.Schema({
|
||||
},
|
||||
version: {
|
||||
type: String,
|
||||
requred: true
|
||||
required: true
|
||||
},
|
||||
name: {
|
||||
type: String,
|
||||
unique : true,
|
||||
requred: true,
|
||||
required: true,
|
||||
index: true
|
||||
},
|
||||
isAdminOnly: {
|
||||
@@ -31,7 +31,7 @@ const scenarioSchema = new mongoose.Schema({
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
isExternal: {
|
||||
isExterrequirednal: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
@@ -41,7 +41,7 @@ const scenarioSchema = new mongoose.Schema({
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
requred: true
|
||||
required: true
|
||||
},
|
||||
description: String,
|
||||
availableProductVersions: Array,
|
||||
@@ -49,7 +49,7 @@ const scenarioSchema = new mongoose.Schema({
|
||||
newImageName: String, //For Gen scenarios
|
||||
subscription: {
|
||||
type: mongoose.Types.ObjectId, ref: 'Subscription',
|
||||
requred: true
|
||||
required: true
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -9,32 +9,34 @@ const options = {
|
||||
useUnifiedTopology: true
|
||||
};
|
||||
|
||||
console.log("--- MongoDB connecting...");
|
||||
|
||||
// Connect to DB
|
||||
mongoose.connect(process.env.MONGO_URI, options);
|
||||
|
||||
// When successfully connected
|
||||
mongoose.connection.on('connected', () => {
|
||||
console.log('MongoDB connected...');
|
||||
console.log('--- MongoDB connected');
|
||||
});
|
||||
|
||||
// When successfully reconnected
|
||||
mongoose.connection.on('reconnected', () => {
|
||||
console.log('dbevent: reconnected');
|
||||
console.log('--- MongoDB dbevent: reconnected');
|
||||
});
|
||||
|
||||
// If the connection throws an error
|
||||
mongoose.connection.on('error', (err) => {
|
||||
console.log(`dbevent: error: ${err}`);
|
||||
console.log(`--- MongoDB dbevent: error: ${err}`);
|
||||
//console.log(`Retry mongo connect`);
|
||||
//mongoose.connect(process.env.MONGO_URI, options);
|
||||
});
|
||||
|
||||
|
||||
// Get Data Models
|
||||
const Scenario = require('./models/Scenario');
|
||||
const Provision = require('./models/Provision');
|
||||
const Destroy = require('./models/Destroy');
|
||||
const User = require('./models/User');
|
||||
const Scenario = require('./models/Scenario');
|
||||
const VmType = require('./models/VmType');
|
||||
const ApiKey = require('./models/ApiKey');
|
||||
const Notification = require('./models/Notification');
|
||||
@@ -82,12 +84,12 @@ const get = async (model, filter, select, skip, limit, populates, reply) => {
|
||||
|
||||
if ( populates ) {
|
||||
populates = JSON.parse(populates);
|
||||
populates.forEach(p=>{
|
||||
exec = exec.populate({path: p});
|
||||
populates.forEach(p=> {
|
||||
exec = exec.populate(p);
|
||||
});
|
||||
} else {
|
||||
if ( model === Provision ) {
|
||||
exec = exec.populate({ path: 'user', select: 'displayName upn'}).populate({path:'destroy', select: "-user -jobId"});
|
||||
exec = exec.populate({ path: 'user', select: 'displayName upn'}).populate({path:'destroy', select: "-user -jobId"}).populate({path:'_scenarioDoc', select: "-availableProductVersions -updated -created"});
|
||||
}
|
||||
|
||||
if ( model === ApiKey ) {
|
||||
@@ -120,7 +122,7 @@ const getById = async (model, id, reply) => {
|
||||
try {
|
||||
var exec = model.findById(id);
|
||||
if ( model === Provision ) {
|
||||
exec = exec.populate('user').populate('destroy');
|
||||
exec = exec.populate('user').populate('destroy').populate('_scenarioDoc');
|
||||
}
|
||||
if ( model === ApiKey ) {
|
||||
exec = exec.populate('user');
|
||||
@@ -139,7 +141,7 @@ const getOne = async (model, filter, reply) => {
|
||||
try {
|
||||
var exec = model.findOne(filter);
|
||||
if ( model === Provision ) {
|
||||
exec = exec.populate('user').populate('destroy');
|
||||
exec = exec.populate('user').populate('destroy').populate('_scenarioDoc');
|
||||
}
|
||||
if ( model === ApiKey ) {
|
||||
exec = exec.populate('user');
|
||||
|
||||
BIN
qmicloud-2020-06-26-T00:00:01+0000.archive
Normal file
BIN
qmicloud-2020-06-26-T00:00:01+0000.archive
Normal file
Binary file not shown.
@@ -229,39 +229,6 @@ router.delete('/:id', passport.ensureAuthenticatedAndAdmin, async (req, res, nex
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /provisions/{id}:
|
||||
* put:
|
||||
* description: Update Provision by ID
|
||||
* summary: Update Provision by ID
|
||||
* tags:
|
||||
* - admin
|
||||
* parameters:
|
||||
* - name: id
|
||||
* in: path
|
||||
* type: string
|
||||
* required: true
|
||||
* - in: body
|
||||
* name: body
|
||||
* description: Provision object
|
||||
* required: true
|
||||
* produces:
|
||||
* - application/json
|
||||
* responses:
|
||||
* 200:
|
||||
* description: Provision
|
||||
*/
|
||||
router.put('/:id', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
|
||||
|
||||
try {
|
||||
const result = await db.provision.update(req.params.id, req.body);
|
||||
return res.json(result);
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /provisions/{id}/logs:
|
||||
|
||||
@@ -41,7 +41,6 @@ import { SubscriptionsService } from './services/deployopts.service';
|
||||
import { TableApiKeysComponent } from './tables/table-apikeys.component';
|
||||
import { ApikeyModalComponent } from './modals/edit-apikey.component';
|
||||
import { VmTypeModalComponent } from './modals/edit-vmtype.component';
|
||||
import { ProvisionModalComponent } from './modals/edit-provision.component';
|
||||
|
||||
|
||||
|
||||
@@ -82,8 +81,7 @@ export function markedOptions(): MarkedOptions {
|
||||
TableApiKeysComponent,
|
||||
ApikeyModalComponent,
|
||||
TableVmTypesComponent,
|
||||
VmTypeModalComponent,
|
||||
ProvisionModalComponent
|
||||
VmTypeModalComponent
|
||||
],
|
||||
imports: [
|
||||
BrowserModule,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="modal-content text-center">
|
||||
<!--Header-->
|
||||
<div class="modal-header d-flex justify-content-center">
|
||||
<p class="heading" [innerHTML]="info.title"></p>
|
||||
<p class="heading">{{info.title}}</p>
|
||||
</div>
|
||||
|
||||
<!--Body-->
|
||||
|
||||
@@ -24,13 +24,13 @@ export class ApikeyModalComponent implements OnInit, OnDestroy {
|
||||
ngOnInit() {
|
||||
this._usersService.getUsers().subscribe(res=> {
|
||||
this.users = res.results;
|
||||
this.users = this.users.sort(function(a, b){return a.displayName.localeCompare(b.displayName);});
|
||||
if (this.apiKey) {
|
||||
this.sendData = JSON.parse(JSON.stringify(this.apiKey))
|
||||
}
|
||||
if (this.apiKey.user ) {
|
||||
this.selectedUser = this.apiKey.user._id;
|
||||
}
|
||||
console.log("apiKey",this.apiKey);
|
||||
if (this.apiKey) {
|
||||
this.sendData = JSON.parse(JSON.stringify(this.apiKey))
|
||||
}
|
||||
if (this.apiKey.user ) {
|
||||
this.selectedUser = this.apiKey.user._id;
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
<!--Content-->
|
||||
<div class="modal-content">
|
||||
<div class="modal-header text-center">
|
||||
<button type="button" class="close pull-right" aria-label="Close" (click)="modalRef.hide()">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
<h4 class="modal-title w-100 font-weight-bold">Edit Provision</h4>
|
||||
</div>
|
||||
<div class="modal-body" style="max-height: 650px; overflow: auto;">
|
||||
<div>
|
||||
<section style="padding: 20px 0px;">
|
||||
<label>Onwer (*):</label>
|
||||
<select class="browser-default custom-select custom-select-sm" [(ngModel)]="selectedUser">
|
||||
<option *ngFor="let item of users" [value]="item._id">{{item.displayName}}</option>
|
||||
</select>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-footer d-flex justify-content-center">
|
||||
<button style="margin-right: 100px;" *ngIf="sendData._id" mdbBtn color="danger" outline="true" class="waves-light" size="sm" mdbWavesEffect (click)="delete();">Delete</button>
|
||||
<button mdbBtn color="dark-green" size="sm" outline="true" class="waves-effect" mdbWavesEffect (click)="modalRef.hide()">Cancel</button>
|
||||
<button mdbBtn color="dark-green" class="waves-light" size="sm" mdbWavesEffect (click)="confirm();">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
<!--/.Content-->
|
||||
@@ -1,45 +0,0 @@
|
||||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
import { MDBModalRef } from 'angular-bootstrap-md';
|
||||
import { Subject } from 'rxjs';
|
||||
import { UsersService } from '../services/users.service';
|
||||
import { ProvisionsService } from '../services/provisions.service';
|
||||
|
||||
@Component({
|
||||
selector: 'qmi-edit-provision',
|
||||
templateUrl: './edit-provision.component.html',
|
||||
styleUrls: ['./edit-provision.component.scss']
|
||||
})
|
||||
export class ProvisionModalComponent implements OnInit, OnDestroy {
|
||||
|
||||
provision;
|
||||
action: Subject<any> = new Subject();
|
||||
users;
|
||||
selectedUser;
|
||||
|
||||
sendData : any = {};
|
||||
|
||||
constructor( public modalRef: MDBModalRef, private _usersService: UsersService, private _provisionsService: ProvisionsService ) {}
|
||||
|
||||
ngOnInit() {
|
||||
var sub = this._usersService.getUsers().subscribe(res=> {
|
||||
this.users = res.results;
|
||||
this.users = this.users.sort(function(a, b){return a.displayName.localeCompare(b.displayName);});
|
||||
sub.unsubscribe();
|
||||
if (this.provision.user ) {
|
||||
this.selectedUser = this.provision.user._id;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
|
||||
}
|
||||
|
||||
confirm() : void {
|
||||
this._provisionsService.updateProvisionAdmin(this.provision._id, { user: this.selectedUser } ).subscribe( res=>{
|
||||
this.action.next(res);
|
||||
this.modalRef.hide();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
<b>Purpose: </b> {{info.description}}
|
||||
</div>
|
||||
<div>
|
||||
<b>Scenario: </b> {{info._scenario[0].title}} <span *ngIf="info.isExternalAccess">( External Access is enabled )</span>
|
||||
<b>Scenario: </b> {{info._scenarioDoc.title}} <span *ngIf="info.isExternalAccess">( External Access is enabled )</span>
|
||||
</div>
|
||||
|
||||
<div *ngIf="info.vmType && !info.vmImage">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<div *ngIf="provisions && provisions.length" class="flexcontainer">
|
||||
<div *ngFor="let provision of provisions; let i = index" class="box">
|
||||
<div class="title {{provision.status}} {{provision.statusVms}} {{provision.destroy? provision.destroy.status : ''}}">
|
||||
<div class="maintitle"><span *ngIf="provision._scenario && provision._scenario[0]">{{provision._scenario[0].title}}</span><span *ngIf="!provision._scenario || !provision._scenario[0]">Old scenario (please destroy)</span></div>
|
||||
<div class="maintitle"><span *ngIf="provision._scenarioDoc">{{provision._scenarioDoc.title}}</span><span *ngIf="!provision._scenarioDoc">Old scenario (please destroy)</span></div>
|
||||
<div class="subtitle">{{provision.scenario}} (v{{provision.scenarioVersion}})</div>
|
||||
</div>
|
||||
<div class="title desc {{provision.status}} {{provision.statusVms}} {{provision.destroy? provision.destroy.status : ''}}">
|
||||
@@ -105,7 +105,7 @@
|
||||
<div *ngIf="destroys && destroys.length" class="flexcontainer">
|
||||
<div *ngFor="let provision of destroys; let i = index" class="box">
|
||||
<div class="title {{provision.status}} {{provision.destroy.status}}">
|
||||
<div class="maintitle"><span *ngIf="provision._scenario && provision._scenario[0]">{{provision._scenario[0].title}}</span><span *ngIf="!provision._scenario || !provision._scenario[0]">Old scenario (please delete)</span></div>
|
||||
<div class="maintitle"><span *ngIf="provision._scenarioDoc">{{provision._scenarioDoc.title}}</span><span *ngIf="!provision._scenarioDoc">Old scenario (please delete)</span></div>
|
||||
<div class="subtitle">{{provision.scenario}} (v{{provision.scenarioVersion}})</div>
|
||||
</div>
|
||||
<div class="title desc {{provision.status}} {{provision.destroy.status}}">
|
||||
|
||||
@@ -3,7 +3,6 @@ import { ProvisionsService } from '../services/provisions.service';
|
||||
import { Subscription, timer} from 'rxjs';
|
||||
import { switchMap } from 'rxjs/operators';
|
||||
import { AuthGuard } from '../services/auth.guard';
|
||||
import { ScenariosService } from '../services/scenarios.service';
|
||||
import { AlertService } from '../services/alert.service';
|
||||
import { MDBModalService } from 'angular-bootstrap-md';
|
||||
import { ModalInfoComponent } from '../modals/modalinfo.component';
|
||||
@@ -22,13 +21,11 @@ export class ProvisionsComponent implements OnInit {
|
||||
destroys;
|
||||
subscription: Subscription;
|
||||
instantSubs: Subscription;
|
||||
scenariosSub: Subscription;
|
||||
logShow: boolean = false;
|
||||
logstype: String = 'provision';
|
||||
public selectedprov: Object = null;
|
||||
scenarios;
|
||||
|
||||
constructor(private modalService: MDBModalService, private _alertService: AlertService, private _provisionsService: ProvisionsService, private _scenariosService: ScenariosService, private _auth: AuthGuard) {
|
||||
constructor(private modalService: MDBModalService, private _alertService: AlertService, private _provisionsService: ProvisionsService, private _auth: AuthGuard) {
|
||||
this._auth.getUserInfo().subscribe( value => {
|
||||
this._userId = value? value._id : null;
|
||||
});
|
||||
@@ -38,7 +35,6 @@ export class ProvisionsComponent implements OnInit {
|
||||
this.instantSubs = this._provisionsService.getProvisionsByUser(this._userId).subscribe( provisions=>{
|
||||
provisions = provisions.results;
|
||||
provisions.forEach(p=>{
|
||||
p._scenario = this.scenarios.filter(s => s.name === p.scenario);
|
||||
this._provisionsService.timeRunning(p);
|
||||
});
|
||||
this.provisions = provisions.filter(p => !p.destroy || !p.destroy.status || p.destroy.status !== 'destroyed');
|
||||
@@ -47,22 +43,15 @@ export class ProvisionsComponent implements OnInit {
|
||||
})
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.scenariosSub = this._scenariosService.getScenariosAll().subscribe( res => {
|
||||
|
||||
this.scenarios = res.results;
|
||||
this.scenariosSub.unsubscribe();
|
||||
|
||||
this.subscription = timer(0, 8000).pipe( switchMap(() => this._provisionsService.getProvisionsByUser(this._userId) ) ).subscribe(provisions => {
|
||||
provisions = provisions.results;
|
||||
provisions.forEach(p=>{
|
||||
p._scenario = this.scenarios.filter(s => s.name === p.scenario);
|
||||
this._provisionsService.timeRunning(p);
|
||||
});
|
||||
this.provisions = provisions.filter(p => !p.destroy || !p.destroy.status || p.destroy.status !== 'destroyed');
|
||||
this.destroys = provisions.filter(p => p.destroy && p.destroy.status === 'destroyed');
|
||||
})
|
||||
});
|
||||
ngOnInit() {
|
||||
this.subscription = timer(0, 8000).pipe( switchMap(() => this._provisionsService.getProvisionsByUser(this._userId) ) ).subscribe(provisions => {
|
||||
provisions = provisions.results;
|
||||
provisions.forEach(p=>{
|
||||
this._provisionsService.timeRunning(p);
|
||||
});
|
||||
this.provisions = provisions.filter(p => !p.destroy || !p.destroy.status || p.destroy.status !== 'destroyed');
|
||||
this.destroys = provisions.filter(p => p.destroy && p.destroy.status === 'destroyed');
|
||||
})
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
|
||||
@@ -23,6 +23,10 @@ export class ProvisionsService {
|
||||
if ( filter ){
|
||||
params = params.append("filter", JSON.stringify(filter));
|
||||
}
|
||||
params = params.append("populates", JSON.stringify([
|
||||
{ path: 'user', select: 'displayName upn' },
|
||||
{ path:'destroy', select: "-user -jobId" }
|
||||
]));
|
||||
return this.httpClient.get(`${environment.apiVersionPath}/provisions`, { params: params });
|
||||
}
|
||||
|
||||
@@ -30,6 +34,10 @@ export class ProvisionsService {
|
||||
return this.httpClient.get(`${environment.apiVersionPath}/users/${userId}/provisions`);
|
||||
}
|
||||
|
||||
getProvisionsById(id) : Observable<any> {
|
||||
return this.httpClient.get(`${environment.apiVersionPath}/provisions/${id}`);
|
||||
}
|
||||
|
||||
getDestroyProvisionsAdmin() : Observable<any> {
|
||||
return this.httpClient.get(`${environment.apiVersionPath}/destroyprovisions`);
|
||||
}
|
||||
@@ -43,10 +51,6 @@ export class ProvisionsService {
|
||||
return this.httpClient.delete(`${environment.apiVersionPath}/users/${userId}/provisions/${id}`);
|
||||
}
|
||||
|
||||
updateProvisionAdmin(id, patch): Observable<any> {
|
||||
return this.httpClient.put(`${environment.apiVersionPath}/provisions/${id}`, patch);
|
||||
}
|
||||
|
||||
newDestroy(id, userId) : Observable<any> {
|
||||
return this.httpClient.post(`${environment.apiVersionPath}/users/${userId}/provisions/${id}/destroy`, null);
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
</span>
|
||||
|
||||
</td>
|
||||
<th *ngIf="i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex">{{item.provision}}</th>
|
||||
<th *ngIf="i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex"><a href="#" (click)="openInfoModal($event,item.provision)">{{item.provision}}</a></th>
|
||||
<td *ngIf="i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex">{{item.message}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { MdbTablePaginationComponent, MdbTableDirective } from 'angular-bootstrap-md';
|
||||
import { MdbTablePaginationComponent, MdbTableDirective, MDBModalService } from 'angular-bootstrap-md';
|
||||
|
||||
import { Component, OnInit, ViewChild, HostListener, AfterViewInit, ChangeDetectorRef } from '@angular/core';
|
||||
import { UsersService } from '../services/users.service';
|
||||
import { ModalInfoComponent } from '../modals/modalinfo.component';
|
||||
import { ProvisionsService } from '../services/provisions.service';
|
||||
|
||||
@Component({
|
||||
selector: 'table-notifications',
|
||||
@@ -24,7 +26,7 @@ export class TableNotificationsComponent implements OnInit, AfterViewInit {
|
||||
this.mdbTablePagination.searchText = this.searchText;
|
||||
}
|
||||
|
||||
constructor(private cdRef: ChangeDetectorRef, private _usersService: UsersService) {
|
||||
constructor(private cdRef: ChangeDetectorRef, private _provisionsService: ProvisionsService, private _usersService: UsersService, private modalService: MDBModalService) {
|
||||
}
|
||||
|
||||
private _initElements(): void {
|
||||
@@ -79,4 +81,25 @@ export class TableNotificationsComponent implements OnInit, AfterViewInit {
|
||||
});
|
||||
}
|
||||
|
||||
openInfoModal($event, provisionId) {
|
||||
$event.preventDefault();
|
||||
this._provisionsService.getProvisionsById(provisionId).subscribe( res=> {
|
||||
|
||||
this.modalService.show(ModalInfoComponent, {
|
||||
backdrop: true,
|
||||
keyboard: true,
|
||||
focus: true,
|
||||
show: false,
|
||||
ignoreBackdropClick: false,
|
||||
class: 'modal-lg',
|
||||
containerClass: '',
|
||||
animated: true,
|
||||
data: {
|
||||
info: res
|
||||
}
|
||||
} );
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -23,7 +23,7 @@
|
||||
<tr>
|
||||
<th>ProvisionID</th>
|
||||
<th [mdbTableSort]="elements" sortBy="created" >Prov. Date <mdb-icon fas icon="sort"></mdb-icon></th>
|
||||
<th [mdbTableSort]="elements" sortBy="user.displayName">Owner <mdb-icon fas icon="sort"></mdb-icon></th>
|
||||
<th [mdbTableSort]="elements" sortBy="user.displayName">User <mdb-icon fas icon="sort"></mdb-icon></th>
|
||||
<th [mdbTableSort]="elements" sortBy="scenario">Scenario (v)<mdb-icon fas icon="sort"></mdb-icon></th>
|
||||
<th [mdbTableSort]="elements" sortBy="isExternalAccess">Ext. Access? <mdb-icon fas icon="sort"></mdb-icon></th>
|
||||
<th [mdbTableSort]="elements" sortBy="statusVms">VMs (Running time)<mdb-icon fas icon="sort"></mdb-icon></th>
|
||||
@@ -36,16 +36,14 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr mdbTableCol *ngFor="let provision of elements; let i = index">
|
||||
<td (click)="openInfoModal(provision)" scope="row" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<td (click)="openInfoModal(provision._id)" scope="row" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<a href (click)="showLogs($event, provision, 'provision')" class="lui-text-info">{{ provision._id }}</a>
|
||||
</td>
|
||||
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.created | date: 'MMM dd, yyyy - H:mm'}}</td>
|
||||
<td *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" class="ell" title="{{provision.path}}" >
|
||||
<a href (click)="openOwnerChange($event, provision)" class="lui-text-info">{{provision.user.displayName}}</a>
|
||||
</td>
|
||||
<td (click)="openInfoModal(provision)"*ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.scenario}} (v{{provision.scenarioVersion}})</td>
|
||||
<td style="text-align: center;" (click)="openInfoModal(provision)"*ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)"><mdb-icon *ngIf="provision.isExternalAccess" fas icon="check"></mdb-icon></td>
|
||||
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.created | date: 'MMM dd, yyyy - H:mm'}}</td>
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" class="ell" title="{{provision.path}}" >{{provision.user.displayName}}</td>
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.scenario}} (v{{provision.scenarioVersion}})</td>
|
||||
<td style="text-align: center;" (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)"><mdb-icon *ngIf="provision.isExternalAccess" fas icon="check"></mdb-icon></td>
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<span>
|
||||
<span style="text-transform: capitalize;" class="badge badge-secondary" [ngClass]="{'badge-success': provision.statusVms === 'Running', 'badge-warning': provision.statusVms === 'Stopped' || provision.statusVms === 'Stopping' || provision.statusVms === 'Starting'}">{{provision.statusVms}}</span>
|
||||
<span *ngIf="provision.statusVms === 'Starting' || provision.statusVms === 'Stopping'" class="spinner-border spinner-border-sm text-warning" role="status">
|
||||
@@ -70,15 +68,15 @@
|
||||
</i>
|
||||
</div>
|
||||
</td>
|
||||
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<span style="text-transform: capitalize;" class="badge badge-secondary" [ngClass]="{'badge-warning': provision.status === 'provisioning' || provision.status === 'initializing', 'badge-success': provision.status === 'provisioned', 'badge-danger': (provision.status === 'error' || provision.status === 'error_init' || provision.status === 'error_plan') }">{{provision.status}}</span>
|
||||
<span *ngIf="provision.status === 'provisioning' || provision.status === 'initializing'" class="spinner-border spinner-border-sm text-warning" role="status">
|
||||
<span class="sr-only"></span>
|
||||
</span>
|
||||
</td>
|
||||
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" style="border-left:2px solid #ccc;"><a *ngIf="provision.destroy" href (click)="showLogs($event, provision, 'destroy')" class="lui-text-info">{{provision.destroy._id}}</a></td>
|
||||
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" ><span *ngIf="provision.destroy">{{provision.destroy.created | date: 'MMM dd, yyyy - H:mm'}}</span></td>
|
||||
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" style="border-left:2px solid #ccc;"><a *ngIf="provision.destroy" href (click)="showLogs($event, provision, 'destroy')" class="lui-text-info">{{provision.destroy._id}}</a></td>
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" ><span *ngIf="provision.destroy">{{provision.destroy.created | date: 'MMM dd, yyyy - H:mm'}}</span></td>
|
||||
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
|
||||
<span *ngIf="provision.destroy">
|
||||
<span style="text-transform: capitalize;" class="badge badge-secondary" [ngClass]="{'badge-warning': provision.destroy.status === 'destroying', 'badge-success': provision.destroy.status === 'destroyed', 'badge-danger': provision.destroy.status === 'error'}">{{provision.destroy.status}}</span>
|
||||
<span *ngIf="provision.destroy.status === 'destroying'" class="spinner-border spinner-border-sm text-warning" role="status">
|
||||
|
||||
@@ -4,9 +4,7 @@ import { ProvisionsService } from '../services/provisions.service';
|
||||
import { AlertService } from '../services/alert.service';
|
||||
import { ModalInfoComponent } from '../modals/modalinfo.component';
|
||||
import { ModalConfirmComponent } from '../modals/confirm.component';
|
||||
import { Subscription, timer } from 'rxjs';
|
||||
import { ScenariosService } from '../services/scenarios.service';
|
||||
import { ProvisionModalComponent } from '../modals/edit-provision.component';
|
||||
import { Subscription } from 'rxjs';
|
||||
@Component({
|
||||
selector: 'table-provisions',
|
||||
templateUrl: './table-provisions.component.html',
|
||||
@@ -39,6 +37,7 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
|
||||
this.mdbTablePagination.searchText = this.searchText;
|
||||
}
|
||||
|
||||
|
||||
selectedprov: any = null;
|
||||
showInfo: boolean = false;
|
||||
logShow: boolean = false;
|
||||
@@ -47,7 +46,7 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
|
||||
maxVisibleItems: number = 25;
|
||||
|
||||
|
||||
constructor(private modalService: MDBModalService, private _scenariosService: ScenariosService, private _alertService: AlertService, private cdRef: ChangeDetectorRef, private _provisionsService: ProvisionsService) {
|
||||
constructor(private modalService: MDBModalService, private _alertService: AlertService, private cdRef: ChangeDetectorRef, private _provisionsService: ProvisionsService) {
|
||||
|
||||
}
|
||||
|
||||
@@ -58,11 +57,9 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
|
||||
}
|
||||
|
||||
private _process(provisions) : void {
|
||||
provisions.forEach( p=> {
|
||||
p.user.currentUserId = p.user._id;
|
||||
p._scenario = this.scenarios.filter(s => s.name === p.scenario);
|
||||
provisions.forEach(p=>{
|
||||
this._provisionsService.timeRunning(p);
|
||||
} );
|
||||
});
|
||||
if ( this.elements.length === 0 ) {
|
||||
this.elements = provisions;
|
||||
} else {
|
||||
@@ -93,17 +90,8 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
var scenariosSub = this._scenariosService.getScenariosAll().subscribe( res => {
|
||||
scenariosSub.unsubscribe();
|
||||
this.scenarios = res.results;
|
||||
|
||||
/*this.subscription = timer(0, 8000).pipe( switchMap(() => this._provisionsService.getProvisionsAdmin(this.filterParams) ) ).subscribe(provisions => {
|
||||
this._process(provisions.results);
|
||||
});*/
|
||||
|
||||
this.refreshData();
|
||||
|
||||
});
|
||||
this.refreshData();
|
||||
|
||||
//this._initElements();
|
||||
}
|
||||
@@ -125,26 +113,6 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
|
||||
}
|
||||
}
|
||||
|
||||
openOwnerChange($event, provision){
|
||||
$event.preventDefault();
|
||||
var modalRef = this.modalService.show(ProvisionModalComponent, {
|
||||
class: 'modal-md modal-notify',
|
||||
containerClass: '',
|
||||
data: {
|
||||
provision: provision
|
||||
}
|
||||
} );
|
||||
|
||||
var sub = modalRef.content.action.subscribe( (result: any) => {
|
||||
sub.unsubscribe();
|
||||
provision.user = result.user;
|
||||
this._alertService.showAlert({
|
||||
type: 'alert-primary',
|
||||
text: `New owner ${provision.user.displayName} assigned to this provision`
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
searchItems() {
|
||||
const prev = this.mdbTable.getDataSource();
|
||||
|
||||
@@ -243,20 +211,24 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
|
||||
})
|
||||
}
|
||||
|
||||
openInfoModal(provision) {
|
||||
this.modalService.show(ModalInfoComponent, {
|
||||
backdrop: true,
|
||||
keyboard: true,
|
||||
focus: true,
|
||||
show: false,
|
||||
ignoreBackdropClick: false,
|
||||
class: 'modal-lg',
|
||||
containerClass: '',
|
||||
animated: true,
|
||||
data: {
|
||||
info: provision
|
||||
}
|
||||
} );
|
||||
|
||||
openInfoModal(provisionId) {
|
||||
this._provisionsService.getProvisionsById(provisionId).subscribe( res=> {
|
||||
|
||||
this.modalService.show(ModalInfoComponent, {
|
||||
backdrop: true,
|
||||
keyboard: true,
|
||||
focus: true,
|
||||
show: false,
|
||||
ignoreBackdropClick: false,
|
||||
class: 'modal-lg',
|
||||
containerClass: '',
|
||||
animated: true,
|
||||
data: {
|
||||
info: res
|
||||
}
|
||||
} );
|
||||
})
|
||||
}
|
||||
|
||||
openConfirmDestroyModal(provision) {
|
||||
|
||||
Reference in New Issue
Block a user