You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by pe...@apache.org on 2025/02/24 22:37:08 UTC

(cloudstack) 45/46: Enable Autoscaling on Netris for CPU and memory (#51)

This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a commit to branch netris-integration-upstream
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 37e25427c0197693023a5f0f7a9d43cabdf4723a
Author: Nicolas Vazquez <ni...@gmail.com>
AuthorDate: Thu Feb 13 12:14:30 2025 -0300

    Enable Autoscaling on Netris for CPU and memory (#51)
    
    * Enable Autoscaling on Netris for CPU and memory
    
    * Fix monitor autoscale group and cleanup
    
    * Rename autoscaling group method
    
    * Integrate Autoscaling by allowing to update LB rules
    
    * Refactor according to the SDK changes
---
 .../com/cloud/network/netris/NetrisService.java    |  2 +-
 .../resources/META-INF/db/schema-41910to42000.sql  |  4 +++
 .../apache/cloudstack/resource/NetrisResource.java |  2 +-
 .../apache/cloudstack/service/NetrisApiClient.java |  2 +-
 .../cloudstack/service/NetrisApiClientImpl.java    | 41 +++++++++++++---------
 .../apache/cloudstack/service/NetrisElement.java   | 18 +++++++++-
 .../cloudstack/service/NetrisServiceImpl.java      |  2 +-
 .../com/cloud/network/as/AutoScaleManagerImpl.java | 14 ++++----
 .../network/lb/LoadBalancingRulesManagerImpl.java  |  1 +
 .../com/cloud/server/ConfigurationServerImpl.java  | 31 ++++++++--------
 .../cloud/network/as/AutoScaleManagerImplTest.java | 16 ++++-----
 .../cloudstack/service/NetrisServiceMockTest.java  |  2 +-
 12 files changed, 84 insertions(+), 51 deletions(-)

diff --git a/api/src/main/java/com/cloud/network/netris/NetrisService.java b/api/src/main/java/com/cloud/network/netris/NetrisService.java
index d386d4f8d58..43f94e0c6b7 100644
--- a/api/src/main/java/com/cloud/network/netris/NetrisService.java
+++ b/api/src/main/java/com/cloud/network/netris/NetrisService.java
@@ -55,6 +55,6 @@ public interface NetrisService {
 
     boolean releaseNatIp(long zoneId, String publicIp);
 
-    boolean createLbRule(NetrisNetworkRule rule);
+    boolean createOrUpdateLbRule(NetrisNetworkRule rule);
     boolean deleteLbRule(NetrisNetworkRule rule);
 }
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql b/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
index 739c5644859..be98ec33d33 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
@@ -459,3 +459,7 @@ CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.static_routes', 'next_hop', 'varchar
 
 -- Add `for_router` to `user_ip_address` table
 CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.user_ip_address', 'for_router', 'tinyint(1) DEFAULT 0 COMMENT "True if the ip address is used by Domain Router to expose services"');
+
+-- Add Netris Autoscaling rules
+INSERT IGNORE INTO `cloud`.`counter` (uuid, provider, source, name, value, created) VALUES (UUID(), 'Netris', 'cpu', 'VM CPU - average percentage', 'vm.cpu.average.percentage', NOW());
+INSERT IGNORE INTO `cloud`.`counter` (uuid, provider, source, name, value, created) VALUES (UUID(), 'Netris', 'memory', 'VM Memory - average percentage', 'vm.memory.average.percentage', NOW());
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java
index 5d4777d610c..2a02b5de1b4 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java
@@ -359,7 +359,7 @@ public class NetrisResource implements ServerResource {
     }
 
     private Answer executeRequest(CreateOrUpdateNetrisLoadBalancerRuleCommand cmd) {
-        boolean result = netrisApiClient.createLbRule(cmd);
+        boolean result = netrisApiClient.createOrUpdateLbRule(cmd);
         if (!result) {
             return new NetrisAnswer(cmd, false, String.format("Failed to create Netris LB rule for %s: %s, " +
                     "for private port: %s and public port: %s", getNetworkType(cmd.isVpc()), cmd.getName(), cmd.getPrivatePort(), cmd.getPublicPort(), cmd.getPublicPort()));
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java
index 91351bf21f7..5957805d22d 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java
@@ -86,6 +86,6 @@ public interface NetrisApiClient {
     boolean addOrUpdateStaticRoute(AddOrUpdateNetrisStaticRouteCommand cmd);
     boolean deleteStaticRoute(DeleteNetrisStaticRouteCommand cmd);
     boolean releaseNatIp(ReleaseNatIpCommand cmd);
-    boolean createLbRule(CreateOrUpdateNetrisLoadBalancerRuleCommand cmd);
+    boolean createOrUpdateLbRule(CreateOrUpdateNetrisLoadBalancerRuleCommand cmd);
     boolean deleteLbRule(DeleteNetrisLoadBalancerRuleCommand cmd);
 }
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
index e49c7c5882a..0136a96cb79 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
@@ -56,11 +56,13 @@ import io.netris.model.IpTreeAllocationTenant;
 import io.netris.model.IpTreeSubnet;
 import io.netris.model.IpTreeSubnetSites;
 import io.netris.model.L4LBSite;
+import io.netris.model.L4LbAddItem;
+import io.netris.model.L4LbEditItem;
 import io.netris.model.L4LbTenant;
 import io.netris.model.L4LbVpc;
 import io.netris.model.L4LoadBalancerBackendItem;
 import io.netris.model.L4LoadBalancerItem;
-import io.netris.model.L4lbAddItem;
+import io.netris.model.L4lbAddOrUpdateItem;
 import io.netris.model.L4lbresBody;
 import io.netris.model.NatBodySiteSite;
 import io.netris.model.NatBodyVpcVpc;
@@ -97,6 +99,7 @@ import io.netris.model.VnetResDeleteBody;
 import io.netris.model.VnetResListBody;
 import io.netris.model.VnetsBody;
 import io.netris.model.response.AuthResponse;
+import io.netris.model.response.L4LbEditResponse;
 import io.netris.model.response.TenantResponse;
 import io.netris.model.response.TenantsResponse;
 import org.apache.cloudstack.agent.api.CreateNetrisACLCommand;
@@ -116,6 +119,7 @@ import org.apache.cloudstack.agent.api.ReleaseNatIpCommand;
 import org.apache.cloudstack.agent.api.SetupNetrisPublicRangeCommand;
 import org.apache.cloudstack.resource.NetrisResourceObjectUtils;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -612,7 +616,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
     }
 
     @Override
-    public boolean createLbRule(CreateOrUpdateNetrisLoadBalancerRuleCommand cmd) {
+    public boolean createOrUpdateLbRule(CreateOrUpdateNetrisLoadBalancerRuleCommand cmd) {
         boolean isVpc = cmd.isVpc();
         Long networkResourceId = cmd.getId();
         String networkResourceName = cmd.getName();
@@ -641,16 +645,21 @@ public class NetrisApiClientImpl implements NetrisApiClient {
             if (Boolean.FALSE.equals(result)) {
                 logger.warn("Could not find the Netris LB rule with name {}", lbName);
             }
-            if (!matchingLbId.isEmpty()) {
-                logger.warn("LB rule by name: {} already exists", lbName);
-                return true;
-            }
-
-            L4lbAddItem l4lbAddItem = getL4LbRule(cmd, vpcResource, lbName, publicIp, lbBackends);
+            boolean updateRule = !matchingLbId.isEmpty();
+            L4lbAddOrUpdateItem l4lbAddItem = getL4LbRule(cmd, vpcResource, lbName, publicIp, lbBackends, updateRule);
             L4LoadBalancerApi loadBalancerApi = apiClient.getApiStubForMethod(L4LoadBalancerApi.class);
-            ResAddEditBody response = loadBalancerApi.apiV2L4lbPost(l4lbAddItem);
-            if (Objects.isNull(response) || Boolean.FALSE.equals(response.isIsSuccess())) {
-                throw new CloudRuntimeException("Failed to create Netris LB rule");
+            boolean success;
+            L4LbEditResponse editResponse = null;
+            ResAddEditBody createResponse = null;
+            if (updateRule) {
+                editResponse = loadBalancerApi.apiV2L4lbIdPut((L4LbEditItem) l4lbAddItem, matchingLbId.get(0).intValue());
+                success = editResponse.isIsSuccess();
+            } else {
+                createResponse = loadBalancerApi.apiV2L4lbPost((L4LbAddItem) l4lbAddItem);
+                success = createResponse.isIsSuccess();
+            }
+            if (ObjectUtils.allNull(editResponse, createResponse) || Boolean.FALSE.equals(success)) {
+                throw new CloudRuntimeException(String.format("Failed to %s Netris LB rule", updateRule ? "update" : "create"));
             }
         } catch (ApiException e) {
             logAndThrowException("Failed to create Netris load balancer rule", e);
@@ -658,9 +667,9 @@ public class NetrisApiClientImpl implements NetrisApiClient {
         return true;
     }
 
-    private L4lbAddItem getL4LbRule(CreateOrUpdateNetrisLoadBalancerRuleCommand cmd, VPCListing vpcResource, String lbName,
-                             String publicIp, List<NetrisLbBackend> lbBackends) {
-        L4lbAddItem l4lbAddItem = new L4lbAddItem();
+    private L4lbAddOrUpdateItem getL4LbRule(CreateOrUpdateNetrisLoadBalancerRuleCommand cmd, VPCListing vpcResource, String lbName,
+                                            String publicIp, List<NetrisLbBackend> lbBackends, boolean updateRule) {
+        L4lbAddOrUpdateItem l4lbAddItem = updateRule ? new L4LbEditItem() : new L4LbAddItem();
         try {
             l4lbAddItem.setName(lbName);
 
@@ -685,7 +694,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
             l4lbAddItem.setVpc(vpc);
 
             l4lbAddItem.setAutomatic(false);
-            l4lbAddItem.setIpFamily(NetUtils.isIpv4(publicIp) ? L4lbAddItem.IpFamilyEnum.IPv4 : L4lbAddItem.IpFamilyEnum.IPv6);
+            l4lbAddItem.setIpFamily(NetUtils.isIpv4(publicIp) ? L4lbAddOrUpdateItem.IpFamilyEnum.IPv4 : L4lbAddOrUpdateItem.IpFamilyEnum.IPv6);
             l4lbAddItem.setIp(publicIp);
             l4lbAddItem.setStatus("enable");
 
@@ -698,7 +707,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
             }
             l4lbAddItem.setBackend(backends);
             l4lbAddItem.setPort(Integer.valueOf(cmd.getPublicPort()));
-            l4lbAddItem.setHealthCheck(L4lbAddItem.HealthCheckEnum.NONE);
+            l4lbAddItem.setHealthCheck(L4lbAddOrUpdateItem.HealthCheckEnum.NONE);
         } catch (Exception e) {
             throw new CloudRuntimeException("Failed to create Netris load balancer rule", e);
         }
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java
index 12e7239a8ee..27f8c99fcd0 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java
@@ -44,6 +44,7 @@ import com.cloud.network.PhysicalNetworkServiceProvider;
 import com.cloud.network.PublicIpAddress;
 import com.cloud.network.SDNProviderNetworkRule;
 import com.cloud.network.SDNProviderOpObject;
+import com.cloud.network.as.AutoScaleCounter;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.IPAddressVO;
 import com.cloud.network.dao.LoadBalancerVMMapDao;
@@ -91,6 +92,7 @@ import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.VMInstanceDao;
+import com.google.gson.Gson;
 import org.apache.cloudstack.StartupNetrisCommand;
 import org.apache.cloudstack.api.ApiConstants;
 import com.cloud.network.netris.NetrisNetworkRule;
@@ -147,6 +149,16 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D
 
     private final Map<Network.Service, Map<Network.Capability, String>> capabilities = initCapabilities();
 
+    protected static List<AutoScaleCounter> getNetrisAutoScaleCounters() {
+        AutoScaleCounter counter;
+        final List<AutoScaleCounter> counterList = new ArrayList<>();
+        counter = new AutoScaleCounter(AutoScaleCounter.AutoScaleCounterType.Cpu);
+        counterList.add(counter);
+        counter = new AutoScaleCounter(AutoScaleCounter.AutoScaleCounterType.Memory);
+        counterList.add(counter);
+        return counterList;
+    }
+
     private static Map<Network.Service, Map<Network.Capability, String>> initCapabilities() {
         Map<Network.Service, Map<Network.Capability, String>> capabilities = new HashMap<>();
 
@@ -166,6 +178,10 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D
         lbCapabilities.put(Network.Capability.SupportedProtocols, "tcp, udp");
         lbCapabilities.put(Network.Capability.SupportedStickinessMethods, VirtualRouterElement.getHAProxyStickinessCapability());
         lbCapabilities.put(Network.Capability.LbSchemes, String.join(",", LoadBalancerContainer.Scheme.Internal.name(), LoadBalancerContainer.Scheme.Public.name()));
+        final Gson gson = new Gson();
+        final String autoScaleCounterList = gson.toJson(getNetrisAutoScaleCounters());
+        lbCapabilities.put(Network.Capability.AutoScaleCounters, autoScaleCounterList);
+        lbCapabilities.put(Network.Capability.VmAutoScaling, "true");
 
         capabilities.put(Network.Service.Lb, lbCapabilities);
         capabilities.put(Network.Service.PortForwarding, null);
@@ -750,7 +766,7 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D
                     .lbBackends(lbBackends)
                     .build();
             if (Arrays.asList(FirewallRule.State.Add, FirewallRule.State.Active).contains(loadBalancingRule.getState())) {
-                result &= netrisService.createLbRule(networkRule);
+                result &= netrisService.createOrUpdateLbRule(networkRule);
             } else if (loadBalancingRule.getState() == FirewallRule.State.Revoke) {
                 result &= netrisService.deleteLbRule(networkRule);
             }
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
index 62064c1ac07..45e9147d632 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
@@ -458,7 +458,7 @@ public class NetrisServiceImpl implements NetrisService, Configurable {
     }
 
     @Override
-    public boolean createLbRule(NetrisNetworkRule rule) {
+    public boolean createOrUpdateLbRule(NetrisNetworkRule rule) {
         SDNProviderNetworkRule baseRule = rule.getBaseRule();
         CreateOrUpdateNetrisLoadBalancerRuleCommand cmd = new CreateOrUpdateNetrisLoadBalancerRuleCommand(baseRule.getZoneId(), baseRule.getAccountId(),
                 baseRule.getDomainId(), baseRule.getNetworkResourceName(), baseRule.getNetworkResourceId(), baseRule.isVpcResource(),
diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java
index bda84f09fe6..105ff6a7e8b 100644
--- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java
@@ -2250,8 +2250,9 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
             Network.Provider provider = getLoadBalancerServiceProvider(asGroup.getLoadBalancerId());
             if (Network.Provider.Netscaler.equals(provider)) {
                 checkNetScalerAsGroup(asGroup);
-            } else if (Network.Provider.VirtualRouter.equals(provider) || Network.Provider.VPCVirtualRouter.equals(provider)) {
-                checkVirtualRouterAsGroup(asGroup);
+            } else if (Network.Provider.VirtualRouter.equals(provider) || Network.Provider.VPCVirtualRouter.equals(provider) ||
+                       Network.Provider.Netris.equals(provider)) {
+                checkAutoscalingGroup(asGroup);
             }
         }
     }
@@ -2631,7 +2632,7 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
         countersNumberMap.put(key, countersNumberMap.get(key) + 1);
     }
 
-    protected void monitorVirtualRouterAsGroup(AutoScaleVmGroupVO asGroup) {
+    protected void monitorAutoscalingGroup(AutoScaleVmGroupVO asGroup) {
         if (!checkAsGroupMaxAndMinMembers(asGroup)) {
             return;
         }
@@ -2661,7 +2662,7 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
         }
     }
 
-    protected void checkVirtualRouterAsGroup(AutoScaleVmGroupVO asGroup) {
+    protected void checkAutoscalingGroup(AutoScaleVmGroupVO asGroup) {
         AutoScaleVmGroupTO groupTO = lbRulesMgr.toAutoScaleVmGroupTO(asGroup);
 
         Map<String, Double> countersMap = new HashMap<>();
@@ -3011,8 +3012,9 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
                     Network.Provider provider = getLoadBalancerServiceProvider(asGroup.getLoadBalancerId());
                     if (Network.Provider.Netscaler.equals(provider)) {
                         logger.debug("Skipping the monitoring on AutoScale VmGroup with Netscaler provider: " + asGroup);
-                    } else if (Network.Provider.VirtualRouter.equals(provider) || Network.Provider.VPCVirtualRouter.equals(provider)) {
-                        monitorVirtualRouterAsGroup(asGroup);
+                    } else if (Network.Provider.VirtualRouter.equals(provider) || Network.Provider.VPCVirtualRouter.equals(provider) ||
+                               Network.Provider.Netris.equals(provider)) {
+                        monitorAutoscalingGroup(asGroup);
                     }
                 }
             } catch (final Exception e) {
diff --git a/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index 1615eec4c5c..ee4fe62aef9 100644
--- a/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -1008,6 +1008,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             return false;
         }
         if (provider.get(0) == Provider.Netscaler || provider.get(0) == Provider.F5BigIp ||
+            provider.get(0) == Provider.Netris ||
             provider.get(0) == Provider.VirtualRouter || provider.get(0) == Provider.VPCVirtualRouter) {
             return true;
         }
diff --git a/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java b/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java
index 68e5be2bf22..fce848aa30d 100644
--- a/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java
@@ -1199,51 +1199,52 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
 
                 // Offering #9 - network offering for NSX provider - NATTED mode
                 createAndPersistDefaultProviderOffering(NetworkOffering.DEFAULT_NAT_NSX_OFFERING, "Offering for NSX enabled networks - NAT mode",
-                        NetworkOffering.NetworkMode.NATTED, false, true, Provider.Nsx);
+                        NetworkOffering.NetworkMode.NATTED, false, true, false, Provider.Nsx);
 
                 // Offering #10 - network offering for NSX provider - ROUTED mode
                 createAndPersistDefaultProviderOffering(NetworkOffering.DEFAULT_ROUTED_NSX_OFFERING, "Offering for NSX enabled networks - ROUTED mode",
-                        NetworkOffering.NetworkMode.ROUTED, false, true, Provider.Nsx);
+                        NetworkOffering.NetworkMode.ROUTED, false, true, false, Provider.Nsx);
 
                 // Offering #11 - network offering for NSX provider for VPCs - NATTED mode
                 createAndPersistDefaultProviderOffering(NetworkOffering.DEFAULT_NAT_NSX_OFFERING_FOR_VPC, "Offering for NSX enabled networks on VPCs - NAT mode",
-                        NetworkOffering.NetworkMode.NATTED, true, true, Provider.Nsx);
+                        NetworkOffering.NetworkMode.NATTED, true, true, false, Provider.Nsx);
 
                 // Offering #12 - network offering for NSX provider for VPCs - ROUTED mode
                 createAndPersistDefaultProviderOffering(NetworkOffering.DEFAULT_ROUTED_NSX_OFFERING_FOR_VPC, "Offering for NSX enabled networks on VPCs - ROUTED mode",
-                        NetworkOffering.NetworkMode.ROUTED, true, true, Provider.Nsx);
+                        NetworkOffering.NetworkMode.ROUTED, true, true, false, Provider.Nsx);
 
                 // Offering #13 - network offering for NSX provider for VPCs with Internal LB - NATTED mode
                 createAndPersistDefaultProviderOffering(NetworkOffering.DEFAULT_NAT_NSX_OFFERING_FOR_VPC_WITH_ILB, "Offering for NSX enabled networks on VPCs with internal LB - NAT mode",
-                        NetworkOffering.NetworkMode.NATTED, true, false, Provider.Nsx);
+                        NetworkOffering.NetworkMode.NATTED, true, false, false, Provider.Nsx);
 
                 // Offering #14 - network offering for Netris provider for VPCs - ROUTED mode
                 createAndPersistDefaultProviderOffering(NetworkOffering.DEFAULT_ROUTED_NETRIS_OFFERING_FOR_VPC, "Offering for Netris enabled networks on VPCs - ROUTED mode",
-                        NetworkOffering.NetworkMode.ROUTED, true, true, Provider.Netris);
+                        NetworkOffering.NetworkMode.ROUTED, true, true, false, Provider.Netris);
 
                 // Offering #15 - network offering for Netris provider for VPCs - NATTED mode
                 createAndPersistDefaultProviderOffering(NetworkOffering.DEFAULT_NAT_NETRIS_OFFERING_FOR_VPC, "Offering for Netris enabled networks on VPCs - NAT mode",
-                        NetworkOffering.NetworkMode.NATTED, true, true, Provider.Netris);
+                        NetworkOffering.NetworkMode.NATTED, true, true, true, Provider.Netris);
             }
         });
     }
 
     private void createAndPersistDefaultProviderOffering(String name, String displayText, NetworkOffering.NetworkMode networkMode,
-                                                    boolean forVpc, boolean publicLB, Provider provider) {
-        NetworkOfferingVO defaultNatProviderNetworkOffering =
+                                                    boolean forVpc, boolean publicLB, boolean supportVmAutoscaling, Provider provider) {
+        NetworkOfferingVO providerNetworkOffering =
                 new NetworkOfferingVO(name, displayText, TrafficType.Guest, false, false, null,
                         null, true, Availability.Optional, null, GuestType.Isolated, false,
                         false, false, false, false, forVpc);
-        defaultNatProviderNetworkOffering.setPublicLb(publicLB);
-        defaultNatProviderNetworkOffering.setInternalLb(!publicLB);
-        defaultNatProviderNetworkOffering.setNetworkMode(networkMode);
-        defaultNatProviderNetworkOffering.setState(NetworkOffering.State.Enabled);
-        defaultNatProviderNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNatProviderNetworkOffering);
+        providerNetworkOffering.setPublicLb(publicLB);
+        providerNetworkOffering.setInternalLb(!publicLB);
+        providerNetworkOffering.setNetworkMode(networkMode);
+        providerNetworkOffering.setState(NetworkOffering.State.Enabled);
+        providerNetworkOffering.setSupportsVmAutoScaling(supportVmAutoscaling);
+        providerNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(providerNetworkOffering);
 
         Map<Service, Provider> serviceProviderMap = getServicesAndProvidersForProviderNetwork(networkMode, forVpc, provider);
         for (Map.Entry<Network.Service, Network.Provider> service : serviceProviderMap.entrySet()) {
             NetworkOfferingServiceMapVO offService =
-                    new NetworkOfferingServiceMapVO(defaultNatProviderNetworkOffering.getId(), service.getKey(), service.getValue());
+                    new NetworkOfferingServiceMapVO(providerNetworkOffering.getId(), service.getKey(), service.getValue());
             _ntwkOfferingServiceMapDao.persist(offService);
             logger.trace("Added service for the network offering: " + offService);
         }
