blob: 323af7b0fc276b61b295ba7ca93bbd5512ee8034 [file] [log] [blame]
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { MatDialog } from '@angular/material';
import { Cluster } from '../shared/cluster.model';
import { HelperService } from '../../shared/helper.service';
import { ClusterService } from '../shared/cluster.service';
import { InstanceService } from '../../instance/shared/instance.service';
import { AlertDialogComponent } from '../../shared/dialog/alert-dialog/alert-dialog.component';
import { InputDialogComponent } from '../../shared/dialog/input-dialog/input-dialog.component';
@Component({
selector: 'hi-cluster-detail',
templateUrl: './cluster-detail.component.html',
styleUrls: ['./cluster-detail.component.scss'],
providers: [InstanceService]
})
export class ClusterDetailComponent implements OnInit {
readonly tabLinks = [
{ label: 'Dashboard (beta)', link: 'dashboard' },
{ label: 'Resources', link: 'resources' },
{ label: 'Workflows', link: 'workflows' },
{ label: 'Instances', link: 'instances' },
{ label: 'Configuration', link: 'configs' }
];
isLoading = false;
clusterName: string; // for better UX needs
cluster: Cluster;
can = false;
constructor(
protected route: ActivatedRoute,
protected router: Router,
protected dialog: MatDialog,
protected helperService: HelperService,
protected clusterService: ClusterService,
protected instanceService: InstanceService
) {
}
ngOnInit() {
this.clusterService.can().subscribe(data => this.can = data);
this.route.params
.map(p => p.name)
.subscribe(name => {
this.clusterName = name;
this.loadCluster();
});
}
protected loadCluster() {
this.isLoading = true;
this.clusterService
.get(this.clusterName)
.subscribe(
data => this.cluster = data,
error => this.helperService.showError(error),
() => this.isLoading = false
);
}
addInstance() {
this.dialog
.open(InputDialogComponent, {
data: {
title: 'Add a new Instance',
message: 'Please enter the following information to continue:',
values: {
host: {
label: 'Hostname'
},
port: {
label: 'Port'
},
enabled: {
label: 'Enabled',
type: 'boolean'
}
}
}
})
.afterClosed()
.subscribe(result => {
if (result) {
this.instanceService
.create(this.cluster.name, result.host.value, result.port.value, result.enabled.value)
.subscribe(
data => {
this.helperService.showSnackBar('New Instance added!');
// temporarily navigate back to instance view to refresh
// will fix this using ngrx/store
this.router.navigate(['workflows'], { relativeTo: this.route });
setTimeout(() => {
this.router.navigate(['instances'], { relativeTo: this.route });
}, 100);
},
error => this.helperService.showError(error),
() => {}
);
}
});
}
enableCluster() {
this.clusterService
.enable(this.clusterName)
.subscribe(
() => this.loadCluster(),
error => this.helperService.showError(error)
);
}
disableCluster() {
this.clusterService
.disable(this.clusterName)
.subscribe(
() => this.loadCluster(),
error => this.helperService.showError(error)
);
}
activateCluster() {
this.dialog
.open(InputDialogComponent, {
data: {
title: 'Activate this Cluster',
message: 'To link this cluster to a Helix super cluster (controller), please enter the super cluster name:',
values: {
name: {
label: 'super cluster name'
}
}
}
})
.afterClosed()
.subscribe(result => {
if (result && result.name.value) {
this.clusterService
.activate(this.clusterName, result.name.value)
.subscribe(
() => {
// since this action may delay a little bit, to prevent re-activation,
// use an alert dialog to reload the data later
this.dialog.open(AlertDialogComponent, { data: {
title: 'Cluster Activated',
message: `Cluster '${ this.clusterName }' is linked to super cluster '${ result.name.value }'.`
}}).afterClosed().subscribe(() => {
this.loadCluster();
});
},
error => this.helperService.showError(error)
);
}
});
}
enableMaintenanceMode() {
this.dialog
.open(InputDialogComponent, {
data: {
title: 'Enable maintenance mode',
message: 'What reason do you want to use to put the cluster in maintenance mode?',
values: {
reason: {
label: 'reason'
}
}
}
})
.afterClosed()
.subscribe(result => {
if (result && result.reason.value) {
this.clusterService
.enableMaintenanceMode(this.clusterName, result.reason.value)
.subscribe(
() => this.loadCluster(),
error => this.helperService.showError(error)
);
}
});
}
disableMaintenanceMode() {
this.clusterService
.disableMaintenanceMode(this.clusterName)
.subscribe(
() => this.loadCluster(),
error => this.helperService.showError(error)
);
}
deleteCluster() {
this.helperService
.showConfirmation('Are you sure you want to delete this cluster?')
.then(result => {
if (result) {
this.clusterService
.remove(this.cluster.name)
.subscribe(data => {
this.helperService.showSnackBar('Cluster deleted!');
// FIXME: should reload cluster list as well
this.router.navigate(['..'], { relativeTo: this.route });
});
}
});
}
}