diff --git a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java index 1049740bf55a..24f76215d097 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java @@ -187,6 +187,10 @@ public class NetworkResponse extends BaseResponseWithAssociatedNetwork implement @Param(description = "true network requires restart") private Boolean restartRequired; + @SerializedName(ApiConstants.SPECIFY_VLAN) + @Param(description = "true if network supports specifying vlan, false otherwise") + private Boolean specifyVlan; + @SerializedName(ApiConstants.SPECIFY_IP_RANGES) @Param(description = "true if network supports specifying ip ranges, false otherwise") private Boolean specifyIpRanges; @@ -487,6 +491,10 @@ public void setRestartRequired(Boolean restartRequired) { this.restartRequired = restartRequired; } + public void setSpecifyVlan(Boolean specifyVlan) { + this.specifyVlan = specifyVlan; + } + public void setSpecifyIpRanges(Boolean specifyIpRanges) { this.specifyIpRanges = specifyIpRanges; } diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index 68761f6eed5d..ed7a51d215cc 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -2504,6 +2504,7 @@ public NetworkResponse createNetworkResponse(ResponseView view, Network network) response.setIsSystem(networkOffering.isSystemOnly()); response.setNetworkOfferingAvailability(networkOffering.getAvailability().toString()); response.setIsPersistent(networkOffering.isPersistent()); + response.setSpecifyVlan(networkOffering.isSpecifyVlan()); if (Network.GuestType.Isolated.equals(network.getGuestType()) && network.getVpcId() == null) { response.setEgressDefaultPolicy(networkOffering.isEgressDefaultPolicy()); } diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js index 72eb17e0ae97..1ae0f72df2b2 100644 --- a/ui/src/config/section/network.js +++ b/ui/src/config/section/network.js @@ -141,7 +141,8 @@ export default { label: 'label.update.network', dataView: true, disabled: (record, user) => { - return !record.projectid && (record.account !== user.userInfo.account && !['Admin', 'DomainAdmin'].includes(user.userInfo.roletype)) + return (!record.projectid && (record.account !== user.userInfo.account && !['Admin', 'DomainAdmin'].includes(user.userInfo.roletype))) || + (record.type === 'Shared' && record.specifyvlan && !['Admin'].includes(user.userInfo.roletype)) }, popup: true, component: shallowRef(defineAsyncComponent(() => import('@/views/network/UpdateNetwork.vue'))) @@ -153,7 +154,8 @@ export default { message: 'message.restart.network', dataView: true, disabled: (record, user) => { - return !record.projectid && (record.account !== user.userInfo.account && !['Admin', 'DomainAdmin'].includes(user.userInfo.roletype)) + return (!record.projectid && (record.account !== user.userInfo.account && !['Admin', 'DomainAdmin'].includes(user.userInfo.roletype))) || + (record.type === 'Shared' && record.specifyvlan && !['Admin'].includes(user.userInfo.roletype)) }, args: (record, store, isGroupAction) => { var fields = [] @@ -194,7 +196,8 @@ export default { message: 'message.action.delete.network', dataView: true, disabled: (record, user) => { - return !record.projectid && (record.account !== user.userInfo.account && !['Admin', 'DomainAdmin'].includes(user.userInfo.roletype)) + return (!record.projectid && (record.account !== user.userInfo.account && !['Admin', 'DomainAdmin'].includes(user.userInfo.roletype))) || + (record.type === 'Shared' && record.specifyvlan && !['Admin'].includes(user.userInfo.roletype)) }, groupAction: true, popup: true,