mirror of https://github.com/portainer/portainer
246 lines
8.4 KiB
JavaScript
246 lines
8.4 KiB
JavaScript
import angular from 'angular';
|
|
import { KubernetesConfigurationFormValues, KubernetesConfigurationFormValuesDataEntry } from 'Kubernetes/models/configuration/formvalues';
|
|
import { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';
|
|
import KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';
|
|
import KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';
|
|
import _ from 'lodash-es';
|
|
|
|
class KubernetesConfigurationController {
|
|
/* @ngInject */
|
|
constructor(
|
|
$async,
|
|
$state,
|
|
clipboard,
|
|
Notifications,
|
|
LocalStorage,
|
|
KubernetesConfigurationService,
|
|
KubernetesResourcePoolService,
|
|
ModalService,
|
|
KubernetesApplicationService,
|
|
KubernetesEventService,
|
|
KubernetesNamespaceHelper
|
|
) {
|
|
this.$async = $async;
|
|
this.$state = $state;
|
|
this.clipboard = clipboard;
|
|
this.Notifications = Notifications;
|
|
this.LocalStorage = LocalStorage;
|
|
this.ModalService = ModalService;
|
|
this.KubernetesConfigurationService = KubernetesConfigurationService;
|
|
this.KubernetesResourcePoolService = KubernetesResourcePoolService;
|
|
this.KubernetesApplicationService = KubernetesApplicationService;
|
|
this.KubernetesEventService = KubernetesEventService;
|
|
this.KubernetesConfigurationTypes = KubernetesConfigurationTypes;
|
|
this.KubernetesNamespaceHelper = KubernetesNamespaceHelper;
|
|
|
|
this.onInit = this.onInit.bind(this);
|
|
this.getConfigurationAsync = this.getConfigurationAsync.bind(this);
|
|
this.getEvents = this.getEvents.bind(this);
|
|
this.getEventsAsync = this.getEventsAsync.bind(this);
|
|
this.getApplications = this.getApplications.bind(this);
|
|
this.getApplicationsAsync = this.getApplicationsAsync.bind(this);
|
|
this.getConfigurationsAsync = this.getConfigurationsAsync.bind(this);
|
|
this.updateConfiguration = this.updateConfiguration.bind(this);
|
|
this.updateConfigurationAsync = this.updateConfigurationAsync.bind(this);
|
|
}
|
|
|
|
isSystemNamespace() {
|
|
return this.KubernetesNamespaceHelper.isSystemNamespace(this.configuration.Namespace);
|
|
}
|
|
|
|
selectTab(index) {
|
|
this.LocalStorage.storeActiveTab('configuration', index);
|
|
}
|
|
|
|
showEditor() {
|
|
this.state.showEditorTab = true;
|
|
this.selectTab(2);
|
|
}
|
|
|
|
copyConfigurationValue(idx) {
|
|
this.clipboard.copyText(this.formValues.Data[idx].Value);
|
|
$('#copyValueNotification_' + idx)
|
|
.show()
|
|
.fadeOut(2500);
|
|
}
|
|
|
|
isFormValid() {
|
|
if (this.formValues.IsSimple) {
|
|
return this.formValues.Data.length > 0 && this.state.isDataValid;
|
|
}
|
|
return this.state.isDataValid;
|
|
}
|
|
|
|
async updateConfigurationAsync() {
|
|
try {
|
|
this.state.actionInProgress = true;
|
|
if (
|
|
this.formValues.Type !== this.configuration.Type ||
|
|
this.formValues.ResourcePool.Namespace.Name !== this.configuration.Namespace ||
|
|
this.formValues.Name !== this.configuration.Name
|
|
) {
|
|
await this.KubernetesConfigurationService.create(this.formValues);
|
|
await this.KubernetesConfigurationService.delete(this.configuration);
|
|
this.Notifications.success('Configuration succesfully updated');
|
|
this.$state.go(
|
|
'kubernetes.configurations.configuration',
|
|
{
|
|
namespace: this.formValues.ResourcePool.Namespace.Name,
|
|
name: this.formValues.Name,
|
|
},
|
|
{ reload: true }
|
|
);
|
|
} else {
|
|
await this.KubernetesConfigurationService.update(this.formValues);
|
|
this.Notifications.success('Configuration succesfully updated');
|
|
this.$state.reload();
|
|
}
|
|
} catch (err) {
|
|
this.Notifications.error('Failure', err, 'Unable to update configuration');
|
|
} finally {
|
|
this.state.actionInProgress = false;
|
|
}
|
|
}
|
|
|
|
updateConfiguration() {
|
|
if (this.configuration.Used) {
|
|
const plural = this.configuration.Applications.length > 1 ? 's' : '';
|
|
this.ModalService.confirmUpdate(
|
|
`The changes will be propagated to ${this.configuration.Applications.length} running application${plural}. Are you sure you want to update this configuration?`,
|
|
(confirmed) => {
|
|
if (confirmed) {
|
|
return this.$async(this.updateConfigurationAsync);
|
|
}
|
|
}
|
|
);
|
|
} else {
|
|
return this.$async(this.updateConfigurationAsync);
|
|
}
|
|
}
|
|
|
|
async getConfigurationAsync() {
|
|
try {
|
|
this.state.configurationLoading = true;
|
|
const name = this.$transition$.params().name;
|
|
const namespace = this.$transition$.params().namespace;
|
|
this.configuration = await this.KubernetesConfigurationService.get(namespace, name);
|
|
} catch (err) {
|
|
this.Notifications.error('Failure', err, 'Unable to retrieve configuration');
|
|
} finally {
|
|
this.state.configurationLoading = false;
|
|
}
|
|
}
|
|
|
|
getConfiguration() {
|
|
return this.$async(this.getConfigurationAsync);
|
|
}
|
|
|
|
async getApplicationsAsync(namespace) {
|
|
try {
|
|
this.state.applicationsLoading = true;
|
|
const applications = await this.KubernetesApplicationService.get(namespace);
|
|
this.configuration.Applications = KubernetesConfigurationHelper.getUsingApplications(this.configuration, applications);
|
|
KubernetesConfigurationHelper.setConfigurationUsed(this.configuration);
|
|
} catch (err) {
|
|
this.Notifications.error('Failure', err, 'Unable to retrieve applications');
|
|
} finally {
|
|
this.state.applicationsLoading = false;
|
|
}
|
|
}
|
|
|
|
getApplications(namespace) {
|
|
return this.$async(this.getApplicationsAsync, namespace);
|
|
}
|
|
|
|
hasEventWarnings() {
|
|
return this.state.eventWarningCount;
|
|
}
|
|
|
|
async getEventsAsync(namespace) {
|
|
try {
|
|
this.state.eventsLoading = true;
|
|
this.events = await this.KubernetesEventService.get(namespace);
|
|
this.events = _.filter(this.events, (event) => event.Involved.uid === this.configuration.Id);
|
|
this.state.eventWarningCount = KubernetesEventHelper.warningCount(this.events);
|
|
} catch (err) {
|
|
this.Notifications('Failure', err, 'Unable to retrieve events');
|
|
} finally {
|
|
this.state.eventsLoading = false;
|
|
}
|
|
}
|
|
|
|
getEvents(namespace) {
|
|
return this.$async(this.getEventsAsync, namespace);
|
|
}
|
|
|
|
async getConfigurationsAsync() {
|
|
try {
|
|
this.configurations = await this.KubernetesConfigurationService.get();
|
|
} catch (err) {
|
|
this.Notifications.error('Failure', err, 'Unable to retrieve configurations');
|
|
}
|
|
}
|
|
|
|
getConfigurations() {
|
|
return this.$async(this.getConfigurationsAsync);
|
|
}
|
|
|
|
async onInit() {
|
|
try {
|
|
this.state = {
|
|
actionInProgress: false,
|
|
configurationLoading: true,
|
|
applicationsLoading: true,
|
|
eventsLoading: true,
|
|
showEditorTab: false,
|
|
viewReady: false,
|
|
eventWarningCount: 0,
|
|
activeTab: 0,
|
|
currentName: this.$state.$current.name,
|
|
isDataValid: true,
|
|
};
|
|
|
|
this.state.activeTab = this.LocalStorage.getActiveTab('configuration');
|
|
|
|
this.formValues = new KubernetesConfigurationFormValues();
|
|
|
|
this.resourcePools = await this.KubernetesResourcePoolService.get();
|
|
await this.getConfiguration();
|
|
await this.getApplications(this.configuration.Namespace);
|
|
await this.getEvents(this.configuration.Namespace);
|
|
this.formValues.ResourcePool = _.find(this.resourcePools, (resourcePool) => resourcePool.Namespace.Name === this.configuration.Namespace);
|
|
this.formValues.Id = this.configuration.Id;
|
|
this.formValues.Name = this.configuration.Name;
|
|
this.formValues.Type = this.configuration.Type;
|
|
this.formValues.Data = _.map(this.configuration.Data, (value, key) => {
|
|
if (this.configuration.Type === KubernetesConfigurationTypes.SECRET) {
|
|
value = atob(value);
|
|
}
|
|
this.formValues.DataYaml += key + ': ' + value + '\n';
|
|
const entry = new KubernetesConfigurationFormValuesDataEntry();
|
|
entry.Key = key;
|
|
entry.Value = value;
|
|
return entry;
|
|
});
|
|
await this.getConfigurations();
|
|
} catch (err) {
|
|
this.Notifications.error('Failure', err, 'Unable to load view data');
|
|
} finally {
|
|
this.state.viewReady = true;
|
|
}
|
|
}
|
|
|
|
$onInit() {
|
|
return this.$async(this.onInit);
|
|
}
|
|
|
|
$onDestroy() {
|
|
if (this.state.currentName !== this.$state.$current.name) {
|
|
this.LocalStorage.storeActiveTab('configuration', 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
export default KubernetesConfigurationController;
|
|
angular.module('portainer.kubernetes').controller('KubernetesConfigurationController', KubernetesConfigurationController);
|