2020-06-09 02:43:32 +00:00
|
|
|
import { ContainerGroupDefaultModel } from '../../../models/container_group';
|
|
|
|
|
|
|
|
angular.module('portainer.azure').controller('AzureCreateContainerInstanceController', [
|
|
|
|
'$q',
|
|
|
|
'$scope',
|
|
|
|
'$state',
|
|
|
|
'AzureService',
|
|
|
|
'Notifications',
|
2021-03-29 21:58:56 +00:00
|
|
|
'Authentication',
|
|
|
|
'ResourceControlService',
|
2021-06-17 23:30:18 +00:00
|
|
|
'FormValidator',
|
|
|
|
function ($q, $scope, $state, AzureService, Notifications, Authentication, ResourceControlService, FormValidator) {
|
2020-06-09 02:43:32 +00:00
|
|
|
var allResourceGroups = [];
|
|
|
|
var allProviders = [];
|
|
|
|
|
|
|
|
$scope.state = {
|
|
|
|
actionInProgress: false,
|
|
|
|
selectedSubscription: null,
|
|
|
|
selectedResourceGroup: null,
|
2020-08-25 07:45:06 +00:00
|
|
|
formValidationError: '',
|
2020-06-09 02:43:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
$scope.changeSubscription = function () {
|
|
|
|
var selectedSubscription = $scope.state.selectedSubscription;
|
|
|
|
updateResourceGroupsAndLocations(selectedSubscription, allResourceGroups, allProviders);
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.addPortBinding = function () {
|
|
|
|
$scope.model.Ports.push({ host: '', container: '', protocol: 'TCP' });
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.removePortBinding = function (index) {
|
|
|
|
$scope.model.Ports.splice(index, 1);
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.create = function () {
|
|
|
|
var model = $scope.model;
|
|
|
|
var subscriptionId = $scope.state.selectedSubscription.Id;
|
|
|
|
var resourceGroupName = $scope.state.selectedResourceGroup.Name;
|
|
|
|
|
2020-08-25 07:45:06 +00:00
|
|
|
$scope.state.formValidationError = validateForm(model);
|
|
|
|
if ($scope.state.formValidationError) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-06-09 02:43:32 +00:00
|
|
|
$scope.state.actionInProgress = true;
|
|
|
|
AzureService.createContainerGroup(model, subscriptionId, resourceGroupName)
|
2021-03-29 21:58:56 +00:00
|
|
|
.then(applyResourceControl)
|
|
|
|
.then(() => {
|
2020-06-09 02:43:32 +00:00
|
|
|
Notifications.success('Container successfully created', model.Name);
|
|
|
|
$state.go('azure.containerinstances');
|
|
|
|
})
|
|
|
|
.catch(function error(err) {
|
|
|
|
Notifications.error('Failure', err, 'Unable to create container');
|
|
|
|
})
|
|
|
|
.finally(function final() {
|
|
|
|
$scope.state.actionInProgress = false;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2021-03-29 21:58:56 +00:00
|
|
|
function applyResourceControl(newResourceGroup) {
|
|
|
|
const userId = Authentication.getUserDetails().ID;
|
|
|
|
const resourceControl = newResourceGroup.Portainer.ResourceControl;
|
|
|
|
const accessControlData = $scope.model.AccessControlData;
|
|
|
|
|
|
|
|
return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);
|
|
|
|
}
|
|
|
|
|
2020-08-25 07:45:06 +00:00
|
|
|
function validateForm(model) {
|
|
|
|
if (!model.Ports || !model.Ports.length || model.Ports.every((port) => !port.host || !port.container)) {
|
|
|
|
return 'At least one port binding is required';
|
|
|
|
}
|
|
|
|
|
2021-06-17 23:30:18 +00:00
|
|
|
const error = FormValidator.validateAccessControl(model.AccessControlData, Authentication.isAdmin());
|
|
|
|
if (error !== '') {
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
2020-08-25 07:45:06 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-06-09 02:43:32 +00:00
|
|
|
function updateResourceGroupsAndLocations(subscription, resourceGroups, providers) {
|
|
|
|
$scope.state.selectedResourceGroup = resourceGroups[subscription.Id][0];
|
|
|
|
$scope.resourceGroups = resourceGroups[subscription.Id];
|
|
|
|
|
|
|
|
var currentSubLocations = providers[subscription.Id].Locations;
|
|
|
|
$scope.model.Location = currentSubLocations[0];
|
|
|
|
$scope.locations = currentSubLocations;
|
|
|
|
}
|
|
|
|
|
|
|
|
function initView() {
|
2021-03-29 21:58:56 +00:00
|
|
|
$scope.model = new ContainerGroupDefaultModel();
|
2020-06-09 02:43:32 +00:00
|
|
|
|
|
|
|
AzureService.subscriptions()
|
|
|
|
.then(function success(data) {
|
|
|
|
var subscriptions = data;
|
|
|
|
$scope.state.selectedSubscription = subscriptions[0];
|
|
|
|
$scope.subscriptions = subscriptions;
|
|
|
|
|
|
|
|
return $q.all({
|
|
|
|
resourceGroups: AzureService.resourceGroups(subscriptions),
|
|
|
|
containerInstancesProviders: AzureService.containerInstanceProvider(subscriptions),
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.then(function success(data) {
|
|
|
|
var resourceGroups = data.resourceGroups;
|
|
|
|
allResourceGroups = resourceGroups;
|
|
|
|
|
|
|
|
var containerInstancesProviders = data.containerInstancesProviders;
|
|
|
|
allProviders = containerInstancesProviders;
|
|
|
|
|
|
|
|
var selectedSubscription = $scope.state.selectedSubscription;
|
|
|
|
updateResourceGroupsAndLocations(selectedSubscription, resourceGroups, containerInstancesProviders);
|
|
|
|
})
|
|
|
|
.catch(function error(err) {
|
|
|
|
Notifications.error('Failure', err, 'Unable to retrieve Azure resources');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
initView();
|
|
|
|
},
|
|
|
|
]);
|