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: [

Reply via email to