diff --git a/server/src/test/java/com/cloud/network/as/AutoScaleManagerImplTest.java b/server/src/test/java/com/cloud/network/as/AutoScaleManagerImplTest.java
index 7d2b35361bc..76e9269b9f1 100644
--- a/server/src/test/java/com/cloud/network/as/AutoScaleManagerImplTest.java
+++ b/server/src/test/java/com/cloud/network/as/AutoScaleManagerImplTest.java
@@ -1577,11 +1577,11 @@ public class AutoScaleManagerImplTest {
         when(asVmGroupMock.getState()).thenReturn(AutoScaleVmGroup.State.ENABLED);
         when(asVmGroupMock.getLoadBalancerId()).thenReturn(loadBalancerId);
         Mockito.doReturn(Network.Provider.VirtualRouter).when(autoScaleManagerImplSpy).getLoadBalancerServiceProvider(loadBalancerId);
-        Mockito.doNothing().when(autoScaleManagerImplSpy).checkVirtualRouterAsGroup(asVmGroupMock);
+        Mockito.doNothing().when(autoScaleManagerImplSpy).checkAutoscalingGroup(asVmGroupMock);
 
         autoScaleManagerImplSpy.checkAutoScaleVmGroup(asVmGroupMock);
 
-        Mockito.verify(autoScaleManagerImplSpy).checkVirtualRouterAsGroup(asVmGroupMock);
+        Mockito.verify(autoScaleManagerImplSpy).checkAutoscalingGroup(asVmGroupMock);
         Mockito.verify(autoScaleManagerImplSpy, never()).checkNetScalerAsGroup(asVmGroupMock);
     }
 
