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/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/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/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/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 bfda859aa7d..8b16dec93c9 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/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"; + } + +} diff --git a/core/src/com/cloud/offerings/NetworkOfferingVO.java b/core/src/com/cloud/offerings/NetworkOfferingVO.java index 26ad13b8c13..b3580b1d768 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,11 +28,18 @@ 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") 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") @@ -42,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") @@ -54,6 +63,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 +91,11 @@ public class NetworkOfferingVO implements NetworkOffering { public long getId() { return id; } + + @Override + public TrafficType getTrafficType() { + return trafficType; + } @Override public Integer getMulticastRateMbps() { @@ -85,21 +112,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/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/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/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/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/agent/manager/allocator/impl/UserConcentratedAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java index ef407afedd3..2236689c049 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; @@ -253,14 +254,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/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/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/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); 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 febaddc51d6..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,8 +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.Network.TrafficType; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering.GuestIpType; +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; @@ -110,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; @@ -134,6 +139,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; @@ -217,20 +223,29 @@ 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; + + @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")); @@ -989,6 +1004,111 @@ 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); + 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 +2344,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 +2352,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach if (_template == null) { 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/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() { 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..e88e1344776 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; @@ -125,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; @@ -186,8 +191,10 @@ 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; + + Adapters _networkProfilers; long _routerTemplateId = -1; int _routerRamSize; @@ -198,6 +205,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 +218,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 +231,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 +366,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 +1505,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 +1748,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) { @@ -1764,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); @@ -1806,7 +1823,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 +1831,19 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager throw new ConfigurationException("Unable to find the template for the router: " + _routerTemplateId); } + _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); + + // 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; @@ -1826,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; @@ -2133,6 +2172,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager public RouterCleanupTask() { } + @Override public void run() { try { final List ids = _routerDao.findLonelyRouters(); @@ -2298,6 +2338,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..cd9099147ac 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) @@ -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; @@ -65,15 +68,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; } @@ -122,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/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..95bfae9cc00 --- /dev/null +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java @@ -0,0 +1,51 @@ +/** + * + */ +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 implements NetworkOfferingDao { + SearchBuilder NameSearch; + + protected NetworkOfferingDaoImpl() { + super(); + + NameSearch = createSearchBuilder(); + NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ); + NameSearch.done(); + } + + @Override + public NetworkOfferingVO findByName(String name) { + SearchCriteria sc = NameSearch.create(); + + sc.setParameters("name", name); + + return findOneActiveBy(sc); + + } + + @Override + 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/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/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/MauriceMoss.java b/server/src/com/cloud/vm/MauriceMoss.java index a082aed3fc7..a3bd4cebe77 100644 --- a/server/src/com/cloud/vm/MauriceMoss.java +++ b/server/src/com/cloud/vm/MauriceMoss.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import javax.ejb.Local; +import javax.naming.ConfigurationException; import com.cloud.dc.DataCenterVO; import com.cloud.network.NetworkManager; @@ -33,9 +34,11 @@ import com.cloud.utils.component.Inject; @Local(value=VmManager.class) public class MauriceMoss implements VmManager { + String _name; @Inject private StorageManager _storageMgr; @Inject private NetworkManager _networkMgr; + @Override public VMInstanceVO allocate(VMInstanceVO vm, ServiceOfferingVO serviceOffering, Long rootSize, @@ -46,6 +49,7 @@ public class MauriceMoss implements VmManager { return null; } + @Override public VMInstanceVO allocate(VMInstanceVO vm, ServiceOfferingVO serviceOffering, Long rootSize, @@ -70,16 +74,27 @@ public class MauriceMoss implements VmManager { } @Override - public void start() { - // TODO Auto-generated method stub - + public boolean start() { + return true; } @Override - public void stop() { - // TODO Auto-generated method stub + public boolean stop() { + return true; + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _name = name; + return true; + } + + @Override + public String getName() { + return _name; } protected MauriceMoss() { } + } 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/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 43098ef070c..c4c28ecb2aa 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 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; @@ -250,6 +254,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; 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 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