From e0165dd2efe597940c7325c69212e5c877cf4075 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 23 Aug 2010 13:59:23 -0700 Subject: [PATCH 1/7] my changes --- .../com/cloud/offering/NetworkOffering.java | 14 ++- .../com/cloud/offering/ServiceOffering.java | 10 +- .../cloud/offerings/NetworkOfferingVO.java | 57 ++++++++- .../com/cloud/service/ServiceOfferingVO.java | 9 +- core/src/com/cloud/vm/dao/UserVmDaoImpl.java | 4 +- .../impl/UserConcentratedAllocator.java | 11 +- .../commands/CreateServiceOfferingCmd.java | 5 +- .../api/commands/ListServiceOfferingsCmd.java | 5 +- .../commands/UpdateServiceOfferingCmd.java | 5 +- .../ConfigurationManagerImpl.java | 11 +- .../consoleproxy/ConsoleProxyManagerImpl.java | 112 +++++++++++++++++- .../migration/Db20to21MigrationUtil.java | 9 +- .../cloud/migration/ServiceOffering20VO.java | 13 +- .../cloud/migration/ServiceOffering21VO.java | 9 +- .../com/cloud/network/NetworkManagerImpl.java | 32 ++++- .../com/cloud/network/NetworkProfileVO.java | 13 +- .../offerings/dao/NetworkOfferingDao.java | 31 +++++ .../offerings/dao/NetworkOfferingDaoImpl.java | 49 ++++++++ .../cloud/server/ManagementServerImpl.java | 17 +-- .../allocator/LocalStoragePoolAllocator.java | 19 +-- .../SecondaryStorageManagerImpl.java | 5 +- server/src/com/cloud/test/DatabaseConfig.java | 9 +- .../com/cloud/user/AccountManagerImpl.java | 4 - .../src/com/cloud/vm/UserVmManagerImpl.java | 5 +- setup/db/create-schema.sql | 12 +- 25 files changed, 368 insertions(+), 102 deletions(-) create mode 100644 server/src/com/cloud/offerings/dao/NetworkOfferingDao.java create mode 100644 server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java index 831a626c0f8..3d098f0069e 100644 --- a/api/src/com/cloud/offering/NetworkOffering.java +++ b/api/src/com/cloud/offering/NetworkOffering.java @@ -17,18 +17,20 @@ */ package com.cloud.offering; +import com.cloud.network.Network.TrafficType; /** * Describes network offering * */ public interface NetworkOffering { - public enum GuestIpType { - Virtualized, - DirectSingle, - DirectDual - } + public enum GuestIpType { + Virtualized, + DirectSingle, + DirectDual + } + long getId(); /** @@ -60,4 +62,6 @@ public interface NetworkOffering { * @return concurrent connections to be supported. */ Integer getConcurrentConnections(); + + TrafficType getTrafficType(); } diff --git a/api/src/com/cloud/offering/ServiceOffering.java b/api/src/com/cloud/offering/ServiceOffering.java index 4cdaaeb4dce..87ff831d32e 100755 --- a/api/src/com/cloud/offering/ServiceOffering.java +++ b/api/src/com/cloud/offering/ServiceOffering.java @@ -22,13 +22,7 @@ package com.cloud.offering; * offered. */ public interface ServiceOffering { - public enum GuestIpType { - Virtualized, - DirectSingle, - DirectDual - } - - /** + /** * @return user readable description */ String getName(); @@ -66,7 +60,7 @@ public interface ServiceOffering { /** * @return the type of IP address to allocate as the primary ip address to a guest */ - GuestIpType getGuestIpType(); + NetworkOffering.GuestIpType getGuestIpType(); /** * @return whether or not the service offering requires local storage diff --git a/core/src/com/cloud/offerings/NetworkOfferingVO.java b/core/src/com/cloud/offerings/NetworkOfferingVO.java index 26ad13b8c13..b16d6baa4d0 100644 --- a/core/src/com/cloud/offerings/NetworkOfferingVO.java +++ b/core/src/com/cloud/offerings/NetworkOfferingVO.java @@ -17,6 +17,8 @@ */ package com.cloud.offerings; +import java.util.Date; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -26,7 +28,9 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import com.cloud.network.Network.TrafficType; import com.cloud.offering.NetworkOffering; +import com.cloud.utils.db.GenericDao; @Entity @Table(name="network_offerings") @@ -54,6 +58,19 @@ public class NetworkOfferingVO implements NetworkOffering { @Column(name="type") @Enumerated(value=EnumType.STRING) GuestIpType guestIpType; + + @Column(name="traffic_type") + @Enumerated(value=EnumType.STRING) + TrafficType trafficType; + + @Column(name="system_only") + boolean systemOnly; + + @Column(name=GenericDao.REMOVED_COLUMN) + Date removed; + + @Column(name=GenericDao.CREATED_COLUMN) + Date created; @Override public String getDisplayText() { @@ -69,6 +86,11 @@ public class NetworkOfferingVO implements NetworkOffering { public long getId() { return id; } + + @Override + public TrafficType getTrafficType() { + return trafficType; + } @Override public Integer getMulticastRateMbps() { @@ -85,21 +107,44 @@ public class NetworkOfferingVO implements NetworkOffering { return rateMbps; } + public Date getCreated() { + return created; + } + + public boolean isSystemOnly() { + return systemOnly; + } + + public Date getRemoved() { + return removed; + } + + @Override + public Integer getConcurrentConnections() { + return concurrentConnections; + } + public NetworkOfferingVO() { } - public NetworkOfferingVO(String name, String displayText, GuestIpType type, Integer rateMbps, Integer multicastRateMbps, Integer concurrentConnections) { + public NetworkOfferingVO(String name, String displayText, TrafficType trafficType, GuestIpType type, boolean systemOnly, Integer rateMbps, Integer multicastRateMbps, Integer concurrentConnections) { this.name = name; this.displayText = displayText; this.guestIpType = type; this.rateMbps = rateMbps; this.multicastRateMbps = multicastRateMbps; this.concurrentConnections = concurrentConnections; + this.trafficType = trafficType; + this.systemOnly = systemOnly; } - - @Override - public Integer getConcurrentConnections() { - return concurrentConnections; + + /** + * Network Offering for all system vms. + * @param name + * @param trafficType + * @param type + */ + public NetworkOfferingVO(String name, TrafficType trafficType, GuestIpType type) { + this(name, "System Offering for " + name, trafficType, type, true, null, null, null); } - } diff --git a/core/src/com/cloud/service/ServiceOfferingVO.java b/core/src/com/cloud/service/ServiceOfferingVO.java index 8466ce82914..d5d4b4d7ce6 100644 --- a/core/src/com/cloud/service/ServiceOfferingVO.java +++ b/core/src/com/cloud/service/ServiceOfferingVO.java @@ -27,6 +27,7 @@ import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import javax.persistence.Transient; +import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.storage.DiskOfferingVO; @@ -55,13 +56,13 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering @Column(name="guest_ip_type") @Enumerated(EnumType.STRING) - private GuestIpType guestIpType; + private NetworkOffering.GuestIpType guestIpType; protected ServiceOfferingVO() { super(); } - public ServiceOfferingVO(String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, GuestIpType guestIpType, boolean useLocalStorage, boolean recreatable, String tags) { + public ServiceOfferingVO(String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, NetworkOffering.GuestIpType guestIpType, boolean useLocalStorage, boolean recreatable, String tags) { super(name, displayText, false, tags, recreatable, useLocalStorage); this.cpu = cpu; this.ramSize = ramSize; @@ -135,11 +136,11 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering return multicastRateMbps; } - public void setGuestIpType(GuestIpType guestIpType) { + public void setGuestIpType(NetworkOffering.GuestIpType guestIpType) { this.guestIpType = guestIpType; } - public GuestIpType getGuestIpType() { + public NetworkOffering.GuestIpType getGuestIpType() { return guestIpType; } } diff --git a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java index 6e75bc179bb..6ab439486af 100755 --- a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -24,7 +24,7 @@ import javax.ejb.Local; import org.apache.log4j.Logger; -import com.cloud.offering.ServiceOffering; +import com.cloud.offering.NetworkOffering; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.utils.component.ComponentLocator; @@ -279,7 +279,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use SearchCriteria sc = AccountDataCenterVirtualSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); - sc.setJoinParameters("offeringSearch", "guestIpType", ServiceOffering.GuestIpType.Virtualized); + sc.setJoinParameters("offeringSearch", "guestIpType", NetworkOffering.GuestIpType.Virtualized); return listActiveBy(sc); } diff --git a/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java index 29ba8bc511c..46be20b4466 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java @@ -36,8 +36,9 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.HostPodDao; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.VolumeVO; @@ -252,14 +253,14 @@ public class UserConcentratedAllocator implements PodAllocator { so = _offeringDao.findById(userVm.getServiceOfferingId()); } else if(vm.getType() == VirtualMachine.Type.ConsoleProxy) { so = new ServiceOfferingVO("Fake Offering For DomP", 1, - _proxyRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + _proxyRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else if(vm.getType() == VirtualMachine.Type.SecondaryStorageVm) { - so = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else if(vm.getType() == VirtualMachine.Type.DomainRouter) { - so = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else { assert(false) : "Unsupported system vm type"; - so = new ServiceOfferingVO("Fake Offering For unknow system VM", 1, 128, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For unknow system VM", 1, 128, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } if(capacityType == CapacityVO.CAPACITY_TYPE_MEMORY) { diff --git a/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java b/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java index 5d749cff451..7bc9df50e4a 100644 --- a/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java +++ b/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java @@ -26,7 +26,8 @@ import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; import com.cloud.api.ServerApiException; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -142,7 +143,7 @@ public class CreateServiceOfferingCmd extends BaseCmd{ storageType = offering.getUseLocalStorage() ? "local" : "shared"; returnValues.add(new Pair(BaseCmd.Properties.STORAGE_TYPE.getName(), storageType)); returnValues.add(new Pair(BaseCmd.Properties.OFFER_HA.getName(), offering.getOfferHA())); - returnValues.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK.getName(), (offering.getGuestIpType().equals(GuestIpType.Virtualized)))); + returnValues.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK.getName(), (offering.getGuestIpType().equals(NetworkOffering.GuestIpType.Virtualized)))); returnValues.add(new Pair(BaseCmd.Properties.TAGS.getName(), offering.getTags())); } return returnValues; diff --git a/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java b/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java index e7d97615452..8ccfe32aeb9 100644 --- a/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java +++ b/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java @@ -26,7 +26,8 @@ import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; import com.cloud.api.ServerApiException; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.server.Criteria; import com.cloud.service.ServiceOfferingVO; import com.cloud.user.Account; @@ -123,7 +124,7 @@ public class ListServiceOfferingsCmd extends BaseCmd { String storageType = offering.getUseLocalStorage() ? "local" : "shared"; offeringData.add(new Pair(BaseCmd.Properties.STORAGE_TYPE.getName(), storageType)); offeringData.add(new Pair(BaseCmd.Properties.OFFER_HA.getName(), offering.getOfferHA())); - offeringData.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK.getName(), (offering.getGuestIpType().equals(GuestIpType.Virtualized)))); + offeringData.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK.getName(), (offering.getGuestIpType().equals(NetworkOffering.GuestIpType.Virtualized)))); offeringData.add(new Pair(BaseCmd.Properties.TAGS.getName(), (offering.getTags()))); soTag[i++] = offeringData; diff --git a/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java b/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java index 0b4d46ef420..37e750783c9 100644 --- a/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java +++ b/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java @@ -26,7 +26,8 @@ import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; import com.cloud.api.ServerApiException; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -95,7 +96,7 @@ public class UpdateServiceOfferingCmd extends BaseCmd{ String storageType = offering.getUseLocalStorage() ? "local" : "shared"; returnValues.add(new Pair(BaseCmd.Properties.STORAGE_TYPE.getName(), storageType)); returnValues.add(new Pair(BaseCmd.Properties.OFFER_HA.getName(), offering.getOfferHA())); - returnValues.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK.getName(), (offering.getGuestIpType().equals(GuestIpType.Virtualized)))); + returnValues.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK.getName(), (offering.getGuestIpType().equals(NetworkOffering.GuestIpType.Virtualized)))); returnValues.add(new Pair(BaseCmd.Properties.TAGS.getName(), offering.getTags())); } else { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update service offering " + offeringId); diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 52a7b58dfc3..047da0d1bef 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -52,7 +52,8 @@ import com.cloud.event.dao.EventDao; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; @@ -799,7 +800,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { String multicastRateStr = _configDao.getValue("multicast.throttling.rate"); int networkRate = ((networkRateStr == null) ? 200 : Integer.parseInt(networkRateStr)); int multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr)); - GuestIpType guestIpType = useVirtualNetwork ? GuestIpType.Virtualized : GuestIpType.DirectSingle; + NetworkOffering.GuestIpType guestIpType = useVirtualNetwork ? NetworkOffering.GuestIpType.Virtualized : NetworkOffering.GuestIpType.DirectSingle; tags = cleanupTags(tags); ServiceOfferingVO offering = new ServiceOfferingVO(name, cpu, ramSize, speed, networkRate, multicastRate, offerHA, displayText, guestIpType, localStorageRequired, false, tags); @@ -833,7 +834,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } if (useVirtualNetwork != null) { - GuestIpType guestIpType = useVirtualNetwork ? GuestIpType.Virtualized : GuestIpType.DirectSingle; + NetworkOffering.GuestIpType guestIpType = useVirtualNetwork ? NetworkOffering.GuestIpType.Virtualized : NetworkOffering.GuestIpType.DirectSingle; offering.setGuestIpType(guestIpType); } @@ -848,7 +849,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { if (_serviceOfferingDao.update(serviceOfferingId, offering)) { offering = _serviceOfferingDao.findById(serviceOfferingId); saveConfigurationEvent(userId, null, EventTypes.EVENT_SERVICE_OFFERING_EDIT, "Successfully updated service offering with name: " + offering.getName() + ".", "soId=" + offering.getId(), "name=" + offering.getName(), - "displayText=" + offering.getDisplayText(), "offerHA=" + offering.getOfferHA(), "useVirtualNetwork=" + (offering.getGuestIpType() == GuestIpType.Virtualized), "tags=" + offering.getTags()); + "displayText=" + offering.getDisplayText(), "offerHA=" + offering.getOfferHA(), "useVirtualNetwork=" + (offering.getGuestIpType() == NetworkOffering.GuestIpType.Virtualized), "tags=" + offering.getTags()); return offering; } else { return null; @@ -891,7 +892,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { if (_serviceOfferingDao.remove(serviceOfferingId)) { saveConfigurationEvent(userId, null, EventTypes.EVENT_SERVICE_OFFERING_EDIT, "Successfully deleted service offering with name: " + offering.getName(), "soId=" + serviceOfferingId, "name=" + offering.getName(), - "displayText=" + offering.getDisplayText(), "offerHA=" + offering.getOfferHA(), "useVirtualNetwork=" + (offering.getGuestIpType() == GuestIpType.Virtualized)); + "displayText=" + offering.getDisplayText(), "offerHA=" + offering.getOfferHA(), "useVirtualNetwork=" + (offering.getGuestIpType() == NetworkOffering.GuestIpType.Virtualized)); return true; } else { return false; diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 36732052a9b..91eeeff3302 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -96,8 +96,9 @@ import com.cloud.info.RunningHostInfoAgregator.ZoneHostInfo; import com.cloud.maid.StackMaid; import com.cloud.network.IpAddrAllocator; import com.cloud.network.IpAddrAllocator.networkInfo; +import com.cloud.network.NetworkProfileVO; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; @@ -134,6 +135,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.VmManager; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.VMInstanceDao; import com.google.gson.Gson; @@ -221,7 +223,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach private EventDao _eventDao; @Inject ServiceOfferingDao _offeringDao; - @Inject private IpAddrAllocator _IpAllocator; private ConsoleProxyListener _listener; @@ -231,6 +232,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach @Inject private AsyncJobManager _asyncMgr; + + @Inject + private VmManager _vmMgr; private final ScheduledExecutorService _capacityScanScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("CP-Scan")); private final ExecutorService _requestHandlerScheduler = Executors.newCachedThreadPool(new NamedThreadFactory("Request-handler")); @@ -248,6 +252,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach private String _domain; private String _instance; + private NetworkProfileVO _publicNetworkProfile; + private NetworkProfileVO _managementNetworkProfile; + private NetworkProfileVO _controlNetworkProfile; + // private String _privateNetmask; private int _proxyCmdPort = DEFAULT_PROXY_CMD_PORT; @@ -989,6 +997,102 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach } } + @DB + protected Map createProxyInstance2(long dataCenterId) { + + Map context = new HashMap(); + String publicIpAddress = null; + + + + Transaction txn = Transaction.currentTxn(); + try { + DataCenterVO dc = _dcDao.findById(dataCenterId); + assert (dc != null); + context.put("dc", dc); + + // this will basically allocate the pod based on data center id as + // we use system user id here + Set avoidPods = new HashSet(); + Pair pod = null; + networkInfo publicIpAndVlan = null; + + // About MAC address allocation + // MAC address used by User VM is inherited from DomR MAC address, + // with the least 16 bits overrided. to avoid + // potential conflicts, domP will mask bit 31 + // + String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(dataCenterId, (1L << 31)); + String privateMacAddress = macAddresses[0]; + String publicMacAddress = macAddresses[1]; + macAddresses = _dcDao.getNextAvailableMacAddressPair(dataCenterId, (1L << 31)); + String guestMacAddress = macAddresses[0]; + while ((pod = _agentMgr.findPod(_template, _serviceOffering, dc, Account.ACCOUNT_ID_SYSTEM, avoidPods)) != null) { + publicIpAndVlan = allocPublicIpAddress(dataCenterId, pod.first().getId(), publicMacAddress); + if (publicIpAndVlan == null) { + s_logger.warn("Unable to allocate public IP address for console proxy vm in data center : " + dataCenterId + ", pod=" + + pod.first().getId()); + avoidPods.add(pod.first().getId()); + } else { + break; + } + } + + if (pod == null || publicIpAndVlan == null) { + s_logger.warn("Unable to allocate pod for console proxy vm in data center : " + dataCenterId); + + context.put("proxyVmId", (long) 0); + return context; + } + + long id = _consoleProxyDao.getNextInSequence(Long.class, "id"); + + context.put("publicIpAddress", publicIpAndVlan._ipAddr); + context.put("pod", pod); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Pod allocated " + pod.first().getName()); + } + + String cidrNetmask = NetUtils.getCidrNetmask(pod.first().getCidrSize()); + + // Find the VLAN ID, VLAN gateway, and VLAN netmask for + // publicIpAddress + publicIpAddress = publicIpAndVlan._ipAddr; + + String vlanGateway = publicIpAndVlan._gateWay; + String vlanNetmask = publicIpAndVlan._netMask; + + txn.start(); + ConsoleProxyVO proxy; + String name = VirtualMachineName.getConsoleProxyName(id, _instance).intern(); + proxy = new ConsoleProxyVO(id, name, guestMacAddress, null, NetUtils.getLinkLocalNetMask(), privateMacAddress, null, cidrNetmask, + _template.getId(), _template.getGuestOSId(), publicMacAddress, publicIpAddress, vlanNetmask, publicIpAndVlan._vlanDbId, + publicIpAndVlan._vlanid, pod.first().getId(), dataCenterId, vlanGateway, null, dc.getDns1(), dc.getDns2(), _domain, + _proxyRamSize, 0); + + proxy.setLastHostId(pod.second()); + proxy = _consoleProxyDao.persist(proxy); + long proxyVmId = proxy.getId(); + + final EventVO event = new EventVO(); + event.setUserId(User.UID_SYSTEM); + event.setAccountId(Account.ACCOUNT_ID_SYSTEM); + event.setType(EventTypes.EVENT_PROXY_CREATE); + event.setLevel(EventVO.LEVEL_INFO); + event.setDescription("New console proxy created - " + proxy.getName()); + _eventDao.persist(event); + txn.commit(); + + context.put("proxyVmId", proxyVmId); + return context; + } catch (Throwable e) { + s_logger.error("Unexpected exception : ", e); + + context.put("proxyVmId", (long) 0); + return context; + } + } + @DB protected ConsoleProxyVO allocProxyStorage(long dataCenterId, long proxyVmId) { ConsoleProxyVO proxy = _consoleProxyDao.findById(proxyVmId); @@ -2224,7 +2328,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach } boolean useLocalStorage = Boolean.parseBoolean((String) params.get(Config.SystemVMUseLocalStorage.key())); - _serviceOffering = new ServiceOfferingVO("Fake Offering For DomP", 1, _proxyRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, + _serviceOffering = new ServiceOfferingVO("Fake Offering For DomP", 1, _proxyRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null); _serviceOffering.setUniqueName("Cloud.com-ConsoleProxy"); _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); @@ -2232,7 +2336,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach if (_template == null) { throw new ConfigurationException("Unable to find the template for console proxy VMs"); } - + _capacityScanScheduler.scheduleAtFixedRate(getCapacityScanTask(), STARTUP_DELAY, _capacityScanInterval, TimeUnit.MILLISECONDS); if (s_logger.isInfoEnabled()) diff --git a/server/src/com/cloud/migration/Db20to21MigrationUtil.java b/server/src/com/cloud/migration/Db20to21MigrationUtil.java index 05955684b9c..90e950dc9e8 100644 --- a/server/src/com/cloud/migration/Db20to21MigrationUtil.java +++ b/server/src/com/cloud/migration/Db20to21MigrationUtil.java @@ -38,7 +38,8 @@ import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.migration.DiskOffering21VO.Type; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.Storage.StoragePoolType; @@ -305,7 +306,7 @@ public class Db20to21MigrationUtil { _configDao.getValue(Config.ConsoleProxyRamSize.key()), ConsoleProxyManager.DEFAULT_PROXY_VM_RAMSIZE); ServiceOffering21VO soConsoleProxy = new ServiceOffering21VO("Fake Offering For DomP", 1, - proxyRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, + proxyRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null); soConsoleProxy.setId(seq++); soConsoleProxy.setUniqueName("Cloud.com-ConsoleProxy"); @@ -316,7 +317,7 @@ public class Db20to21MigrationUtil { _configDao.getValue(Config.SecStorageVmRamSize.key()), SecondaryStorageVmManager.DEFAULT_SS_VM_RAMSIZE); ServiceOffering21VO soSecondaryVm = new ServiceOffering21VO("Fake Offering For Secondary Storage VM", 1, - secStorageVmRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); + secStorageVmRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null); soSecondaryVm.setId(seq++); soSecondaryVm.setUniqueName("Cloud.com-SecondaryStorage"); soSecondaryVm = _serviceOffering21Dao.persist(soSecondaryVm); @@ -324,7 +325,7 @@ public class Db20to21MigrationUtil { int routerRamSize = NumbersUtil.parseInt(_configDao.getValue("router.ram.size"), 128); ServiceOffering21VO soDomainRouter = new ServiceOffering21VO("Fake Offering For DomR", 1, - routerRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); + routerRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null); soDomainRouter.setId(seq++); soDomainRouter.setUniqueName("Cloud.Com-SoftwareRouter"); soDomainRouter = _serviceOffering21Dao.persist(soDomainRouter); diff --git a/server/src/com/cloud/migration/ServiceOffering20VO.java b/server/src/com/cloud/migration/ServiceOffering20VO.java index bff56722ed3..acb355376f1 100644 --- a/server/src/com/cloud/migration/ServiceOffering20VO.java +++ b/server/src/com/cloud/migration/ServiceOffering20VO.java @@ -11,7 +11,8 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.utils.db.GenericDao; @Entity @@ -51,7 +52,7 @@ public class ServiceOffering20VO { @Column(name="guest_ip_type") @Enumerated(EnumType.STRING) - private GuestIpType guestIpType = GuestIpType.Virtualized; + private NetworkOffering.GuestIpType guestIpType = NetworkOffering.GuestIpType.Virtualized; @Column(name="use_local_storage") private boolean useLocalStorage; @@ -66,10 +67,10 @@ public class ServiceOffering20VO { } public ServiceOffering20VO(Long id, String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, boolean localStorageRequired) { - this(id, name, cpu, ramSize, speed, rateMbps, multicastRateMbps, offerHA, displayText, GuestIpType.Virtualized, localStorageRequired); + this(id, name, cpu, ramSize, speed, rateMbps, multicastRateMbps, offerHA, displayText, NetworkOffering.GuestIpType.Virtualized, localStorageRequired); } - public ServiceOffering20VO(Long id, String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, GuestIpType guestIpType, boolean useLocalStorage) { + public ServiceOffering20VO(Long id, String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, NetworkOffering.GuestIpType guestIpType, boolean useLocalStorage) { this.id = id; this.name = name; this.cpu = cpu; @@ -167,11 +168,11 @@ public class ServiceOffering20VO { return multicastRateMbps; } - public void setGuestIpType(GuestIpType guestIpType) { + public void setGuestIpType(NetworkOffering.GuestIpType guestIpType) { this.guestIpType = guestIpType; } - public GuestIpType getGuestIpType() { + public NetworkOffering.GuestIpType getGuestIpType() { return guestIpType; } diff --git a/server/src/com/cloud/migration/ServiceOffering21VO.java b/server/src/com/cloud/migration/ServiceOffering21VO.java index 324e6143135..31ba534831c 100644 --- a/server/src/com/cloud/migration/ServiceOffering21VO.java +++ b/server/src/com/cloud/migration/ServiceOffering21VO.java @@ -9,6 +9,7 @@ import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import javax.persistence.Transient; +import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; @Entity @@ -36,13 +37,13 @@ public class ServiceOffering21VO extends DiskOffering21VO implements ServiceOffe @Column(name="guest_ip_type") @Enumerated(EnumType.STRING) - private GuestIpType guestIpType; + private NetworkOffering.GuestIpType guestIpType; protected ServiceOffering21VO() { super(); } - public ServiceOffering21VO(String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, GuestIpType guestIpType, boolean useLocalStorage, boolean recreatable, String tags) { + public ServiceOffering21VO(String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, NetworkOffering.GuestIpType guestIpType, boolean useLocalStorage, boolean recreatable, String tags) { super(name, displayText, false, tags, recreatable, useLocalStorage); this.cpu = cpu; this.ramSize = ramSize; @@ -116,11 +117,11 @@ public class ServiceOffering21VO extends DiskOffering21VO implements ServiceOffe return multicastRateMbps; } - public void setGuestIpType(GuestIpType guestIpType) { + public void setGuestIpType(NetworkOffering.GuestIpType guestIpType) { this.guestIpType = guestIpType; } - public GuestIpType getGuestIpType() { + public NetworkOffering.GuestIpType getGuestIpType() { return guestIpType; } } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 80ad3568233..c96f95aa7dc 100644 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -98,11 +98,15 @@ import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; +import com.cloud.network.Network.TrafficType; import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.SecurityGroupVMMapDao; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; @@ -186,8 +190,8 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager @Inject AsyncJobManager _asyncMgr; @Inject StoragePoolDao _storagePoolDao = null; @Inject ServiceOfferingDao _serviceOfferingDao = null; - @Inject - private UserStatisticsDao _statsDao; + @Inject UserStatisticsDao _statsDao = null; + @Inject NetworkOfferingDao _networkOfferingDao = null; long _routerTemplateId = -1; int _routerRamSize; @@ -198,6 +202,10 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager int _routerCleanupInterval = 3600; int _routerStatsInterval = 300; private ServiceOfferingVO _offering; + private NetworkOfferingVO _managementNetworkOffering; + private NetworkOfferingVO _publicNetworkOffering; + private NetworkOfferingVO _linkLocalNetworkOffering; + private NetworkOfferingVO _guestNetworkOffering; private VMTemplateVO _template; ScheduledExecutorService _executor; @@ -207,6 +215,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager return destroyRouter(router.getId()); } + @Override public boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey) { ModifySshKeysCommand cmd = new ModifySshKeysCommand(pubKey, prvKey); final Answer answer = _agentMgr.easySend(hostId, cmd); @@ -219,7 +228,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager @Override @DB public String assignSourceNatIpAddress(AccountVO account, final DataCenterVO dc, final String domain, final ServiceOfferingVO serviceOffering, long startEventId) throws ResourceAllocationException { - if (serviceOffering.getGuestIpType() == GuestIpType.DirectDual || serviceOffering.getGuestIpType() == GuestIpType.DirectSingle) { + if (serviceOffering.getGuestIpType() == NetworkOffering.GuestIpType.DirectDual || serviceOffering.getGuestIpType() == NetworkOffering.GuestIpType.DirectSingle) { return null; } final long dcId = dc.getId(); @@ -354,6 +363,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } } + @Override @DB public DomainRouterVO createDhcpServerForDirectlyAttachedGuests(long userId, long accountId, DataCenterVO dc, HostPodVO pod, Long candidateHost, VlanVO guestVlan) throws ConcurrentOperationException{ @@ -1492,6 +1502,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } } + @Override public List updatePortForwardingRules(final List fwRules, final DomainRouterVO router, Long hostId ){ final List fwdRules = new ArrayList(); final List result = new ArrayList(); @@ -1734,6 +1745,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager return _routerDao.listByHostId(hostId); } + @Override public boolean updateLoadBalancerRules(final List fwRules, final DomainRouterVO router, Long hostId) { for (FirewallRuleVO rule : fwRules) { @@ -1806,7 +1818,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager _haMgr.registerHandler(VirtualMachine.Type.DomainRouter, this); boolean useLocalStorage = Boolean.parseBoolean((String)params.get(Config.SystemVMUseLocalStorage.key())); - _offering = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); + _offering = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null); _offering.setUniqueName("Cloud.Com-SoftwareRouter"); _offering = _serviceOfferingDao.persistSystemServiceOffering(_offering); _template = _templateDao.findById(_routerTemplateId); @@ -1814,6 +1826,14 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager throw new ConfigurationException("Unable to find the template for the router: " + _routerTemplateId); } + _publicNetworkOffering = new NetworkOfferingVO("System-VM-Public-Network", TrafficType.Public, null); + _publicNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_publicNetworkOffering); + + _managementNetworkOffering = new NetworkOfferingVO("System-VM-Management-Network", TrafficType.Management, null); + _linkLocalNetworkOffering = new NetworkOfferingVO("System-VM-LinkLocal-Network", TrafficType.LinkLocal, null); + _guestNetworkOffering = new NetworkOfferingVO("System-VM-Guest-Network", TrafficType.Guest, GuestIpType.Virtualized); + // FIXME: Obviously Virtualized is not the only guest network. How do we determine which one to use? + s_logger.info("Network Manager is configured."); return true; @@ -2133,6 +2153,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager public RouterCleanupTask() { } + @Override public void run() { try { final List ids = _routerDao.findLonelyRouters(); @@ -2298,6 +2319,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager public NetworkUsageTask() { } + @Override public void run() { final List routers = _routerDao.listUpByHostId(null); s_logger.debug("Found " + routers.size() + " running routers. "); diff --git a/server/src/com/cloud/network/NetworkProfileVO.java b/server/src/com/cloud/network/NetworkProfileVO.java index 081803e8c63..2e7d4f29438 100644 --- a/server/src/com/cloud/network/NetworkProfileVO.java +++ b/server/src/com/cloud/network/NetworkProfileVO.java @@ -36,7 +36,7 @@ import com.cloud.user.OwnedBy; * */ @Entity -@Table(name="network_profile") +@Table(name="network_profiles") public class NetworkProfileVO implements OwnedBy { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @@ -65,15 +65,18 @@ public class NetworkProfileVO implements OwnedBy { public NetworkProfileVO() { } + + public NetworkProfileVO(long accountId, TrafficType trafficType, Mode mode, BroadcastDomainType broadcastDomainType) { + this.accountId = accountId; + this.trafficType = trafficType; + this.mode = mode; + this.broadcastDomainType = broadcastDomainType; + } public long getId() { return id; } - public void setId(long id) { - this.id = id; - } - public Mode getMode() { return mode; } diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingDao.java b/server/src/com/cloud/offerings/dao/NetworkOfferingDao.java new file mode 100644 index 00000000000..f244864c97c --- /dev/null +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingDao.java @@ -0,0 +1,31 @@ +/** + * + */ +package com.cloud.offerings.dao; + +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.utils.db.GenericDao; + +/** + * NetworkOfferingDao deals with searches and operations done on the + * network_offering table. + * + */ +public interface NetworkOfferingDao extends GenericDao { + /** + * Returns the network offering that matches the name. + * @param name name + * @return NetworkOfferingVO + */ + NetworkOfferingVO findByName(String name); + + /** + * Persists the system network offering by checking the name. If it + * is already there, then it returns the correct one in the database. + * If not, then it persists it into the database. + * + * @param offering network offering to persist if not in the database. + * @return NetworkOfferingVO backed by a row in the database + */ + NetworkOfferingVO persistSystemNetworkOffering(NetworkOfferingVO offering); +} diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java new file mode 100644 index 00000000000..3166a464f82 --- /dev/null +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java @@ -0,0 +1,49 @@ +/** + * + */ +package com.cloud.offerings.dao; + +import javax.ejb.Local; +import javax.persistence.EntityExistsException; + +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + +@Local(value=NetworkOfferingDao.class) +public class NetworkOfferingDaoImpl extends GenericDaoBase { + SearchBuilder NameSearch; + + protected NetworkOfferingDaoImpl() { + super(); + + NameSearch = createSearchBuilder(); + NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ); + NameSearch.done(); + } + + public NetworkOfferingVO findByName(String name) { + SearchCriteria sc = NameSearch.create(); + + sc.setParameters("name", name); + + return findOneActiveBy(sc); + + } + + public NetworkOfferingVO persistSystemNetworkOffering(NetworkOfferingVO offering) { + assert offering.getName() != null : "how are you going to find this later if you don't set it?"; + NetworkOfferingVO vo = findByName(offering.getName()); + if (vo != null) { + return vo; + } + try { + vo = persist(offering); + return vo; + } catch (EntityExistsException e) { + // Assume it's conflict on unique name from two different management servers. + return findByName(offering.getName()); + } + } +} diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 2a5d57d5b8d..c477a6d226e 100644 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -174,8 +174,9 @@ import com.cloud.network.security.NetworkGroupManager; import com.cloud.network.security.NetworkGroupRulesVO; import com.cloud.network.security.NetworkGroupVO; import com.cloud.network.security.dao.NetworkGroupDao; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.serializer.GsonHelper; import com.cloud.server.auth.UserAuthenticator; import com.cloud.service.ServiceOfferingVO; @@ -2275,7 +2276,7 @@ public class ManagementServerImpl implements ManagementServer { throw rae; } } else { - if (offering.getGuestIpType() == GuestIpType.Virtualized) { + if (offering.getGuestIpType() == NetworkOffering.GuestIpType.Virtualized) { try { externalIp = _networkMgr.assignSourceNatIpAddress(account, dc, domain, offering, startEventId); } catch (ResourceAllocationException rae) { @@ -2484,12 +2485,12 @@ public class ManagementServerImpl implements ManagementServer { } } - if (offering.getGuestIpType() != GuestIpType.Virtualized) { + if (offering.getGuestIpType() != NetworkOffering.GuestIpType.Virtualized) { _networkGroupMgr.createDefaultNetworkGroup(accountId); } if (networkGroups != null) { - if (offering.getGuestIpType() == GuestIpType.Virtualized) { + if (offering.getGuestIpType() == NetworkOffering.GuestIpType.Virtualized) { throw new InvalidParameterValueException("Network groups are not compatible with service offering " + offering.getName()); } Set nameSet = new HashSet(); //handle duplicate names -- allowed @@ -2502,7 +2503,7 @@ public class ManagementServerImpl implements ManagementServer { } } else { //create a default group if necessary - if (offering.getGuestIpType() != GuestIpType.Virtualized && _networkGroupsEnabled) { + if (offering.getGuestIpType() != NetworkOffering.GuestIpType.Virtualized && _networkGroupsEnabled) { networkGroups = new String[]{NetworkGroupManager.DEFAULT_GROUP_NAME}; } } @@ -2932,7 +2933,7 @@ public class ManagementServerImpl implements ManagementServer { // sanity check that the vm can be applied to the load balancer ServiceOfferingVO offering = _offeringsDao.findById(userVm.getServiceOfferingId()); - if ((offering == null) || !GuestIpType.Virtualized.equals(offering.getGuestIpType())) { + if ((offering == null) || !NetworkOffering.GuestIpType.Virtualized.equals(offering.getGuestIpType())) { if (s_logger.isDebugEnabled()) { s_logger.debug("Unable to apply port forwarding service to virtual machine " + userVm.toString() + ", bad network type (" + ((offering == null) ? "null" : offering.getGuestIpType()) + ")"); } @@ -3362,7 +3363,7 @@ public class ManagementServerImpl implements ManagementServer { private FirewallRuleVO createFirewallRule(long userId, String ipAddress, UserVm userVm, String publicPort, String privatePort, String protocol, Long securityGroupId) throws NetworkRuleConflictException { // sanity check that the vm can be applied to the load balancer ServiceOfferingVO offering = _offeringsDao.findById(userVm.getServiceOfferingId()); - if ((offering == null) || !GuestIpType.Virtualized.equals(offering.getGuestIpType())) { + if ((offering == null) || !NetworkOffering.GuestIpType.Virtualized.equals(offering.getGuestIpType())) { if (s_logger.isDebugEnabled()) { s_logger.debug("Unable to create port forwarding rule (" + protocol + ":" + publicPort + "->" + privatePort+ ") for virtual machine " + userVm.toString() + ", bad network type (" + ((offering == null) ? "null" : offering.getGuestIpType()) + ")"); } @@ -7211,7 +7212,7 @@ public class ManagementServerImpl implements ManagementServer { } else { // sanity check that the vm can be applied to the load balancer ServiceOfferingVO offering = _offeringsDao.findById(userVm.getServiceOfferingId()); - if ((offering == null) || !GuestIpType.Virtualized.equals(offering.getGuestIpType())) { + if ((offering == null) || !NetworkOffering.GuestIpType.Virtualized.equals(offering.getGuestIpType())) { // we previously added these instanceIds to the loadBalancerVMMap, so remove them here as we are rejecting the API request // without actually modifying the load balancer _loadBalancerVMMapDao.remove(loadBalancerId, instanceIds, Boolean.TRUE); diff --git a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java index b70e7049fd0..86edc0eae68 100644 --- a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java @@ -32,8 +32,9 @@ import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StoragePool; @@ -146,14 +147,14 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { so = _offeringDao.findById(userVm.getServiceOfferingId()); } else if(vm.getType() == VirtualMachine.Type.ConsoleProxy) { so = new ServiceOfferingVO("Fake Offering For DomP", 1, - _proxyRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + _proxyRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else if(vm.getType() == VirtualMachine.Type.SecondaryStorageVm) { - so = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else if(vm.getType() == VirtualMachine.Type.DomainRouter) { - so = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else { assert(false) : "Unsupported system vm type"; - so = new ServiceOfferingVO("Fake Offering For unknow system VM", 1, 128, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For unknow system VM", 1, 128, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } long usedMemory = calcHostAllocatedCpuMemoryCapacity(vmOnHost, CapacityVO.CAPACITY_TYPE_MEMORY); @@ -243,14 +244,14 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { so = _offeringDao.findById(userVm.getServiceOfferingId()); } else if(vm.getType() == VirtualMachine.Type.ConsoleProxy) { so = new ServiceOfferingVO("Fake Offering For DomP", 1, - _proxyRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + _proxyRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else if(vm.getType() == VirtualMachine.Type.SecondaryStorageVm) { - so = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else if(vm.getType() == VirtualMachine.Type.DomainRouter) { - so = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } else { assert(false) : "Unsupported system vm type"; - so = new ServiceOfferingVO("Fake Offering For unknow system VM", 1, 128, 0, 0, 0, false, null, GuestIpType.Virtualized, false, true, null); + so = new ServiceOfferingVO("Fake Offering For unknow system VM", 1, 128, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, false, true, null); } if(capacityType == CapacityVO.CAPACITY_TYPE_MEMORY) { diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 815ead3bc0f..3f3fd1d7a5f 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -86,7 +86,8 @@ import com.cloud.network.IpAddrAllocator; import com.cloud.network.NetworkManager; import com.cloud.network.IpAddrAllocator.networkInfo; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; @@ -1365,7 +1366,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } boolean useLocalStorage = Boolean.parseBoolean((String)params.get(Config.SystemVMUseLocalStorage.key())); - _serviceOffering = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); + _serviceOffering = new ServiceOfferingVO("Fake Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null); _serviceOffering.setUniqueName("Cloud.com-SecondaryStorage"); _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); _template = _templateDao.findConsoleProxyTemplate(); diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java index 2be08d86823..7beda280aa1 100644 --- a/server/src/com/cloud/test/DatabaseConfig.java +++ b/server/src/com/cloud/test/DatabaseConfig.java @@ -49,7 +49,8 @@ import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDaoImpl; import com.cloud.storage.DiskOfferingVO; @@ -720,11 +721,11 @@ public class DatabaseConfig { boolean ha = Boolean.parseBoolean(_currentObjectParams.get("enableHA")); boolean mirroring = Boolean.parseBoolean(_currentObjectParams.get("mirrored")); String guestIpType = _currentObjectParams.get("guestIpType"); - GuestIpType type = null; + NetworkOffering.GuestIpType type = null; if (guestIpType == null) { - type = GuestIpType.Virtualized; + type = NetworkOffering.GuestIpType.Virtualized; } else { - type = GuestIpType.valueOf(guestIpType); + type = NetworkOffering.GuestIpType.valueOf(guestIpType); } boolean useLocalStorage; diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index beeee83728b..374ec7977fc 100644 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -33,9 +33,7 @@ import com.cloud.configuration.dao.ResourceLimitDao; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.exception.InvalidParameterValueException; -import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.dao.AccountDao; -import com.cloud.user.dao.UserDao; import com.cloud.utils.component.Inject; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GlobalLock; @@ -48,8 +46,6 @@ public class AccountManagerImpl implements AccountManager { private String _name; @Inject private AccountDao _accountDao; @Inject private DomainDao _domainDao; - @Inject private UserDao _userDao; - @Inject private VMTemplateDao _templateDao; @Inject private ResourceLimitDao _resourceLimitDao; @Inject private ResourceCountDao _resourceCountDao; private final GlobalLock m_resourceCountLock = GlobalLock.getInternLock("resource.count"); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 283deb48f64..7a26cc7d100 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -120,8 +120,9 @@ import com.cloud.network.dao.SecurityGroupDao; import com.cloud.network.dao.SecurityGroupVMMapDao; import com.cloud.network.security.NetworkGroupManager; import com.cloud.network.security.NetworkGroupVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; @@ -1176,7 +1177,7 @@ public class UserVmManagerImpl implements UserVmManager { public void releaseGuestIpAddress(UserVmVO userVm) { ServiceOffering offering = _offeringDao.findById(userVm.getServiceOfferingId()); - if (offering.getGuestIpType() != GuestIpType.Virtualized) { + if (offering.getGuestIpType() != NetworkOffering.GuestIpType.Virtualized) { IPAddressVO guestIP = (userVm.getGuestIpAddress() == null) ? null : _ipAddressDao.findById(userVm.getGuestIpAddress()); if (guestIP != null && guestIP.getAllocated() != null) { _ipAddressDao.unassignIpAddress(userVm.getGuestIpAddress()); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 43098ef070c..d6bdfac7972 100644 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -114,12 +114,16 @@ CREATE TABLE `cloud`.`nics` ( CREATE TABLE `cloud`.`network_offerings` ( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `name` varchar(64) NOT NULL COMMENT 'network offering', + `name` varchar(64) NOT NULL unique COMMENT 'network offering', `type` varchar(32) NOT NULL COMMENT 'type of network', `display_text` varchar(255) NOT NULL COMMENT 'text to display to users', - `nw_rate` smallint unsigned default 200 COMMENT 'network rate throttle mbits/s', - `mc_rate` smallint unsigned default 10 COMMENT 'mcast rate throttle mbits/s', - `concurrent_connections` smallint unsigned COMMENT 'concurrent connections supported on this network', + `nw_rate` smallint unsigned COMMENT 'network rate throttle mbits/s', + `mc_rate` smallint unsigned COMMENT 'mcast rate throttle mbits/s', + `concurrent_connections` int(10) unsigned COMMENT 'concurrent connections supported on this network', + `traffic_type` varchar(32) NOT NULL COMMENT 'traffic type carried on this network', + `created` datetime NOT NULL COMMENT 'time the entry was created', + `removed` datetime NOT NULL COMMENT 'time the entry was removed', + `system_only` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this network offering for system use only', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 7454f0f24a3dfff4d83ff7a447b19c5fff495326 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 23 Aug 2010 16:02:45 -0700 Subject: [PATCH 2/7] Incremental checkin for volume lineage --- api/src/com/cloud/storage/Volume.java | 11 +++++++ .../com/cloud/storage/StorageResource.java | 8 ++--- core/src/com/cloud/storage/VolumeVO.java | 33 ++++++++++++++++--- .../com/cloud/storage/StorageManagerImpl.java | 19 ++++++++--- setup/db/create-schema.sql | 2 ++ 5 files changed, 61 insertions(+), 12 deletions(-) diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java index c7a981eeb41..f43f5a5be74 100755 --- a/api/src/com/cloud/storage/Volume.java +++ b/api/src/com/cloud/storage/Volume.java @@ -37,6 +37,9 @@ public interface Volume extends PartOf, OwnedBy, BasedOn { Destroyed } + enum SourceType { + Snapshot,DiskOffering,Template,Blank + } /** * @return the volume name */ @@ -75,4 +78,12 @@ public interface Volume extends PartOf, OwnedBy, BasedOn { Long getPoolId(); State getState(); + + SourceType getSourceType(); + + void setSourceType(SourceType sourceType); + + void setSourceId(Long sourceId); + + Long getSourceId(); } diff --git a/core/src/com/cloud/storage/StorageResource.java b/core/src/com/cloud/storage/StorageResource.java index c80509708a4..7ad29f10c83 100755 --- a/core/src/com/cloud/storage/StorageResource.java +++ b/core/src/com/cloud/storage/StorageResource.java @@ -195,7 +195,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv String path = rootdiskFolder + File.separator + "rootdisk"; long totalSize = getVolumeSize(path); - VolumeVO vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), rootdiskFolder, path, totalSize, Volume.VolumeType.ROOT); + VolumeVO vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), rootdiskFolder, path, totalSize, Volume.VolumeType.ROOT); vols.add(vol); // Get the datadisk volume @@ -203,7 +203,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv path = datadiskFolder + File.separator + datadiskName; totalSize = getVolumeSize(path); - vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), datadiskFolder, path, totalSize, Volume.VolumeType.DATADISK); + vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), datadiskFolder, path, totalSize, Volume.VolumeType.DATADISK); vols.add(vol); } @@ -216,7 +216,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv String path = getVolumeName(imagePath, null); long totalSize = getVolumeSize(path); - VolumeVO vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.ROOT); + VolumeVO vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.ROOT); vols.add(vol); @@ -225,7 +225,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv totalSize = getVolumeSize(path); - vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.DATADISK); + vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.DATADISK); vols.add(vol); } diff --git a/core/src/com/cloud/storage/VolumeVO.java b/core/src/com/cloud/storage/VolumeVO.java index e80a02a6d1d..48ccc908c99 100755 --- a/core/src/com/cloud/storage/VolumeVO.java +++ b/core/src/com/cloud/storage/VolumeVO.java @@ -149,6 +149,13 @@ public class VolumeVO implements Volume { @Enumerated(value=EnumType.STRING) private State state; + @Column(name="source_type") + @Enumerated(value=EnumType.STRING) + Volume.SourceType sourceType; + + @Column(name="source_id") + Long sourceId; + /** * Constructor for data disk. * @param type @@ -178,8 +185,7 @@ public class VolumeVO implements Volume { } // Real Constructor - public VolumeVO(long id, VolumeType type, String name, long dcId, long domainId, long accountId, long diskOfferingId, long size) { - this.id = id; + public VolumeVO(VolumeType type, String name, long dcId, long domainId, long accountId, long diskOfferingId, long size) { this.volumeType = type; this.name = name; this.dataCenterId = dcId; @@ -212,8 +218,7 @@ public class VolumeVO implements Volume { } - public VolumeVO(Long id, String name, long dcId, long podId, long accountId, long domainId, Long instanceId, String folder, String path, long size, Volume.VolumeType vType) { - this.id = id; + public VolumeVO(String name, long dcId, long podId, long accountId, long domainId, Long instanceId, String folder, String path, long size, Volume.VolumeType vType) { this.name = name; this.accountId = accountId; this.domainId = domainId; @@ -510,4 +515,24 @@ public class VolumeVO implements Volume { public String toString() { return new StringBuilder("Vol[").append(id).append("|vm=").append(instanceId).append("|").append(volumeType).append("]").toString(); } + + @Override + public SourceType getSourceType() { + return this.sourceType; + } + + @Override + public void setSourceType(SourceType sourceType) { + this.sourceType = sourceType; + } + + @Override + public void setSourceId(Long sourceId){ + this.sourceId = sourceId; + } + + @Override + public Long getSourceId(){ + return this.sourceId; + } } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 76091274ccd..99c13301707 100644 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -102,6 +102,7 @@ import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Volume.MirrorState; +import com.cloud.storage.Volume.SourceType; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.allocator.StoragePoolAllocator; import com.cloud.storage.dao.DiskOfferingDao; @@ -233,7 +234,7 @@ public class StorageManagerImpl implements StorageManager { long deviceId = 0; Transaction txn = Transaction.currentTxn(); txn.start(); - rootVol = new VolumeVO(rootDisk.getVolumeId(), VolumeType.ROOT, rootDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), rootDisk.getDiskOfferingId(), rootDisk.getSize()); + rootVol = new VolumeVO(VolumeType.ROOT, rootDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), rootDisk.getDiskOfferingId(), rootDisk.getSize()); if (rootDisk.getTemplateId() != null) { rootVol.setTemplateId(rootDisk.getTemplateId()); } @@ -242,7 +243,7 @@ public class StorageManagerImpl implements StorageManager { rootVol = _volsDao.persist(rootVol); vols.add(rootVol); for (DiskCharacteristics dataDisk : dataDisks) { - dataVol = new VolumeVO(dataDisk.getVolumeId(), VolumeType.DATADISK, dataDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), dataDisk.getDiskOfferingId(), dataDisk.getSize()); + dataVol = new VolumeVO(VolumeType.DATADISK, dataDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), dataDisk.getDiskOfferingId(), dataDisk.getSize()); dataVol.setDeviceId(deviceId++); dataVol.setInstanceId(vm.getId()); dataVol = _volsDao.persist(dataVol); @@ -484,7 +485,7 @@ public class StorageManagerImpl implements StorageManager { // Create the Volume object and save it so that we can return it to the user Account account = _accountDao.findById(accountId); - VolumeVO volume = new VolumeVO(null, userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); + VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); volume.setPoolId(null); volume.setDataCenterId(dc.getId()); volume.setPodId(null); @@ -499,6 +500,8 @@ public class StorageManagerImpl implements StorageManager { volume.setInstanceId(null); volume.setUpdated(new Date()); volume.setStatus(AsyncInstanceCreateStatus.Creating); + volume.setSourceType(SourceType.Snapshot); + volume.setSourceId(snapshot.getId()); volume = _volsDao.persist(volume); volumeId = volume.getId(); @@ -853,18 +856,24 @@ public class StorageManagerImpl implements StorageManager { if (Storage.ImageFormat.ISO == template.getFormat()) { rootVol = new VolumeVO(VolumeType.ROOT, vm.getId(), vm.getInstanceName() + "-ROOT", dc.getId(), pod.getId(), account.getId(), account.getDomainId(),(size>0)? size : diskOffering.getDiskSizeInBytes()); rootVol.setDiskOfferingId(diskOffering.getId()); + rootVol.setSourceType(SourceType.Template); + rootVol.setSourceId(template.getId()); rootVol.setDeviceId(0l); rootVol = _volsDao.persist(rootVol); } else { rootVol = new VolumeVO(VolumeType.ROOT, vm.getId(), template.getId(), vm.getInstanceName() + "-ROOT", dc.getId(), pod.getId(), account.getId(), account.getDomainId(), offering.isRecreatable()); rootVol.setDiskOfferingId(offering.getId()); rootVol.setTemplateId(template.getId()); + rootVol.setSourceId(template.getId()); + rootVol.setSourceType(SourceType.Template); rootVol.setDeviceId(0l); rootVol = _volsDao.persist(rootVol); if (diskOffering != null && diskOffering.getDiskSizeInBytes() > 0) { dataVol = new VolumeVO(VolumeType.DATADISK, vm.getId(), vm.getInstanceName() + "-DATA", dc.getId(), pod.getId(), account.getId(), account.getDomainId(), (size>0)? size : diskOffering.getDiskSizeInBytes()); dataVol.setDiskOfferingId(diskOffering.getId()); + dataVol.setSourceType(SourceType.DiskOffering); + dataVol.setSourceId(diskOffering.getId()); dataVol.setDeviceId(1l); dataVol = _volsDao.persist(dataVol); } @@ -1572,7 +1581,7 @@ public class StorageManagerImpl implements StorageManager { // Create the Volume object and save it so that we can return it to the user Account account = _accountDao.findById(accountId); - VolumeVO volume = new VolumeVO(null, userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); + VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); volume.setPoolId(null); volume.setDataCenterId(dc.getId()); volume.setPodId(null); @@ -1585,6 +1594,8 @@ public class StorageManagerImpl implements StorageManager { volume.setUpdated(new Date()); volume.setStatus(AsyncInstanceCreateStatus.Creating); volume.setDomainId(account.getDomainId()); + volume.setSourceId(diskOffering.getId()); + volume.setSourceType(SourceType.DiskOffering); volume = _volsDao.persist(volume); AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 43098ef070c..cba1fea9f28 100644 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -250,6 +250,8 @@ CREATE TABLE `cloud`.`volumes` ( `removed` datetime COMMENT 'Date removed. not null if removed', `status` varchar(32) COMMENT 'Async API volume creation status', `state` varchar(32) COMMENT 'State machine', + `source_id` bigint unsigned COMMENT 'id for the source', + `source_type` varchar(32) COMMENT 'source from which the volume is created -- snapshot, diskoffering, template, blank', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 7f771cbe243255d74fbfe5755c0ea19d41819072 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 23 Aug 2010 16:17:18 -0700 Subject: [PATCH 3/7] bug 5883: Final checkin for volume lineage status 5853: RESOLVED FIXED --- server/src/com/cloud/api/BaseCmd.java | 2 ++ server/src/com/cloud/api/commands/ListVolumesCmd.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/api/BaseCmd.java b/server/src/com/cloud/api/BaseCmd.java index e9072b732b4..4c630bd734c 100644 --- a/server/src/com/cloud/api/BaseCmd.java +++ b/server/src/com/cloud/api/BaseCmd.java @@ -337,6 +337,8 @@ public abstract class BaseCmd { STATE("state", BaseCmd.TYPE_STRING, "state"), STOPPED_VMS("stoppedvms", BaseCmd.TYPE_LONG, "stoppedvms"), STORAGE("storage", BaseCmd.TYPE_LONG, "storage"), + SOURCE_ID("sourceid", BaseCmd.TYPE_LONG, "sourceid"), + SOURCE_TYPE("sourcetype",BaseCmd.TYPE_STRING,"sourcetype"), STORAGE_TYPE("storagetype", BaseCmd.TYPE_STRING, "storageType"), SUCCESS("success", BaseCmd.TYPE_BOOLEAN, "success"), SUM_ACROSS_ZONE("sumacrosszone", BaseCmd.TYPE_BOOLEAN, "sumAcrossZone"), diff --git a/server/src/com/cloud/api/commands/ListVolumesCmd.java b/server/src/com/cloud/api/commands/ListVolumesCmd.java index a4680be0441..b856e4eae2f 100644 --- a/server/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/server/src/com/cloud/api/commands/ListVolumesCmd.java @@ -223,7 +223,9 @@ public class ListVolumesCmd extends BaseCmd{ Long poolId = volume.getPoolId(); String poolName = (poolId == null) ? "none" : getManagementServer().findPoolById(poolId).getName(); volumeData.add(new Pair(BaseCmd.Properties.STORAGE.getName(), poolName)); - + volumeData.add(new Pair(BaseCmd.Properties.SOURCE_ID.getName(),volume.getSourceId())); + volumeData.add(new Pair(BaseCmd.Properties.SOURCE_TYPE.getName(),volume.getSourceType().toString())); + vTag[i++] = volumeData; } Pair volumeTag = new Pair("volume", vTag); From 67e1eee981dd028a9717ade05852d17b89d88604 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 23 Aug 2010 16:27:40 -0700 Subject: [PATCH 4/7] Adding to migration script --- setup/db/migration/schema-21to22.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup/db/migration/schema-21to22.sql b/setup/db/migration/schema-21to22.sql index 108ed2a9e20..dff1e91ae52 100644 --- a/setup/db/migration/schema-21to22.sql +++ b/setup/db/migration/schema-21to22.sql @@ -7,3 +7,5 @@ ALTER TABLE `cloud`.`data_center` MODIFY COLUMN `guest_network_cidr` varchar(18) ALTER TABLE `cloud`.`resource_count` ADD COLUMN `domain_id` bigint unsigned; -- add the new column ALTER TABLE `cloud`.`resource_count` MODIFY COLUMN `account_id` bigint unsigned; -- modify the column to allow NULL values ALTER TABLE `cloud`.`storage_pool` add COLUMN STATUS varchar(32) not null; -- new status column for maintenance mode support for primary storage +ALTER TABLE `cloud`.`volumes` ADD COLUMN `source_id` bigint unsigned; -- id for the source +ALTER TABLE `cloud`.`volumes` ADD COLUMN `source_type` varchar(32); --source from which the volume is created i.e. snapshot, diskoffering, template, blank From 0366dd093c63d386a882c6c26dbbd3b24c0adf4c Mon Sep 17 00:00:00 2001 From: Anthony Xu Date: Mon, 23 Aug 2010 18:01:39 -0700 Subject: [PATCH 5/7] use slaveconnection instead of masterconnection for all host plugin calls. tested by creating domr and user vm and migrating them 1. if you add host for kvm , you need specify kvm://ip_address, otherwiset there is no to differ kvm and xenserver hosts, edison cloud you please test this, may need some minor fixes. 2. if you want to session inside your plugin call, you can not use the one which is passed in, due to it is a slavesession, you need to call get_xapi_session() to get a new local session and use it. I have modified some of these, I may ignore some. Please let me know if you see XENAPI_PLUGIN_EXCEPTION. --- client/tomcatconf/components.xml.in | 1 + .../xen/resource/CitrixResourceBase.java | 39 ++++++++++++++++-- .../vm/hypervisor/xenserver/hostvmstats.py | 8 +--- scripts/vm/hypervisor/xenserver/vmops | 41 +++++++++++++++---- .../kvm/discoverer/KvmServerDiscoverer.java | 4 +- .../xen/discoverer/XcpServerDiscoverer.java | 37 ++++++++--------- 6 files changed, 89 insertions(+), 41 deletions(-) diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 986ac065f6d..ce698854bbe 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -149,6 +149,7 @@ + diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 24997f1110a..bdb4de079a1 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -3491,9 +3491,25 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected String callHostPlugin(String plugin, String cmd, String... params) { Map args = new HashMap(); + Session slaveSession = null; + Connection slaveConn = null; try { - Connection conn = getConnection(); - Host host = Host.getByUuid(conn, _host.uuid); + URL slaveUrl = null; + try { + slaveUrl = new URL("http://" + _host.ip); + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + slaveConn = new Connection(slaveUrl, 10); + slaveSession = Session.slaveLocalLoginWithPassword(slaveConn, _username, _password); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Slave logon successful. session= " + slaveSession); + } + Host host = Host.getByUuid(slaveConn, _host.uuid); + + for (int i = 0; i < params.length; i += 2) { args.put(params[i], params[i + 1]); } @@ -3502,7 +3518,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args)); } - String result = host.callPlugin(conn, plugin, cmd, args); + String result = host.callPlugin(slaveConn, plugin, cmd, args); if (s_logger.isTraceEnabled()) { s_logger.trace("callHostPlugin Result: " + result); } @@ -3511,6 +3527,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString()); } catch (XmlRpcException e) { s_logger.debug("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.getMessage()); + } finally { + if( slaveSession != null) { + try { + slaveSession.localLogout(slaveConn); + } catch (Exception e) { + } + } } return null; } @@ -3979,6 +4002,10 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.debug("Can't get xs-tools.iso: " + e.toString()); } } + + protected boolean can_bridge_firewall() { + return false; + } protected boolean getHostInfo() throws IllegalArgumentException{ Connection conn = getConnection(); @@ -3998,7 +4025,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return false; } - _canBridgeFirewall = Boolean.valueOf(callHostPlugin("vmops", "can_bridge_firewall", "host_uuid", _host.uuid)); + _canBridgeFirewall = can_bridge_firewall(); Nic privateNic = getLocalNetwork(conn, name); if (privateNic == null) { @@ -4008,6 +4035,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.warn("Unable to determine the private network for host " + _host.ip); return false; } + _privateNetworkName = name; privateNic = getLocalNetwork(conn, name); if (privateNic == null) { s_logger.warn("Unable to get private network " + name); @@ -4026,6 +4054,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } } else { guestNic = privateNic; + _guestNetworkName = _privateNetworkName; } _host.guestNetwork = guestNic.nr.uuid; _host.guestPif = guestNic.pr.uuid; @@ -4039,6 +4068,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } } else { publicNic = guestNic; + _publicNetworkName = _guestNetworkName; } _host.publicPif = publicNic.pr.uuid; _host.publicNetwork = publicNic.nr.uuid; @@ -4061,6 +4091,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR _host.storagePif2 = storageNic2.pr.uuid; s_logger.info("Private Network is " + _privateNetworkName + " for host " + _host.ip); + s_logger.info("Guest Network is " + _guestNetworkName + " for host " + _host.ip); s_logger.info("Public Network is " + _publicNetworkName + " for host " + _host.ip); s_logger.info("Storage Network 1 is " + _storageNetworkName1 + " for host " + _host.ip); s_logger.info("Storage Network 2 is " + _storageNetworkName2 + " for host " + _host.ip); diff --git a/scripts/vm/hypervisor/xenserver/hostvmstats.py b/scripts/vm/hypervisor/xenserver/hostvmstats.py index 89af959db61..8aa3eede4f9 100644 --- a/scripts/vm/hypervisor/xenserver/hostvmstats.py +++ b/scripts/vm/hypervisor/xenserver/hostvmstats.py @@ -7,14 +7,8 @@ import time import logging logging.basicConfig(filename='/tmp/xapilog',level=logging.DEBUG) -def get_xapi_session(): - xapi = XenAPI.xapi_local(); - xapi.login_with_password("","") - return xapi._session - -def get_stats(collect_host_stats, consolidation_function, interval, start_time): +def get_stats(session, collect_host_stats, consolidation_function, interval, start_time): try: - session = get_xapi_session() if collect_host_stats == "true" : url = "http://localhost/rrd_updates?" diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 3ac93f4abd5..dfc0c1d168e 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -4,6 +4,7 @@ import os, sys, time import XenAPIPlugin +import XenAPI sys.path.append("/opt/xensource/sm/") import SR, VDI, SRCommand, util, lvutil from util import CommandException @@ -35,13 +36,20 @@ def echo(fn): return res return wrapped + +def get_xapi_session(): + xapi = XenAPI.xapi_local(); + xapi.login_with_password("","") + return xapi._session + @echo def gethostvmstats(session, args): collect_host_stats = args['collectHostStats'] consolidation_function = args['consolidationFunction'] interval = args['interval'] start_time = args['startTime'] - result = hostvmstats.get_stats(collect_host_stats, consolidation_function, interval, start_time) + session = get_xapi_session() + result = hostvmstats.get_stats(session, collect_host_stats, consolidation_function, interval, start_time) return result @echo @@ -454,7 +462,9 @@ def heartbeat(session, args): txt='fail' return txt -def get_private_nic(session, args): +def get_private_nic( args): + session = get_xapi_session() + vms = session.xenapi.VM.get_all() host_uuid = args.get('host_uuid') host = session.xenapi.host.get_by_uuid(host_uuid) piflist = session.xenapi.host.get_PIFs(host) @@ -481,7 +491,7 @@ def can_bridge_firewall(session, args): util.pread2(['iptables', '-D', 'FORWARD', '-j', 'RH-Firewall-1-INPUT']) except: util.SMlog('Chain BRIDGE-FIREWALL already exists') - privnic = get_private_nic(session, args) + privnic = get_private_nic(args) result = 'true' try: util.pread2(['/bin/bash', '-c', 'iptables -n -L FORWARD | grep BRIDGE-FIREWALL']) @@ -496,8 +506,8 @@ def can_bridge_firewall(session, args): if not os.path.exists('/var/run/cloud'): os.makedirs('/var/run/cloud') - cleanup_rules_for_dead_vms(session) - cleanup_rules(session) + cleanup_rules_for_dead_vms() + cleanup_rules() return result @@ -875,6 +885,8 @@ def get_rule_log_for_vm(session, vmName): def get_rule_logs_for_vms(session, args): host_uuid = args.pop('host_uuid') try: + session = get_xapi_session() + thishost = session.xenapi.host.get_by_uuid(host_uuid) hostrec = session.xenapi.host.get_record(thishost) vms = hostrec.get('resident_VMs') @@ -897,7 +909,9 @@ def get_rule_logs_for_vms(session, args): return ";".join(result) @echo -def cleanup_rules_for_dead_vms(session): +def cleanup_rules_for_dead_vms(): + try: + session = get_xapi_session() vms = session.xenapi.VM.get_all() cleaned = 0 for vm_name in [session.xenapi.VM.get_name_label(x) for x in vms]: @@ -913,9 +927,16 @@ def cleanup_rules_for_dead_vms(session): cleaned = cleaned+1 util.SMlog("Cleaned up rules for " + str(cleaned) + " vms") + except: + util.SMlog("Failed to cleanup rules for dead vms!") + + @echo -def cleanup_rules(session): +def cleanup_rules(): + try: + session = get_xapi_session() + chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2" chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n') cleaned = 0 @@ -942,6 +963,8 @@ def cleanup_rules(session): destroy_network_rules_for_vm(session, {'vmName':vmname}) util.SMlog("Cleaned up rules for " + str(len(cleanup)) + " chains") + except: + util.SMlog("Failed to cleanup rules !") @echo def check_rule_log_for_vm(vmName, vmID, vmIP, domID, signature, seqno): @@ -1005,6 +1028,8 @@ def remove_rule_log_for_vm(vmName): @echo def network_rules(session, args): + try: + session = get_xapi_session() vm_name = args.get('vmName') vmName = vm_name vm_ip = args.get('vmIP') @@ -1101,6 +1126,8 @@ def network_rules(session, args): return 'false' return 'true' + except: + util.SMlog("Failed to network rule !") diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java index 19c1aea8bee..2f043069012 100644 --- a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java @@ -99,8 +99,8 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, String password) throws DiscoveryException { Map> resources = new HashMap>(); Map details = new HashMap(); - if (!uri.getScheme().equals("http")) { - String msg = "urlString is not http so we're not taking care of the discovery for this: " + uri; + if (!uri.getScheme().equals("kvm")) { + String msg = "urlString is not kvm so we're not taking care of the discovery for this: " + uri; s_logger.debug(msg); return null; } diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index e7017710f9e..cc1fb72b343 100644 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -53,6 +53,7 @@ import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.xen.resource.CitrixResourceBase; import com.cloud.hypervisor.xen.resource.XcpServerResource; import com.cloud.hypervisor.xen.resource.XenServerConnectionPool; +import com.cloud.hypervisor.xen.resource.XenServerResource; import com.cloud.resource.Discoverer; import com.cloud.resource.DiscovererBase; import com.cloud.resource.ServerResource; @@ -170,15 +171,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L if (_hostDao.findByGuid(record.uuid) != null) { s_logger.debug("Skipping " + record.address + " because " + record.uuid + " is already in the database."); continue; - } - - - if (!checkServer(conn, dcId, podId, host, record)) { - continue; - } - + } + + CitrixResourceBase resource = createServerResource(dcId, podId, record); s_logger.info("Found host " + record.hostname + " ip=" + record.address + " product version=" + prodVersion); - CitrixResourceBase resource = createServerResource(record); Map details = new HashMap(); Map params = new HashMap(); @@ -379,22 +375,21 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L return true; } - - protected boolean checkServer(Connection conn, long dcId, Long podId, Host host, Host.Record record) { + + protected CitrixResourceBase createServerResource(long dcId, Long podId, Host.Record record) { String prodBrand = record.softwareVersion.get("product_brand").trim(); String prodVersion = record.softwareVersion.get("product_version").trim(); - if(!prodBrand.equals("XenCloudPlatform") || !prodVersion.equals("0.1.1")) { - String msg = "Only support XCP 0.1.1, but this one is " + prodBrand + " " + prodVersion; - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); - s_logger.debug(msg); - throw new RuntimeException(msg); - } - return true; - } - - protected CitrixResourceBase createServerResource(Host.Record record) { - return new XcpServerResource(); + if(prodBrand.equals("XenCloudPlatform") && prodVersion.equals("0.1.1")) + return new XcpServerResource(); + + if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0")) + return new XenServerResource(); + + String msg = "Only support XCP 0.1.1 and Xerver 5.6.0, but this one is " + prodBrand + " " + prodVersion; + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); + s_logger.debug(msg); + throw new RuntimeException(msg); } protected void serverConfig() { From 20b26082db9a541e95937bef6454a219b704aa63 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Tue, 24 Aug 2010 00:00:43 -0700 Subject: [PATCH 6/7] bug 5764: changing from networkoffering to network profile --- api/src/com/cloud/acl/SecurityChecker.java | 6 ++- .../ConflictingNetworkSettingsException.java | 16 +++++++ api/src/com/cloud/network/NetworkProfile.java | 26 +++++++++++ .../com/cloud/network/NetworkProfiler.java | 25 +++++++++++ api/src/com/cloud/vm/NetworkProfiler.java | 18 -------- .../cloud/offerings/NetworkOfferingVO.java | 9 +++- core/src/com/cloud/vm/ConsoleProxyVO.java | 10 ++++- .../consoleproxy/ConsoleProxyManagerImpl.java | 41 ++++++++++++++---- .../com/cloud/network/NetworkManagerImpl.java | 27 ++++++++++-- .../com/cloud/network/NetworkProfileVO.java | 4 ++ .../cloud/network/NetworkProfilerImpl.java | 41 ++++++++++++++++++ .../network/dao/NetworkProfileDaoImpl.java | 20 ++++++++- .../offerings/dao/NetworkOfferingDaoImpl.java | 4 +- server/src/com/cloud/vm/MauriceMoss.java | 25 ++++++++--- server/src/com/cloud/vm/VmManager.java | 7 +-- setup/db/create-schema.sql | 2 +- .../src/com/cloud/utils/EnumerationImpl.java | 19 +++++++- .../src/com/cloud/utils/SerialVersionUID.java | 3 +- .../com/cloud/utils/component/Adapters.java | 8 +++- .../com/cloud/utils/db/GenericDaoBase.java | 43 ++++++++++++------- .../src/com/cloud/utils/db/UpdateBuilder.java | 5 +-- .../src/com/cloud/utils/db/UpdateFilter.java | 16 +++++++ 22 files changed, 303 insertions(+), 72 deletions(-) create mode 100644 api/src/com/cloud/exception/ConflictingNetworkSettingsException.java create mode 100644 api/src/com/cloud/network/NetworkProfile.java create mode 100644 api/src/com/cloud/network/NetworkProfiler.java delete mode 100644 api/src/com/cloud/vm/NetworkProfiler.java create mode 100644 server/src/com/cloud/network/NetworkProfilerImpl.java create mode 100644 utils/src/com/cloud/utils/db/UpdateFilter.java diff --git a/api/src/com/cloud/acl/SecurityChecker.java b/api/src/com/cloud/acl/SecurityChecker.java index 42e97eb645f..b878ca0b005 100644 --- a/api/src/com/cloud/acl/SecurityChecker.java +++ b/api/src/com/cloud/acl/SecurityChecker.java @@ -3,6 +3,8 @@ */ package com.cloud.acl; +import java.security.acl.NotOwnerException; + import com.cloud.domain.PartOf; import com.cloud.exception.PermissionDeniedException; import com.cloud.user.Account; @@ -23,7 +25,7 @@ public interface SecurityChecker extends Adapter { * @return true if access allowed. false if this adapter cannot authenticate ownership. * @throws PermissionDeniedException if this adapter is suppose to authenticate ownership and the check failed. */ - boolean checkOwnership(Account account, OwnedBy object) throws PermissionDeniedException; + boolean checkOwnership(Account account, OwnedBy object) throws NotOwnerException; /** * Checks if the user belongs to an account that owns the object. @@ -33,7 +35,7 @@ public interface SecurityChecker extends Adapter { * @return true if access allowed. false if this adapter cannot authenticate ownership. * @throws PermissionDeniedException if this adapter is suppose to authenticate ownership and the check failed. */ - boolean checkOwnership(User user, OwnedBy object) throws PermissionDeniedException; + boolean checkOwnership(User user, OwnedBy object) throws NotOwnerException; /** * Checks if the account can access the object. diff --git a/api/src/com/cloud/exception/ConflictingNetworkSettingsException.java b/api/src/com/cloud/exception/ConflictingNetworkSettingsException.java new file mode 100644 index 00000000000..6b19cf069a1 --- /dev/null +++ b/api/src/com/cloud/exception/ConflictingNetworkSettingsException.java @@ -0,0 +1,16 @@ +/** + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + + +public class ConflictingNetworkSettingsException extends Exception { + + private static final long serialVersionUID = SerialVersionUID.ConflictingNetworkSettingException; + + public ConflictingNetworkSettingsException() { + super(); + } +} diff --git a/api/src/com/cloud/network/NetworkProfile.java b/api/src/com/cloud/network/NetworkProfile.java new file mode 100644 index 00000000000..dada6e3a1b7 --- /dev/null +++ b/api/src/com/cloud/network/NetworkProfile.java @@ -0,0 +1,26 @@ +/** + * + */ +package com.cloud.network; + +import com.cloud.network.Network.BroadcastDomainType; +import com.cloud.network.Network.Mode; +import com.cloud.network.Network.TrafficType; +import com.cloud.user.OwnedBy; + +public interface NetworkProfile extends OwnedBy { + + long getId(); + + Mode getMode(); + + BroadcastDomainType getBroadcastDomainType(); + + TrafficType getTrafficType(); + + String getGateway(); + + String getCidr(); + + void setCidr(String cidr); +} diff --git a/api/src/com/cloud/network/NetworkProfiler.java b/api/src/com/cloud/network/NetworkProfiler.java new file mode 100644 index 00000000000..96d481bb742 --- /dev/null +++ b/api/src/com/cloud/network/NetworkProfiler.java @@ -0,0 +1,25 @@ +/** + * + */ +package com.cloud.network; + +import java.util.Collection; +import java.util.List; + +import com.cloud.exception.ConflictingNetworkSettingsException; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.ServiceOffering; +import com.cloud.user.Account; +import com.cloud.utils.component.Adapter; +import com.cloud.vm.VirtualMachine; + +/** + * NetworkProfiler takes the list of network offerings requested and figures + * out what are the additional network profiles that are needed to add + * to the account in order to support this network. + * + */ +public interface NetworkProfiler extends Adapter { + List convert(Collection networkOfferings, Account owner); + boolean check(VirtualMachine vm, ServiceOffering serviceOffering, Collection networkProfiles) throws ConflictingNetworkSettingsException; +} diff --git a/api/src/com/cloud/vm/NetworkProfiler.java b/api/src/com/cloud/vm/NetworkProfiler.java deleted file mode 100644 index b3afdd47c59..00000000000 --- a/api/src/com/cloud/vm/NetworkProfiler.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * - */ -package com.cloud.vm; - -import java.util.Collection; -import java.util.List; - -import com.cloud.offering.DiskOffering; -import com.cloud.offering.NetworkOffering; -import com.cloud.offering.ServiceOffering; -import com.cloud.user.Account; -import com.cloud.utils.Ternary; -import com.cloud.utils.component.Adapter; - -public interface NetworkProfiler extends Adapter { - Ternary, List> convert(VirtualMachine vm, ServiceOffering serviceOffering, List networkOfferings, Collection diskOfferings, Account owner); -} diff --git a/core/src/com/cloud/offerings/NetworkOfferingVO.java b/core/src/com/cloud/offerings/NetworkOfferingVO.java index b16d6baa4d0..b3580b1d768 100644 --- a/core/src/com/cloud/offerings/NetworkOfferingVO.java +++ b/core/src/com/cloud/offerings/NetworkOfferingVO.java @@ -35,6 +35,11 @@ import com.cloud.utils.db.GenericDao; @Entity @Table(name="network_offerings") public class NetworkOfferingVO implements NetworkOffering { + public final static String SystemVmPublicNetwork = "System-Vm-Public-Network"; + public final static String SystemVmGuestNetwork = "System-Vm-Guest-Network"; + public final static String SystemVmLinkLocalNetwork = "System-Vm-LinkLocal-Network"; + public final static String SystemVmManagementNetwork = "System-Vm-Management-Network"; + @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") @@ -46,10 +51,10 @@ public class NetworkOfferingVO implements NetworkOffering { @Column(name="display_text") String displayText; - @Column(name="rate") + @Column(name="nw_rate") Integer rateMbps; - @Column(name="multicast_rate") + @Column(name="mc_rate") Integer multicastRateMbps; @Column(name="concurrent_connections") diff --git a/core/src/com/cloud/vm/ConsoleProxyVO.java b/core/src/com/cloud/vm/ConsoleProxyVO.java index 20499b437b8..25e3defeeb5 100644 --- a/core/src/com/cloud/vm/ConsoleProxyVO.java +++ b/core/src/com/cloud/vm/ConsoleProxyVO.java @@ -93,7 +93,15 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { @Transient private int port; - + + /** + * Correct constructor to use. + */ + public ConsoleProxyVO(long id, String name, long templateId, long guestOSId, long dataCenterId, int activeSession) { + super(id, name, name, Type.ConsoleProxy, templateId, guestOSId, false); + this.activeSession = activeSession; + } + public ConsoleProxyVO( long id, String name, diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 91eeeff3302..8402256a5eb 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; @@ -96,9 +97,11 @@ import com.cloud.info.RunningHostInfoAgregator.ZoneHostInfo; import com.cloud.maid.StackMaid; import com.cloud.network.IpAddrAllocator; import com.cloud.network.IpAddrAllocator.networkInfo; -import com.cloud.network.NetworkProfileVO; +import com.cloud.network.Network.TrafficType; import com.cloud.network.dao.IPAddressDao; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; @@ -111,6 +114,7 @@ import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.user.Account; +import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; @@ -219,16 +223,23 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach private StorageManager _storageMgr; @Inject private HighAvailabilityManager _haMgr; + @Inject AccountManager _accountMgr; @Inject private EventDao _eventDao; @Inject ServiceOfferingDao _offeringDao; + @Inject + NetworkOfferingDao _networkOfferingDao; private IpAddrAllocator _IpAllocator; private ConsoleProxyListener _listener; private ServiceOfferingVO _serviceOffering; private VMTemplateVO _template; + + NetworkOfferingVO _publicNetworkOffering; + NetworkOfferingVO _managementNetworkOffering; + NetworkOfferingVO _linkLocalNetworkOffering; @Inject private AsyncJobManager _asyncMgr; @@ -252,10 +263,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach private String _domain; private String _instance; - private NetworkProfileVO _publicNetworkProfile; - private NetworkProfileVO _managementNetworkProfile; - private NetworkProfileVO _controlNetworkProfile; - // private String _privateNetmask; private int _proxyCmdPort = DEFAULT_PROXY_CMD_PORT; @@ -1000,11 +1007,21 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach @DB protected Map createProxyInstance2(long dataCenterId) { + long id = _consoleProxyDao.getNextInSequence(Long.class, "id"); + String name = VirtualMachineName.getConsoleProxyName(id, _instance); + + ConsoleProxyVO proxy = new ConsoleProxyVO(id, name, _template.getId(), _template.getGuestOSId(), dataCenterId, 0); + proxy = _consoleProxyDao.persist(proxy); + ArrayList networkOfferings = new ArrayList(3); + networkOfferings.add(_managementNetworkOffering); + networkOfferings.add(_linkLocalNetworkOffering); + networkOfferings.add(_publicNetworkOffering); + _vmMgr.allocate(proxy, _serviceOffering, null, networkOfferings, null, null, null, _accountMgr.getSystemAccount()); Map context = new HashMap(); String publicIpAddress = null; + return null; - - +/* Transaction txn = Transaction.currentTxn(); try { DataCenterVO dc = _dcDao.findById(dataCenterId); @@ -1044,7 +1061,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach context.put("proxyVmId", (long) 0); return context; } - long id = _consoleProxyDao.getNextInSequence(Long.class, "id"); context.put("publicIpAddress", publicIpAndVlan._ipAddr); @@ -1090,7 +1106,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach context.put("proxyVmId", (long) 0); return context; - } + }*/ } @DB @@ -2337,6 +2353,13 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach throw new ConfigurationException("Unable to find the template for console proxy VMs"); } + _publicNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmPublicNetwork, TrafficType.Public, null); + _publicNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_publicNetworkOffering); + _managementNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmManagementNetwork, TrafficType.Management, null); + _managementNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_managementNetworkOffering); + _linkLocalNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmLinkLocalNetwork, TrafficType.LinkLocal, null); + _linkLocalNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_linkLocalNetworkOffering); + _capacityScanScheduler.scheduleAtFixedRate(getCapacityScanTask(), STARTUP_DELAY, _capacityScanInterval, TimeUnit.MILLISECONDS); if (s_logger.isInfoEnabled()) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index c96f95aa7dc..e88e1344776 100644 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -129,6 +129,7 @@ import com.cloud.user.dao.UserStatisticsDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; +import com.cloud.utils.component.Adapters; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.concurrency.NamedThreadFactory; @@ -192,6 +193,8 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager @Inject ServiceOfferingDao _serviceOfferingDao = null; @Inject UserStatisticsDao _statsDao = null; @Inject NetworkOfferingDao _networkOfferingDao = null; + + Adapters _networkProfilers; long _routerTemplateId = -1; int _routerRamSize; @@ -1776,6 +1779,8 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor")); final ComponentLocator locator = ComponentLocator.getCurrentLocator(); + _networkProfilers = locator.getAdapters(NetworkProfiler.class); + final Map configs = _configDao.getConfiguration("AgentManager", params); _routerTemplateId = NumbersUtil.parseInt(configs.get("router.template.id"), 1); @@ -1826,14 +1831,19 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager throw new ConfigurationException("Unable to find the template for the router: " + _routerTemplateId); } - _publicNetworkOffering = new NetworkOfferingVO("System-VM-Public-Network", TrafficType.Public, null); + _publicNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmPublicNetwork, TrafficType.Public, null); _publicNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_publicNetworkOffering); + _managementNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmManagementNetwork, TrafficType.Management, null); + _managementNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_managementNetworkOffering); + _linkLocalNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmLinkLocalNetwork, TrafficType.LinkLocal, null); + _linkLocalNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_linkLocalNetworkOffering); + _guestNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmGuestNetwork, TrafficType.Guest, GuestIpType.Virtualized); + _guestNetworkOffering = _networkOfferingDao.persistSystemNetworkOffering(_guestNetworkOffering); - _managementNetworkOffering = new NetworkOfferingVO("System-VM-Management-Network", TrafficType.Management, null); - _linkLocalNetworkOffering = new NetworkOfferingVO("System-VM-LinkLocal-Network", TrafficType.LinkLocal, null); - _guestNetworkOffering = new NetworkOfferingVO("System-VM-Guest-Network", TrafficType.Guest, GuestIpType.Virtualized); // FIXME: Obviously Virtualized is not the only guest network. How do we determine which one to use? + + s_logger.info("Network Manager is configured."); return true; @@ -1846,6 +1856,15 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager @Override public boolean start() { + List offerings = new ArrayList(4); + offerings.add(_publicNetworkOffering); + offerings.add(_guestNetworkOffering); + offerings.add(_linkLocalNetworkOffering); + offerings.add(_managementNetworkOffering); + + for (NetworkProfiler profiler : _networkProfilers) { + List profiles = profiler.convert(offerings, _accountMgr.getSystemAccount()); + } _executor.scheduleAtFixedRate(new RouterCleanupTask(), _routerCleanupInterval, _routerCleanupInterval, TimeUnit.SECONDS); _executor.scheduleAtFixedRate(new NetworkUsageTask(), _routerStatsInterval, _routerStatsInterval, TimeUnit.SECONDS); return true; diff --git a/server/src/com/cloud/network/NetworkProfileVO.java b/server/src/com/cloud/network/NetworkProfileVO.java index 2e7d4f29438..cd9099147ac 100644 --- a/server/src/com/cloud/network/NetworkProfileVO.java +++ b/server/src/com/cloud/network/NetworkProfileVO.java @@ -57,6 +57,9 @@ public class NetworkProfileVO implements OwnedBy { @Enumerated(value=EnumType.STRING) TrafficType trafficType; + @Column(name="vlanIds") + String vlanIds; + @Column(name="gateway") String gateway; @@ -125,4 +128,5 @@ public class NetworkProfileVO implements OwnedBy { public void setCidr(String cidr) { this.cidr = cidr; } + } diff --git a/server/src/com/cloud/network/NetworkProfilerImpl.java b/server/src/com/cloud/network/NetworkProfilerImpl.java new file mode 100644 index 00000000000..22ac017126a --- /dev/null +++ b/server/src/com/cloud/network/NetworkProfilerImpl.java @@ -0,0 +1,41 @@ +/** + * + */ +package com.cloud.network; + +import java.util.Collection; +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.exception.ConflictingNetworkSettingsException; +import com.cloud.network.dao.NetworkProfileDao; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.ServiceOffering; +import com.cloud.user.Account; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.Inject; +import com.cloud.vm.VirtualMachine; + +@Local(value=NetworkProfiler.class) +public class NetworkProfilerImpl extends AdapterBase implements NetworkProfiler { + @Inject protected NetworkProfileDao _profileDao; + + protected NetworkProfilerImpl() { + super(); + } + + @Override + public List convert(Collection networkOfferings, Account owner) { + for (NetworkOffering offering : networkOfferings) { + } + return null; + } + + @Override + public boolean check(VirtualMachine vm, ServiceOffering serviceOffering, Collection networkProfiles) throws ConflictingNetworkSettingsException { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/server/src/com/cloud/network/dao/NetworkProfileDaoImpl.java b/server/src/com/cloud/network/dao/NetworkProfileDaoImpl.java index 734e378faec..09da5628ccb 100644 --- a/server/src/com/cloud/network/dao/NetworkProfileDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkProfileDaoImpl.java @@ -19,11 +19,29 @@ package com.cloud.network.dao; import javax.ejb.Local; +import com.cloud.network.Network.Mode; +import com.cloud.network.Network.TrafficType; import com.cloud.network.NetworkProfileVO; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; @Local(value=NetworkProfileDao.class) -public class NetworkProfileDaoImpl extends GenericDaoBase { +public class NetworkProfileDaoImpl extends GenericDaoBase implements NetworkProfileDao { + final SearchBuilder ProfileSearch; + protected NetworkProfileDaoImpl() { + super(); + + ProfileSearch = createSearchBuilder(); + ProfileSearch.and("account", ProfileSearch.entity().getAccountId(), SearchCriteria.Op.EQ); + ProfileSearch.and("trafficType", ProfileSearch.entity().getTrafficType(), SearchCriteria.Op.EQ); + ProfileSearch.and("cidr", ProfileSearch.entity().getCidr(), SearchCriteria.Op.EQ); + ProfileSearch.and("broadcastType", ProfileSearch.entity().getBroadcastDomainType(), SearchCriteria.Op.EQ); + } + + public NetworkProfileVO findBy(TrafficType trafficType, Mode mode, long accountId) { + return null; + } } diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java index 3166a464f82..95bfae9cc00 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java @@ -12,7 +12,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @Local(value=NetworkOfferingDao.class) -public class NetworkOfferingDaoImpl extends GenericDaoBase { +public class NetworkOfferingDaoImpl extends GenericDaoBase implements NetworkOfferingDao { SearchBuilder NameSearch; protected NetworkOfferingDaoImpl() { @@ -23,6 +23,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase sc = NameSearch.create(); @@ -32,6 +33,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase params) throws ConfigurationException { + _name = name; + return true; + } + + @Override + public String getName() { + return _name; } protected MauriceMoss() { } + } diff --git a/server/src/com/cloud/vm/VmManager.java b/server/src/com/cloud/vm/VmManager.java index a9833ec82bf..99c8352bc6c 100644 --- a/server/src/com/cloud/vm/VmManager.java +++ b/server/src/com/cloud/vm/VmManager.java @@ -25,11 +25,12 @@ import com.cloud.offerings.NetworkOfferingVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; import com.cloud.user.AccountVO; +import com.cloud.utils.component.Manager; /** * Manages allocating resources to vms. */ -public interface VmManager { +public interface VmManager extends Manager { VMInstanceVO allocate(VMInstanceVO vm, ServiceOfferingVO serviceOffering, @@ -51,10 +52,6 @@ public interface VmManager { void create(VmCharacteristics vm, List disks, List networks); - void start(); - - void stop(); - void destroy(); } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index d6bdfac7972..4b23fa18abb 100644 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -122,7 +122,7 @@ CREATE TABLE `cloud`.`network_offerings` ( `concurrent_connections` int(10) unsigned COMMENT 'concurrent connections supported on this network', `traffic_type` varchar(32) NOT NULL COMMENT 'traffic type carried on this network', `created` datetime NOT NULL COMMENT 'time the entry was created', - `removed` datetime NOT NULL COMMENT 'time the entry was removed', + `removed` datetime DEFAULT NULL COMMENT 'time the entry was removed', `system_only` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this network offering for system use only', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/utils/src/com/cloud/utils/EnumerationImpl.java b/utils/src/com/cloud/utils/EnumerationImpl.java index a30ffefa5bc..c8c7e417399 100755 --- a/utils/src/com/cloud/utils/EnumerationImpl.java +++ b/utils/src/com/cloud/utils/EnumerationImpl.java @@ -26,7 +26,7 @@ import java.util.Iterator; * * Why the heck didn't Iterator extend from Enumeration, I will probably never know. Tell me Lee Boyton! **/ -public class EnumerationImpl implements Enumeration { +public class EnumerationImpl implements Enumeration, Iterator { Iterator _it; // Can't use this. @@ -37,11 +37,28 @@ public class EnumerationImpl implements Enumeration { _it = it; } + @Override public boolean hasMoreElements() { return _it.hasNext(); } + @Override public T nextElement() { return _it.next(); } + + @Override + public boolean hasNext() { + return _it.hasNext(); + } + + @Override + public T next() { + return _it.next(); + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Enumerations do not support remove operation"); + } } diff --git a/utils/src/com/cloud/utils/SerialVersionUID.java b/utils/src/com/cloud/utils/SerialVersionUID.java index 664d31f44e4..712932eed13 100755 --- a/utils/src/com/cloud/utils/SerialVersionUID.java +++ b/utils/src/com/cloud/utils/SerialVersionUID.java @@ -54,5 +54,6 @@ public interface SerialVersionUID { public static final long OperationTimedoutException = Base | 0x18; public static final long StorageUnavailableException = Base | 0x19; public static final long InfficientVirtualNetworkCapacityException = Base | 0x1a; - public static final long DiscoveryException = Base | 0x1b; + public static final long DiscoveryException = Base | 0x1b; + public static final long ConflictingNetworkSettingException = Base | 0x1c; } diff --git a/utils/src/com/cloud/utils/component/Adapters.java b/utils/src/com/cloud/utils/component/Adapters.java index e1b504ed535..fe9f0edcb1e 100755 --- a/utils/src/com/cloud/utils/component/Adapters.java +++ b/utils/src/com/cloud/utils/component/Adapters.java @@ -18,6 +18,7 @@ package com.cloud.utils.component; import java.util.Enumeration; +import java.util.Iterator; import java.util.List; import com.cloud.utils.EnumerationImpl; @@ -30,7 +31,7 @@ import com.cloud.utils.EnumerationImpl; * the iterator even during dynamic reloading. * **/ -public class Adapters { +public class Adapters implements Iterable { private List _adapters; protected String _name; @@ -51,6 +52,11 @@ public class Adapters { public Enumeration enumeration() { return new EnumerationImpl(_adapters.iterator()); } + + @Override + public Iterator iterator() { + return new EnumerationImpl(_adapters.iterator()); + } protected List get() { return _adapters; diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java index 641bd55fe43..0faf861b7a8 100755 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@ -45,8 +45,11 @@ import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.TableGenerator; +import net.sf.cglib.proxy.Callback; +import net.sf.cglib.proxy.CallbackFilter; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.Factory; +import net.sf.cglib.proxy.NoOp; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; @@ -126,8 +129,11 @@ public abstract class GenericDaoBase implements Gene protected final Map, Attribute> _allColumns; protected Enhancer _enhancer; protected Factory _factory; + protected Enhancer _searchEnhancer; protected int _timeoutSeconds; + protected final static CallbackFilter s_callbackFilter = new UpdateFilter(); + protected static final String FOR_UPDATE_CLAUSE = " FOR UPDATE "; protected static final String SHARE_MODE_CLAUSE = " LOCK IN SHARE MODE"; protected static final String SELECT_LAST_INSERT_ID_SQL = "SELECT LAST_INSERT_ID()"; @@ -157,9 +163,10 @@ public abstract class GenericDaoBase implements Gene return dao; } + @Override @SuppressWarnings("unchecked") public GenericSearchBuilder createSearchBuilder(Class resultType) { - final T entity = (T)_enhancer.create(); + final T entity = (T)_searchEnhancer.create(); final Factory factory = (Factory)entity; GenericSearchBuilder builder = new GenericSearchBuilder(entity, resultType, _allAttributes); factory.setCallback(0, builder); @@ -210,11 +217,18 @@ public abstract class GenericDaoBase implements Gene _tgs.put(tg.name(), tg); } + Callback[] callbacks = new Callback[] { NoOp.INSTANCE, new UpdateBuilder(_allAttributes) }; + _enhancer = new Enhancer(); _enhancer.setSuperclass(_entityBeanType); - _enhancer.setCallback(new UpdateBuilder(_allAttributes)); + _enhancer.setCallbackFilter(s_callbackFilter); + _enhancer.setCallbacks(callbacks); _factory = (Factory)_enhancer.create(); + _searchEnhancer = new Enhancer(); + _searchEnhancer.setSuperclass(_entityBeanType); + _searchEnhancer.setCallback(new UpdateBuilder(_allAttributes)); + if (s_logger.isTraceEnabled()) { s_logger.trace("Select SQL: " + _partialSelectSql.first().toString()); s_logger.trace("Remove SQL: " + (_removeSql != null ? _removeSql.first() : "No remove sql")); @@ -235,8 +249,7 @@ public abstract class GenericDaoBase implements Gene @Override @DB(txn=false) @SuppressWarnings("unchecked") public T createForUpdate(final ID id) { - final T entity = (T)_enhancer.create(); - final Factory factory = (Factory)entity; + final T entity = (T)_factory.newInstance(new Callback[] {NoOp.INSTANCE, new UpdateBuilder(_allAttributes)}); if (id != null) { try { _idField.set(entity, id); @@ -244,7 +257,6 @@ public abstract class GenericDaoBase implements Gene } catch (final IllegalAccessException e) { } } - factory.setCallback(0, new UpdateBuilder(_allAttributes)); return entity; } @@ -254,7 +266,6 @@ public abstract class GenericDaoBase implements Gene } @Override - @SuppressWarnings("unchecked") public K getNextInSequence(final Class clazz, final String name) { final TableGenerator tg = _tgs.get(name); assert (tg != null) : "Couldn't find Table generator using " + name; @@ -285,6 +296,7 @@ public abstract class GenericDaoBase implements Gene return searchAll(sc, filter, lock, cache); } + @Override public List searchAll(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { @@ -377,7 +389,6 @@ public abstract class GenericDaoBase implements Gene final Transaction txn = Transaction.currentTxn(); PreparedStatement pstmt = s_initStmt; - final List result = new ArrayList(); try { pstmt = txn.prepareAutoCloseStatement(sql); int i = 0; @@ -398,7 +409,6 @@ public abstract class GenericDaoBase implements Gene } ResultSet rs = pstmt.executeQuery(); SelectType st = sc.getSelectType(); - ResultSetMetaData md = rs.getMetaData(); ArrayList results = new ArrayList(); List fields = sc.getSelectFields(); while (rs.next()) { @@ -505,8 +515,8 @@ public abstract class GenericDaoBase implements Gene final Enumerated enumerated = field.getAnnotation(Enumerated.class); final EnumType enumType = (enumerated == null) ? EnumType.STRING : enumerated.value(); - final Enum[] enums = (Enum[])field.getType().getEnumConstants(); - for (final Enum e : enums) { + final Enum[] enums = (Enum[])field.getType().getEnumConstants(); + for (final Enum e : enums) { if ((enumType == EnumType.STRING && e.name().equalsIgnoreCase(rs.getString(index))) || (enumType == EnumType.ORDINAL && e.ordinal() == rs.getInt(index))) { field.set(entity, e); @@ -626,7 +636,7 @@ public abstract class GenericDaoBase implements Gene @DB(txn=false) protected int update(final ID id, final UpdateBuilder ub) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd(_idAttributes.get(_table)[0], SearchCriteria.Op.EQ, id); int rowsUpdated = update(ub, sc, null); if (_cache != null) { @@ -761,7 +771,6 @@ public abstract class GenericDaoBase implements Gene } @Override @DB(txn=false) - @SuppressWarnings("unchecked") public T findById(final ID id, boolean fresh) { if(!fresh) return findById(id); @@ -801,6 +810,7 @@ public abstract class GenericDaoBase implements Gene return acquire(id, _timeoutSeconds); } + @Override public T acquire(final ID id, int seconds) { Transaction txn = Transaction.currentTxn(); T t = null; @@ -941,6 +951,7 @@ public abstract class GenericDaoBase implements Gene } // FIXME: Does not work for joins. + @Override public int delete(final SearchCriteria sc) { final StringBuilder str = new StringBuilder("DELETE FROM "); str.append(_table); @@ -1176,7 +1187,7 @@ public abstract class GenericDaoBase implements Gene if (type == EnumType.STRING) { pstmt.setString(j, value == null ? null : value.toString()); } else if (type == EnumType.ORDINAL) { - pstmt.setInt(j, value == null ? null : ((Enum)value).ordinal()); + pstmt.setInt(j, value == null ? null : ((Enum)value).ordinal()); } } else if (attr.field.getType() == byte[].class) { pstmt.setBytes(j, (byte[])value); @@ -1204,7 +1215,7 @@ public abstract class GenericDaoBase implements Gene @SuppressWarnings("unchecked") @DB(txn=false) protected T toEntityBean(final ResultSet result, final boolean cache) throws SQLException { - final T entity = (T)_factory.newInstance(new UpdateBuilder(_allAttributes)); + final T entity = (T)_factory.newInstance(new Callback[] {NoOp.INSTANCE, new UpdateBuilder(_allAttributes)}); toEntityBean(result, entity); @@ -1341,13 +1352,13 @@ public abstract class GenericDaoBase implements Gene public static UpdateBuilder getUpdateBuilder(final T entityObject) { final Factory factory = (Factory)entityObject; assert(factory != null); - return (UpdateBuilder)factory.getCallback(0); + return (UpdateBuilder)factory.getCallback(1); } @SuppressWarnings("unchecked") @Override @DB(txn=false) public SearchBuilder createSearchBuilder() { - final T entity = (T)_enhancer.create(); + final T entity = (T)_searchEnhancer.create(); final Factory factory = (Factory)entity; SearchBuilder builder = new SearchBuilder(entity, _allAttributes); factory.setCallback(0, builder); diff --git a/utils/src/com/cloud/utils/db/UpdateBuilder.java b/utils/src/com/cloud/utils/db/UpdateBuilder.java index 6c1d464541d..fb5936e69c9 100755 --- a/utils/src/com/cloud/utils/db/UpdateBuilder.java +++ b/utils/src/com/cloud/utils/db/UpdateBuilder.java @@ -18,16 +18,13 @@ package com.cloud.utils.db; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; -import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.exception.CloudRuntimeException; @@ -40,6 +37,7 @@ public class UpdateBuilder implements MethodInterceptor { _changes = new HashMap>(); } + @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { String name = method.getName(); if (name.startsWith("set")) { @@ -125,7 +123,6 @@ public class UpdateBuilder implements MethodInterceptor { } public StringBuilder toSql(String tables) { - List> setters = new ArrayList>(); if (_changes.isEmpty()) { return null; } diff --git a/utils/src/com/cloud/utils/db/UpdateFilter.java b/utils/src/com/cloud/utils/db/UpdateFilter.java new file mode 100644 index 00000000000..b011d08888b --- /dev/null +++ b/utils/src/com/cloud/utils/db/UpdateFilter.java @@ -0,0 +1,16 @@ +/** + * + */ +package com.cloud.utils.db; + +import java.lang.reflect.Method; + +import net.sf.cglib.proxy.CallbackFilter; + +public class UpdateFilter implements CallbackFilter { + @Override + public int accept(Method method) { + String name = method.getName(); + return (name.startsWith("set") || name.startsWith("incr") || name.startsWith("decr")) ? 1 : 0; + } +} \ No newline at end of file From 5fb852f0ca0eacdfa18901dd19ac9419e8317def Mon Sep 17 00:00:00 2001 From: Anthony Xu Date: Tue, 24 Aug 2010 10:21:05 -0700 Subject: [PATCH 7/7] fix build, add XenServerResource.java --- .../xen/resource/XenServerResource.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java new file mode 100644 index 00000000000..713b3e6c3ae --- /dev/null +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java @@ -0,0 +1,55 @@ +/** + * + * 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.hypervisor.xen.resource; + + +import javax.ejb.Local; +import org.apache.log4j.Logger; +import org.apache.xmlrpc.XmlRpcException; + +import com.cloud.hypervisor.xen.resource.CitrixResourceBase; +import com.xensource.xenapi.VM; +import com.cloud.resource.ServerResource; +import com.xensource.xenapi.Connection; +import com.xensource.xenapi.Types.XenAPIException; + + +@Local(value=ServerResource.class) +public class XenServerResource extends CitrixResourceBase { + private static final Logger s_logger = Logger.getLogger(XenServerResource.class); + + + public XenServerResource() { + super(); + } + + @Override + protected String getGuestOsType(String stdType) { + return stdType; + } + + @Override + protected void setMemory(Connection conn, VM vm, long memsize) throws XmlRpcException, XenAPIException { + vm.setMemoryLimits(conn, memsize, memsize, memsize, memsize); + } + + @Override + protected String getPatchPath() { + return "scripts/vm/hypervisor/xenserver/xenserver56"; + } + +}