@@ -1590,11 +1590,11 @@ public class AutoScaleManagerImplTest {
         when(asVmGroupMock.getState()).thenReturn(AutoScaleVmGroup.State.ENABLED);
         when(asVmGroupMock.getLoadBalancerId()).thenReturn(loadBalancerId);
         Mockito.doReturn(Network.Provider.VPCVirtualRouter).when(autoScaleManagerImplSpy).getLoadBalancerServiceProvider(loadBalancerId);
-        Mockito.doNothing().when(autoScaleManagerImplSpy).checkVirtualRouterAsGroup(asVmGroupMock);
+        Mockito.doNothing().when(autoScaleManagerImplSpy).checkAutoscalingGroup(asVmGroupMock);
 
         autoScaleManagerImplSpy.checkAutoScaleVmGroup(asVmGroupMock);
 
-        Mockito.verify(autoScaleManagerImplSpy).checkVirtualRouterAsGroup(asVmGroupMock);
+        Mockito.verify(autoScaleManagerImplSpy).checkAutoscalingGroup(asVmGroupMock);
         Mockito.verify(autoScaleManagerImplSpy, never()).checkNetScalerAsGroup(asVmGroupMock);
     }
 
@@ -1607,7 +1607,7 @@ public class AutoScaleManagerImplTest {
 
         autoScaleManagerImplSpy.checkAutoScaleVmGroup(asVmGroupMock);
 
-        Mockito.verify(autoScaleManagerImplSpy, never()).checkVirtualRouterAsGroup(asVmGroupMock);
+        Mockito.verify(autoScaleManagerImplSpy, never()).checkAutoscalingGroup(asVmGroupMock);
         Mockito.verify(autoScaleManagerImplSpy).checkNetScalerAsGroup(asVmGroupMock);
     }
 
