mirror of https://github.com/portainer/portainer
121 lines
4.2 KiB
JavaScript
121 lines
4.2 KiB
JavaScript
import _ from 'lodash-es';
|
|
import angular from 'angular';
|
|
import { KubernetesStorageClassAccessPolicies, KubernetesStorageClass } from 'Kubernetes/models/storage-class/models';
|
|
|
|
class KubernetesConfigureController {
|
|
/* @ngInject */
|
|
constructor($async, $state, $stateParams, Notifications, KubernetesStorageService, EndpointService, EndpointProvider) {
|
|
this.$async = $async;
|
|
this.$state = $state;
|
|
this.$stateParams = $stateParams;
|
|
this.Notifications = Notifications;
|
|
this.KubernetesStorageService = KubernetesStorageService;
|
|
this.EndpointService = EndpointService;
|
|
this.EndpointProvider = EndpointProvider;
|
|
|
|
this.onInit = this.onInit.bind(this);
|
|
this.configureAsync = this.configureAsync.bind(this);
|
|
}
|
|
|
|
storageClassAvailable() {
|
|
return this.StorageClasses && this.StorageClasses.length > 0;
|
|
}
|
|
|
|
hasValidStorageConfiguration() {
|
|
let valid = true;
|
|
_.forEach(this.StorageClasses, (item) => {
|
|
if (item.selected && item.AccessModes.length === 0) {
|
|
valid = false;
|
|
}
|
|
});
|
|
|
|
return valid;
|
|
}
|
|
|
|
async configureAsync() {
|
|
try {
|
|
this.state.actionInProgress = true;
|
|
const classes = _.without(
|
|
_.map(this.StorageClasses, (item) => {
|
|
if (item.selected) {
|
|
const res = new KubernetesStorageClass();
|
|
res.Name = item.Name;
|
|
res.AccessModes = _.map(item.AccessModes, 'Name');
|
|
res.Provisioner = item.Provisioner;
|
|
return res;
|
|
}
|
|
}),
|
|
undefined
|
|
);
|
|
|
|
this.endpoint.Kubernetes.Configuration.StorageClasses = classes;
|
|
this.endpoint.Kubernetes.Configuration.UseLoadBalancer = this.formValues.UseLoadBalancer;
|
|
this.endpoint.Kubernetes.Configuration.UseServerMetrics = this.formValues.UseServerMetrics;
|
|
await this.EndpointService.updateEndpoint(this.endpoint.Id, this.endpoint);
|
|
const endpoints = this.EndpointProvider.endpoints();
|
|
const modifiedEndpoint = _.find(endpoints, (item) => item.Id === this.endpoint.Id);
|
|
if (modifiedEndpoint) {
|
|
modifiedEndpoint.Kubernetes.Configuration.StorageClasses = classes;
|
|
modifiedEndpoint.Kubernetes.Configuration.UseLoadBalancer = this.formValues.UseLoadBalancer;
|
|
modifiedEndpoint.Kubernetes.Configuration.UseServerMetrics = this.formValues.UseServerMetrics;
|
|
this.EndpointProvider.setEndpoints(endpoints);
|
|
}
|
|
this.Notifications.success('Configuration successfully applied');
|
|
this.$state.go('portainer.home');
|
|
} catch (err) {
|
|
this.Notifications.error('Failure', err, 'Unable to apply configuration');
|
|
} finally {
|
|
this.state.actionInProgress = false;
|
|
}
|
|
}
|
|
|
|
configure() {
|
|
return this.$async(this.configureAsync);
|
|
}
|
|
|
|
async onInit() {
|
|
this.state = {
|
|
actionInProgress: false,
|
|
displayConfigureClassPanel: {},
|
|
viewReady: false,
|
|
};
|
|
|
|
this.formValues = {
|
|
UseLoadBalancer: false,
|
|
UseServerMetrics: false,
|
|
};
|
|
|
|
try {
|
|
const endpointId = this.$stateParams.id;
|
|
[this.StorageClasses, this.endpoint] = await Promise.all([this.KubernetesStorageService.get(endpointId), this.EndpointService.endpoint(endpointId)]);
|
|
_.forEach(this.StorageClasses, (item) => {
|
|
item.availableAccessModes = new KubernetesStorageClassAccessPolicies();
|
|
const storage = _.find(this.endpoint.Kubernetes.Configuration.StorageClasses, (sc) => sc.Name === item.Name);
|
|
if (storage) {
|
|
item.selected = true;
|
|
_.forEach(storage.AccessModes, (access) => {
|
|
const mode = _.find(item.availableAccessModes, { Name: access });
|
|
if (mode) {
|
|
mode.selected = true;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
this.formValues.UseLoadBalancer = this.endpoint.Kubernetes.Configuration.UseLoadBalancer;
|
|
this.formValues.UseServerMetrics = this.endpoint.Kubernetes.Configuration.UseServerMetrics;
|
|
} catch (err) {
|
|
this.Notifications.error('Failure', err, 'Unable to retrieve storage classes');
|
|
} finally {
|
|
this.state.viewReady = true;
|
|
}
|
|
}
|
|
|
|
$onInit() {
|
|
return this.$async(this.onInit);
|
|
}
|
|
}
|
|
|
|
export default KubernetesConfigureController;
|
|
angular.module('portainer.kubernetes').controller('KubernetesConfigureController', KubernetesConfigureController);
|