mirror of https://github.com/portainer/portainer
219 lines
6.2 KiB
JavaScript
219 lines
6.2 KiB
JavaScript
|
export default class CreateEdgeStackViewController {
|
||
|
/* @ngInject */
|
||
constructor($state, $window, ModalService, EdgeStackService, EdgeGroupService, EdgeTemplateService, Notifications, FormHelper, $async) {
|
|||
Object.assign(this, { $state, $window, ModalService, EdgeStackService, EdgeGroupService, EdgeTemplateService, Notifications, FormHelper, $async });
|
|||
|
|||
this.formValues = {
|
|||
Name: '',
|
|||
StackFileContent: '',
|
|||
StackFile: null,
|
|||
RepositoryURL: '',
|
|||
RepositoryReferenceName: '',
|
|||
RepositoryAuthentication: false,
|
|||
RepositoryUsername: '',
|
|||
RepositoryPassword: '',
|
|||
Env: [],
|
|||
|
ComposeFilePathInRepository: '',
|
||
Groups: [],
|
|||
|
DeploymentType: 0,
|
||
};
|
|||
|
|||
this.state = {
|
|||
Method: 'editor',
|
|||
formValidationError: '',
|
|||
actionInProgress: false,
|
|||
StackType: null,
|
|||
isEditorDirty: false,
|
|||
|
hasKubeEndpoint: false,
|
||
endpointTypes: [],
|
|||
};
|
|||
|
|||
this.edgeGroups = null;
|
|||
|
|||
this.createStack = this.createStack.bind(this);
|
|||
this.validateForm = this.validateForm.bind(this);
|
|||
this.createStackByMethod = this.createStackByMethod.bind(this);
|
|||
this.createStackFromFileContent = this.createStackFromFileContent.bind(this);
|
|||
this.createStackFromFileUpload = this.createStackFromFileUpload.bind(this);
|
|||
this.createStackFromGitRepository = this.createStackFromGitRepository.bind(this);
|
|||
|
this.onChangeGroups = this.onChangeGroups.bind(this);
|
||
this.hasDockerEndpoint = this.hasDockerEndpoint.bind(this);
|
|||
this.onChangeDeploymentType = this.onChangeDeploymentType.bind(this);
|
|||
}
|
|||
|
|||
|
buildAnalyticsProperties() {
|
||
const format = 'compose';
|
|||
const metadata = { type: methodLabel(this.state.Method), format };
|
|||
|
|||
if (metadata.type === 'template') {
|
|||
metadata.templateName = this.selectedTemplate.title;
|
|||
}
|
|||
|
|||
return { metadata };
|
|||
|
|||
function methodLabel(method) {
|
|||
switch (method) {
|
|||
case 'editor':
|
|||
return 'web-editor';
|
|||
case 'repository':
|
|||
return 'git';
|
|||
case 'upload':
|
|||
return 'file-upload';
|
|||
case 'template':
|
|||
return 'template';
|
|||
}
|
|||
}
|
|||
}
|
|||
|
|||
|
uiCanExit() {
|
||
if (this.state.Method === 'editor' && this.formValues.StackFileContent && this.state.isEditorDirty) {
|
|||
return this.ModalService.confirmWebEditorDiscard();
|
|||
}
|
|||
}
|
|||
|
|||
async $onInit() {
|
|||
try {
|
|||
this.edgeGroups = await this.EdgeGroupService.groups();
|
|||
this.noGroups = this.edgeGroups.length === 0;
|
|||
} catch (err) {
|
|||
this.Notifications.error('Failure', err, 'Unable to retrieve Edge groups');
|
|||
}
|
|||
|
|||
this.$window.onbeforeunload = () => {
|
|||
if (this.state.Method === 'editor' && this.formValues.StackFileContent && this.state.isEditorDirty) {
|
|||
return '';
|
|||
}
|
|||
};
|
|||
}
|
|||
|
|||
$onDestroy() {
|
|||
this.state.isEditorDirty = false;
|
|||
}
|
|||
|
|||
createStack() {
|
|||
|
return this.$async(async () => {
|
||
const name = this.formValues.Name;
|
|||
let method = this.state.Method;
|
|||
|
|||
|
if (method === 'template') {
|
||
method = 'editor';
|
|||
}
|
|||
|
|||
|
if (!this.validateForm(method)) {
|
||
return;
|
|||
}
|
|||
|
|||
|
this.state.actionInProgress = true;
|
||
try {
|
|||
await this.createStackByMethod(name, method);
|
|||
|
|||
this.Notifications.success('Stack successfully deployed');
|
|||
this.state.isEditorDirty = false;
|
|||
this.$state.go('edge.stacks');
|
|||
} catch (err) {
|
|||
this.Notifications.error('Deployment error', err, 'Unable to deploy stack');
|
|||
} finally {
|
|||
this.state.actionInProgress = false;
|
|||
}
|
|||
});
|
|||
}
|
|||
|
|||
|
onChangeGroups(groups) {
|
||
this.formValues.Groups = groups;
|
|||
|
|||
|
this.checkIfEndpointTypes(groups);
|
||
}
|
|||
|
|||
|
checkIfEndpointTypes(groups) {
|
||
const edgeGroups = groups.map((id) => this.edgeGroups.find((e) => e.Id === id));
|
|||
this.state.endpointTypes = edgeGroups.flatMap((group) => group.EndpointTypes);
|
|||
|
|||
if (this.hasDockerEndpoint() && this.formValues.DeploymentType == 1) {
|
|||
this.onChangeDeploymentType(0);
|
|||
}
|
|||
|
}
|
||
|
|||
|
hasKubeEndpoint() {
|
||
return this.state.endpointTypes.includes(7);
|
|||
}
|
|||
|
|||
|
hasDockerEndpoint() {
|
||
return this.state.endpointTypes.includes(4);
|
|||
}
|
|||
|
|||
validateForm(method) {
|
|||
this.state.formValidationError = '';
|
|||
|
|||
if (method === 'editor' && this.formValues.StackFileContent === '') {
|
|||
this.state.formValidationError = 'Stack file content must not be empty';
|
|||
return;
|
|||
}
|
|||
|
|||
return true;
|
|||
}
|
|||
|
|||
createStackByMethod(name, method) {
|
|||
switch (method) {
|
|||
case 'editor':
|
|||
return this.createStackFromFileContent(name);
|
|||
case 'upload':
|
|||
return this.createStackFromFileUpload(name);
|
|||
case 'repository':
|
|||
return this.createStackFromGitRepository(name);
|
|||
}
|
|||
}
|
|||
|
|||
createStackFromFileContent(name) {
|
|||
|
const { StackFileContent, Groups, DeploymentType } = this.formValues;
|
||
|
|||
return this.EdgeStackService.createStackFromFileContent({
|
|||
name,
|
|||
StackFileContent,
|
|||
EdgeGroups: Groups,
|
|||
DeploymentType,
|
|||
});
|
|||
}
|
|||
|
|||
createStackFromFileUpload(name) {
|
|||
|
const { StackFile, Groups, DeploymentType } = this.formValues;
|
||
return this.EdgeStackService.createStackFromFileUpload(
|
|||
{
|
|||
Name: name,
|
|||
EdgeGroups: Groups,
|
|||
DeploymentType,
|
|||
},
|
|||
StackFile
|
|||
);
|
|||
}
|
|||
|
|||
createStackFromGitRepository(name) {
|
|||
|
const { Groups, DeploymentType } = this.formValues;
|
||
const repositoryOptions = {
|
|||
RepositoryURL: this.formValues.RepositoryURL,
|
|||
RepositoryReferenceName: this.formValues.RepositoryReferenceName,
|
|||
|
FilePathInRepository: this.formValues.ComposeFilePathInRepository,
|
||
RepositoryAuthentication: this.formValues.RepositoryAuthentication,
|
|||
RepositoryUsername: this.formValues.RepositoryUsername,
|
|||
RepositoryPassword: this.formValues.RepositoryPassword,
|
|||
};
|
|||
|
return this.EdgeStackService.createStackFromGitRepository(
|
||
{
|
|||
name,
|
|||
EdgeGroups: Groups,
|
|||
DeploymentType,
|
|||
},
|
|||
repositoryOptions
|
|||
);
|
|||
}
|
|||
|
|||
onChangeDeploymentType(deploymentType) {
|
|||
this.formValues.DeploymentType = deploymentType;
|
|||
this.state.Method = 'editor';
|
|||
this.formValues.StackFileContent = '';
|
|||
}
|
|||
|
|||
|
formIsInvalid() {
|
||
return this.form.$invalid || !this.formValues.Groups.length || (['template', 'editor'].includes(this.state.Method) && !this.formValues.StackFileContent);
|
|||
}
|
|||
}
|