CLOUDSTACK-9322 : Changes to support InternalLbVm with Nuage VSP plugin

This commit is contained in:
Nick Livens 2016-02-18 11:03:34 +01:00
parent c48b6c33c0
commit ae0d6b32d8
10 changed files with 153 additions and 32 deletions

View File

@ -32,4 +32,5 @@ public class VspConstants {
public static final String NUAGE_VSP_API_CHILD_RESOURCE = "childresource";
public static final String NUAGE_VSP_API_RESOURCE_FILTER = "resourcefilter";
public static final String NUAGE_VSP_API_RESOURCE_INFO = "resourceinfo";
public static final String NUAGE_VSP_CMS_ID = "cmsid";
}

View File

@ -65,6 +65,10 @@ public class NuageVspDeviceResponse extends BaseResponse {
@Param(description = "the time to wait after failure before retrying to communicate to Nuage VSD")
private long apiRetryInterval;
@SerializedName(VspConstants.NUAGE_VSP_CMS_ID)
@Param(description = "the CMS ID generated by the Nuage VSD")
private String cmsId;
public void setId(String vspDetailsId) {
this.id = vspDetailsId;
}
@ -101,4 +105,7 @@ public class NuageVspDeviceResponse extends BaseResponse {
this.apiRetryInterval = apiRetryInterval;
}
public void setCmsId(String cmsId) {
this.cmsId = cmsId;
}
}

View File

@ -59,6 +59,7 @@ import com.cloud.network.dao.NuageVspDao;
import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkVO;
import com.cloud.network.manager.NuageVspManager;
import com.cloud.network.manager.NuageVspManagerImpl;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.FirewallRuleType;
import com.cloud.network.rules.FirewallRuleVO;
@ -69,7 +70,9 @@ import com.cloud.network.vpc.NetworkACLItemVO;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.StaticRouteProfile;
import com.cloud.network.vpc.Vpc;
import com.cloud.network.vpc.VpcOfferingServiceMapVO;
import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
@ -135,6 +138,8 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
@Inject
VpcDao _vpcDao;
@Inject
VpcOfferingServiceMapDao _vpcOfferingSrvcDao;
@Inject
NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
@Inject
AgentManager _agentMgr;
@ -426,6 +431,16 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
}
}
if (network.getVpcId() != null) {
NetworkOffering networkOffering = _ntwkOfferingDao.findById(network.getNetworkOfferingId());
if (!networkOffering.getIsPersistent()) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("NuageVsp can't handle VPC tiers which use a network offering which are not persistent");
}
return false;
}
}
return true;
}
@ -586,6 +601,22 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
@Override
public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
List<VpcOfferingServiceMapVO> vpcOfferingServices = _vpcOfferingSrvcDao.listByVpcOffId(vpc.getVpcOfferingId());
Map<Network.Service, Set<Network.Provider>> supportedVpcServices = NuageVspManagerImpl.NUAGE_VSP_VPC_SERVICE_MAP;
for (VpcOfferingServiceMapVO vpcOfferingService : vpcOfferingServices) {
Network.Service service = Network.Service.getService(vpcOfferingService.getService());
if (!supportedVpcServices.containsKey(service)) {
s_logger.warn(String.format("NuageVsp doesn't support service %s for VPCs", service.getName()));
return false;
}
Network.Provider provider = Network.Provider.getProvider(vpcOfferingService.getProvider());
if (!supportedVpcServices.get(service).contains(provider)) {
s_logger.warn(String.format("NuageVsp doesn't support provider %s for service %s for VPCs", provider.getName(), service.getName()));
return false;
}
}
return true;
}

View File

