From 0049c74a5efeffd8dec5466563c8776d79cb5e19 Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 16 Dec 2010 17:41:53 -0800 Subject: [PATCH] 1) Different format for LoadBalancerCommand. 2) When apply lb rule for domR, resend all lb rules belonging to the lb network --- .../routing/LoadBalancerConfigCommand.java | 81 +--- .../cloud/agent/api/to/LoadBalancerTO.java | 107 +++++ api/src/com/cloud/dc/Vlan.java | 4 +- .../cloud/network/DomainRouterService.java | 2 + .../com/cloud/network/PublicIpAddress.java | 35 ++ .../cloud/network/element/NetworkElement.java | 4 +- .../cloud/network/lb/LoadBalancingRule.java | 2 +- .../src/com/cloud/api/ApiResponseHelper.java | 6 +- .../ConfigurationManagerImpl.java | 14 +- server/src/com/cloud/dc/VlanVO.java | 10 +- server/src/com/cloud/dc/dao/VlanDaoImpl.java | 4 +- .../src/com/cloud/network/NetworkManager.java | 3 +- .../com/cloud/network/NetworkManagerImpl.java | 18 +- .../src/com/cloud/network/addr/PublicIp.java | 11 +- .../network/dao/FirewallRulesDaoImpl.java | 3 +- .../cloud/network/dao/LoadBalancerDao.java | 7 +- .../network/dao/LoadBalancerDaoImpl.java | 11 +- .../cloud/network/element/DhcpElement.java | 4 +- .../network/element/DomainRouterElement.java | 23 +- .../cloud/network/guru/DirectNetworkGuru.java | 6 +- .../cloud/network/guru/PublicNetworkGuru.java | 6 +- .../network/lb/LoadBalancingRulesManager.java | 4 + .../lb/LoadBalancingRulesManagerImpl.java | 5 +- .../network/router/DomainRouterManager.java | 6 +- .../router/DomainRouterManagerImpl.java | 436 +++++++++++++++--- .../cloud/server/ManagementServerImpl.java | 4 +- server/src/com/cloud/vm/UserVmManager.java | 1 - .../src/com/cloud/vm/UserVmManagerImpl.java | 337 ++++++++++++-- 28 files changed, 928 insertions(+), 226 deletions(-) create mode 100644 api/src/com/cloud/agent/api/to/LoadBalancerTO.java create mode 100644 api/src/com/cloud/network/PublicIpAddress.java diff --git a/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java b/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java index 8a8925ce1ef..b0b19888b71 100644 --- a/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java +++ b/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java @@ -19,89 +19,20 @@ package com.cloud.agent.api.routing; import java.util.List; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.agent.api.to.LoadBalancerTO; /** * LoadBalancerConfigCommand sends the load balancer configuration * to the load balancer. Isn't that kinda obvious? */ public class LoadBalancerConfigCommand extends RoutingCommand { - String srcIp; - int srcPort; - String protocol; - String algorithm; - boolean revoked; - boolean alreadyAdded; - DestinationTO[] destinations; + List loadBalancers; - public LoadBalancerConfigCommand(String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List destinations) { - this.srcIp = srcIp; - this.srcPort = srcPort; - this.protocol = protocol; - this.algorithm = algorithm; - this.revoked = revoked; - this.alreadyAdded = alreadyAdded; - this.destinations = new DestinationTO[destinations.size()]; - int i = 0; - for (LbDestination destination : destinations) { - this.destinations[i++] = new DestinationTO(destination.getIpAddress(), destination.getDestinationPortStart(), destination.isRevoked(), false); - } - } - - public String getSrcIp() { - return srcIp; + public LoadBalancerConfigCommand(List loadBalancers) { + this.loadBalancers = loadBalancers; } - public int getSrcPort() { - return srcPort; - } - - public String getAlgorithm() { - return algorithm; - } - - public String getProtocol() { - return protocol; - } - - public boolean isRevoked() { - return revoked; - } - - public boolean isAlreadyAdded() { - return alreadyAdded; - } - - public DestinationTO[] getDestinations() { - return destinations; - } - - public class DestinationTO { - String destIp; - int destPort; - boolean revoked; - boolean alreadyAdded; - public DestinationTO(String destIp, int destPort, boolean revoked, boolean alreadyAdded) { - this.destIp = destIp; - this.destPort = destPort; - this.revoked = revoked; - this.alreadyAdded = alreadyAdded; - } - - public String getDestIp() { - return destIp; - } - - public int getDestPort() { - return destPort; - } - - public boolean isRevoked() { - return revoked; - } - - public boolean isAlreadyAdded() { - return alreadyAdded; - } + public List getLoadBalancers() { + return loadBalancers; } } diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java new file mode 100644 index 00000000000..323a21f2a2f --- /dev/null +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -0,0 +1,107 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.agent.api.to; + +import java.util.List; + +import com.cloud.network.lb.LoadBalancingRule.LbDestination; + + +public class LoadBalancerTO { + String srcIp; + int srcPort; + String protocol; + String algorithm; + boolean revoked; + boolean alreadyAdded; + DestinationTO[] destinations; + + + public LoadBalancerTO (String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List destinations) { + this.srcIp = srcIp; + this.srcPort = srcPort; + this.protocol = protocol; + this.algorithm = algorithm; + this.revoked = revoked; + this.alreadyAdded = alreadyAdded; + this.destinations = new DestinationTO[destinations.size()]; + int i = 0; + for (LbDestination destination : destinations) { + this.destinations[i++] = new DestinationTO(destination.getIpAddress(), destination.getDestinationPortStart(), destination.isRevoked(), false); + } + } + + public String getSrcIp() { + return srcIp; + } + + public int getSrcPort() { + return srcPort; + } + + public String getAlgorithm() { + return algorithm; + } + + public String getProtocol() { + return protocol; + } + + public boolean isRevoked() { + return revoked; + } + + public boolean isAlreadyAdded() { + return alreadyAdded; + } + + public DestinationTO[] getDestinations() { + return destinations; + } + + + public class DestinationTO { + String destIp; + int destPort; + boolean revoked; + boolean alreadyAdded; + public DestinationTO(String destIp, int destPort, boolean revoked, boolean alreadyAdded) { + this.destIp = destIp; + this.destPort = destPort; + this.revoked = revoked; + this.alreadyAdded = alreadyAdded; + } + + public String getDestIp() { + return destIp; + } + + public int getDestPort() { + return destPort; + } + + public boolean isRevoked() { + return revoked; + } + + public boolean isAlreadyAdded() { + return alreadyAdded; + } + } + +} diff --git a/api/src/com/cloud/dc/Vlan.java b/api/src/com/cloud/dc/Vlan.java index 588092f1dfa..d6076bd0431 100644 --- a/api/src/com/cloud/dc/Vlan.java +++ b/api/src/com/cloud/dc/Vlan.java @@ -26,9 +26,9 @@ public interface Vlan { public final static String UNTAGGED = "untagged"; - public Long getId(); + public long getId(); - public String getVlanId(); + public String getVlanTag(); public String getVlanGateway(); diff --git a/api/src/com/cloud/network/DomainRouterService.java b/api/src/com/cloud/network/DomainRouterService.java index f21f352271e..11d1259b81e 100644 --- a/api/src/com/cloud/network/DomainRouterService.java +++ b/api/src/com/cloud/network/DomainRouterService.java @@ -65,4 +65,6 @@ public interface DomainRouterService { VirtualRouter upgradeRouter(UpgradeRouterCmd cmd); + + } diff --git a/api/src/com/cloud/network/PublicIpAddress.java b/api/src/com/cloud/network/PublicIpAddress.java new file mode 100644 index 00000000000..61b9ff4b7a1 --- /dev/null +++ b/api/src/com/cloud/network/PublicIpAddress.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network; + +import com.cloud.acl.ControlledEntity; + +/** + * PublicIp is a combo object of IPAddressVO and VLAN information. + */ + +public interface PublicIpAddress extends ControlledEntity, IpAddress{ + + String getMacAddress(); + + public String getNetmask(); + + public String getGateway(); + + public String getVlanTag(); +} \ No newline at end of file diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java index e4357baeabe..0ac546708ec 100644 --- a/api/src/com/cloud/network/element/NetworkElement.java +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -10,8 +10,8 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.IpAddress; import com.cloud.network.Network; +import com.cloud.network.PublicIpAddress; import com.cloud.network.rules.FirewallRule; import com.cloud.offering.NetworkOffering; import com.cloud.utils.component.Adapter; @@ -76,7 +76,7 @@ public interface NetworkElement extends Adapter { * @return * @throws ResourceUnavailableException */ - boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException; + boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException; /** * Apply rules diff --git a/api/src/com/cloud/network/lb/LoadBalancingRule.java b/api/src/com/cloud/network/lb/LoadBalancingRule.java index d7cb938c1b8..8b0a8b4f035 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRule.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRule.java @@ -76,7 +76,7 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer{ @Override public String getProtocol() { - return null; + return lb.getProtocol(); } @Override diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 76f3c0688c8..0cb27377acd 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -548,7 +548,7 @@ public class ApiResponseHelper implements ResponseGenerator { VlanIpRangeResponse vlanResponse = new VlanIpRangeResponse(); vlanResponse.setId(vlan.getId()); vlanResponse.setForVirtualNetwork(vlan.getVlanType().equals(VlanType.VirtualNetwork)); - vlanResponse.setVlan(vlan.getVlanId()); + vlanResponse.setVlan(vlan.getVlanTag()); vlanResponse.setZoneId(vlan.getDataCenterId()); if (podId != null) { @@ -617,7 +617,7 @@ public class ApiResponseHelper implements ResponseGenerator { Account account = UserContext.current().getAccount(); if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) { ipResponse.setVlanId(ipAddress.getVlanId()); - ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddress.getVlanId()).getVlanId()); + ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddress.getVlanId()).getVlanTag()); } ipResponse.setObjectName("ipaddress"); return ipResponse; @@ -2178,7 +2178,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setEndIp(range[1]); response.setGateway(singleVlan.getVlanGateway()); response.setNetmask(singleVlan.getVlanNetmask()); - response.setVlan(singleVlan.getVlanId()); + response.setVlan(singleVlan.getVlanTag()); } response.setZoneId(network.getDataCenterId()); diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 5ed037b4018..d9a3135ee92 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1775,17 +1775,17 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura otherVlanEndIP = otherVlanIpRange[1]; } - if (!vlanId.equals(vlan.getVlanId()) && newVlanSubnet.equals(otherVlanSubnet)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanId() + " in zone " + zone.getName() + " has the same subnet. Please specify a different gateway/netmask."); + if (!vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet)) { + throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " in zone " + zone.getName() + " has the same subnet. Please specify a different gateway/netmask."); } - if (vlanId.equals(vlan.getVlanId()) && newVlanSubnet.equals(otherVlanSubnet)) { + if (vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet)) { if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanId() + " already has IPs that overlap with the new range. Please specify a different start IP/end IP."); + throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " already has IPs that overlap with the new range. Please specify a different start IP/end IP."); } if (!vlanGateway.equals(otherVlanGateway)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanId() + " has already been added with gateway " + otherVlanGateway + ". Please specify a different tag."); + throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " has already been added with gateway " + otherVlanGateway + ". Please specify a different tag."); } } } @@ -1966,14 +1966,14 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String[] ipRange = vlan.getIpRange().split("\\-"); String startIP = ipRange[0]; String endIP = (ipRange.length > 1) ? ipRange[1] : null; - String eventMsg = "Successfully deleted IP range (tag = " + vlan.getVlanId() + ", gateway = " + vlan.getVlanGateway() + ", netmask = " + vlan.getVlanNetmask() + ", start IP = " + startIP; + String eventMsg = "Successfully deleted IP range (tag = " + vlan.getVlanTag() + ", gateway = " + vlan.getVlanGateway() + ", netmask = " + vlan.getVlanNetmask() + ", start IP = " + startIP; if (endIP != null) { eventMsg += ", end IP = " + endIP; } eventMsg += "."; saveConfigurationEvent(userId, null, EventTypes.EVENT_VLAN_IP_RANGE_DELETE, eventMsg, "vlanType=" + vlan.getVlanType(), "dcId=" + vlan.getDataCenterId(), "accountId=" + accountId, "podId=" + podId, - "vlanId=" + vlan.getVlanId(), "vlanGateway=" + vlan.getVlanGateway(), + "vlanId=" + vlan.getVlanTag(), "vlanGateway=" + vlan.getVlanGateway(), "vlanNetmask=" + vlan.getVlanNetmask(), "startIP=" + startIP, "endIP=" + endIP); } diff --git a/server/src/com/cloud/dc/VlanVO.java b/server/src/com/cloud/dc/VlanVO.java index 29e94e50fad..99eeda2de0e 100644 --- a/server/src/com/cloud/dc/VlanVO.java +++ b/server/src/com/cloud/dc/VlanVO.java @@ -37,7 +37,7 @@ public class VlanVO implements Vlan { Long id; @Column(name="vlan_id") - String vlanId; + String vlanTag; @Column(name="vlan_gateway") String vlanGateway; @@ -60,7 +60,7 @@ public class VlanVO implements Vlan { public VlanVO(VlanType vlanType, String vlanTag, String vlanGateway, String vlanNetmask, long dataCenterId, String ipRange, Long networkId) { this.vlanType = vlanType; - this.vlanId = vlanTag; + this.vlanTag = vlanTag; this.vlanGateway = vlanGateway; this.vlanNetmask = vlanNetmask; this.dataCenterId = dataCenterId; @@ -72,12 +72,12 @@ public class VlanVO implements Vlan { } - public Long getId() { + public long getId() { return id; } - public String getVlanId() { - return vlanId; + public String getVlanTag() { + return vlanTag; } public String getVlanGateway() { diff --git a/server/src/com/cloud/dc/dao/VlanDaoImpl.java b/server/src/com/cloud/dc/dao/VlanDaoImpl.java index 03f463aa0f5..6c69fa91227 100644 --- a/server/src/com/cloud/dc/dao/VlanDaoImpl.java +++ b/server/src/com/cloud/dc/dao/VlanDaoImpl.java @@ -79,7 +79,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao public VlanDaoImpl() { ZoneVlanIdSearch = createSearchBuilder(); ZoneVlanIdSearch.and("zoneId", ZoneVlanIdSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - ZoneVlanIdSearch.and("vlanId", ZoneVlanIdSearch.entity().getVlanId(), SearchCriteria.Op.EQ); + ZoneVlanIdSearch.and("vlanId", ZoneVlanIdSearch.entity().getVlanTag(), SearchCriteria.Op.EQ); ZoneVlanIdSearch.done(); ZoneSearch = createSearchBuilder(); @@ -222,7 +222,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao // Try to find an empty VLAN with the same tag/subnet as a VLAN that is full for (VlanVO fullVlan : fullVlans) { for (VlanVO emptyVlan : emptyVlans) { - if (fullVlan.getVlanId().equals(emptyVlan.getVlanId()) && + if (fullVlan.getVlanTag().equals(emptyVlan.getVlanTag()) && fullVlan.getVlanGateway().equals(emptyVlan.getVlanGateway()) && fullVlan.getVlanNetmask().equals(emptyVlan.getVlanNetmask())) { return emptyVlan; diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index aa0bdf8baea..ffdfe4d7f6d 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -19,7 +19,6 @@ package com.cloud.network; import java.util.List; -import com.cloud.agent.manager.Commands; import com.cloud.dc.Vlan.VlanType; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; @@ -30,6 +29,7 @@ import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.addr.PublicIp; import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRuleVO; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.user.Account; @@ -126,5 +126,4 @@ public interface NetworkManager extends NetworkService { String getNextAvailableMacAddressInNetwork(long networkConfigurationId) throws InsufficientAddressCapacityException; boolean applyRules(Ip ip, List rules, boolean continueOnError) throws ResourceUnavailableException; - } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 382b3f44d38..24d5043f7fd 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -92,6 +92,7 @@ import com.cloud.network.Networks.Availability; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; +import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.RemoteAccessVpnDao; @@ -181,6 +182,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Inject DomainRouterManager _routerMgr; @Inject RulesManager _rulesMgr; @Inject LoadBalancingRulesManager _lbMgr; + @Inject FirewallRulesDao _firewallRulesDao; @Inject(adapter=NetworkGuru.class) Adapters _networkGurus; @@ -372,7 +374,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag for (final IPAddressVO ip: ipList) { sourceNat = ip.isSourceNat(); VlanVO vlan = vlanAndIp.getKey(); - String vlanId = vlan.getVlanId(); + String vlanId = vlan.getVlanTag(); String vlanGateway = vlan.getVlanGateway(); String vlanNetmask = vlan.getVlanNetmask(); @@ -455,11 +457,18 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag public boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException { List userIps = _ipAddressDao.listByNetwork(network.getId()); - + List publicIps = new ArrayList(); + if (userIps != null && !userIps.isEmpty()) { + for (IPAddressVO userIp : userIps) { + PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), userIp.getMacAddress()); + publicIps.add(publicIp); + } + } + boolean success = true; for (NetworkElement element : _networkElements) { try { - element.applyIps(network, userIps); + element.applyIps(network, publicIps); } catch (ResourceUnavailableException e) { success = false; if (!continueOnError) { @@ -2049,8 +2058,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - - @Override public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException{ String accountName = cmd.getAccountName(); @@ -2082,5 +2089,4 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } return success; } - } diff --git a/server/src/com/cloud/network/addr/PublicIp.java b/server/src/com/cloud/network/addr/PublicIp.java index ce12278259a..cd451aa6373 100644 --- a/server/src/com/cloud/network/addr/PublicIp.java +++ b/server/src/com/cloud/network/addr/PublicIp.java @@ -21,13 +21,13 @@ import java.util.Date; import com.cloud.dc.VlanVO; import com.cloud.network.IPAddressVO; -import com.cloud.network.IpAddress; +import com.cloud.network.PublicIpAddress; import com.cloud.utils.net.NetUtils; /** * PublicIp is a combo object of IPAddressVO and VLAN information. */ -public class PublicIp implements IpAddress { +public class PublicIp implements PublicIpAddress{ IPAddressVO _addr; VlanVO _vlan; String macAddress; @@ -43,16 +43,19 @@ public class PublicIp implements IpAddress { return _addr.getAddress(); } + @Override public String getNetmask() { return _vlan.getVlanNetmask(); } + @Override public String getGateway() { return _vlan.getVlanGateway(); } + @Override public String getVlanTag() { - return _vlan.getVlanId(); + return _vlan.getVlanTag(); } @Override @@ -118,6 +121,7 @@ public class PublicIp implements IpAddress { return _vlan; } + @Override public String getMacAddress() { return macAddress; } @@ -126,4 +130,5 @@ public class PublicIp implements IpAddress { public Long getAssociatedNetworkId() { return _addr.getAssociatedNetworkId(); } + } diff --git a/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java index 28852a35605..57f6cd4688f 100644 --- a/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java +++ b/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java @@ -51,6 +51,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i AllFieldsSearch.and("account", AllFieldsSearch.entity().getAccountId(), Op.EQ); AllFieldsSearch.and("domain", AllFieldsSearch.entity().getDomainId(), Op.EQ); AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ); + AllFieldsSearch.and("networkId", AllFieldsSearch.entity().getNetworkId(), Op.EQ); AllFieldsSearch.done(); @@ -69,7 +70,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i return listBy(sc); } - + @Override public boolean setStateToAdd(FirewallRuleVO rule) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/server/src/com/cloud/network/dao/LoadBalancerDao.java b/server/src/com/cloud/network/dao/LoadBalancerDao.java index 90822effa4e..e48027dfe5b 100644 --- a/server/src/com/cloud/network/dao/LoadBalancerDao.java +++ b/server/src/com/cloud/network/dao/LoadBalancerDao.java @@ -18,8 +18,8 @@ package com.cloud.network.dao; -import java.util.List; - +import java.util.List; + import com.cloud.network.LoadBalancerVO; import com.cloud.utils.db.GenericDao; @@ -27,5 +27,6 @@ public interface LoadBalancerDao extends GenericDao { List listInstancesByLoadBalancer(long loadBalancerId); List listByIpAddress(String ipAddress); LoadBalancerVO findByIpAddressAndPublicPort(String ipAddress, String publicPort); - LoadBalancerVO findByAccountAndName(Long accountId, String name); + LoadBalancerVO findByAccountAndName(Long accountId, String name); + List listByNetworkId(long networkId); } diff --git a/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java index e080ed35677..f74837cb1a2 100644 --- a/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java +++ b/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java @@ -27,7 +27,6 @@ import javax.ejb.Local; import org.apache.log4j.Logger; -import com.cloud.domain.DomainVO; import com.cloud.network.LoadBalancerVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -51,7 +50,8 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im protected LoadBalancerDaoImpl() { ListByIp = createSearchBuilder(); - ListByIp.and("ipAddress", ListByIp.entity().getSourceIpAddress(), SearchCriteria.Op.EQ); + ListByIp.and("ipAddress", ListByIp.entity().getSourceIpAddress(), SearchCriteria.Op.EQ); + ListByIp.and("networkId", ListByIp.entity().getNetworkId(), SearchCriteria.Op.EQ); ListByIp.done(); IpAndPublicPortSearch = createSearchBuilder(); @@ -91,6 +91,13 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im SearchCriteria sc = ListByIp.create(); sc.setParameters("ipAddress", ipAddress); return listBy(sc); + } + + @Override + public List listByNetworkId(long networkId) { + SearchCriteria sc = ListByIp.create(); + sc.setParameters("networkId", networkId); + return listBy(sc); } @Override diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index f058bee6318..40d28c484cf 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -29,9 +29,9 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.NetworkManager; +import com.cloud.network.PublicIpAddress; import com.cloud.network.dao.NetworkDao; import com.cloud.network.router.DomainRouterManager; import com.cloud.network.rules.FirewallRule; @@ -122,7 +122,7 @@ public class DhcpElement extends AdapterBase implements NetworkElement { } @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { + public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { return true; } } diff --git a/server/src/com/cloud/network/element/DomainRouterElement.java b/server/src/com/cloud/network/element/DomainRouterElement.java index fb0dfb4a3c5..8cbcc7de564 100644 --- a/server/src/com/cloud/network/element/DomainRouterElement.java +++ b/server/src/com/cloud/network/element/DomainRouterElement.java @@ -17,6 +17,7 @@ */ package com.cloud.network.element; +import java.util.ArrayList; import java.util.List; import javax.ejb.Local; @@ -30,10 +31,15 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.IpAddress; +import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; import com.cloud.network.NetworkManager; +import com.cloud.network.PublicIpAddress; +import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.DomainRouterManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; @@ -60,12 +66,14 @@ public class DomainRouterElement extends AdapterBase implements NetworkElement { @Inject NetworkDao _networkConfigDao; @Inject NetworkManager _networkMgr; + @Inject LoadBalancingRulesManager _lbMgr; @Inject NetworkOfferingDao _networkOfferingDao; @Inject DomainRouterManager _routerMgr; @Inject UserVmManager _userVmMgr; @Inject UserVmDao _userVmDao; @Inject DomainRouterDao _routerDao; @Inject DataCenterDao _dataCenterDao; + @Inject LoadBalancerDao _lbDao; private boolean canHandle(GuestIpType ipType, DataCenter dc) { @@ -123,7 +131,16 @@ public class DomainRouterElement extends AdapterBase implements NetworkElement { if (canHandle(config.getGuestType(),dc)) { if (rules != null && !rules.isEmpty()) { if (rules.get(0).getPurpose() == Purpose.LoadBalancing) { - return _routerMgr.applyLBRules(config, rules); + //for load balancer we have to resend all lb rules for the network + List lbs = _lbDao.listByNetworkId(config.getId()); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList); + lbRules.add(loadBalancing); + } + + return _routerMgr.applyLBRules(config, lbRules); } else if (rules.get(0).getPurpose() == Purpose.PortForwarding) { return _routerMgr.applyPortForwardingRules(config, rules); } @@ -135,7 +152,7 @@ public class DomainRouterElement extends AdapterBase implements NetworkElement { } @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { + public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { DataCenter dc = _dataCenterDao.findById(network.getDataCenterId()); if (canHandle(network.getGuestType(),dc)) { return _routerMgr.associateIP(network, ipAddress); diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java index 9d8492461b5..f996676d31c 100644 --- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java @@ -92,11 +92,11 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { nic.setIp4Address(ip.getAddress()); nic.setGateway(ip.getGateway()); nic.setNetmask(ip.getNetmask()); - nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag())); + nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanId())); nic.setBroadcastType(BroadcastDomainType.Vlan); - nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag())); + nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanId())); nic.setFormat(AddressFormat.Ip4); - nic.setReservationId(ip.getVlanTag()); + nic.setReservationId(String.valueOf(ip.getVlanId())); nic.setMacAddress(ip.getMacAddress()); } nic.setDns1(dc.getDns1()); diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java index 403dd78fbcb..6cc9097c7e0 100644 --- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java @@ -75,11 +75,11 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { nic.setIp4Address(ip.getAddress()); nic.setGateway(ip.getGateway()); nic.setNetmask(ip.getNetmask()); - nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag())); + nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanId())); nic.setBroadcastType(BroadcastDomainType.Vlan); - nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag())); + nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanId())); nic.setFormat(AddressFormat.Ip4); - nic.setReservationId(ip.getVlanTag()); + nic.setReservationId(String.valueOf(ip.getVlanId())); nic.setMacAddress(ip.getMacAddress()); } nic.setDns1(dc.getDns1()); diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java index db77dd2d9b9..9f28f1d10a8 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java @@ -17,8 +17,12 @@ */ package com.cloud.network.lb; +import java.util.List; + +import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.utils.net.Ip; public interface LoadBalancingRulesManager extends LoadBalancingRulesService { boolean removeAllLoadBalanacers(Ip ip); + List getExistingDestinations(long lbId); } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index c4314843d45..8910da86528 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -184,7 +184,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, } - @Override @DB + @Override public boolean removeFromLoadBalancer(long loadBalancerId, List instanceIds) { UserContext caller = UserContext.current(); @@ -375,7 +375,8 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, return true; } - private List getExistingDestinations(long lbId) { + @Override + public List getExistingDestinations(long lbId) { List dstList = new ArrayList(); List lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lbId); LoadBalancerVO lb = _lbDao.findById(lbId); diff --git a/server/src/com/cloud/network/router/DomainRouterManager.java b/server/src/com/cloud/network/router/DomainRouterManager.java index 8a7f6464d7a..1a1bb353e11 100644 --- a/server/src/com/cloud/network/router/DomainRouterManager.java +++ b/server/src/com/cloud/network/router/DomainRouterManager.java @@ -28,11 +28,12 @@ import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.IpAddress; import com.cloud.network.Network; +import com.cloud.network.PublicIpAddress; import com.cloud.network.RemoteAccessVpnVO; import com.cloud.network.VpnUserVO; import com.cloud.network.rules.FirewallRule; +import com.cloud.service.ServiceOfferingVO; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.component.Manager; @@ -103,8 +104,9 @@ public interface DomainRouterManager extends Manager { DomainRouterVO addVirtualMachineIntoNetwork(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context, Boolean startDhcp) throws ConcurrentOperationException, InsufficientNetworkCapacityException, ResourceUnavailableException; - boolean associateIP (Network network, List ipAddress); + boolean associateIP (Network network, List ipAddress); boolean applyLBRules(Network network, List rules); boolean applyPortForwardingRules(Network network, List rules); + } diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java index 8561281ddff..3aaf98d252f 100644 --- a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java +++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java @@ -20,7 +20,6 @@ package com.cloud.network.router; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -55,6 +54,7 @@ import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand; import com.cloud.agent.api.routing.SavePasswordCommand; import com.cloud.agent.api.routing.VmDataCommand; import com.cloud.agent.api.routing.VpnUsersCfgCommand; +import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; import com.cloud.api.commands.RebootRouterCmd; @@ -72,6 +72,8 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceLimitDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; +import com.cloud.dc.Vlan; +import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.DataCenterDao; @@ -79,6 +81,7 @@ import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; +import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.event.Event; import com.cloud.event.EventTypes; @@ -109,6 +112,7 @@ import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PublicIpAddress; import com.cloud.network.RemoteAccessVpnVO; import com.cloud.network.SshKeysDistriMonitor; import com.cloud.network.VpnUserVO; @@ -127,7 +131,6 @@ import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.PortForwardingRuleVO; import com.cloud.network.rules.RulesManager; -import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -145,6 +148,7 @@ import com.cloud.storage.dao.VolumeDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountService; +import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.UserContext; import com.cloud.user.UserStatisticsVO; @@ -168,7 +172,6 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.State; -import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineGuru; import com.cloud.vm.VirtualMachineManager; @@ -283,7 +286,322 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } } - @Override + @DB + public DomainRouterVO createDhcpServerForDirectlyAttachedGuests(long userId, long accountId, DataCenterVO dc, HostPodVO pod, Long candidateHost, VlanVO guestVlan) throws ConcurrentOperationException{ + + final AccountVO account = _accountDao.findById(accountId); + boolean podVlan = guestVlan.getVlanType().equals(VlanType.DirectAttached) && guestVlan.getVlanTag().equals(Vlan.UNTAGGED); + long accountIdForDHCPServer = podVlan ? Account.ACCOUNT_ID_SYSTEM : accountId; + long domainIdForDHCPServer = podVlan ? DomainVO.ROOT_DOMAIN : account.getDomainId(); + String domainNameForDHCPServer = podVlan ? "root" : _domainDao.findById(account.getDomainId()).getName(); + + final VMTemplateVO rtrTemplate = _templateDao.findRoutingTemplate(); + + final Transaction txn = Transaction.currentTxn(); + DomainRouterVO router = null; + Long podId = pod.getId(); + pod = _podDao.acquireInLockTable(podId, 20*60); + if (pod == null) { + throw new ConcurrentOperationException("Unable to acquire lock on pod " + podId ); + } + if(s_logger.isDebugEnabled()) { + s_logger.debug("Lock on pod " + podId + " is acquired"); + } + + final long id = _routerDao.getNextInSequence(Long.class, "id"); + final String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(dc.getId()); + final String mgmtMacAddress = macAddresses[0]; + final String guestMacAddress = macAddresses[1]; + final String name = VirtualMachineName.getRouterName(id, _instance).intern(); + + boolean routerLockAcquired = false; + try { + List rtrs = _routerDao.listByVlanDbId(guestVlan.getId()); + assert rtrs.size() < 2 : "How did we get more than one router per vlan?"; + if (rtrs.size() == 1) { + return rtrs.get(0); + } + String mgmtNetmask = NetUtils.getCidrNetmask(pod.getCidrSize()); + final String guestIp = null;//_ipAddressDao.assignIpAddress(accountIdForDHCPServer, domainIdForDHCPServer, guestVlan.getId(), false).getAddress(); + + router = + new DomainRouterVO(id, + _offering.getId(), + name, + mgmtMacAddress, + null, + mgmtNetmask, + _routerTemplateId, + rtrTemplate.getGuestOSId(), + guestMacAddress, + guestIp, + guestVlan.getVlanNetmask(), + accountIdForDHCPServer, + domainIdForDHCPServer, + "FE:FF:FF:FF:FF:FF", + null, + "255.255.255.255", + guestVlan.getId(), + guestVlan.getVlanTag(), + pod.getId(), + dc.getId(), + _routerRamSize, + guestVlan.getVlanGateway(), + domainNameForDHCPServer, + dc.getDns1(), + dc.getDns2()); + router.setRole(Role.DHCP_USERDATA); + router.setVnet(guestVlan.getVlanTag()); + + router.setLastHostId(candidateHost); + + txn.start(); + router = _routerDao.persist(router); + router = _routerDao.acquireInLockTable(router.getId()); + if (router == null) { + s_logger.debug("Unable to acquire lock on router " + id); + throw new CloudRuntimeException("Unable to acquire lock on router " + id); + } + + routerLockAcquired = true; + + txn.commit(); + + List vols = _storageMgr.create(account, router, rtrTemplate, dc, pod, _offering, null,0); + if (vols == null){ + _ipAddressDao.unassignIpAddress(guestIp); + _routerDao.expunge(router.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to create dhcp server in storage host or pool in pod " + pod.getName() + " (id:" + pod.getId() + ")"); + } + } + + final EventVO event = new EventVO(); + event.setUserId(userId); + event.setAccountId(accountIdForDHCPServer); + event.setType(EventTypes.EVENT_ROUTER_CREATE); + + if (vols == null) { + event.setDescription("failed to create DHCP Server : " + router.getName()); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); + throw new ExecutionException("Unable to create DHCP Server"); + } + _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, null); + + s_logger.info("DHCP server created: id=" + router.getId() + "; name=" + router.getName() + "; vlan=" + guestVlan.getVlanTag() + "; pod=" + pod.getName()); + + event.setDescription("successfully created DHCP Server : " + router.getName() + " with ip : " + router.getGuestIpAddress()); + _eventDao.persist(event); + + return router; + } catch (final Throwable th) { + if (th instanceof ExecutionException) { + s_logger.error("Error while starting router due to " + th.getMessage()); + } else { + s_logger.error("Unable to create router", th); + } + txn.rollback(); + + if (router.getState() == State.Creating) { + _routerDao.expunge(router.getId()); + } + return null; + } finally { + if (routerLockAcquired) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Releasing lock on router " + id); + } + _routerDao.releaseFromLockTable(id); + } + if (pod != null) { + if(s_logger.isDebugEnabled()) { + s_logger.debug("Releasing lock on pod " + podId); + } + _podDao.releaseFromLockTable(pod.getId()); + } + } + } + +// @Override +// public boolean releaseRouter(final long routerId) { +// return destroyRouter(routerId); +// } +// +// @Override @DB +// public DomainRouterVO createRouter(final long accountId, final String publicIpAddress, final long dataCenterId, +// String domain, final ServiceOfferingVO offering, long startEventId) +// throws ConcurrentOperationException { +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Creating a router for account=" + accountId + "; publicIpAddress=" + publicIpAddress + "; dc=" + dataCenterId + "domain=" + domain); +// } +// +// final AccountVO account = _accountDao.acquireInLockTable(accountId); +// if (account == null) { +// throw new ConcurrentOperationException("Unable to acquire account " + accountId); +// } +// +// if(s_logger.isDebugEnabled()) { +// s_logger.debug("lock on account " + accountId + " for createRouter is acquired"); +// } +// +// final Transaction txn = Transaction.currentTxn(); +// DomainRouterVO router = null; +// boolean success = false; +// try { +// router = _routerDao.findBy(accountId, dataCenterId); +// if (router != null && router.getState() != State.Creating) { +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Router " + router.toString() + " found for account " + accountId + " in data center " + dataCenterId); +// } +// success = true; +// return router; +// } +// EventVO event = new EventVO(); +// event.setUserId(1L); +// event.setAccountId(accountId); +// event.setType(EventTypes.EVENT_ROUTER_CREATE); +// event.setState(Event.State.Started); +// event.setStartId(startEventId); +// event.setDescription("Creating Router for account with Id: "+accountId); +// event = _eventDao.persist(event); +// +// final DataCenterVO dc = _dcDao.findById(dataCenterId); +// final VMTemplateVO template = _templateDao.findRoutingTemplate(); +// +// String[] macAddresses = getMacAddressPair(dataCenterId); +// String privateMacAddress = macAddresses[0]; +// String publicMacAddress = macAddresses[1]; +// +// final long id = _routerDao.getNextInSequence(Long.class, "id"); +// +// if (domain == null) { +// domain = "v" + Long.toHexString(accountId) + "." + _domain; +// } +// +// final String name = VirtualMachineName.getRouterName(id, _instance).intern(); +// long routerMacAddress = NetUtils.mac2Long(dc.getRouterMacAddress()) | ((dc.getId() & 0xff) << 32); +// +// //set the guestNetworkCidr from the dc obj +// String guestNetworkCidr = dc.getGuestNetworkCidr(); +// String[] cidrTuple = guestNetworkCidr.split("\\/"); +// String guestIpAddress = NetUtils.getIpRangeStartIpFromCidr(cidrTuple[0], Long.parseLong(cidrTuple[1])); +// String guestNetmask = NetUtils.getCidrNetmask(Long.parseLong(cidrTuple[1])); +// +//// String path = null; +//// final int numVolumes = offering.isMirroredVolumes()?2:1; +//// long routerId = 0; +// +// // Find the VLAN ID, VLAN gateway, and VLAN netmask for publicIpAddress +// IPAddressVO ipVO = _ipAddressDao.findById(publicIpAddress); +// VlanVO vlan = _vlanDao.findById(ipVO.getVlanId()); +// String vlanId = vlan.getVlanTag(); +// String vlanGateway = vlan.getVlanGateway(); +// String vlanNetmask = vlan.getVlanNetmask(); +// +// Pair pod = null; +// Set avoids = new HashSet(); +// boolean found = false; +// while ((pod = _agentMgr.findPod(template, offering, dc, accountId, avoids)) != null) { +// +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Attempting to create in pod " + pod.first().getName()); +// } +// +// router = new DomainRouterVO(id, +// _offering.getId(), +// name, +// privateMacAddress, +// null, +// null, +// _routerTemplateId, +// template.getGuestOSId(), +// NetUtils.long2Mac(routerMacAddress), +// guestIpAddress, +// guestNetmask, +// accountId, +// account.getDomainId(), +// publicMacAddress, +// publicIpAddress, +// vlanNetmask, +// vlan.getId(), +// vlanId, +// pod.first().getId(), +// dataCenterId, +// _routerRamSize, +// vlanGateway, +// domain, +// dc.getDns1(), +// dc.getDns2()); +// router.setMirroredVols(offering.isMirrored()); +// +// router.setLastHostId(pod.second()); +// router = _routerDao.persist(router); +// +// List vols = _storageMgr.create(account, router, template, dc, pod.first(), _offering, null,0); +// if(vols != null) { +// found = true; +// break; +// } +// +// _routerDao.expunge(router.getId()); +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Unable to find storage host or pool in pod " + pod.first().getName() + " (id:" + pod.first().getId() + "), checking other pods"); +// } +// avoids.add(pod.first().getId()); +// } +// +// if (!found) { +// event.setDescription("failed to create Domain Router : " + name); +// event.setLevel(EventVO.LEVEL_ERROR); +// _eventDao.persist(event); +// throw new ExecutionException("Unable to create DomainRouter"); +// } +// _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, null); +// +// s_logger.debug("Router created: id=" + router.getId() + "; name=" + router.getName()); +// +// event = new EventVO(); +// event.setUserId(1L); // system user performed the action +// event.setAccountId(accountId); +// event.setType(EventTypes.EVENT_ROUTER_CREATE); +// event.setStartId(startEventId); +// event.setDescription("successfully created Domain Router : " + router.getName() + " with ip : " + publicIpAddress); +// _eventDao.persist(event); +// success = true; +// return router; +// } catch (final Throwable th) { +// if (th instanceof ExecutionException) { +// s_logger.error("Error while starting router due to " + th.getMessage()); +// } else { +// s_logger.error("Unable to create router", th); +// } +// txn.rollback(); +// +// if (router != null && router.getState() == State.Creating) { +// _routerDao.expunge(router.getId()); +// } +// return null; +// } finally { +// if (account != null) { +// if(s_logger.isDebugEnabled()) { +// s_logger.debug("Releasing lock on account " + account.getId() + " for createRouter"); +// } +// _accountDao.releaseFromLockTable(account.getId()); +// } +// if(!success){ +// EventVO event = new EventVO(); +// event.setUserId(1L); // system user performed the action +// event.setAccountId(accountId); +// event.setType(EventTypes.EVENT_ROUTER_CREATE); +// event.setStartId(startEventId); +// event.setLevel(EventVO.LEVEL_ERROR); +// event.setDescription("Failed to create router for account " + accountId + " in data center " + dataCenterId); +// _eventDao.persist(event); +// } +// } +// } + public boolean destroyRouter(final long routerId) { if (s_logger.isDebugEnabled()) { @@ -478,9 +796,9 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } private boolean resendDhcpEntries(final DomainRouterVO router){ - final List vms = _vmDao.listBy(router.getId(), State.Creating, State.Starting, State.Running, State.Stopping, State.Stopped, State.Migrating); + final List vms = _vmDao.listBy(router.getId(), State.Creating, State.Starting, State.Running, State.Stopping, State.Stopped, State.Migrating); Commands cmds = new Commands(OnError.Continue); - for (UserVmVO vm: vms) { + for (UserVm vm: vms) { if (vm.getGuestIpAddress() == null || vm.getGuestMacAddress() == null || vm.getName() == null) { continue; } @@ -1477,9 +1795,17 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } //source NAT address is stored in /proc/cmdline of the domR and gets //reassigned upon powerup. Source NAT rule gets configured in StartRouter command - final List ipAddrs = _networkMgr.listPublicIpAddressesInVirtualNetwork(router.getAccountId(), router.getDataCenterId(), null); - if (!ipAddrs.isEmpty()) { - cmds = getAssociateIPCommands(router, ipAddrs, cmds, 0); + final List userIps = _networkMgr.listPublicIpAddressesInVirtualNetwork(router.getAccountId(), router.getDataCenterId(), null); + List publicIps = new ArrayList(); + if (userIps != null && !userIps.isEmpty()) { + for (IPAddressVO userIp : userIps) { + PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), userIp.getMacAddress()); + publicIps.add((PublicIpAddress)publicIp); + } + + } + if (!publicIps.isEmpty()) { + cmds = getAssociateIPCommands(router, publicIps, cmds, 0); } return true; } @@ -1840,49 +2166,34 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute // } - private Commands getAssociateIPCommands(final DomainRouterVO router, final List ipAddrList, Commands cmds, long vmId) { - boolean sourceNat = false; - Map> vlanIpMap = new HashMap>(); - for (final IpAddress ip: ipAddrList) { - VlanVO vlan = _vlanDao.findById(ip.getVlanId()); - ArrayList ipList = vlanIpMap.get(vlan); - if (ipList == null) { - ipList = new ArrayList(); + private Commands getAssociateIPCommands(final DomainRouterVO router, final List ipAddrList, Commands cmds, long vmId) { + + //Ip addresses have to be sorted before sending + Collections.sort(ipAddrList, new Comparator() { + @Override + public int compare(IpAddress o1, IpAddress o2) { + return o1.getAddress().compareTo(o2.getAddress()); + } }); + + boolean firstIP = true; + + for (final PublicIpAddress ip: ipAddrList) { + + boolean add = (ip.getState() == IpAddress.State.Releasing ? false : true); + boolean sourceNat = ip.isSourceNat(); + String vlanId = ip.getVlanTag(); + String vlanGateway = ip.getGateway(); + String vlanNetmask = ip.getNetmask(); + String vifMacAddress = ip.getMacAddress(); + + String vmGuestAddress = null; + if(vmId!=0){ + vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); } - ipList.add(ip); - vlanIpMap.put(vlan, ipList); - } - for (Map.Entry> vlanAndIp: vlanIpMap.entrySet()) { - boolean firstIP = true; - ArrayList ipList = vlanAndIp.getValue(); - Collections.sort(ipList, new Comparator() { - @Override - public int compare(IpAddress o1, IpAddress o2) { - return o1.getAddress().compareTo(o2.getAddress()); - } }); - for (final IpAddress ip: ipList) { - boolean add = (ip.getState() == IpAddress.State.Releasing ? false : true); - sourceNat = ip.isSourceNat(); - VlanVO vlan = vlanAndIp.getKey(); - String vlanId = vlan.getVlanId(); - String vlanGateway = vlan.getVlanGateway(); - String vlanNetmask = vlan.getVlanNetmask(); + cmds.addCommand("IPAssocCommand", new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ip.getAddress(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress)); - String vifMacAddress = null; - if (firstIP && add) { - String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(ip.getDataCenterId()); - vifMacAddress = macAddresses[1]; - } - String vmGuestAddress = null; - if(vmId!=0){ - vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); - } - - cmds.addCommand("IPAssocCommand", new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ip.getAddress(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress)); - - firstIP = false; - } + firstIP = false; } return cmds; } @@ -1914,7 +2225,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } @Override - public boolean associateIP (Network network, List ipAddress) { + public boolean associateIP (Network network, List ipAddress) { DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); if (router == null) { s_logger.warn("Unable to associate ip addresses, virtual router doesn't exist in the network " + network.getId()); @@ -1942,27 +2253,25 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute throw new ResourceUnavailableException("Unable to apply lb rules"); } - if (router.getState() == State.Running || router.getState() == State.Starting) { - List loadBalancingRules = new ArrayList(); - - for (FirewallRule rule : rules) { - loadBalancingRules.add((LoadBalancingRule) rule); - } - + if (router.getState() == State.Running || router.getState() == State.Starting || router.getState() == State.Stopped) { + Commands cmds = new Commands(OnError.Continue); - - for (LoadBalancingRule rule : loadBalancingRules) { + List lbs = new ArrayList(); + for (FirewallRule fwRule : rules) { + LoadBalancingRule rule = (LoadBalancingRule) fwRule; boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); String protocol = rule.getProtocol(); String algorithm = rule.getAlgorithm(); String srcIp = rule.getSourceIpAddress().addr(); int srcPort = rule.getSourcePortStart(); - List destinations = rule.getDestinations(); - - LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(srcIp, srcPort, protocol, algorithm, revoked, false, destinations); - cmds.addCommand(cmd); + List destinations = rule.getDestinations(); + LoadBalancerTO lb = new LoadBalancerTO(srcIp, srcPort, protocol, algorithm, revoked, false, destinations); + lbs.add(lb); } + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs); + cmds.addCommand(cmd); + //Send commands to router return sendCommandsToRouter(router, cmds); @@ -1973,7 +2282,6 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute s_logger.warn("Unable to apply load balancer rules, virtual router is not in the right state " + router.getState()); throw new ResourceUnavailableException("Unable to apply load balancer rules, domR is not in right state " + router.getState()); } - } @Override diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index f9f0f7a53ae..f483e6da310 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1420,9 +1420,9 @@ public class ManagementServerImpl implements ManagementServer { SearchBuilder sb = _vlanDao.createSearchBuilder(); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("vlan", sb.entity().getVlanId(), SearchCriteria.Op.EQ); + sb.and("vlan", sb.entity().getVlanTag(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); - sb.and("vlan", sb.entity().getVlanId(), SearchCriteria.Op.EQ); + sb.and("vlan", sb.entity().getVlanTag(), SearchCriteria.Op.EQ); sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); sb.and("vlanType", sb.entity().getVlanType(), SearchCriteria.Op.EQ); diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java index 2536c99f84e..800782a72b7 100644 --- a/server/src/com/cloud/vm/UserVmManager.java +++ b/server/src/com/cloud/vm/UserVmManager.java @@ -1,5 +1,4 @@ /** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * * This software is licensed under the GNU General Public License v3 or later. * diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 658b56689ee..787eefbefa5 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -132,9 +132,7 @@ import com.cloud.network.dao.LoadBalancerVMMapDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.router.DomainRouterManager; import com.cloud.network.rules.RulesManager; -import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.security.SecurityGroupManager; -import com.cloud.network.security.SecurityGroupVO; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -350,6 +348,35 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } } + @Override + public boolean stopVirtualMachine(long userId, long vmId, long eventId) { + boolean status = false; + if (s_logger.isDebugEnabled()) { + s_logger.debug("Stopping vm=" + vmId); + } + UserVmVO vm = _vmDao.findById(vmId); + if (vm == null || vm.getRemoved() != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("VM is either removed or deleted."); + } + return true; + } + + EventUtils.saveStartedEvent(userId, vm.getAccountId(), EventTypes.EVENT_VM_STOP, "stopping Vm with Id: "+vmId, eventId); + + status = stop(userId, vm, 0); + + if(status){ + EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_STOP, "Successfully stopped VM instance : " + vmId); + return status; + } + else { + EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, "Error stopping VM instance : " + vmId); + return status; + } + } + + @Override public Volume attachVolumeToVM(AttachVolumeCmd command) { Long vmId = command.getVirtualMachineId(); @@ -786,36 +813,25 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return (a != null); } - @Override - public boolean stopVirtualMachine(long userId, long vmId, long eventId) { - boolean status = false; - if (s_logger.isDebugEnabled()) { - s_logger.debug("Stopping vm=" + vmId); - } - - UserVmVO vm = _vmDao.findById(vmId); - if (vm == null || vm.getRemoved() != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("VM is either removed or deleted."); + + private void checkIfPoolAvailable(long vmId) throws StorageUnavailableException { + //check if the sp is up before starting + List rootVolList = _volsDao.findByInstanceAndType(vmId, VolumeType.ROOT); + if(rootVolList == null || rootVolList.size() == 0){ + throw new StorageUnavailableException("Could not find the root disk for this vm to verify if the pool on which it exists is Up or not"); + }else{ + Long poolId = rootVolList.get(0).getPoolId();//each vm has 1 root vol + StoragePoolVO sp = _storagePoolDao.findById(poolId); + if(sp == null){ + throw new StorageUnavailableException("Could not find the pool for the root disk of vm"+vmId+", to confirm if it is Up or not"); + }else{ + //found pool + if(!sp.getStatus().equals(com.cloud.host.Status.Up) && !sp.getStatus().equals(com.cloud.host.Status.CancelMaintenance)){ + throw new StorageUnavailableException("Could not start the vm; the associated storage pool is in:"+sp.getStatus().toString()+" state"); + } } - return true; } - - EventUtils.saveStartedEvent(userId, vm.getAccountId(), EventTypes.EVENT_VM_STOP, "stopping Vm with Id: "+vmId, eventId); - - status = stop(userId, vm, 0); - - if(status) - { - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_STOP, "Successfully stopped VM instance : " + vmId); - return status; - } - else - { - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, "Error stopping VM instance : " + vmId); - return status; - } - } + } private boolean rebootVirtualMachine(long userId, long vmId) { UserVmVO vm = _vmDao.findById(vmId); @@ -1976,6 +1992,267 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return privateTemplate; } +// @DB +// @Override +// public UserVmVO createDirectlyAttachedVM(Long vmId, long userId, AccountVO account, DataCenterVO dc, ServiceOfferingVO offering, VMTemplateVO template, DiskOfferingVO diskOffering, String displayName, String userData, List a, List networkGroups, long startEventId, long size) throws CloudRuntimeException, ResourceAllocationException { +// +// long accountId = account.getId(); +// long dataCenterId = dc.getId(); +// long serviceOfferingId = offering.getId(); +// long templateId = -1; +// if (template != null) { +// templateId = template.getId(); +// } +// +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Creating directly attached vm for account id=" + account.getId() + +// ", name="+ account.getAccountName() + "; dc=" + dc.getName() + +// "; offering=" + offering.getId() + "; diskOffering=" + ((diskOffering != null) ? diskOffering.getName() : "none") + +// "; template=" + templateId); +// } +// +// // Determine the Guest OS Id +// long guestOSId; +// if (template != null) { +// guestOSId = template.getGuestOSId(); +// } else { +// throw new CloudRuntimeException("No template or ISO was specified for the VM."); +// } +// +// Transaction txn = Transaction.currentTxn(); +// txn.start(); +// +// account = _accountDao.lockRow(accountId, true); +// if (account == null) { +// throw new CloudRuntimeException("Unable to lock up the account: " + accountId); +// } +// +// // First check that the maximum number of UserVMs for the given accountId will not be exceeded +// if (_accountMgr.resourceLimitExceeded(account, ResourceType.user_vm)) { +// ResourceAllocationException rae = new ResourceAllocationException("Maximum number of virtual machines for account: " + account.getAccountName() + " has been exceeded."); +// rae.setResourceType("vm"); +// throw rae; +// } +// _accountMgr.incrementResourceCount(account.getId(), ResourceType.user_vm); +// boolean isIso = Storage.ImageFormat.ISO.equals(template.getFormat()); +// long numVolumes = (isIso || (diskOffering == null)) ? 1 : 2; +// _accountMgr.incrementResourceCount(account.getId(), ResourceType.volume, numVolumes); +// txn.commit(); +// +// try { +// UserVmVO vm = null; +// +// final String name = VirtualMachineName.getVmName(vmId, accountId, _instance); +// +// final String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(dc.getId()); +// long routerId = -1; +// long poolId = 0; +// Pair pod = null; +// DomainRouterVO router = null; +// Set avoids = new HashSet(); +// VlanVO guestVlan = null; +// List vlansForAccount = _vlanDao.listVlansForAccountByType(dc.getId(), account.getId(), VlanType.DirectAttached); +// List vlansForPod = null; +// List zoneWideVlans = null; +// +// boolean forAccount = false; +// boolean forZone = false; +// if (vlansForAccount.size() > 0) { +// forAccount = true; +// guestVlan = vlansForAccount.get(0);//FIXME: iterate over all vlans +// } +// else +// { +// //list zone wide vlans that are direct attached and tagged +// //if exists pick random one +// //set forZone = true +// +// //note the dao method below does a NEQ on vlan id, hence passing untagged +// zoneWideVlans = _vlanDao.searchForZoneWideVlans(dc.getId(),VlanType.DirectAttached.toString(),"untagged"); +// +// if(zoneWideVlans!=null && zoneWideVlans.size()>0){ +// forZone = true; +// guestVlan = zoneWideVlans.get(0);//FIXME: iterate over all vlans +// } +// } +// +// while ((pod = _agentMgr.findPod(template, offering, dc, account.getId(), avoids)) != null) { +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Attempting to create direct attached vm in pod " + pod.first().getName()); +// } +// if (!forAccount && !forZone) { +// vlansForPod = _vlanDao.listVlansForPodByType(pod.first().getId(), VlanType.DirectAttached); +// if (vlansForPod.size() < 1) { +// avoids.add(pod.first().getId()); +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("No direct attached vlans available in pod " + pod.first().getName() + " (id:" + pod.first().getId() + "), checking other pods"); +// } +// continue; +// } +// guestVlan = vlansForPod.get(0);//FIXME: iterate over all vlans +// } +// +// List rtrs = _routerDao.listByVlanDbId(guestVlan.getId()); +// assert rtrs.size() < 2 : "How did we get more than one router per vlan?"; +// if (rtrs.size() > 0) { +// router = rtrs.get(0); +// routerId = router.getId(); +// } else if (rtrs.size() == 0) { +// router = _routerMgr.createDhcpServerForDirectlyAttachedGuests(userId, accountId, dc, pod.first(), pod.second(), guestVlan); +// if (router == null) { +// avoids.add(pod.first().getId()); +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Unable to create DHCP server in vlan " + guestVlan.getVlanTag() + ", pod=" + pod.first().getName() + " (podid:" + pod.first().getId() + "), checking other pods"); +// } +// continue; +// } +// routerId = router.getId(); +// } +// String guestIp = null; +// +// if(forAccount) +// { +// for(VlanVO vlanForAcc : vlansForAccount) +// { +// guestIp = null;//_ipAddressDao.assignIpAddress(accountId, account.getDomainId(), vlanForAcc.getId(), false).getAddress(); +// if(guestIp!=null) { +// break; //got an ip +// } +// } +// } +// else if(!forAccount && !forZone) +// { +// //i.e. for pod +// for(VlanVO vlanForPod : vlansForPod) +// { +// guestIp = null; // _ipAddressDao.assignIpAddress(accountId, account.getDomainId(), vlanForPod.getId(), false).getAddress(); +// if(guestIp!=null) { +// break;//got an ip +// } +// } +// } +// else +// { +// //for zone +// for(VlanVO vlanForZone : zoneWideVlans) +// { +// guestIp = null;// _ipAddressDao.assignIpAddress(accountId, account.getDomainId(), vlanForZone.getId(), false).getAddress(); +// if(guestIp!=null) { +// break;//found an ip +// } +// } +// } +// +// if (guestIp == null) { +// s_logger.debug("No guest IP available in pod id=" + pod.first().getId()); +// avoids.add(pod.first().getId()); +// continue; +// } +// s_logger.debug("Acquired a guest IP, ip=" + guestIp); +// String guestMacAddress = macAddresses[0]; +// String externalMacAddress = macAddresses[1]; +// Long externalVlanDbId = null; +// +// vm = new UserVmVO(vmId, name, templateId, guestOSId, accountId, account.getDomainId(), +// serviceOfferingId, guestMacAddress, guestIp, guestVlan.getVlanNetmask(), +// null, externalMacAddress, externalVlanDbId, +// routerId, pod.first().getId(), dataCenterId, +// offering.getOfferHA(), displayName, userData); +// +// if (diskOffering != null) { +// vm.setMirroredVols(diskOffering.isMirrored()); +// } +// +// vm.setLastHostId(pod.second()); +// vm = _vmDao.persist(vm); +// boolean addedToGroups = _networkGroupMgr.addInstanceToGroups(vmId, networkGroups); +// if (!addedToGroups) { +// s_logger.warn("Not all specified network groups can be found"); +// _vmDao.expunge(vm.getId()); +// throw new InvalidParameterValueException("Not all specified network groups can be found"); +// } +// +// vm = _vmDao.findById(vmId); +// try { +// poolId = _storageMgr.createUserVM(account, vm, template, dc, pod.first(), offering, diskOffering, a,size); +// } catch (CloudRuntimeException e) { +// _vmDao.expunge(vmId); +// _ipAddressDao.unassignIpAddress(guestIp); +// s_logger.debug("Released a guest ip address because we could not find storage: ip=" + guestIp); +// guestIp = null; +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Unable to find storage host in pod " + pod.first().getName() + " (id:" + pod.first().getId() + "), checking other pods"); +// } +// avoids.add(pod.first().getId()); +// continue; // didn't find a storage host in pod, go to the next pod +// } +// +// EventVO event = new EventVO(); +// event.setUserId(userId); +// event.setAccountId(accountId); +// event.setType(EventTypes.EVENT_NET_IP_ASSIGN); +// event.setParameters("guestIPaddress=" + guestIp + "\nvmName=" + vm.getName() + "\ndcId=" + vm.getDataCenterId()); +// event.setDescription("acquired a public ip: " + guestIp); +// _eventDao.persist(event); +// +// break; // if we got here, we found a host and can stop searching the pods +// } +// +// if (poolId == 0) { +// if(vm != null && vm.getName()!=null && vm.getDisplayName() != null) +// { +// if(!vm.getName().equals(vm.getDisplayName())) { +// s_logger.debug("failed to create VM instance : " + name+"("+vm.getInstanceName()+")"); +// } else { +// s_logger.debug("failed to create VM instance : " + name); +// } +// } +// else +// { +// s_logger.debug("failed to create VM instance : " + name); +// throw new CloudRuntimeException("We could not find a suitable pool for creating this directly attached vm"); +// +// } +// _accountMgr.decrementResourceCount(account.getId(), ResourceType.user_vm); +// _accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes); +// return null; +// } +// +// txn.start(); +// EventVO event = new EventVO(); +// event.setUserId(userId); +// event.setAccountId(accountId); +// event.setType(EventTypes.EVENT_VM_CREATE); +// event.setStartId(startEventId); +// event.setState(Event.State.Completed); +// String diskOfferingIdentifier = (diskOffering != null) ? String.valueOf(diskOffering.getId()) : "-1"; +// String eventParams = "id=" + vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ndoId=" + diskOfferingIdentifier + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); +// event.setParameters(eventParams); +// if(!vm.getName().equals(vm.getDisplayName())) { +// event.setDescription("successfully created VM instance : " + vm.getName()+"("+vm.getInstanceName()+")"); +// } else { +// event.setDescription("successfully created VM instance : " + vm.getName()); +// } +// _eventDao.persist(event); +// +// _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, null); +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("vm created " + vmId); +// } +// txn.commit(); +// +// return _vmDao.findById(vmId); +// } catch (Throwable th) { +// _accountMgr.decrementResourceCount(account.getId(), ResourceType.user_vm); +// _accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes); +// +// s_logger.error("Unable to create vm", th); +// throw new CloudRuntimeException("Unable to create vm: "+th.getMessage(), th); +// } finally{ +// updateVmStateForFailedVmCreation(vmId); +// } +// } + //used for vm transitioning to error state private void updateVmStateForFailedVmCreation(Long vmId) { UserVmVO vm = _vmDao.findById(vmId);