1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-31 03:09:44 +02:00

feat(networks): Support multiple excluded IPs for MACVLAN networks (#3962)

* feat(networks): Support multiple excluded IPs for MACVLAN networks

* feat(networks): add a generated name

* feat(networks): prevent create macvlan network where exclude ip is the same as gateway

* feat(networks): remove auxaddresses validation on submit

* feat(networks): check exclude ip validation on change

* feat(networks): check form validation on change

* feat(networks): clean checkAuxiliaryAddress function
This commit is contained in:
Maxime Bajeux 2020-07-08 03:35:52 +02:00 committed by GitHub
parent 08095913a6
commit c778ef6404
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 112 additions and 13 deletions

View file

@ -21,13 +21,13 @@ angular.module('portainer.docker').controller('CreateNetworkController', [
Subnet: '',
Gateway: '',
IPRange: '',
AuxAddress: '',
AuxiliaryAddresses: [],
},
IPV6: {
Subnet: '',
Gateway: '',
IPRange: '',
AuxAddress: '',
AuxiliaryAddresses: [],
},
Labels: [],
AccessControlData: new AccessControlFormData(),
@ -79,6 +79,59 @@ angular.module('portainer.docker').controller('CreateNetworkController', [
$scope.formValues.Labels.splice(index, 1);
};
$scope.addIPV4AuxAddress = function () {
$scope.formValues.IPV4.AuxiliaryAddresses.push('');
};
$scope.addIPV6AuxAddress = function () {
$scope.formValues.IPV6.AuxiliaryAddresses.push('');
};
$scope.removeIPV4AuxAddress = function (index) {
$scope.formValues.IPV4.AuxiliaryAddresses.splice(index, 1);
$scope.state.IPV4AuxiliaryAddressesError.splice(index, 1);
};
$scope.removeIPV6AuxAddress = function (index) {
$scope.formValues.IPV6.AuxiliaryAddresses.splice(index, 1);
$scope.state.IPV6AuxiliaryAddressesError.splice(index, 1);
};
function checkAuxiliaryAddress(excludedIP, gateway) {
const split = _.split(excludedIP, '=');
if (split.length === 2) {
return split[1] === gateway;
}
return excludedIP === gateway;
}
$scope.checkIPV4AuxiliaryAddress = function (index) {
$scope.state.IPV4AuxiliaryAddressesError[index] = checkAuxiliaryAddress($scope.formValues.IPV4.AuxiliaryAddresses[index], $scope.formValues.IPV4.Gateway);
};
$scope.checkIPV6AuxiliaryAddress = function (index) {
$scope.state.IPV6AuxiliaryAddressesError[index] = checkAuxiliaryAddress($scope.formValues.IPV6.AuxiliaryAddresses[index], $scope.formValues.IPV6.Gateway);
};
$scope.isValid = function () {
const validIPV4 = !_.reduce($scope.state.IPV4AuxiliaryAddressesError, (acc, item) => acc || item, false);
const validIPV6 = !_.reduce($scope.state.IPV6AuxiliaryAddressesError, (acc, item) => acc || item, false);
return validIPV4 && validIPV6;
};
function prepareAuxiliaryAddresses(ipamConfig, ipFormValues) {
ipamConfig.AuxiliaryAddresses = {};
_.forEach(ipFormValues.AuxiliaryAddresses, (auxAddress, index) => {
const split = _.split(auxAddress, '=');
if (split.length === 2) {
ipamConfig.AuxiliaryAddresses[split[0]] = split[1];
} else {
ipamConfig.AuxiliaryAddresses['device' + index] = auxAddress;
}
});
}
function prepareIPAMConfiguration(config) {
if ($scope.formValues.IPV4.Subnet) {
let ipamConfig = {};
@ -89,8 +142,8 @@ angular.module('portainer.docker').controller('CreateNetworkController', [
if ($scope.formValues.IPV4.IPRange) {
ipamConfig.IPRange = $scope.formValues.IPV4.IPRange;
}
if ($scope.formValues.IPV4.AuxAddress) {
ipamConfig.AuxAddress = $scope.formValues.IPV4.AuxAddress;
if ($scope.formValues.IPV4.AuxiliaryAddresses.length) {
prepareAuxiliaryAddresses(ipamConfig, $scope.formValues.IPV4);
}
config.IPAM.Config.push(ipamConfig);
}
@ -103,8 +156,8 @@ angular.module('portainer.docker').controller('CreateNetworkController', [
if ($scope.formValues.IPV6.IPRange) {
ipamConfig.IPRange = $scope.formValues.IPV6.IPRange;
}
if ($scope.formValues.IPV6.AuxAddress) {
ipamConfig.AuxAddress = $scope.formValues.IPV6.AuxAddress;
if ($scope.formValues.IPV6.AuxiliaryAddresses.length) {
prepareAuxiliaryAddresses(ipamConfig, $scope.formValues.IPV6);
}
config.EnableIPv6 = true;
config.IPAM.Config.push(ipamConfig);
@ -245,6 +298,8 @@ angular.module('portainer.docker').controller('CreateNetworkController', [
function initView() {
var apiVersion = $scope.applicationState.endpoint.apiVersion;
$scope.state.IPV4AuxiliaryAddressesError = [];
$scope.state.IPV6AuxiliaryAddressesError = [];
PluginService.networkPlugins(apiVersion < 1.25)
.then(function success(data) {