@ -25,6 +25,7 @@ import com.cloud.agent.api.guru.DeallocateVmVspCommand;
import com.cloud.agent.api.guru.ImplementNetworkVspCommand;
import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand;
import com.cloud.agent.api.guru.TrashNetworkVspCommand;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.VlanVO;
@ -105,6 +106,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
AgentManager _agentMgr;
@Inject
NuageVspManager _nuageVspManager;
@Inject
ConfigurationManager _configMgr;
public NuageVspGuestNetworkGuru() {
super();
@ -347,6 +350,12 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
protected boolean canHandle(NetworkOffering offering, final NetworkType networkType, final PhysicalNetwork physicalNetwork) {
if (networkType == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && (offering.getGuestType() == Network.GuestType.Isolated || offering.getGuestType() == Network.GuestType.Shared)
&& isMyIsolationMethod(physicalNetwork)) {
if (_configMgr.isOfferingForVpc(offering) && !offering.getIsPersistent()) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("NuageVsp can't handle VPC tiers which use a network offering which are not persistent");
}
return false;
}
return true;
} else {
if (s_logger.isTraceEnabled()) {

View File

@ -105,6 +105,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import net.nuage.vsp.acs.NuageVspPluginClientLoader;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
@ -120,7 +121,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -137,8 +137,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
private static final int ONE_MINUTE_MULTIPLIER = 60 * 1000;
private static final Set<Network.Provider> NUAGE_VSP_PROVIDERS;
private static final Map<Network.Service, Set<Network.Provider>> NUAGE_VSP_VPC_SERVICE_MAP;
public static final Map<Network.Service, Set<Network.Provider>> NUAGE_VSP_VPC_SERVICE_MAP;
private static final ConfigKey[] NUAGE_VSP_CONFIG_KEYS = new ConfigKey<?>[] { NuageVspConfigDns, NuageVspDnsExternal, NuageVspConfigGateway,
NuageVspSharedNetworkDomainTemplateName, NuageVspVpcDomainTemplateName, NuageVspIsolatedNetworkDomainTemplateName };
@ -195,13 +194,18 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
MessageBus _messageBus;
static {
NUAGE_VSP_PROVIDERS = ImmutableSet.of(Network.Provider.NuageVsp);
Set<Network.Provider> nuageVspProviders = ImmutableSet.of(Network.Provider.NuageVsp);
Set<Network.Provider> userDataProviders = ImmutableSet.of(Network.Provider.VPCVirtualRouter);
Set<Network.Provider> lbProviders = ImmutableSet.of(Network.Provider.InternalLbVm);
NUAGE_VSP_VPC_SERVICE_MAP = ImmutableMap.<Network.Service, Set<Network.Provider>>builder()
.put(Network.Service.Connectivity, NUAGE_VSP_PROVIDERS)
.put(Network.Service.Dhcp, NUAGE_VSP_PROVIDERS)
.put(Network.Service.StaticNat, NUAGE_VSP_PROVIDERS)
.put(Network.Service.SourceNat, NUAGE_VSP_PROVIDERS)
.put(Network.Service.NetworkACL, NUAGE_VSP_PROVIDERS)
.put(Network.Service.Connectivity, nuageVspProviders)
.put(Network.Service.Gateway, nuageVspProviders)
.put(Network.Service.Dhcp, nuageVspProviders)
.put(Network.Service.StaticNat, nuageVspProviders)
.put(Network.Service.SourceNat, nuageVspProviders)
.put(Network.Service.NetworkACL, nuageVspProviders)
.put(Network.Service.UserData, userDataProviders)
.put(Network.Service.Lb, lbProviders)
.build();
}
@ -424,6 +428,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
HostVO nuageVspHost = _hostDao.findById(nuageVspDeviceVO.getHostId());
_hostDao.loadDetails(nuageVspHost);
NuageVspResource.Configuration resourceConfiguration = NuageVspResource.Configuration.fromConfiguration(nuageVspHost.getDetails());
NuageVspDeviceResponse response = new NuageVspDeviceResponse();
response.setDeviceName(nuageVspDeviceVO.getDeviceName());
PhysicalNetwork pnw = ApiDBUtils.findPhysicalNetworkById(nuageVspDeviceVO.getPhysicalNetworkId());
@ -432,12 +437,13 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
}
response.setId(nuageVspDeviceVO.getUuid());
response.setProviderName(nuageVspDeviceVO.getProviderName());
response.setHostName(nuageVspHost.getDetail("hostname"));
response.setPort(Integer.parseInt(nuageVspHost.getDetail("port")));
String apiRelativePath = nuageVspHost.getDetail("apirelativepath");
response.setHostName(resourceConfiguration.hostName());
response.setPort(Integer.parseInt(resourceConfiguration.port()));
String apiRelativePath = resourceConfiguration.apiRelativePath();
response.setApiVersion(apiRelativePath.substring(apiRelativePath.lastIndexOf('/') + 1));
response.setApiRetryCount(Integer.parseInt(nuageVspHost.getDetail("retrycount")));
response.setApiRetryInterval(Long.parseLong(nuageVspHost.getDetail("retryinterval")));
response.setApiRetryCount(Integer.parseInt(resourceConfiguration.retryCount()));
response.setApiRetryInterval(Long.parseLong(resourceConfiguration.retryInterval()));
response.setCmsId(resourceConfiguration.nuageVspCmsId());
response.setObjectName("nuagevspdevice");
return response;
}
@ -770,7 +776,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
defaultNuageVspSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled);
defaultNuageVspSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNuageVspSharedSGNetworkOffering);
Map<Network.Service, Network.Provider> defaultNuageVspSharedSGNetworkOfferingProviders = new HashMap<>();
Map<Network.Service, Network.Provider> defaultNuageVspSharedSGNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.Dhcp, Network.Provider.NuageVsp);
defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.SecurityGroup, Network.Provider.NuageVsp);
defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.Connectivity, Network.Provider.NuageVsp);
@ -794,16 +800,15 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
Transaction.execute(new TransactionCallbackNoReturn() {
@Override
public void doInTransactionWithoutResult(TransactionStatus status) {
if (_vpcOffDao.findByUniqueName(nuageVPCOfferingName) == null) {
VpcOffering offering = _vpcOffDao.findByUniqueName(nuageVPCOfferingName);
if (offering == null) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Creating default Nuage VPC offering " + nuageVPCOfferingName);
}
Map<Network.Service, Set<Network.Provider>> svcProviderMap = Maps.newHashMap(NUAGE_VSP_VPC_SERVICE_MAP);
Set<Network.Provider> userDataProviders = Collections.singleton(Network.Provider.VPCVirtualRouter);
svcProviderMap.put(Network.Service.UserData, userDataProviders);
createVpcOffering(nuageVPCOfferingName, nuageVPCOfferingDisplayText, svcProviderMap, true, VpcOffering.State.Enabled, null);
createVpcOffering(nuageVPCOfferingName, nuageVPCOfferingDisplayText, NUAGE_VSP_VPC_SERVICE_MAP, true, VpcOffering.State.Enabled, null);
} else {
updateVpcOffering(offering, NUAGE_VSP_VPC_SERVICE_MAP);
}
}
});
@ -822,7 +827,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
offering.setState(state);
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("Adding vpc offering " + offering);
s_logger.debug(String.format("Adding vpc offering %s", offering));
}
offering = _vpcOffDao.persist(offering);
// populate services and providers
@ -834,11 +839,49 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider);
_vpcOffSvcMapDao.persist(offService);
if (s_logger.isTraceEnabled()) {
s_logger.trace("Added service for the vpc offering: " + offService + " with provider " + provider.getName());
s_logger.trace(String.format("Added service for the vpc offering: %s with provider %s", offService, provider.getName()));
}
}
} else {
throw new InvalidParameterValueException("Provider is missing for the VPC offering service " + service.getName());
throw new InvalidParameterValueException(String.format("Provider is missing for the VPC offering service %s", service.getName()));
}
}
}
return offering;
}
});
}
@DB
protected void updateVpcOffering(final VpcOffering offering, final Map<Network.Service, Set<Network.Provider>> svcProviderMap) {
Transaction.execute(new TransactionCallback<VpcOffering>() {
@Override
public VpcOffering doInTransaction(TransactionStatus status) {
if (s_logger.isDebugEnabled()) {
s_logger.debug(String.format("Updating vpc offering %s", offering));
}
List<VpcOfferingServiceMapVO> currentVpcOfferingServices = _vpcOffSvcMapDao.listByVpcOffId(offering.getId());
Map<Network.Service, Set<Network.Provider>> currentSvcProviderMap = Maps.newHashMap();
for (VpcOfferingServiceMapVO vpcOfferingService : currentVpcOfferingServices) {
Network.Service service = Network.Service.getService(vpcOfferingService.getService());
Network.Provider provider = Network.Provider.getProvider(vpcOfferingService.getProvider());
if (!currentSvcProviderMap.containsKey(service)) {
currentSvcProviderMap.put(service, Sets.newHashSet(provider));
} else if (!currentSvcProviderMap.get(service).contains(provider)) {
currentSvcProviderMap.get(service).add(provider);
}
}
for (Network.Service service : svcProviderMap.keySet()) {
for (Network.Provider provider : svcProviderMap.get(service)) {
if (currentSvcProviderMap.get(service) == null || !currentSvcProviderMap.get(service).contains(provider)) {
VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider);
_vpcOffSvcMapDao.persist(offService);
if (s_logger.isDebugEnabled()) {
s_logger.debug(String.format("Added service for the vpc offering: %s", offService));
}
}
}
}

View File

@ -142,6 +142,12 @@ public class NuageVspElementTest {
final Network net = mock(Network.class);
when(net.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
when(net.getId()).thenReturn(NETWORK_ID);
when(net.getNetworkOfferingId()).thenReturn(NETWORK_ID);
final NetworkOfferingVO ntwkoffer = mock(NetworkOfferingVO.class);
when(ntwkoffer.getId()).thenReturn(NETWORK_ID);
when(ntwkoffer.getIsPersistent()).thenReturn(true);
when(ntwkOfferingDao.findById(NETWORK_ID)).thenReturn(ntwkoffer);
when(ntwkSrvcDao.canProviderSupportServiceInNetwork(NETWORK_ID, Service.Connectivity, Provider.NuageVsp)).thenReturn(true);
// Golden path

View File

@ -22,6 +22,7 @@ package com.cloud.network.guru;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.DataCenterVO;
@ -78,6 +79,7 @@ import static com.cloud.network.manager.NuageVspManager.NuageVspIsolatedNetworkD
import static com.cloud.network.manager.NuageVspManager.NuageVspSharedNetworkDomainTemplateName;
import static com.cloud.network.manager.NuageVspManager.NuageVspVpcDomainTemplateName;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
@ -102,6 +104,7 @@ public class NuageVspGuestNetworkGuruTest {
ConfigurationDao configDao = mock(ConfigurationDao.class);
IPAddressDao ipAddressDao = mock(IPAddressDao.class);
NuageVspManager nuageVspManager = mock(NuageVspManager.class);
ConfigurationManager configurationManager = mock(ConfigurationManager.class);
NetworkDao netdao = mock(NetworkDao.class);
NuageVspGuestNetworkGuru guru;
@ -126,6 +129,7 @@ public class NuageVspGuestNetworkGuruTest {
guru._configDao = configDao;
guru._ipAddressDao = ipAddressDao;
guru._nuageVspManager = nuageVspManager;
guru._configMgr = configurationManager;
final DataCenterVO dc = mock(DataCenterVO.class);
when(dc.getNetworkType()).thenReturn(NetworkType.Advanced);
@ -144,6 +148,8 @@ public class NuageVspGuestNetworkGuruTest {
when(offering.getId()).thenReturn(NETWORK_ID);
when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
when(offering.getGuestType()).thenReturn(GuestType.Isolated);
when(offering.getIsPersistent()).thenReturn(false);
when(configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(false);
final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class);
when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VSP"}));
@ -151,25 +157,28 @@ public class NuageVspGuestNetworkGuruTest {
when(nosd.areServicesSupportedByNetworkOffering(NETWORK_ID, Service.Connectivity)).thenReturn(true);
assertTrue(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
assertTrue(guru.canHandle(offering, NetworkType.Advanced, physnet));
// Not supported TrafficType != Guest
when(offering.getTrafficType()).thenReturn(TrafficType.Management);
assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet));
// Supported: GuestType Shared
when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
when(offering.getGuestType()).thenReturn(GuestType.Shared);
assertTrue(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
assertTrue(guru.canHandle(offering, NetworkType.Advanced, physnet));
// Not supported: Basic networking
when(offering.getGuestType()).thenReturn(GuestType.Isolated);
assertFalse(guru.canHandle(offering, NetworkType.Basic, physnet) == true);
assertFalse(guru.canHandle(offering, NetworkType.Basic, physnet));
// Not supported: IsolationMethod != STT
when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VLAN"}));
assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet));
// Not supported: Non-persistent VPC tier
when(configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(true);
assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet));
}
@Test
@ -187,6 +196,8 @@ public class NuageVspGuestNetworkGuruTest {
when(offering.getId()).thenReturn(NETWORK_ID);
when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
when(offering.getGuestType()).thenReturn(GuestType.Isolated);
when(offering.getIsPersistent()).thenReturn(false);
when(configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(false);
when(nosd.areServicesSupportedByNetworkOffering(NETWORK_ID, Service.Connectivity)).thenReturn(true);
@ -197,6 +208,10 @@ public class NuageVspGuestNetworkGuruTest {
final Network designednetwork = guru.design(offering, plan, network, account);
assertTrue(designednetwork != null);
assertTrue(designednetwork.getBroadcastDomainType() == BroadcastDomainType.Vsp);
// Can't design non-persistent VPC tier
when(configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(true);
assertNull(guru.design(offering, plan, network, account));
}
@Test

View File

@ -46,6 +46,7 @@ import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationSe
import org.apache.cloudstack.framework.config.ConfigDepot;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import com.cloud.configuration.Config;
@ -402,8 +403,6 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
svcProviderMap.put(Service.NetworkACL, defaultProviders);
}
svcProviderMap.put(Service.Gateway, defaultProviders);
if (serviceProviders != null) {
for (final Entry<String, List<String>> serviceEntry : serviceProviders.entrySet()) {
final Network.Service service = Network.Service.getService(serviceEntry.getKey());
@ -425,6 +424,12 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
}
}
// add gateway provider (if sourceNat provider is enabled)
final Set<Provider> sourceNatServiceProviders = svcProviderMap.get(Service.SourceNat);
if (CollectionUtils.isNotEmpty(sourceNatServiceProviders)) {
svcProviderMap.put(Service.Gateway, sourceNatServiceProviders);
}
validateConnectivtyServiceCapabilities(svcProviderMap.get(Service.Connectivity), serviceCapabilitystList);
final boolean supportsDistributedRouter = isVpcOfferingSupportsDistributedRouter(serviceCapabilitystList);

View File

@ -308,6 +308,7 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
cleanupDomainOfferings(domain.getId());
CallContext.current().putContextParameter(Domain.class, domain.getUuid());
_messageBus.publish(_name, MESSAGE_REMOVE_DOMAIN_EVENT, PublishScope.LOCAL, domain);
return true;
} catch (Exception ex) {
s_logger.error("Exception deleting domain with id " + domain.getId(), ex);

View File

@ -3583,7 +3583,10 @@
});
networkServiceObjs.push({
name: 'Lb',
provider: [{name: 'VpcVirtualRouter'}]
provider: [
{name: 'VpcVirtualRouter'},
{name: 'InternalLbVm'}
]
});
networkServiceObjs.push({
name: 'Gateway',