mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
finalized guru design
This commit is contained in:
parent
0be5053c56
commit
979fcf8b78
@ -57,7 +57,28 @@ public class DeployDestination {
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
assert false : "Not implemented correctly yet.";
|
||||
return false;
|
||||
DeployDestination that = (DeployDestination)obj;
|
||||
if (this._dc == null || that._dc == null) {
|
||||
return false;
|
||||
}
|
||||
if (this._dc.getId() != that._dc.getId()) {
|
||||
return false;
|
||||
}
|
||||
if (this._pod == null || that._pod == null) {
|
||||
return false;
|
||||
}
|
||||
if (this._pod.getId() != that._pod.getId()) {
|
||||
return false;
|
||||
}
|
||||
if (this._cluster == null || that._cluster == null) {
|
||||
return false;
|
||||
}
|
||||
if (this._cluster.getId() != that._cluster.getId()) {
|
||||
return false;
|
||||
}
|
||||
if (this._host == null || that._host == null) {
|
||||
return false;
|
||||
}
|
||||
return this._host.getId() == that._host.getId();
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,9 +27,9 @@ public interface NetworkGuru extends Adapter {
|
||||
|
||||
NicProfile allocate(NetworkConfiguration config, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException;
|
||||
|
||||
boolean create(NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException;
|
||||
// NicProfile create(NicProfile nic, NetworkConfiguration config, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException;
|
||||
|
||||
String reserve(NicProfile nic, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException;
|
||||
String reserve(NicProfile nic, NetworkConfiguration config, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException;
|
||||
|
||||
boolean release(String uniqueId);
|
||||
|
||||
|
||||
@ -4,6 +4,11 @@
|
||||
package com.cloud.resource;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.cloud.utils.fsm.FiniteState;
|
||||
import com.cloud.utils.fsm.StateMachine;
|
||||
|
||||
/**
|
||||
* Indicates a resource in CloudStack.
|
||||
@ -12,11 +17,50 @@ import java.util.Date;
|
||||
*
|
||||
*/
|
||||
public interface Resource {
|
||||
enum State {
|
||||
Allocated, // The resource is allocated but not re
|
||||
Reserving,
|
||||
Reserved,
|
||||
Releasing,
|
||||
enum Event {
|
||||
ReservationRequested,
|
||||
ReleaseRequested,
|
||||
CancelRequested,
|
||||
OperationCompleted,
|
||||
OperationFailed,
|
||||
}
|
||||
|
||||
enum State implements FiniteState<State, Event> {
|
||||
Allocated, // Resource is allocated
|
||||
Reserving, // Resource is being reserved right now.
|
||||
Reserved, // Resource is reserved
|
||||
Releasing, // Resource is being released.
|
||||
Ready; // Resource is ready which means it does not need to go through reservation.
|
||||
|
||||
@Override
|
||||
public StateMachine<State, Event> getStateMachine() {
|
||||
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public State getNextState(Event event) {
|
||||
return s_fsm.getNextState(this, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<State> getFromStates(Event event) {
|
||||
return s_fsm.getFromStates(this, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Event> getPossibleEvents() {
|
||||
return s_fsm.getPossibleEvents(this);
|
||||
}
|
||||
|
||||
final static private StateMachine<State, Event> s_fsm = new StateMachine<State, Event>();
|
||||
static {
|
||||
s_fsm.addTransition(State.Allocated, Event.ReservationRequested, State.Reserving);
|
||||
s_fsm.addTransition(State.Reserving, Event.CancelRequested, State.Allocated);
|
||||
s_fsm.addTransition(State.Reserving, Event.OperationCompleted, State.Reserved);
|
||||
s_fsm.addTransition(State.Reserving, Event.OperationFailed, State.Allocated);
|
||||
}
|
||||
}
|
||||
|
||||
enum ReservationStrategy {
|
||||
|
||||
@ -10,15 +10,15 @@ 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.resource.Resource;
|
||||
import com.cloud.resource.Resource.ReservationStrategy;
|
||||
|
||||
public class NicProfile {
|
||||
long id;
|
||||
BroadcastDomainType broadcastType;
|
||||
String cidr;
|
||||
Mode mode;
|
||||
long vmId;
|
||||
String gateway;
|
||||
int deviceId;
|
||||
AddressFormat format;
|
||||
TrafficType trafficType;
|
||||
String ip4Address;
|
||||
@ -27,6 +27,8 @@ public class NicProfile {
|
||||
URI isolationUri;
|
||||
String netmask;
|
||||
URI broadcastUri;
|
||||
ReservationStrategy strategy;
|
||||
String reservationId;
|
||||
|
||||
public String getNetmask() {
|
||||
return netmask;
|
||||
@ -44,7 +46,7 @@ public class NicProfile {
|
||||
return broadcastUri;
|
||||
}
|
||||
|
||||
public void setIsolationUril(URI isolationUri) {
|
||||
public void setIsolationUri(URI isolationUri) {
|
||||
this.isolationUri = isolationUri;
|
||||
}
|
||||
|
||||
@ -60,10 +62,6 @@ public class NicProfile {
|
||||
this.broadcastType = broadcastType;
|
||||
}
|
||||
|
||||
public void setCidr(String cidr) {
|
||||
this.cidr = cidr;
|
||||
}
|
||||
|
||||
public void setMode(Mode mode) {
|
||||
this.mode = mode;
|
||||
}
|
||||
@ -76,10 +74,6 @@ public class NicProfile {
|
||||
this.gateway = gateway;
|
||||
}
|
||||
|
||||
public void setDeviceId(int deviceId) {
|
||||
this.deviceId = deviceId;
|
||||
}
|
||||
|
||||
public void setFormat(AddressFormat format) {
|
||||
this.format = format;
|
||||
}
|
||||
@ -112,10 +106,6 @@ public class NicProfile {
|
||||
return broadcastType;
|
||||
}
|
||||
|
||||
public String getCidr() {
|
||||
return cidr;
|
||||
}
|
||||
|
||||
public void setMacAddress(String macAddress) {
|
||||
this.macAddress = macAddress;
|
||||
}
|
||||
@ -128,10 +118,6 @@ public class NicProfile {
|
||||
return gateway;
|
||||
}
|
||||
|
||||
public int getDeviceId() {
|
||||
return deviceId;
|
||||
}
|
||||
|
||||
public AddressFormat getFormat() {
|
||||
return format;
|
||||
}
|
||||
@ -158,8 +144,6 @@ public class NicProfile {
|
||||
|
||||
public NicProfile(Nic nic, NetworkConfiguration network) {
|
||||
this.id = nic.getId();
|
||||
this.deviceId = nic.getDeviceId();
|
||||
this.cidr = network.getCidr();
|
||||
this.gateway = network.getGateway();
|
||||
this.mode = network.getMode();
|
||||
this.format = null;
|
||||
@ -168,19 +152,35 @@ public class NicProfile {
|
||||
this.ip4Address = nic.getIp4Address();
|
||||
this.ip6Address = null;
|
||||
this.macAddress = nic.getMacAddress();
|
||||
this.reservationId = nic.getReservationId();
|
||||
this.strategy = nic.getReservationStrategy();
|
||||
}
|
||||
|
||||
public NicProfile(long id, BroadcastDomainType type, String cidr, Mode mode, long vmId) {
|
||||
public NicProfile(long id, BroadcastDomainType type, Mode mode, long vmId) {
|
||||
this.id = id;
|
||||
this.broadcastType = type;
|
||||
this.cidr = cidr;
|
||||
this.mode = mode;
|
||||
this.vmId = vmId;
|
||||
}
|
||||
|
||||
public NicProfile(String ip4Address, String macAddress, String gateway) {
|
||||
public NicProfile(Resource.ReservationStrategy strategy, String ip4Address, String macAddress, String gateway, String netmask) {
|
||||
this.format = AddressFormat.Ip4;
|
||||
this.ip4Address = ip4Address;
|
||||
this.macAddress = macAddress;
|
||||
this.gateway = gateway;
|
||||
this.netmask = netmask;
|
||||
this.strategy = strategy;
|
||||
}
|
||||
|
||||
public ReservationStrategy getReservationStrategy() {
|
||||
return strategy;
|
||||
}
|
||||
|
||||
public String getReservationId() {
|
||||
return reservationId;
|
||||
}
|
||||
|
||||
public void setReservationId(String reservationId) {
|
||||
this.reservationId = reservationId;
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,25 +17,15 @@
|
||||
*/
|
||||
package com.cloud.vm;
|
||||
|
||||
import com.cloud.network.Network.IsolationType;
|
||||
import com.cloud.network.Network.Mode;
|
||||
|
||||
/**
|
||||
* VirtualNetwork describes from a management level the
|
||||
* things needed to provide the network to the virtual
|
||||
* machine.
|
||||
*/
|
||||
public class VirtualNetwork {
|
||||
public enum Mode {
|
||||
None,
|
||||
Local,
|
||||
Static,
|
||||
Dhcp;
|
||||
}
|
||||
|
||||
public enum Isolation {
|
||||
VNET,
|
||||
VLAN,
|
||||
OSWITCH,
|
||||
}
|
||||
|
||||
/**
|
||||
* The gateway for this network.
|
||||
*/
|
||||
@ -74,7 +64,7 @@ public class VirtualNetwork {
|
||||
/**
|
||||
* Isolation method for networking.
|
||||
*/
|
||||
public Isolation method;
|
||||
public IsolationType method;
|
||||
|
||||
public boolean firewalled;
|
||||
|
||||
|
||||
@ -2488,7 +2488,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
|
||||
nic.setState(Resource.State.Reserving);
|
||||
_nicDao.update(nic.getId(), nic);
|
||||
NicProfile profile = toNicProfile(nic);
|
||||
String reservationId = concierge.reserve(profile, vmProfile, dest);
|
||||
String reservationId = concierge.reserve(profile, config, vmProfile, dest);
|
||||
nic.setIp4Address(profile.getIp4Address());
|
||||
nic.setIp6Address(profile.getIp6Address());
|
||||
nic.setMacAddress(profile.getMacAddress());
|
||||
@ -2497,6 +2497,9 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
|
||||
nic.setReservationId(reservationId);
|
||||
nic.setReserver(concierge.getName());
|
||||
nic.setState(Resource.State.Reserved);
|
||||
nic.setNetmask(profile.getNetmask());
|
||||
nic.setGateway(profile.getGateway());
|
||||
nic.setAddressFormat(profile.getFormat());
|
||||
_nicDao.update(nic.getId(), nic);
|
||||
for (NetworkElement element : _networkElements) {
|
||||
if (!element.prepare(config, profile, vmProfile, null)) {
|
||||
|
||||
@ -17,12 +17,14 @@ import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.deploy.DeploymentPlan;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||
import com.cloud.network.Network.AddressFormat;
|
||||
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.offering.NetworkOffering;
|
||||
import com.cloud.resource.Resource.ReservationStrategy;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.utils.component.AdapterBase;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
@ -90,21 +92,18 @@ public class ControlNetworkGuru extends AdapterBase implements NetworkGuru {
|
||||
throw new CloudRuntimeException("Does not support nic specification at this time: " + nic);
|
||||
}
|
||||
|
||||
return new NicProfile(null, null, null);
|
||||
return new NicProfile(ReservationStrategy.Start, null, null, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean create(NicProfile nic, VirtualMachineProfile profile) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String reserve(NicProfile nic, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException,
|
||||
public String reserve(NicProfile nic, NetworkConfiguration config, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException,
|
||||
InsufficientAddressCapacityException {
|
||||
String ip = _dcDao.allocateLinkLocalPrivateIpAddress(dest.getDataCenter().getId(), dest.getPod().getId(), vm.getId());
|
||||
nic.setIp4Address(ip);
|
||||
nic.setMacAddress("FE:FF:FF:FF:FF:FF");
|
||||
nic.setNetmask("255.255.0.0");
|
||||
nic.setFormat(AddressFormat.Ip4);
|
||||
|
||||
return Long.toString(nic.getId());
|
||||
}
|
||||
|
||||
|
||||
@ -73,14 +73,7 @@ public class GuestNetworkGuru extends AdapterBase implements NetworkGuru {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean create(NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException,
|
||||
InsufficientAddressCapacityException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String reserve(NicProfile nic, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException,
|
||||
public String reserve(NicProfile nic, NetworkConfiguration config, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException,
|
||||
InsufficientAddressCapacityException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
|
||||
@ -14,12 +14,14 @@ import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.deploy.DeploymentPlan;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||
import com.cloud.network.Network.AddressFormat;
|
||||
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.offering.NetworkOffering;
|
||||
import com.cloud.resource.Resource.ReservationStrategy;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.utils.component.AdapterBase;
|
||||
import com.cloud.utils.component.Inject;
|
||||
@ -62,17 +64,12 @@ public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru {
|
||||
throw new CloudRuntimeException("Does not support nic configuration");
|
||||
}
|
||||
|
||||
NicProfile profile = new NicProfile(null, null, null);
|
||||
NicProfile profile = new NicProfile(ReservationStrategy.Start, null, null, null, null);
|
||||
return profile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean create(NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String reserve(NicProfile nic, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException,
|
||||
public String reserve(NicProfile nic, NetworkConfiguration config, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException,
|
||||
InsufficientAddressCapacityException {
|
||||
DataCenter dc = dest.getDataCenter();
|
||||
Pod pod = dest.getPod();
|
||||
@ -81,9 +78,9 @@ public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru {
|
||||
String[] macs = _dcDao.getNextAvailableMacAddressPair(dc.getId());
|
||||
|
||||
nic.setIp4Address(ip);
|
||||
nic.setCidr(pod.getCidrAddress() + "/" + pod.getCidrSize());
|
||||
nic.setGateway(pod.getGateway());
|
||||
nic.setMacAddress(macs[0]);
|
||||
nic.setFormat(AddressFormat.Ip4);
|
||||
String netmask = NetUtils.getCidrSubNet(pod.getCidrAddress(), pod.getCidrSize());
|
||||
nic.setNetmask(netmask);
|
||||
|
||||
|
||||
@ -3,9 +3,6 @@
|
||||
*/
|
||||
package com.cloud.network.configuration;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
@ -18,12 +15,15 @@ import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.deploy.DeploymentPlan;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||
import com.cloud.network.Network.AddressFormat;
|
||||
import com.cloud.network.Network.BroadcastDomainType;
|
||||
import com.cloud.network.Network.IsolationType;
|
||||
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.offering.NetworkOffering;
|
||||
import com.cloud.resource.Resource.ReservationStrategy;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.component.AdapterBase;
|
||||
@ -62,18 +62,19 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
|
||||
if (nic != null) {
|
||||
throw new CloudRuntimeException("Unsupported nic settings");
|
||||
}
|
||||
|
||||
return new NicProfile(null, null, null);
|
||||
|
||||
return new NicProfile(ReservationStrategy.Create, null, null, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean create(NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String reserve(NicProfile ch, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
|
||||
public String reserve(NicProfile ch, NetworkConfiguration configuration, VirtualMachineProfile vm, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
|
||||
if (ch.getReservationId() != null) {
|
||||
return ch.getReservationId();
|
||||
}
|
||||
|
||||
long dcId = dest.getDataCenter().getId();
|
||||
|
||||
String[] macs = _dcDao.getNextAvailableMacAddressPair(dcId);
|
||||
|
||||
Pair<String, VlanVO> ipAndVlan = _vlanDao.assignIpAddress(dcId, vm.getVm().getAccountId(), vm.getVm().getDomainId(), VlanType.VirtualNetwork, true);
|
||||
if (ipAndVlan == null) {
|
||||
@ -83,12 +84,12 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
|
||||
ch.setIp4Address(ipAndVlan.first());
|
||||
ch.setGateway(vlan.getVlanGateway());
|
||||
ch.setNetmask(vlan.getVlanNetmask());
|
||||
try {
|
||||
ch.setIsolationUril(new URI("vlan://" + vlan.getVlanId()));
|
||||
} catch (URISyntaxException e) {
|
||||
throw new CloudRuntimeException("URI Syntax: " + "vlan://" + vlan.getVlanId(), e);
|
||||
}
|
||||
ch.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanId()));
|
||||
ch.setBroadcastType(BroadcastDomainType.Vlan);
|
||||
ch.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanId()));
|
||||
ch.setMacAddress(macs[1]);
|
||||
ch.setFormat(AddressFormat.Ip4);
|
||||
ch.setReservationId(Long.toString(vlan.getId()));
|
||||
|
||||
return Long.toString(vlan.getId());
|
||||
}
|
||||
|
||||
@ -29,6 +29,7 @@ import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import com.cloud.network.Network.AddressFormat;
|
||||
import com.cloud.network.Network.Mode;
|
||||
|
||||
@Entity
|
||||
@ -57,6 +58,9 @@ public class NicVO implements Nic {
|
||||
@Column(name="isolation_uri")
|
||||
URI isolationUri;
|
||||
|
||||
@Column(name="ip_type")
|
||||
AddressFormat addressFormat;
|
||||
|
||||
@Column(name="broadcast_uri")
|
||||
URI broadcastUri;
|
||||
|
||||
@ -138,6 +142,14 @@ public class NicVO implements Nic {
|
||||
public void setGateway(String gateway) {
|
||||
this.gateway = gateway;
|
||||
}
|
||||
|
||||
public AddressFormat getAddressFormat() {
|
||||
return addressFormat;
|
||||
}
|
||||
|
||||
public void setAddressFormat(AddressFormat format) {
|
||||
this.addressFormat = format;
|
||||
}
|
||||
|
||||
public void setNetmask(String netmask) {
|
||||
this.netmask = netmask;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user