more work from alex

This commit is contained in:
Alex Huang 2010-09-17 13:27:23 -07:00
parent e0d962a8e4
commit bebe79ebc9
30 changed files with 409 additions and 131 deletions

View File

@ -12,6 +12,11 @@ import com.cloud.network.Network.TrafficType;
* owned by an account.
*/
public interface NetworkConfiguration {
enum State {
Allocated, // Indicates the network configuration is in allocated but not setup.
Setup, // Indicates the network configuration is setup.
InUse; // Indicates the network configuration is in use.
}
/**
* @return id of the network profile. Null means the network profile is not from the database.
@ -28,7 +33,9 @@ public interface NetworkConfiguration {
String getCidr();
public long getDataCenterId();
long getDataCenterId();
long getNetworkOfferingId();
State getState();
}

View File

@ -1,21 +0,0 @@
/**
*
*/
package com.cloud.network;
import java.util.Map;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.utils.component.Adapter;
/**
* 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 {
NetworkConfiguration convert(NetworkOffering offering, DeploymentPlan plan, Map<String, String> params, Account owner);
}

View File

@ -0,0 +1,24 @@
/**
*
*/
package com.cloud.network.configuration;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.network.NetworkConfiguration;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.utils.component.Adapter;
/**
* 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 NetworkGuru extends Adapter {
NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration config, Account owner);
NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination);
}

View File

@ -0,0 +1,32 @@
/**
*
*/
package com.cloud.network.element;
import com.cloud.network.NetworkConfiguration;
import com.cloud.offering.NetworkOffering;
import com.cloud.utils.component.Adapter;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineProfile;
/**
* Represents one network element that exists in a network.
*/
public interface NetworkElement extends Adapter {
/**
* Implement the network configuration as specified.
* @param config fully specified network configuration.
* @param offering network offering that originated the network configuration.
* @return true if network configuration is now usable; false if not.
*/
boolean implement(NetworkConfiguration config, NetworkOffering offering);
/**
* Prepare the nic profile to be used within the network.
* @param config
* @param nic
* @param offering
* @return
*/
boolean prepare(NetworkConfiguration config, NicProfile nic, VirtualMachineProfile vm, NetworkOffering offering);
}

View File

@ -19,6 +19,12 @@ public interface Resource {
Releasing,
}
enum ReservationStrategy {
UserSpecified,
Create,
Start
}
/**
* @return id in the CloudStack database
*/
@ -56,4 +62,6 @@ public interface Resource {
* @return the reservation state of the resource.
*/
State getState();
ReservationStrategy getReservationStrategy();
}

View File

@ -7,7 +7,7 @@ import com.cloud.deploy.DeployDestination;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.network.NetworkConfiguration;
import com.cloud.utils.component.Adapter;
import com.cloud.resource.Concierge;
/**
* NetworkConcierge reserves network settings for a VM based
@ -16,7 +16,7 @@ import com.cloud.utils.component.Adapter;
* the reservation.
*
*/
public interface NetworkConcierge extends Adapter {
public interface NetworkConcierge extends Concierge<Nic> {
String getUniqueName();
NicProfile allocate(VirtualMachine vm, NetworkConfiguration config, NicProfile nic) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException;

View File

@ -19,10 +19,13 @@
package com.cloud.vm;
import java.util.List;
import java.util.Set;
import com.cloud.utils.fsm.FiniteState;
import com.cloud.utils.fsm.StateMachine;
import com.cloud.vm.VirtualMachine.Event;
public enum State {
public enum State implements FiniteState<State, Event> {
Creating(true),
Starting(true),
Running(false),
@ -44,22 +47,24 @@ public enum State {
return _transitional;
}
public static String[] toStrings(State... states) {
String[] strs = new String[states.length];
for (int i = 0; i < states.length; i++) {
strs[i] = states[i].toString();
}
return strs;
}
@Override
public State getNextState(VirtualMachine.Event e) {
return s_fsm.getNextState(this, e);
}
public State[] getFromStates(VirtualMachine.Event e) {
List<State> from = s_fsm.getFromStates(this, e);
return from.toArray(new State[from.size()]);
@Override
public List<State> getFromStates(VirtualMachine.Event e) {
return s_fsm.getFromStates(this, e);
}
@Override
public Set<Event> getPossibleEvents() {
return s_fsm.getPossibleEvents(this);
}
@Override
public StateMachine<State, Event> getStateMachine() {
return s_fsm;
}
protected static final StateMachine<State, VirtualMachine.Event> s_fsm = new StateMachine<State, VirtualMachine.Event>();

View File

@ -67,10 +67,18 @@ public class VirtualMachineProfile {
this._nics = profiles;
}
public List<NicProfile> getNics() {
return _nics;
}
public void setDisks(List<DiskProfile> profiles) {
this._disks = profiles;
}
public List<DiskProfile> getDisks() {
return _disks;
}
public Hypervisor.Type getHypervisorType() {
return _hypervisorType;
}

View File

@ -36,12 +36,14 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.StateMachine;
import com.cloud.utils.fsm.FiniteStateObject;
@Entity
@Table(name="vm_instance")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING, length=32)
public class VMInstanceVO implements VirtualMachine {
public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, VirtualMachine.Event> {
@Id
@TableGenerator(name="vm_instance_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="vm_instance_seq", allocationSize=1)
@Column(name="id", updatable=false, nullable = false)
@ -66,6 +68,7 @@ public class VMInstanceVO implements VirtualMachine {
* else could be updating it as well.
*/
@Enumerated(value=EnumType.STRING)
@StateMachine(state=State.class, event=Event.class)
@Column(name="state", updatable=true, nullable=false, length=32)
private State state = null;
@ -249,6 +252,7 @@ public class VMInstanceVO implements VirtualMachine {
}
// don't use this directly, use VM state machine instead, this method is added for migration tool only
@Override
public void setState(State state) {
this.state = state;
}

View File

@ -1020,7 +1020,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach
List<NetworkOfferingVO> offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmControlNetwork, NetworkOfferingVO.SystemVmManagementNetwork, NetworkOfferingVO.SystemVmPublicNetwork);
List<NetworkConfigurationVO> profiles = new ArrayList<NetworkConfigurationVO>(offerings.size());
for (NetworkOfferingVO offering : offerings) {
profiles.add(_networkMgr.setupNetworkProfile(_accountMgr.getSystemAccount(), offering, plan));
profiles.add(_networkMgr.setupNetworkConfiguration(_accountMgr.getSystemAccount(), offering, plan));
}
ConsoleProxyVO proxy = new ConsoleProxyVO(id, name, _template.getId(), _template.getGuestOSId(), dataCenterId, 0);
proxy = _consoleProxyDao.persist(proxy);

View File

@ -70,11 +70,20 @@ public class NetworkConfigurationVO implements NetworkConfiguration {
@Column(name="data_center_id")
long dataCenterId;
@Column(name="handler_name")
String handlerName;
@Column(name="state")
@Enumerated(value=EnumType.STRING)
State state;
public NetworkConfigurationVO() {
}
public NetworkConfigurationVO(NetworkConfiguration that, long offeringId, long dataCenterId) {
public NetworkConfigurationVO(NetworkConfiguration that, long offeringId, long dataCenterId, String handlerName) {
this(that.getTrafficType(), that.getMode(), that.getBroadcastDomainType(), offeringId, dataCenterId);
this.handlerName = handlerName;
this.state = that.getState();
}
public NetworkConfigurationVO(TrafficType trafficType, Mode mode, BroadcastDomainType broadcastDomainType, long networkOfferingId, long dataCenterId) {
@ -83,6 +92,16 @@ public class NetworkConfigurationVO implements NetworkConfiguration {
this.broadcastDomainType = broadcastDomainType;
this.networkOfferingId = networkOfferingId;
this.dataCenterId = dataCenterId;
this.state = State.Allocated;
}
@Override
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
@Override
@ -109,6 +128,14 @@ public class NetworkConfigurationVO implements NetworkConfiguration {
return broadcastDomainType;
}
public String getHandlerName() {
return handlerName;
}
public void setHandlerName(String handlerName) {
this.handlerName = handlerName;
}
public void setBroadcastDomainType(BroadcastDomainType broadcastDomainType) {
this.broadcastDomainType = broadcastDomainType;
}

View File

@ -26,9 +26,12 @@ import com.cloud.async.executor.LoadBalancerParam;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
import com.cloud.dc.VlanVO;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.service.ServiceOfferingVO;
@ -41,6 +44,7 @@ import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachineProfile;
/**
* NetworkManager manages the network for the different end users.
@ -215,15 +219,15 @@ public interface NetworkManager extends Manager {
*/
List<IPAddressVO> listPublicIpAddressesInVirtualNetwork(long accountId, long dcId, Boolean sourceNat);
NetworkConfigurationVO setupNetworkProfile(AccountVO account, NetworkOfferingVO offering, DeploymentPlan plan);
NetworkConfigurationVO setupNetworkProfile(AccountVO account, NetworkOfferingVO offering, Map<String, String> params, DeploymentPlan plan);
List<NetworkConfigurationVO> setupNetworkProfiles(AccountVO account, List<NetworkOfferingVO> offerings, DeploymentPlan plan);
NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, DeploymentPlan plan);
NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, NetworkConfiguration predefined, DeploymentPlan plan);
List<NetworkConfigurationVO> setupNetworkConfigurations(AccountVO owner, List<NetworkOfferingVO> offerings, DeploymentPlan plan);
List<NetworkOfferingVO> getSystemAccountNetworkOfferings(String... offeringNames);
<K extends VMInstanceVO> List<NicProfile> allocate(K vm, List<Pair<NetworkConfigurationVO, NicProfile>> networks) throws InsufficientCapacityException;
<K extends VMInstanceVO> List<NicTO> prepare(K vm);
List<NicTO> prepare(VirtualMachineProfile profile, DeployDestination dest) throws InsufficientAddressCapacityException, InsufficientVirtualNetworkCapcityException;
<K extends VMInstanceVO> void create(K vm);

View File

@ -79,6 +79,7 @@ import com.cloud.dc.VlanVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.domain.DomainVO;
import com.cloud.domain.dao.DomainDao;
@ -88,7 +89,9 @@ import com.cloud.event.EventVO;
import com.cloud.event.dao.EventDao;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.exception.InternalErrorException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.NetworkRuleConflictException;
@ -102,6 +105,7 @@ 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.configuration.NetworkGuru;
import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao;
@ -111,6 +115,8 @@ 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.resource.Resource;
import com.cloud.resource.Resource.ReservationStrategy;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.StorageManager;
@ -157,6 +163,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.VirtualMachineProfile;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
@ -205,8 +212,8 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
@Inject NetworkConfigurationDao _networkProfileDao = null;
@Inject NicDao _nicDao;
@Inject(adapter=NetworkProfiler.class)
Adapters<NetworkProfiler> _networkProfilers;
@Inject(adapter=NetworkGuru.class)
Adapters<NetworkGuru> _networkGurus;
@Inject(adapter=NetworkConcierge.class)
Adapters<NetworkConcierge> _networkConcierges;
@ -1794,7 +1801,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
_executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor"));
final ComponentLocator locator = ComponentLocator.getCurrentLocator();
_networkProfilers = locator.getAdapters(NetworkProfiler.class);
_networkGurus = locator.getAdapters(NetworkGuru.class);
_networkConcierges = locator.getAdapters(NetworkConcierge.class);
final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params);
@ -2344,12 +2351,12 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
}
@Override
public NetworkConfigurationVO setupNetworkProfile(AccountVO owner, NetworkOfferingVO offering, DeploymentPlan plan) {
return setupNetworkProfile(owner, offering, new HashMap<String, String>(), plan);
public NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, DeploymentPlan plan) {
return setupNetworkConfiguration(owner, offering, null, plan);
}
@Override
public NetworkConfigurationVO setupNetworkProfile(AccountVO owner, NetworkOfferingVO offering, Map<String, String> params, DeploymentPlan plan) {
public NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, NetworkConfiguration predefined, DeploymentPlan plan) {
List<NetworkConfigurationVO> configs = _networkProfileDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId());
if (configs.size() > 0) {
if (s_logger.isDebugEnabled()) {
@ -2358,8 +2365,8 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
return configs.get(0);
}
for (NetworkProfiler profiler : _networkProfilers) {
NetworkConfiguration profile = profiler.convert(offering, plan, params, owner);
for (NetworkGuru guru : _networkGurus) {
NetworkConfiguration profile = guru.design(offering, plan, predefined, owner);
if (profile == null) {
continue;
}
@ -2372,7 +2379,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
}
}
NetworkConfigurationVO vo = new NetworkConfigurationVO(profile, offering.getId(), plan.getDataCenterId());
NetworkConfigurationVO vo = new NetworkConfigurationVO(profile, offering.getId(), plan.getDataCenterId(), guru.getName());
return _networkProfileDao.persist(vo, owner.getId());
}
@ -2380,10 +2387,10 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
}
@Override
public List<NetworkConfigurationVO> setupNetworkProfiles(AccountVO owner, List<NetworkOfferingVO> offerings, DeploymentPlan plan) {
public List<NetworkConfigurationVO> setupNetworkConfigurations(AccountVO owner, List<NetworkOfferingVO> offerings, DeploymentPlan plan) {
List<NetworkConfigurationVO> profiles = new ArrayList<NetworkConfigurationVO>(offerings.size());
for (NetworkOfferingVO offering : offerings) {
profiles.add(setupNetworkProfile(owner, offering, plan));
profiles.add(setupNetworkConfiguration(owner, offering, plan));
}
return profiles;
}
@ -2447,10 +2454,29 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
}
@Override
public <K extends VMInstanceVO> List<NicTO> prepare(K vm) {
public List<NicTO> prepare(VirtualMachineProfile vmProfile, DeployDestination dest) throws InsufficientAddressCapacityException, InsufficientVirtualNetworkCapcityException {
List<NicVO> nics = _nicDao.listBy(vmProfile.getId());
for (NicVO nic : nics) {
NetworkConfigurationVO config = _networkProfileDao.findById(nic.getNetworkConfigurationId());
if (nic.getReservationStrategy() == ReservationStrategy.Start) {
NetworkConcierge concierge = _networkConcierges.get(nic.getReserver());
nic.setState(Resource.State.Reserving);
_nicDao.update(nic.getId(), nic);
concierge.reserve(vmProfile.getId(), toNicProfile(nic), dest);
} else {
}
}
return null;
}
NicProfile toNicProfile(NicVO nic) {
NetworkConfiguration config = _networkProfileDao.findById(nic.getNetworkConfigurationId());
NicProfile profile = new NicProfile(nic, config);
return profile;
}
@Override
public <K extends VMInstanceVO> void create(K vm) {
for (NetworkConcierge concierge : _networkConcierges) {

View File

@ -1,7 +1,7 @@
/**
*
*/
package com.cloud.network.profiler;
package com.cloud.network.configuration;
import java.util.Map;
@ -22,7 +22,6 @@ import com.cloud.network.Network.Mode;
import com.cloud.network.Network.TrafficType;
import com.cloud.network.NetworkConfiguration;
import com.cloud.network.NetworkConfigurationVO;
import com.cloud.network.NetworkProfiler;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.utils.component.AdapterBase;
@ -34,15 +33,15 @@ import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine;
@Local(value={NetworkProfiler.class, NetworkConcierge.class})
public class ControlNetworkProfiler extends AdapterBase implements NetworkProfiler, NetworkConcierge {
private static final Logger s_logger = Logger.getLogger(ControlNetworkProfiler.class);
@Local(value={NetworkGuru.class, NetworkConcierge.class})
public class ControlNetworkGuru extends AdapterBase implements NetworkGuru, NetworkConcierge {
private static final Logger s_logger = Logger.getLogger(ControlNetworkGuru.class);
@Inject DataCenterDao _dcDao;
String _cidr;
String _gateway;
@Override
public NetworkConfiguration convert(NetworkOffering offering, DeploymentPlan plan, Map<String, String> params, Account owner) {
public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration specifiedConfig, Account owner) {
if (offering.getTrafficType() != TrafficType.Control) {
return null;
}
@ -54,7 +53,7 @@ public class ControlNetworkProfiler extends AdapterBase implements NetworkProfil
return config;
}
protected ControlNetworkProfiler() {
protected ControlNetworkGuru() {
super();
}
@ -120,4 +119,9 @@ public class ControlNetworkProfiler extends AdapterBase implements NetworkProfil
_dcDao.releaseLinkLocalPrivateIpAddress(Long.parseLong(uniqueId));
return true;
}
@Override
public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) {
return config;
}
}

View File

@ -1,22 +1,20 @@
/**
*
*/
package com.cloud.network.profiler;
import java.util.Map;
package com.cloud.network.configuration;
import javax.ejb.Local;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.network.Network.BroadcastDomainType;
import com.cloud.network.Network.Mode;
import com.cloud.network.Network.TrafficType;
import com.cloud.network.NetworkConfiguration;
import com.cloud.network.NetworkConfigurationVO;
import com.cloud.network.NetworkProfiler;
import com.cloud.network.dao.NetworkConfigurationDao;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.NetworkOffering.GuestIpType;
@ -24,18 +22,18 @@ import com.cloud.user.Account;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.component.Inject;
@Local(value=NetworkProfiler.class)
public class GuestNetworkProfiler extends AdapterBase implements NetworkProfiler {
@Local(value=NetworkGuru.class)
public class GuestNetworkGuru extends AdapterBase implements NetworkGuru {
@Inject protected NetworkConfigurationDao _profileDao;
@Inject protected DataCenterDao _dcDao;
@Inject protected VlanDao _vlanDao;
protected GuestNetworkProfiler() {
protected GuestNetworkGuru() {
super();
}
@Override
public NetworkConfiguration convert(NetworkOffering offering, DeploymentPlan plan, Map<String, String> params, Account owner) {
public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration userSpecified, Account owner) {
if (offering.getTrafficType() != TrafficType.Guest) {
return null;
}
@ -57,4 +55,10 @@ public class GuestNetworkProfiler extends AdapterBase implements NetworkProfiler
return profile;
}
@Override
public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -0,0 +1,9 @@
/**
*
*/
package com.cloud.network.configuration;
public final class GuruUtils {
}

View File

@ -1,9 +1,7 @@
/**
*
*/
package com.cloud.network.profiler;
import java.util.Map;
package com.cloud.network.configuration;
import javax.ejb.Local;
@ -20,7 +18,6 @@ import com.cloud.network.Network.Mode;
import com.cloud.network.Network.TrafficType;
import com.cloud.network.NetworkConfiguration;
import com.cloud.network.NetworkConfigurationVO;
import com.cloud.network.NetworkProfiler;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.utils.component.AdapterBase;
@ -31,13 +28,13 @@ import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine;
@Local(value={NetworkProfiler.class, NetworkConcierge.class})
public class PodBasedNetworkProfiler extends AdapterBase implements NetworkProfiler, NetworkConcierge {
private static final Logger s_logger = Logger.getLogger(PodBasedNetworkProfiler.class);
@Local(value={NetworkGuru.class, NetworkConcierge.class})
public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru, NetworkConcierge {
private static final Logger s_logger = Logger.getLogger(PodBasedNetworkGuru.class);
@Inject DataCenterDao _dcDao;
@Override
public NetworkConfiguration convert(NetworkOffering offering, DeploymentPlan plan, Map<String, String> params, Account owner) {
public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration userSpecified, Account owner) {
TrafficType type = offering.getTrafficType();
if (type != TrafficType.Management && type != TrafficType.Storage) {
@ -49,7 +46,7 @@ public class PodBasedNetworkProfiler extends AdapterBase implements NetworkProfi
return config;
}
protected PodBasedNetworkProfiler() {
protected PodBasedNetworkGuru() {
super();
}
@ -96,4 +93,10 @@ public class PodBasedNetworkProfiler extends AdapterBase implements NetworkProfi
return true;
}
@Override
public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -1,12 +1,11 @@
/**
*
*/
package com.cloud.network.profiler;
import java.util.Map;
package com.cloud.network.configuration;
import javax.ejb.Local;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.exception.InsufficientAddressCapacityException;
@ -16,21 +15,22 @@ import com.cloud.network.Network.Mode;
import com.cloud.network.Network.TrafficType;
import com.cloud.network.NetworkConfiguration;
import com.cloud.network.NetworkConfigurationVO;
import com.cloud.network.NetworkProfiler;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.component.Inject;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NetworkConcierge;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine;
@Local(value={NetworkProfiler.class, NetworkConcierge.class})
public class PublicNetworkProfiler extends AdapterBase implements NetworkProfiler, NetworkConcierge {
@Local(value={NetworkGuru.class, NetworkConcierge.class})
public class PublicNetworkProfiler extends AdapterBase implements NetworkGuru, NetworkConcierge {
@Inject DataCenterDao _dcDao;
@Override
public NetworkConfiguration convert(NetworkOffering offering, DeploymentPlan plan, Map<String, String> params, Account owner) {
public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration config, Account owner) {
if (offering.getTrafficType() != TrafficType.Public) {
return null;
}
@ -77,4 +77,11 @@ public class PublicNetworkProfiler extends AdapterBase implements NetworkProfile
public boolean release(String uniqueName, String uniqueId) {
return false;
}
@Override
public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -1,9 +0,0 @@
/**
*
*/
package com.cloud.network.profiler;
public final class ProfilerUtils {
}

View File

@ -29,6 +29,7 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.deploy.DeployDestination;
@ -55,6 +56,7 @@ import com.cloud.utils.component.Inject;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.VirtualMachine.Event;
import com.cloud.vm.dao.VMInstanceDao;
@Local(value=VmManager.class)
@ -85,14 +87,15 @@ public class MauriceMoss implements VmManager {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Allocating entries for VM: " + vm);
}
VMInstanceVO instance = _vmDao.findById(vm.getId());
VirtualMachineProfile vmProfile = new VirtualMachineProfile(instance, serviceOffering);
//VMInstanceVO vm = _vmDao.findById(vm.getId());
VirtualMachineProfile vmProfile = new VirtualMachineProfile(vm, serviceOffering);
Transaction txn = Transaction.currentTxn();
txn.start();
instance.setDataCenterId(plan.getDataCenterId());
_vmDao.update(instance.getId(), instance);
List<NicProfile> nics = _networkMgr.allocate(instance, networks);
vm.setDataCenterId(plan.getDataCenterId());
_vmDao.update(vm.getId(), vm);
List<NicProfile> nics = _networkMgr.allocate(vm, networks);
vmProfile.setNics(nics);
if (dataDiskOfferings == null) {
@ -101,32 +104,21 @@ public class MauriceMoss implements VmManager {
List<DiskProfile> disks = new ArrayList<DiskProfile>(dataDiskOfferings.size() + 1);
if (template.getFormat() == ImageFormat.ISO) {
disks.add(_storageMgr.allocateRawVolume(VolumeType.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), instance, owner));
disks.add(_storageMgr.allocateRawVolume(VolumeType.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner));
} else {
disks.add(_storageMgr.allocateTemplatedVolume(VolumeType.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, instance, owner));
disks.add(_storageMgr.allocateTemplatedVolume(VolumeType.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner));
}
for (Pair<DiskOfferingVO, Long> offering : dataDiskOfferings) {
disks.add(_storageMgr.allocateRawVolume(VolumeType.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), instance, owner));
disks.add(_storageMgr.allocateRawVolume(VolumeType.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner));
}
vmProfile.setDisks(disks);
_vmDao.updateIf(vm, Event.OperationSucceeded, null);
txn.commit();
if (s_logger.isDebugEnabled()) {
s_logger.debug("Allocation completed for VM: " + vm);
}
boolean created = false;
try {
vmProfile = create(vmProfile, plan);
created = vmProfile != null;
} catch (InsufficientCapacityException e) {
throw e;
} finally {
if (!created) {
// TODO: Error handling
}
}
return vmProfile;
}
@ -240,8 +232,45 @@ public class MauriceMoss implements VmManager {
}
@Override
public <T extends VMInstanceVO> T start(T vm) {
// TODO Auto-generated method stub
public <T extends VMInstanceVO> T start(VirtualMachineProfile vmProfile, DeploymentPlan plan) throws InsufficientCapacityException {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Creating actual resources for VM " + vmProfile);
}
Journal journal = new Journal.LogJournal("Creating " + vmProfile, s_logger);
Set<DeployDestination> avoids = new HashSet<DeployDestination>();
int retry = _retry;
while (_retry-- > 0) {
DeployDestination context = null;
for (DeploymentDispatcher dispatcher : _dispatchers) {
context = dispatcher.plan(vmProfile, plan, avoids);
if (context != null) {
avoids.add(context);
journal.record("Deployment found ", vmProfile, context);
break;
}
}
if (context == null) {
throw new CloudRuntimeException("Unable to create a deployment for " + vmProfile);
}
VMInstanceVO vm = _vmDao.findById(vmProfile.getId());
vm.setDataCenterId(context.getDataCenter().getId());
vm.setPodId(context.getPod().getId());
_vmDao.updateIf(vm, Event.StartRequested, context.getHost().getId());
VirtualMachineTO vmTO = new VirtualMachineTO();
// _networkMgr.prepare(vmProfile);
// _storageMgr.prepare(vm);
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("Creation complete for VM " + vmProfile);
}
return null;
}

View File

@ -158,6 +158,11 @@ public class NicVO implements Nic {
this.reserver = reserver;
}
@Override
public ReservationStrategy getReservationStrategy() {
return ReservationStrategy.Start;
}
@Override
public int getExpectedReservationInterval() {
return -1;

View File

@ -62,7 +62,7 @@ public interface VmManager extends Manager {
DeploymentPlan plan,
AccountVO owner) throws InsufficientCapacityException, StorageUnavailableException;
<T extends VMInstanceVO> T start(T vm) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException;
<T extends VMInstanceVO> T start(VirtualMachineProfile p, DeploymentPlan plan) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException;
<T extends VMInstanceVO> T stop(T vm) throws AgentUnavailableException, ConcurrentOperationException;

View File

@ -101,6 +101,8 @@ CREATE TABLE `cloud`.`network_configurations` (
`vlan_id` bigint unsigned NULL COMMENT 'vlan id if the broadcast_domain_type is the vlan',
`network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id that this configuration is created from',
`data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this configuration is used in',
`handler_name` varchar(255) NOT NULL COMMENT 'who is responsible for this type of network configuration',
`state` varchar(32) NOT NULL COMMENT 'what state is this configuration in',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -74,7 +74,7 @@ public class Adapters<T extends Adapter> implements Iterable<T> {
this._adapters = adapters;
}
protected T get(String name) {
public T get(String name) {
return _map.get(name);
}

View File

@ -184,7 +184,15 @@ public interface GenericDao<T, ID extends Serializable> {
boolean remove(ID id);
/**
* remove the entity bean.
* Remove based on the search criteria. This will delete if the VO object
* does not have a REMOVED column.
* @param sc search criteria to match
* @return rows removed.
*/
int remove(SearchCriteria<T> sc);
/**
* Expunge actually delete the row even if it's REMOVED.
* @param id
* @return true if removed.
*/
@ -212,5 +220,4 @@ public interface GenericDao<T, ID extends Serializable> {
*/
boolean configure(String name, Map<String, Object> params) throws ConfigurationException;
int remove(SearchCriteria<T> sc);
}

View File

@ -1370,4 +1370,5 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
SearchBuilder<T> builder = createSearchBuilder();
return builder.create();
}
}

View File

@ -43,7 +43,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
* @param <T> VO object this Search is build for.
* @param <K> Result object that should contain the results.
*/
public class GenericSearchBuilder<T, K> implements DaoSearch<T, K>, MethodInterceptor {
public class GenericSearchBuilder<T, K> implements MethodInterceptor {
final protected Map<String, Attribute> _attrs;
protected ArrayList<Condition> _conditions;

View File

@ -0,0 +1,31 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.utils.db;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target(FIELD)
@Retention(RUNTIME)
public @interface StateMachine {
public Class<?> state();
public Class<?> event();
}

View File

@ -0,0 +1,55 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.utils.fsm;
import java.util.List;
import java.util.Set;
/**
* Interface for a state in the finite state machine.
*
* @param <S> State
* @param <E> Event
*/
public interface FiniteState<S, E> {
/**
* @return the state machine being used.
*/
StateMachine<S, E> getStateMachine();
/**
* get next state based on the event.
* @param event
* @return next State
*/
S getNextState(E event);
/**
* Get the states that could have traveled to the current state
* via this event.
* @param event
* @return array of states
*/
List<S> getFromStates(E event);
/**
* Get the possible events that can happen from the current state.
* @return array of events.
*/
Set<E> getPossibleEvents();
}

View File

@ -15,7 +15,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.utils.db;
package com.cloud.utils.fsm;
public interface DaoSearch<T, K> {
public interface FiniteStateObject<S, E> {
/**
* @return finite state.
*/
FiniteState<S, E> getState();
void setState(S state);
}