This is an automated email from the ASF dual-hosted git repository.
borisstoyanov pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.20 by this push:
new 223351c7a59 Add VR's system offering to network listing (#12862)
223351c7a59 is described below
commit 223351c7a59ec9509b25a6122340abcb8cbbd451
Author: Erik Böck <[email protected]>
AuthorDate: Tue Sep 8 10:30:44 2026 -0300
Add VR's system offering to network listing (#12862)
* Add VR system offering to network offerings listing
* Change method to display order column as the last one
* Remove VR's service offering id and name from non-admin users
* Removal of domain column and addition of Egress default policy column
* Revert domain removal
---
.../main/java/org/apache/cloudstack/api/ApiConstants.java | 1 +
.../cloudstack/api/response/NetworkOfferingResponse.java | 12 ++++++++++++
server/src/main/java/com/cloud/api/ApiResponseHelper.java | 3 ++-
ui/public/locales/en.json | 1 +
ui/public/locales/pt_BR.json | 1 +
ui/src/components/view/ListView.vue | 6 +++++-
ui/src/config/section/offering.js | 8 +++++++-
7 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index daf1bdc705d..1267f25692f 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -451,6 +451,7 @@ public class ApiConstants {
public static final String SERIAL = "serial";
public static final String SERVICE_IP = "serviceip";
public static final String SERVICE_OFFERING_ID = "serviceofferingid";
+ public static final String SERVICE_OFFERING_NAME = "serviceofferingname";
public static final String SESSIONKEY = "sessionkey";
public static final String SHOW_CAPACITIES = "showcapacities";
public static final String SHOW_REMOVED = "showremoved";
diff --git
a/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
b/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
index 87f96059028..740dd23604a 100644
---
a/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
+++
b/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
@@ -91,6 +91,10 @@ public class NetworkOfferingResponse extends
BaseResponseWithAnnotations {
@Param(description = "The ID of the service offering used by virtual
router provider")
private String serviceOfferingId;
+ @SerializedName(ApiConstants.SERVICE_OFFERING_NAME)
+ @Param(description = "the name of the service offering used by virtual
router provider")
+ private String serviceOfferingName;
+
@SerializedName(ApiConstants.SERVICE)
@Param(description = "The list of supported services", responseObject =
ServiceResponse.class)
private List<ServiceResponse> services;
@@ -330,4 +334,12 @@ public class NetworkOfferingResponse extends
BaseResponseWithAnnotations {
public void setRoutingMode(String routingMode) {
this.routingMode = routingMode;
}
+
+ public String getServiceOfferingName() {
+ return serviceOfferingName;
+ }
+
+ public void setServiceOfferingName(String serviceOfferingName) {
+ this.serviceOfferingName = serviceOfferingName;
+ }
}
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index 2b7ed1b1100..55e46803d04 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -2336,8 +2336,9 @@ public class ApiResponseHelper implements
ResponseGenerator {
}
if (so != null) {
ServiceOffering soffering = ApiDBUtils.findServiceOfferingById(so);
- if (soffering != null) {
+ if (soffering != null &&
_accountMgr.isRootAdmin(CallContext.current().getCallingAccountId())) {
response.setServiceOfferingId(soffering.getUuid());
+ response.setServiceOfferingName(soffering.getName());
}
}
Map<Service, Set<Provider>> serviceProviderMap =
ApiDBUtils.listNetworkOfferingServices(offering.getId());
diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
index 99178b64cb6..cebfb710ed5 100644
--- a/ui/public/locales/en.json
+++ b/ui/public/locales/en.json
@@ -2487,6 +2487,7 @@
"label.virtual.network": "Virtual Network",
"label.virtual.networking": "Virtual Networking",
"label.virtual.routers": "Virtual Routers",
+"label.virtual.routers.system.offering": "VR system offering",
"label.virtualmachineid": "Instance ID",
"label.virtualmachinename": "Instance name",
"label.virtualsize": "Virtual Size",
diff --git a/ui/public/locales/pt_BR.json b/ui/public/locales/pt_BR.json
index b29afb8d408..88de3761ca8 100644
--- a/ui/public/locales/pt_BR.json
+++ b/ui/public/locales/pt_BR.json
@@ -1729,6 +1729,7 @@
"label.virtual.network": "Rede virtual",
"label.virtual.networking": "Rede virtual",
"label.virtual.routers": "Roteadores virtuais",
+ "label.virtual.routers.system.offering": "Oferta de sistema do roteador
virtual",
"label.virtualmachineid": "ID da VM",
"label.virtualmachinename": "Nome da VM",
"label.virtualsize": "Tamanho virtual",
diff --git a/ui/src/components/view/ListView.vue
b/ui/src/components/view/ListView.vue
index a02fb5569ed..002411db87b 100644
--- a/ui/src/components/view/ListView.vue
+++ b/ui/src/components/view/ListView.vue
@@ -208,7 +208,8 @@
<router-link :to="{ path: '/physicalnetwork/' +
record.physicalnetworkid }">{{ text }}</router-link>
</template>
<template v-if="column.key === 'serviceofferingname'">
- <router-link :to="{ path: '/computeoffering/' +
record.serviceofferingid }">{{ text }}</router-link>
+ <router-link v-if="$route.path === '/networkoffering'" :to="{ path:
'/systemoffering/' + record.serviceofferingid, query:{issystem:'true'} }">{{
text }}</router-link>
+ <router-link v-else :to="{ path: '/computeoffering/' +
record.serviceofferingid }">{{ text }}</router-link>
</template>
<template v-if="column.key === 'hypervisor'">
<span v-if="$route.name === 'hypervisorcapability'">
@@ -426,6 +427,9 @@
<status :text="record.enabled ? record.enabled.toString() : 'false'" />
{{ record.enabled ? 'Enabled' : 'Disabled' }}
</template>
+ <template v-if="column.key === 'egressdefaultpolicy'">
+ <span> {{ record.egressdefaultpolicy ? 'Allow' : 'Deny' }} </span>
+ </template>
<template v-if="['created', 'sent', 'removed', 'effectiveDate',
'endDate', 'allocated'].includes(column.key) ||
(['startdate'].includes(column.key) &&
['webhook'].includes($route.path.split('/')[1])) || (column.key === 'allocated'
&& ['asnumbers', 'publicip', 'ipv4subnets'].includes($route.meta.name) &&
text)">
{{ text && $toLocaleDate(text) }}
</template>
diff --git a/ui/src/config/section/offering.js
b/ui/src/config/section/offering.js
index d958522b333..62e3fe4d346 100644
--- a/ui/src/config/section/offering.js
+++ b/ui/src/config/section/offering.js
@@ -389,7 +389,13 @@ export default {
docHelp: 'adminguide/networking.html#network-offerings',
permission: ['listNetworkOfferings'],
searchFilters: ['name', 'zoneid', 'domainid', 'tags'],
- columns: ['name', 'state', 'guestiptype', 'traffictype', 'networkrate',
'domain', 'zone', 'order'],
+ columns: () => {
+ const fields = ['name', 'state', 'guestiptype', 'traffictype',
'networkrate', 'domain', 'zone', 'egressdefaultpolicy', 'order']
+ if (store.getters.userInfo.roletype === 'Admin') {
+ fields.splice(fields.length - 1, 0, { field: 'serviceofferingname',
customTitle: 'virtual.routers.system.offering' })
+ }
+ return fields
+ },
details: ['name', 'id', 'displaytext', 'guestiptype', 'traffictype',
'internetprotocol', 'networkrate', 'ispersistent', 'egressdefaultpolicy',
'availability', 'conservemode', 'specifyvlan', 'routingmode',
'specifyasnumber', 'specifyipranges', 'supportspublicaccess',
'supportsstrechedl2subnet', 'forvpc', 'fornsx', 'networkmode', 'service',
'tags', 'domain', 'zone'],
resourceType: 'NetworkOffering',
tabs: [