From 883d061dd76160b961a0752fbc365b9df69b23f3 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 6 Jul 2012 10:42:06 -0700 Subject: [PATCH 1/9] cloudstack 3.0 UI - VPC - Edit VPC chart - populate tiers by API call instead of hardcoding. --- ui/scripts/ui-custom/vpc.js | 8 ++--- ui/scripts/vpc.js | 58 +++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/ui/scripts/ui-custom/vpc.js b/ui/scripts/ui-custom/vpc.js index ff39d8d8ae0..0e4975a161b 100644 --- a/ui/scripts/ui-custom/vpc.js +++ b/ui/scripts/ui-custom/vpc.js @@ -161,7 +161,7 @@ $title.html(name); $cidr.html(cidr); $vmCount.append( - $('').addClass('total').html(virtualMachines.length), + $('').addClass('total').html(virtualMachines != null? virtualMachines.length: 0), ' VMs' ); $tier.append($actions); @@ -221,7 +221,7 @@ return $tier; }, - chart: function(args) { + chart: function(args) { var $browser = args.$browser; var siteToSiteVPN = args.siteToSiteVPN; var tiers = args.tiers; @@ -260,7 +260,7 @@ return true; }; - if (tiers.length) { + if (tiers != null && tiers.length > 0) { $(tiers).map(function(index, tier) { var $tier = elems.tier({ name: tier.name, @@ -538,7 +538,7 @@ context: context, response: { success: function(args) { - var tiers = args.data.tiers; + var tiers = args.tiers; var $chart = elems.chart({ $browser: $browser, siteToSiteVPN: siteToSiteVPN, diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js index 23b424decab..e622c627062 100644 --- a/ui/scripts/vpc.js +++ b/ui/scripts/vpc.js @@ -509,34 +509,36 @@ }, // Get tiers - dataProvider: function(args) { - var tiers = [ // Dummy content - { - id: 1, - name: 'web', - cidr: '192.168.0.0/24', - state: 'Running', - virtualMachines: [ - { name: 'i-2-VM' }, - { name: 'i-3-VM' } - ] - }, - { - id: 2, - name: 'app', - state: 'Stopped', - cidr: '10.0.0.0/24', - virtualMachines: [] - } - ]; - - setTimeout(function() { - args.response.success({ - data: { - tiers: tiers - } - }); - }, 1000); + dataProvider: function(args) { + $.ajax({ + url: createURL("listNetworks"), + dataType: "json", + data: { + vpcid: args.context.vpc[0].id, + listAll: true + }, + async: true, + success: function(json) { + var networks = json.listnetworksresponse.network; + if(networks != null && networks.length > 0) { + for(var i = 0; i < networks.length; i++) { + $.ajax({ + url: createURL("listVirtualMachines"), + dataType: "json", + data: { + networkid: networks[i].id, + listAll: true + }, + async: false, + success: function(json) { + networks[i].virtualMachines = json.listvirtualmachinesresponse.virtualmachine; + } + }); + } + } + args.response.success({ tiers: networks }); + } + }); } } }; From 5a5117b744ec5c7869be66cdbcffdcd972ab50fa Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 6 Jul 2012 11:10:43 -0700 Subject: [PATCH 2/9] CS-15471: Fix wrong type of updating customer gateway lifetime Also fixes one typo. --- api/src/com/cloud/api/commands/ListVpnConnectionsCmd.java | 2 +- api/src/com/cloud/api/commands/UpdateVpnCustomerGatewayCmd.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListVpnConnectionsCmd.java b/api/src/com/cloud/api/commands/ListVpnConnectionsCmd.java index e942bc4226f..a7cd2eb6d85 100644 --- a/api/src/com/cloud/api/commands/ListVpnConnectionsCmd.java +++ b/api/src/com/cloud/api/commands/ListVpnConnectionsCmd.java @@ -28,7 +28,7 @@ import com.cloud.network.Site2SiteVpnConnection; @Implementation(description="Lists site to site vpn connection gateways", responseObject=Site2SiteVpnConnectionResponse.class) public class ListVpnConnectionsCmd extends BaseListProjectAndAccountResourcesCmd { - public static final Logger s_logger = Logger.getLogger (ListVpnCustomerGatewaysCmd.class.getName()); + public static final Logger s_logger = Logger.getLogger (ListVpnConnectionsCmd.class.getName()); private static final String s_name = "listvpnconnectionsresponse"; diff --git a/api/src/com/cloud/api/commands/UpdateVpnCustomerGatewayCmd.java b/api/src/com/cloud/api/commands/UpdateVpnCustomerGatewayCmd.java index 2c32fae25c9..98b7ea93ac3 100644 --- a/api/src/com/cloud/api/commands/UpdateVpnCustomerGatewayCmd.java +++ b/api/src/com/cloud/api/commands/UpdateVpnCustomerGatewayCmd.java @@ -57,7 +57,7 @@ public class UpdateVpnCustomerGatewayCmd extends BaseAsyncCmd { @Parameter(name=ApiConstants.ESP_POLICY, type=CommandType.STRING, required=true, description="ESP policy of the customer gateway") private String espPolicy; - @Parameter(name=ApiConstants.LIFETIME, type=CommandType.STRING, required=false, description="Lifetime of vpn connection to the customer gateway, in seconds") + @Parameter(name=ApiConstants.LIFETIME, type=CommandType.LONG, required=false, description="Lifetime of vpn connection to the customer gateway, in seconds") private Long lifetime; ///////////////////////////////////////////////////// From 6f7a7c5e3ed7c77458c8230cffd6308456422f95 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 6 Jul 2012 11:17:45 -0700 Subject: [PATCH 3/9] CS-15470: Remove UNIQUE keyword for some fields User can create/delete/create gateway again and again, then it would no longer be unique. The unique should be guaranteed by API level. --- setup/db/create-schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 5e6fe5db500..6d04d7742e4 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -2137,7 +2137,7 @@ CREATE TABLE `cloud`.`port_profile` ( CREATE TABLE `cloud`.`s2s_vpn_gateway` ( `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', `uuid` varchar(40), - `addr_id` bigint unsigned UNIQUE NOT NULL, + `addr_id` bigint unsigned NOT NULL, `removed` datetime COMMENT 'date removed if not null', PRIMARY KEY (`id`), CONSTRAINT `fk_s2s_vpn_gateway__addr_id` FOREIGN KEY (`addr_id`) REFERENCES `user_ip_address` (`id`) ON DELETE CASCADE, @@ -2147,7 +2147,7 @@ CREATE TABLE `cloud`.`s2s_vpn_gateway` ( CREATE TABLE `cloud`.`s2s_customer_gateway` ( `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', `uuid` varchar(40), - `gateway_ip` char(40) UNIQUE NOT NULL, + `gateway_ip` char(40) NOT NULL, `guest_cidr_list` varchar(200) NOT NULL, `ipsec_psk` varchar(256), `ike_policy` varchar(30) NOT NULL, From 76e8b9fa81c69332eea9356ef3177dc56e9abd24 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 6 Jul 2012 11:34:36 -0700 Subject: [PATCH 4/9] CS-15116: Add missing scripts for XCP server Thank for the help from Wilhem Putz(wp@typoheads.at) to identify the issue. --- scripts/vm/hypervisor/xenserver/xcpserver/patch | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/patch b/scripts/vm/hypervisor/xenserver/xcpserver/patch index 7171635be16..3e92ef750f3 100644 --- a/scripts/vm/hypervisor/xenserver/xcpserver/patch +++ b/scripts/vm/hypervisor/xenserver/xcpserver/patch @@ -42,3 +42,6 @@ create_privatetemplate_from_snapshot.sh=..,0755,/opt/xensource/bin upgrade_snapshot.sh=..,0755,/opt/xensource/bin cloud-clean-vlan.sh=..,0755,/opt/xensource/bin cloud-prepare-upgrade.sh=..,0755,/opt/xensource/bin +getRouterStatus.sh=../../../../network/domr/,0755,/opt/xensource/bin +bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin +getDomRVersion.sh=../../../../network/domr/,0755,/opt/xensource/bin From 1989dce8d08d88599766057663c994f679480022 Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Fri, 6 Jul 2012 12:07:27 -0700 Subject: [PATCH 5/9] Fix 'About' page for CloudPlatform --- ui/scripts/ui/core.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ui/scripts/ui/core.js b/ui/scripts/ui/core.js index a703fa0db87..40e337b4eb7 100644 --- a/ui/scripts/ui/core.js +++ b/ui/scripts/ui/core.js @@ -254,6 +254,12 @@ $elem.appendTo($container); }); + var checkTitle = function(str) { + if ($('#header.nologo').size() == 0) { + return str.replace(/CloudStack/ig,'CloudPlatform'); + } else { return str; } + }; + // User options var $options = $('
').attr({ id: 'user-options' }) .appendTo($('#header')); @@ -274,13 +280,13 @@ } if (this == 'About') { $link.click(function() { - var $logo = $('
').addClass('logo').html('CloudStack'), + var $logo = $('
').addClass('logo').html(checkTitle('CloudStack')), $version = $('
').addClass('version').html(g_cloudstackversion), $about = $('
').addClass('about').append($logo).append($version); $about.dialog({ modal: true, width: 300, - title: 'About CloudStack', + title: checkTitle('About CloudStack'), closeOnEscape: false, dialogClass: 'dialog-about', buttons: { From 2fa2dd5dfd6b362ade92010549b7196a7ba891b2 Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Fri, 6 Jul 2012 14:02:21 -0700 Subject: [PATCH 6/9] CS-15401: Fix arrow BG for PF/LB UI for Japanese language When opening Network screen, arrows to the right side of "show all" for firewall, load balancer and port forwarding are divided in Japanese localized environment. This fix adjusts the CSS to fit longer characters in this condition. --- ui/css/cloudstack3.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index db77fc9a6ae..b43ceb5e141 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -7484,7 +7484,7 @@ div.panel.ui-dialog div.list-view div.fixed-header { color: #FFFFFF; background: url(../images/buttons.png) no-repeat -457px -503px; font-size: 11px; - padding: 6px 24px 6px 9px; + padding: 6px 17px 6px 9px; /*+text-shadow:0px 1px 1px #395065;*/ -moz-text-shadow: 0px 1px 1px #395065; -webkit-text-shadow: 0px 1px 1px #395065; From c49cc27b1c7adfda54beabc4bb45dfdcb481ed0d Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 6 Jul 2012 14:53:23 -0700 Subject: [PATCH 7/9] VPC: CS-15485 - dont' create a record for VPC VR private gateway nic in router_network_ref; do it for regular guest networks only --- server/src/com/cloud/network/NetworkManagerImpl.java | 4 ++-- server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 45a93103eb4..7b1ab94e1e0 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2085,12 +2085,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag List providersToImplement = getNetworkProviders(network.getId()); for (NetworkElement element : _networkElements) { if (providersToImplement.contains(element.getProvider())) { - if (!isProviderEnabledInPhysicalNetwork(getPhysicalNetworkId(network), "VirtualRouter")) { + if (!isProviderEnabledInPhysicalNetwork(getPhysicalNetworkId(network), element.getProvider().getName())) { // The physicalNetworkId will not get translated into a uuid by the reponse serializer, // because the serializer would look up the NetworkVO class's table and retrieve the // network id instead of the physical network id. // So just throw this exception as is. We may need to TBD by changing the serializer. - throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + "either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId()); + throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId()); } if (s_logger.isDebugEnabled()) { s_logger.debug("Asking " + element.getName() + " to implemenet " + network); diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java index 176f03a253b..8ef5b233fac 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -19,9 +19,11 @@ import javax.ejb.Local; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDaoImpl; import com.cloud.network.Network; +import com.cloud.network.Networks.TrafficType; import com.cloud.network.RouterNetworkDaoImpl; import com.cloud.network.RouterNetworkVO; import com.cloud.network.router.VirtualRouter.Role; +import com.cloud.offering.NetworkOffering; import com.cloud.user.UserStatisticsVO; import com.cloud.user.dao.UserStatisticsDaoImpl; import com.cloud.utils.component.ComponentLocator; @@ -265,7 +267,10 @@ public class DomainRouterDaoImpl extends GenericDaoBase im // 2) add router to the network for (Network guestNetwork : guestNetworks) { if (!isRouterPartOfGuestNetwork(router.getId(), guestNetwork.getId())) { - addRouterToGuestNetwork(router, guestNetwork); + //add only when network is not private network + if (!(guestNetwork.getName() != NetworkOffering.SystemPrivateGatewayNetworkOffering)) { + addRouterToGuestNetwork(router, guestNetwork); + } } } } From 987cf9bc93370a782cab4acaeb8b33ad5aadb2fb Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 6 Jul 2012 15:04:28 -0700 Subject: [PATCH 8/9] CS-15447: Don't enable s2s vpn when provider is disabled --- .../element/VpcVirtualRouterElement.java | 39 +++++++++++-------- .../src/com/cloud/network/vpc/VpcManager.java | 6 +++ .../com/cloud/network/vpc/VpcManagerImpl.java | 18 +++++---- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java index 29a82dd2d34..ec97961f9eb 100644 --- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java @@ -85,7 +85,6 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc private static final Map> capabilities = setCapabilities(); - @Override protected boolean canHandle(Network network, Service service) { Long physicalNetworkId = _networkMgr.getPhysicalNetworkId(network); @@ -441,21 +440,24 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc Site2SiteVpnGateway vpnGw = _vpnGatewayDao.findById(conn.getVpnGatewayId()); IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId()); - /* - if (!canHandle(network, Service.Vpn)) { - return false; - } - */ - Map vpnCapabilities = capabilities.get(Service.Vpn); if (!vpnCapabilities.get(Capability.VpnTypes).contains("s2svpn")) { + s_logger.error("try to start site 2 site vpn on unsupported network element?"); return false; } + + Long vpcId = ip.getVpcId(); + Vpc vpc = _vpcMgr.getVpc(vpcId); + + if (!_vpcMgr.vpcProviderEnabledInZone(vpc.getZoneId())) { + throw new ResourceUnavailableException("VPC provider is not enabled in zone " + vpc.getZoneId(), + DataCenter.class, vpc.getZoneId()); + } List routers = _vpcMgr.getVpcRouters(ip.getVpcId()); if (routers == null || routers.size() != 1) { - s_logger.debug("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId()); - return true; + throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(), + DataCenter.class, vpc.getZoneId()); } return _vpcRouterMgr.startSite2SiteVpn(conn, routers.get(0)); @@ -466,21 +468,24 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc Site2SiteVpnGateway vpnGw = _vpnGatewayDao.findById(conn.getVpnGatewayId()); IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId()); - /* - if (!canHandle(network, Service.Vpn)) { - return false; - } - */ - Map vpnCapabilities = capabilities.get(Service.Vpn); if (!vpnCapabilities.get(Capability.VpnTypes).contains("s2svpn")) { + s_logger.error("try to stop site 2 site vpn on unsupported network element?"); return false; } + + Long vpcId = ip.getVpcId(); + Vpc vpc = _vpcMgr.getVpc(vpcId); + + if (!_vpcMgr.vpcProviderEnabledInZone(vpc.getZoneId())) { + throw new ResourceUnavailableException("VPC provider is not enabled in zone " + vpc.getZoneId(), + DataCenter.class, vpc.getZoneId()); + } List routers = _vpcMgr.getVpcRouters(ip.getVpcId()); if (routers == null || routers.size() != 1) { - s_logger.debug("Cannot disable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId()); - return true; + throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(), + DataCenter.class, vpc.getZoneId()); } return _vpcRouterMgr.stopSite2SiteVpn(conn, routers.get(0)); diff --git a/server/src/com/cloud/network/vpc/VpcManager.java b/server/src/com/cloud/network/vpc/VpcManager.java index e42bf84961a..ebad3b4548b 100644 --- a/server/src/com/cloud/network/vpc/VpcManager.java +++ b/server/src/com/cloud/network/vpc/VpcManager.java @@ -96,4 +96,10 @@ public interface VpcManager extends VpcService{ * @return */ List getVpcRouters(long vpcId); + + /** + * @param zoneId + * @return + */ + boolean vpcProviderEnabledInZone(long zoneId); } diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index aa1ddc45b82..0a6a9b318a6 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -516,19 +516,23 @@ public class VpcManagerImpl implements VpcManager, Manager{ } @Override - public Vpc createVpc(long zoneId, long vpcOffId, Account vpcOwner, String vpcName, String displayText, String cidr, - String networkDomain) { - + public boolean vpcProviderEnabledInZone(long zoneId) + { //the provider has to be enabled at least in one network in the zone - boolean providerEnabled = false; for (PhysicalNetwork pNtwk : _pNtwkDao.listByZone(zoneId)) { if (_ntwkMgr.isProviderEnabledInPhysicalNetwork(pNtwk.getId(), Provider.VPCVirtualRouter.getName())) { - providerEnabled = true; - break; + return true; } } - if (!providerEnabled) { + return false; + } + + @Override + public Vpc createVpc(long zoneId, long vpcOffId, Account vpcOwner, String vpcName, String displayText, String cidr, + String networkDomain) { + + if (!vpcProviderEnabledInZone(zoneId)) { throw new InvalidParameterValueException("Provider " + Provider.VPCVirtualRouter.getName() + " should be enabled in at least one physical network of the zone specified"); } From a9e1c8fa8642c6e7baea5826932f3c5194b11933 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 6 Jul 2012 15:26:07 -0700 Subject: [PATCH 9/9] VPC: allow adding private gateway to the VPC when the VR is in Stopped state --- .../network/element/BareMetalElement.java | 2 +- ...VpcVirtualNetworkApplianceManagerImpl.java | 133 +++++++++++------- 2 files changed, 85 insertions(+), 50 deletions(-) diff --git a/server/src/com/cloud/network/element/BareMetalElement.java b/server/src/com/cloud/network/element/BareMetalElement.java index bbf4ff8d69d..1e56003d1f0 100644 --- a/server/src/com/cloud/network/element/BareMetalElement.java +++ b/server/src/com/cloud/network/element/BareMetalElement.java @@ -69,7 +69,7 @@ public class BareMetalElement extends AdapterBase implements NetworkElement { public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { Host host = dest.getHost(); - if (host.getHypervisorType() != HypervisorType.BareMetal) { + if (host == null || host.getHypervisorType() != HypervisorType.BareMetal) { return true; } diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index d7fcf9fb708..39d3b2da46e 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -420,22 +420,33 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian InsufficientCapacityException { boolean result = true; - try { - PlugNicCommand plugNicCmd = new PlugNicCommand(vm, nic); - - Commands cmds = new Commands(OnError.Stop); - cmds.addCommand("plugnic", plugNicCmd); - _agentMgr.send(dest.getHost().getId(), cmds); - - PlugNicAnswer plugNicAnswer = cmds.getAnswer(PlugNicAnswer.class); - if (!(plugNicAnswer != null && plugNicAnswer.getResult())) { - s_logger.warn("Unable to plug nic for vm " + vm.getHostName()); - result = false; - } + DomainRouterVO router = _routerDao.findById(vm.getId()); + if (router.getState() == State.Running) { + try { + PlugNicCommand plugNicCmd = new PlugNicCommand(vm, nic); + + Commands cmds = new Commands(OnError.Stop); + cmds.addCommand("plugnic", plugNicCmd); + _agentMgr.send(dest.getHost().getId(), cmds); + + PlugNicAnswer plugNicAnswer = cmds.getAnswer(PlugNicAnswer.class); + if (!(plugNicAnswer != null && plugNicAnswer.getResult())) { + s_logger.warn("Unable to plug nic for vm " + vm.getHostName()); + result = false; + } - } catch (OperationTimedoutException e) { - throw new AgentUnavailableException("Unable to plug nic for router " + vm.getHostName() + " in network " + network, - dest.getHost().getId(), e); + } catch (OperationTimedoutException e) { + throw new AgentUnavailableException("Unable to plug nic for router " + vm.getHostName() + " in network " + network, + dest.getHost().getId(), e); + } + } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { + s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + + ", so not sending PlugNic command to the backend"); + } else { + s_logger.warn("Unable to apply PlugNic, vm " + router + " is not in the right state " + router.getState()); + + throw new ResourceUnavailableException("Unable to apply PlugNic on the backend," + + " vm " + vm + " is not in the right state", DataCenter.class, router.getDataCenterIdToDeployIn()); } return result; @@ -447,23 +458,34 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian boolean result = true; DomainRouterVO router = _routerDao.findById(vm.getId()); - try { - UnPlugNicCommand unplugNicCmd = new UnPlugNicCommand(vm, nic); - Commands cmds = new Commands(OnError.Stop); - cmds.addCommand("unplugnic", unplugNicCmd); - _agentMgr.send(dest.getHost().getId(), cmds); - - UnPlugNicAnswer unplugNicAnswer = cmds.getAnswer(UnPlugNicAnswer.class); - if (!(unplugNicAnswer != null && unplugNicAnswer.getResult())) { - s_logger.warn("Unable to unplug nic from router " + router); - result = false; - } - - } catch (OperationTimedoutException e) { - throw new AgentUnavailableException("Unable to unplug nic from rotuer " + router + " from network " + network, - dest.getHost().getId(), e); - } + if (router.getState() == State.Running) { + try { + UnPlugNicCommand unplugNicCmd = new UnPlugNicCommand(vm, nic); + Commands cmds = new Commands(OnError.Stop); + cmds.addCommand("unplugnic", unplugNicCmd); + _agentMgr.send(dest.getHost().getId(), cmds); + + UnPlugNicAnswer unplugNicAnswer = cmds.getAnswer(UnPlugNicAnswer.class); + if (!(unplugNicAnswer != null && unplugNicAnswer.getResult())) { + s_logger.warn("Unable to unplug nic from router " + router); + result = false; + } + + } catch (OperationTimedoutException e) { + throw new AgentUnavailableException("Unable to unplug nic from rotuer " + router + " from network " + network, + dest.getHost().getId(), e); + } + } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { + s_logger.debug("Vm " + router.getInstanceName() + " is in " + router.getState() + + ", so not sending unplug nic command to the backend"); + } else { + s_logger.warn("Unable to apply unplug nic, Vm " + router + " is not in the right state " + router.getState()); + + throw new ResourceUnavailableException("Unable to apply unplug nic on the backend," + + " vm " + router +" is not in the right state", DataCenter.class, router.getDataCenterIdToDeployIn()); + } + return result; } @@ -956,29 +978,43 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian * @param add * @param privateNic * @return - * @throws AgentUnavailableException + * @throws ResourceUnavailableException TODO */ protected boolean setupVpcPrivateNetwork(VirtualRouter router, boolean add, NicProfile privateNic) - throws AgentUnavailableException { + throws ResourceUnavailableException { - PrivateIpVO ipVO = _privateIpDao.findByIpAndSourceNetworkId(privateNic.getNetworkId(), privateNic.getIp4Address()); - Network network = _networkDao.findById(privateNic.getNetworkId()); - String vlanTag = network.getBroadcastUri().getHost(); - String netmask = NetUtils.getCidrNetmask(network.getCidr()); - PrivateIpAddress ip = new PrivateIpAddress(ipVO, vlanTag, network.getGateway(), netmask, ipVO.getMacAddress()); - List privateIps = new ArrayList(1); - privateIps.add(ip); - Commands cmds = new Commands(OnError.Stop); - createVpcAssociatePrivateIPCommands(router, privateIps, cmds, add); - - if (sendCommandsToRouter(router, cmds)) { - s_logger.debug("Successfully applied ip association for ip " + ip + " in vpc network " + network); - return true; + if (router.getState() == State.Running) { + + PrivateIpVO ipVO = _privateIpDao.findByIpAndSourceNetworkId(privateNic.getNetworkId(), privateNic.getIp4Address()); + Network network = _networkDao.findById(privateNic.getNetworkId()); + String vlanTag = network.getBroadcastUri().getHost(); + String netmask = NetUtils.getCidrNetmask(network.getCidr()); + PrivateIpAddress ip = new PrivateIpAddress(ipVO, vlanTag, network.getGateway(), netmask, ipVO.getMacAddress()); + + List privateIps = new ArrayList(1); + privateIps.add(ip); + Commands cmds = new Commands(OnError.Stop); + createVpcAssociatePrivateIPCommands(router, privateIps, cmds, add); + + if (sendCommandsToRouter(router, cmds)) { + s_logger.debug("Successfully applied ip association for ip " + ip + " in vpc network " + network); + return true; + } else { + s_logger.warn("Failed to associate ip address " + ip + " in vpc network " + network); + return false; + } + } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { + s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + + ", so not sending setup private network command to the backend"); } else { - s_logger.warn("Failed to associate ip address " + ip + " in vpc network " + network); - return false; + s_logger.warn("Unable to setup private gateway, virtual router " + router + " is not in the right state " + router.getState()); + + throw new ResourceUnavailableException("Unable to setup Private gateway on the backend," + + " virtual router " + router + " is not in the right state", DataCenter.class, router.getDataCenterIdToDeployIn()); } + return true; + } @Override @@ -1031,7 +1067,6 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian for (VirtualRouter router : routers) { if (router.getState() == State.Running) { result = result && sendStaticRoutes(staticRoutes, routers.get(0)); - } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + ", so not sending StaticRoute command to the backend");