Enable defining a network as redundant during restart through the UI (#7405)
Co-authored-by: Gabriel <gabriel.fernandes@scclouds.com.br>
Co-authored-by: Suresh Kumar Anaparti <sureshkumar.anaparti@gmail.com>
diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
index dea8a7e..b959cc4 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -280,6 +280,9 @@
private static final ConfigKey<Boolean> AllowEmptyStartEndIpAddress = new ConfigKey<>("Advanced", Boolean.class,
"allow.empty.start.end.ipaddress", "true", "Allow creating network without mentioning start and end IP address",
true, ConfigKey.Scope.Account);
+ public static final ConfigKey<Boolean> AllowUsersToMakeNetworksRedundant = new ConfigKey<>("Advanced", Boolean.class,
+ "allow.users.to.make.networks.redundant", "true", "Allow Users to make Networks Redundant",
+ true, ConfigKey.Scope.Global);
private static final long MIN_VLAN_ID = 0L;
private static final long MAX_VLAN_ID = 4095L; // 2^12 - 1
private static final long MIN_GRE_KEY = 0L;
@@ -2998,8 +3001,12 @@
throwInvalidIdException("Cannot restart a VPC tier with cleanup, please restart the whole VPC.", network.getUuid(), "network tier");
}
boolean makeRedundant = cmd.getMakeRedundant();
- boolean livePatch = cmd.getLivePatch();
User callerUser = _accountMgr.getActiveUser(CallContext.current().getCallingUserId());
+ if (makeRedundant && !_accountMgr.isRootAdmin(callerUser.getAccountId()) && !AllowUsersToMakeNetworksRedundant.value() ) {
+ throw new InvalidParameterValueException("Could not make the network redundant. Please contact administrator.");
+ }
+
+ boolean livePatch = cmd.getLivePatch();
return restartNetwork(network, cleanup, makeRedundant, livePatch, callerUser);
}
@@ -6278,7 +6285,7 @@
@Override
public ConfigKey<?>[] getConfigKeys() {
- return new ConfigKey<?>[] {AllowDuplicateNetworkName, AllowEmptyStartEndIpAddress, VRPrivateInterfaceMtu, VRPublicInterfaceMtu, AllowUsersToSpecifyVRMtu};
+ return new ConfigKey<?>[] {AllowDuplicateNetworkName, AllowEmptyStartEndIpAddress, AllowUsersToMakeNetworksRedundant, VRPrivateInterfaceMtu, VRPublicInterfaceMtu, AllowUsersToSpecifyVRMtu};
}
public boolean isDefaultAcl(Long aclId) {
diff --git a/ui/public/config.json b/ui/public/config.json
index a067803..3d50f98 100644
--- a/ui/public/config.json
+++ b/ui/public/config.json
@@ -96,6 +96,7 @@
]
},
"plugins": [],
+ "allowMakingRouterRedundant": false,
"apidocs": true,
"basicZoneEnabled": true,
"multipleServer": false,
diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js
index 33b39d2..37cdd0c 100644
--- a/ui/src/config/section/network.js
+++ b/ui/src/config/section/network.js
@@ -20,6 +20,7 @@
import tungsten from '@/assets/icons/tungsten.svg?inline'
import { isAdmin } from '@/role'
import { isZoneCreated } from '@/utils/zone'
+import { vueProps } from '@/vue-app'
export default {
name: 'network',
@@ -171,13 +172,16 @@
if (isGroupAction || record.vpcid == null) {
fields.push('cleanup')
}
+ if (!record.redundantrouter && vueProps.$config.allowMakingRouterRedundant) {
+ fields.push('makeredundant')
+ }
fields.push('livepatch')
return fields
},
show: (record) => record.type !== 'L2',
groupAction: true,
popup: true,
- groupMap: (selection, values) => { return selection.map(x => { return { id: x, cleanup: values.cleanup } }) }
+ groupMap: (selection, values) => { return selection.map(x => { return { id: x, cleanup: values.cleanup, makeredundant: values.makeredundant } }) }
},
{
api: 'replaceNetworkACLList',