@@ -1989,7 +1989,7 @@ public class AutoScaleManagerImplTest {
         Mockito.doNothing().when(autoScaleManagerImplSpy).doScaleUp(vmGroupId, 1);
         Mockito.doNothing().when(autoScaleManagerImplSpy).cleanupAsVmGroupStatistics(groupTO);
 
-        autoScaleManagerImplSpy.checkVirtualRouterAsGroup(asVmGroupMock);
+        autoScaleManagerImplSpy.checkAutoscalingGroup(asVmGroupMock);
 
         Mockito.verify(autoScaleManagerImplSpy).doScaleUp(vmGroupId, 1);
     }
@@ -2005,7 +2005,7 @@ public class AutoScaleManagerImplTest {
         Mockito.doNothing().when(autoScaleManagerImplSpy).doScaleDown(vmGroupId);
         Mockito.doNothing().when(autoScaleManagerImplSpy).cleanupAsVmGroupStatistics(groupTO);
 
-        autoScaleManagerImplSpy.checkVirtualRouterAsGroup(asVmGroupMock);
+        autoScaleManagerImplSpy.checkAutoscalingGroup(asVmGroupMock);
 
         Mockito.verify(autoScaleManagerImplSpy).doScaleDown(vmGroupId);
     }
@@ -2225,7 +2225,7 @@ public class AutoScaleManagerImplTest {
         Mockito.doNothing().when(autoScaleManagerImplSpy).getVmStatsFromHosts(groupTO);
         Mockito.doNothing().when(autoScaleManagerImplSpy).getNetworkStatsFromVirtualRouter(groupTO);
 
-        autoScaleManagerImplSpy.monitorVirtualRouterAsGroup(asVmGroupMock);
+        autoScaleManagerImplSpy.monitorAutoscalingGroup(asVmGroupMock);
 
         Mockito.verify(autoScaleManagerImplSpy).getVmStatsFromHosts(groupTO);
         Mockito.verify(autoScaleManagerImplSpy).getNetworkStatsFromVirtualRouter(groupTO);
diff --git a/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java b/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java
index 99f319d6de7..7dbfc0b9cbb 100644
--- a/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java
+++ b/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java
@@ -107,7 +107,7 @@ public class NetrisServiceMockTest implements NetrisService {
     }
 
     @Override
-    public boolean createLbRule(NetrisNetworkRule rule) {
+    public boolean createOrUpdateLbRule(NetrisNetworkRule rule) {
         return true;
     }